使用Caffe对图片进行训练并分类的简单流程

本文详细介绍了如何使用Caffe进行图片训练和分类。首先确保Caffe正确安装,接着转换数据集为leveldb格式。利用create_imagenet.sh脚本处理数据,创建meanfile。然后,配置并训练模型,如修改lenet系列文件以适应自己的数据集。最后,通过pythonwrapper和meanfile对模型进行分类,参照classify.py和classifymap.py进行结果解析。
摘要由CSDN通过智能技术生成

step 1.      首先,确保caffe已经正确安装,并且make runtest基本通过。

 

step 2.      准备训练集:

        在训练之前,要准备训练需要的训练集,为了验证训练的效果,最好也准备一定数量的测试集。由于caffe的数据集的输入是leveldb格式,因此在训练前需要将输入转为相应格式。

        在caffe_root/example 文件夹中,提供了一些例子,cifar10与imagenet均是将图片形式数据库转换为leveldb格式,mnist则是将其本身的数据集转换为leveldb格式。这就要求我们需要把自己的数据集转换成leveldb格式,需要自己编写程序实现。下面以jpg格式图片为例说明。

在此,假设数据库本身是以图片形式给出,并且给出了label或者同一类别的图片已经分类。这样我们就可以通过imagenet例子中给出的create_imagenet.sh 对我们自己的数据库进行转换,要求数据集图片格式为jpg以下为具体操作步骤:

        A.若数据集已经给出label则忽略此步骤。图片按照类别装在不同文件夹下的情况,自己编写mklabel.sh命令,对图片进行处理并标明label。具体操作参照mklabel.sh 程序说明。

<pre name="code" class="plain">mklabel.sh
#!/bin/sh

#----------------------------------------------------
#文件存放形式为
#	dir/subdir1/files...
#	dir/subdir2/files...
#	dir/subdir3/files...
#	dir/subdirX/files...

#用法:
#1.$ sh mklabel.sh dir startlabel ;dir 为目标文件夹名称
#2.$ chmod a+x mklabel.sh ;然后可以直接用文件名运行
#3.默认label信息显示在终端,请使用转向符'>'生成文本,例:
#		$ sh ./mklabel.sh  data/faces94/male  > label.txt
#4.确保文件夹下除了图片不含其他文件(若含有则需自行添加判断语句)
#-----------------------------------------------------

DIR=~/codes/mklabel.sh		#命令位置(无用)
label=1					#label起始编号(为数字,根据自己需要修改)
testnum=0				#保留的测试集大小

if test $# -eq 0;then	#无参数,默认为当前文件夹下,label=1
	$DIR . 0 $label
else
	if test $# -eq 1;then	#仅有位置参数,默认testnum=0,label=1
		$DIR $1 0 $label
	else
		if test $# -eq 2;then	#两个参数时,label=1
			$DIR $1 $2 $label
		else
			testnum=$2			#每个类别保留测试集大小
			label=$3			#自定义label起始
			
			cd $1				#转到目标文件夹
		
			if test $testnum -ne 0;then
				mkdir "testdata"	#建立测试集
			fi
		
			for i in * ; do
				exist=`expr "$i" != "testdata"`
				if test -d $i && test $exist -eq 1;then	#文件夹存在
					#echo 
					#echo 'DIR:' $i
				
					cd $i			#进入文件夹
						num=1		#图片数目
						for j in *
						do
							if test $num -gt $testnum;then
								echo  $j  $label
								mv $j ../
							fi
							num=`expr $num + 1`
						done
					cd ..			#回到上层目录
				
					if test $testnum -eq 0;then
						rmdir $i
					else
						mv $i ./testdata
					fi
				
					label=`expr $label + 1`
									#计算label
				fi	
			done
		fi
	fi
fi

 
 

        B.修改create_imagenet.sh 文件,使其中的图片源地址与标明label的txt文件对应到自己数据库的相应文件。其中的convert_imageset.cpp 函数的参数依次为图片文件夹位置,label.txt文本文件,目标数据集名称,是否随机存储图片与label(即打乱图片数据的读入顺序)。

若你所使用的数据集不是通过图片形式给出,为了方便,可以根据leveldb数据的存储格式,自己编写程序转换数据集。

 

        C.多通道图片需要用到meanfile,通过example/imagenet文件夹下的shell函数make_imagenet_mean.sh,更改相应函数,很轻松的得到binaryproto文件,在训练时可能需要用到。

step 3.      使用自己的数据进行训练:

        以最简单的mnist网络为例,因为数据集的不同则需要更改的参数也不同。在训练前最好在example下新建个文件夹命名为数据集的名称,然后把mnist下的5个文件:

        lenet.prototxt

        lenet_solver.prototxt

        lenet_train.prototxt

        lenet_test.prototxt

        train_lenet.sh

      复制到新文件夹下,以上5个文件为必需的文件。按顺序对以上文件进行修改,在忽略网络结构的情况下,需要修改的有:

        a.      lenet.prototxt:

input_dim: 64
input_dim: 1
input_dim: 28
input_dim: 28

        分别为一次导入的图片个数,channel,heigth ,width。

                      倒数第二层,即输入给softmax层数据的那层,其中的num_output需要更改为实际图片的label数,即图片类别数。否则在进行训练时,会出现错误。

                                   

 

        b.      lenet_solver.prototxt:

       如果之前文件名没改的话则不需要更改以上两项,否则改为对应文件。其他参数根据实际需要更改。

       

        c.      lenet_train.prototxt:

        需要把data层的数据源文件替换为自己的数据。

              

        在训练多通道图片时,此处最好需要有一个meanfile参数。例如cifar10

       

       num_output参数参照lenet.prototxt修改。

 

        d.      lenet_test.prototxt:

        参照lenet_train.prototxt 进行相应修改。

 

        e.      train_lenet.sh:

         lenet_solver.prototxt文件名未更改的话则不需要进行改动。

  

step 4.      使用自己的model进行分类:

        Reference: http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/classification.ipynb

         假设之前的所有步骤已经成功,并且已经训练出正确率还行的model,则现在就可以使用model对图片进行分类。

       

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值