三:使用Caffe训练Caffemodel并进行图像分类
上一篇记录的是如何使用别人训练好的MNIST数据做训练测试。上手操作一边后大致了解了配置文件属性。这一篇记录如何使用自己准备的图片素材做图像分类。第一篇《实践详细篇-Windows下使用VS2015编译安装Caffe环境(CPU ONLY) 》有讲过使用Caffe的背景.所以这篇记录使用的素材就是12306的验证码来进行图像识别分类。
1、准备素材
由于这里抓取到的验证码是整合后的大图。就是8张小图片合成的。由于12306的验证码大图并不是固定的,而是每一张验证码图片都是随机使用一些小图组成,所以需要将大图进行切割为八张小图片,这样才能准确的提高识别图。
大图:
切割后的小图:
注意:准备的样本图片命名最好有一个格式,比如同一种类型用一种编号,可以是数字或者是数字+字母。比如狮子的编号以100开始,图片编号就是100,101,102....。以此类推。
2、处理样本并将素材转换为leveldb或lmdb数据格式
2.1.下载样本处理工具,解压至Caffe根目录。结构如下:
在mydata目录中分别创建train文件夹和test文件夹。train文件夹用于存放训练样本图片,test文件夹用于存放测试样本图片。
注意:
一、train图片资源最好是比测试图片多。
二、图片尺寸需要保持统一并图片名称不能包含特殊字符 有规则的命名,这样便于下一步创建标签
2.2.创建标签样本
首先需要确定自己有几个样本标签。在caffe根目录\examples目录下新建一个文件夹testImg(这个文件夹就是后期用到的训练主目录了,里面将存放均值文件+神经网络等配置主文件。)并在testImg目录下新建一个文本labels.txt 将样本标签内容填写进去,比如我们这里测试用了8个标签样本,分别是:
1 狮子
2 海鸥
3 本子
4 剪纸
5 绿豆
6 啤酒
7 锦旗
8 金字塔
找到create_filelist.sh文件进行编辑
需要修改的地方:
for i in 语句后面对应的就是需要循环的样本编号 需要修改两处,修改完成后直接运行脚本。
FILETYPE 需要处理的图片类型 我这边使用的是png 如果你是jpg或者其他格式就修改为别的类型即可
#!/usr/bin/env sh
DATA=mydata
FILETYPE=png ##需要处理样本的图片格式
echo "Create train.txt..."
rm -rf $DATA/train.txt
for i in 1 2 3 4 5 6 7 8 ##需要处理几个样本标签就填写几个 我这里处理8个样本 顺序最好是从0开始 我这里以1开始迭代,但是后面我又手动处理了的
do
find $DATA/train -name $i*.$FILETYPE | cut -d '/' -f2-4 | sed "s/$/ $i/">>train.txt
done
echo "Create test.txt..."
rm -rf $DATA/test.txt
for i in 1 2 3 4 5 6 7 8 ##需要处理几个样本标签就填写几个 我这里处理8个样本
do
find $DATA/test -name $i*.$FILETYPE | cut -d '/' -f2-4 | sed "s/$/ $i/">>test.txt
done
echo "All done"
pause
执行脚本进行创建样本文件
Administrator@2T93DQV8MG8N68O MINGW64 /e/shenduxuexi/caffe/create_img_db (windows)
$ sh create_filelist.sh
Create train.txt...
Create test.txt...
All done
执行完成后会在当前脚本目录生成两个文件,分别是train.txt和test.txt样本文件。其中的内容就是使用脚本进行便利图片然后根据图片编号第一位生成了标签编号,标签编号就是用于分类使用的。每一行包含两个内容,分别是图片路径和标签编号。
手动处理:
去掉路径(train/)/(test/),如果将图片分类放置不同的文件夹的话可以不用处理。比如train/老虎/106.png。
将编号-1 也就是 全部替换 将1 改为0 ,2改为1 以此类推,因为标签索引从0开始可以避免一个错误
train.txt文件内容:
train/100.png 1
train/101.png 1
train/103.png 1
train/104.png 1
train/105.png 1
train/106.png 1
train/108.png 1
train/109.png 1
train/110.png 1
train/112.png 1
train/201.png 2
train/202.png 2
train/203.png 2
train/204.png 2
train/205.png 2
train/206.png 2
train/207.png 2
train/208.png 2
........
test.txt内容:
test/100.png 1
test/101.png 1
test/103.png 1
test/104.png 1
test/105.png 1
test/106.png 1
test/108.png 1
test/124.png 1
test/125.png 1
test/200.png 2
test/201.png 2
test/202.png 2
test/203.png 2
test/204.png 2
test/205.png 2
test/206.png 2
test/207.png 2
test/208.png 2
test/209.png 2
test/300.png 3
test/301.png 3
test/302.png 3
test/303.png 3
.......
将两个文件复制到examples/testImg目录下。
2.3.资源转换为数据库文件
找到create_db.sh或create_db.bat文件 进行编辑修改。(如果准备的资源素材图片尺寸不统一则修改resize_height和resize_width表示对图像的尺寸统一转换。自行根据资源决定)我准备的资源尺寸都是67的,所以我在转换的过程就不用附带--resize_height=227 --resize_width=227参数了
#!/usr/bin/env sh
ROOTURL=E:/shenduxuexi/caffe/create_img_db ##当前文件夹绝对路径根目录 根据自己的项目路径修改
BACKEND=lmdb ##需要创建的数据集格式 leveldb或lmdb
echo "Create test $BACKEND.."
rm -rf ./mnist_test_$BACKEND
../scripts/build/tools/Release/convert_imageset --resize_height=227 --resize_width=227 --backend=$BACKEND --shuffle $ROOTURL/mydata/test/ ./test.txt ./mnist_test_$BACKEND
echo "Create train end.."
echo "Create train $BACKEND.."
rm -rf ./mnist_train_$BACKEND
../scripts/build/tools/Release/convert_imageset --resize_height=227 --resize_width=227 --backend=$BACKEND --shuffle $ROOTURL/mydata/train/ ./train.txt ./mnist_train_$BACKEND
echo "All Done.."
修改完成保存后运行create_db.sh文件进行创建图片数据转换,转换成功后会分别创建两个文件夹 mytest_test_lmdb和mytest_train_lmdb。
2.3.1.mytest_test_lmdb文件夹中存放的就是用于测试训练模型的数据集
2.3.2.mytest_train_lmdb文件夹中存放的就是用于训练的数据模型
如两个文件夹中分别包含了以上两个文件表示转换成功了。将转换好的数据模型(mytest_train_lmdb文件夹)和测试数据集(mytest_test_lmdb文件夹)拷贝至examples\testImg文件夹下。
3、计算图像的均值
图片减去均值后再训练会提高训练速度和精度。
caffe程序提供了一个计算均值的工具,所以我们直接使用就可以了
在caffe根目录下新建一个脚本,名为computeImageMean.bat。
第一个是启动均值计算的程序路径(scripts\build\tools\Release\compute_image_mean),
第二个是需要计算均值的数据库文件(examples\testImg\mnist_train_lmdb)
第三个是创建均值保存的路径(examples\testImg\train_mean.binaryproto)。
路径根据自己的项目路径决定
::当前caffe根目录
SET ROOTURL=E:\shenduxuexi\caffe\
%ROOTU