本文主要参考了:https://blog.csdn.net/heimu24/article/details/53581362
https://blog.csdn.net/gaohuazhao/article/details/69568267
准备工具linux系统,caffe框架,淘宝上获取的图片。
整个过程分为,三部分,一、是对数据进行处理,转化为caffe能应用的数据类型。二、搭建网络,进行训练。三、利用训练好的数据进行分类。
一、下载数据集
首先从网上下载需要的数据集。下载地址,百度网盘:https://pan.baidu.com/s/1o77w1wI
下载完后解压,里面会有四个文件,如图所示
只保留train和val即可,因为我们后面用这两个文件来自己生成train.txt和val.txt.
在caffe的examples文件夹下新建一个myfile4文件夹,在这个文件加下建立一个data文件夹,把刚才下载的train和val保存到data文件夹中。
二、生成.txt文件
首先在myfile4下面建立一个.sh文件,我的文件名为:create_filelist.sh。内容如下:
#!/usr/bin/env sh
DATA=examples/myfile4/data #数据来源的路径
MY=examples/myfile4/data #生成的txt文件存储位置
echo "Create train.txt..."
rm -rf $MY/train.txt #先把文件中原有的同名文件删除
find $DATA/train -name 15001*.jpg | cut -d '/' -f4-5 | sed "s/$/ 0/">>$MY/train.txt
find $DATA/train -name 15059*.jpg | cut -d '/' -f4-5 | sed "s/$/ 1/">>$MY/train.txt
find $DATA/train -name 62047*.jpg | cut -d '/' -f4-5 | sed "s/$/ 2/">>$MY/train.txt
find $DATA/train -name 68021*.jpg | cut -d '/' -f4-5 | sed "s/$/ 3/">>$MY/train.txt
find $DATA/train -name 73018*.jpg | cut -d '/' -f4-5 | sed "s/$/ 4/">>$MY/train.txt
find $DATA/train -name 73063*.jpg | cut -d '/' -f4-5 | sed "s/$/ 5/">>$MY/train.txt
find $DATA/train -name 80012*.jpg | cut -d '/' -f4-5 | sed "s/$/ 6/">>$MY/train.txt
find $DATA/train -name 92002*.jpg | cut -d '/' -f4-5 | sed "s/$/ 7/">>$MY/train.txt
find $DATA/train -name 92017*.jpg | cut -d '/' -f4-5 | sed "s/$/ 8/">>$MY/train.txt
find $DATA/train -name 95005*.jpg | cut -d '/' -f4-5 | sed "s/$/ 9/">>$MY/train.txt
echo "Create test.txt..."
rm -rf $MY/val.txt
find $DATA/val -name 15001*.jpg | cut -d '/' -f4-5 | sed "s/$/ 0/">>$MY/val.txt
find $DATA/val -name 15059*.jpg | cut -d '/' -f4-5 | sed "s/$/ 1/">>$MY/val.txt
find $DATA/val -name 62047*.jpg | cut -d '/' -f4-5 | sed "s/$/ 2/">>$MY/val.txt
find $DATA/val -name 68021*.jpg | cut -d '/' -f4-5 | sed "s/$/ 3/">>$MY/val.txt
find $DATA/val -name 73018*.jpg | cut -d '/' -f4-5 | sed "s/$/ 4/">>$MY/val.txt
find $DATA/val -name 73063*.jpg | cut -d '/' -f4-5 | sed "s/$/ 5/">>$MY/val.txt
find $DATA/val -name 80012*.jpg | cut -d '/' -f4-5 | sed "s/$/ 6/">>$MY/val.txt
find $DATA/val -name 92002*.jpg | cut -d '/' -f4-5 | sed "s/$/ 7/">>$MY/val.txt
find $DATA/val -name 92017*.jpg | cut -d '/' -f4-5 | sed "s/$/ 8/">>$MY/val.txt
find $DATA/val -name 95005*.jpg | cut -d '/' -f4-5 | sed "s/$/ 9/">>$MY/val.txt
echo "All done"
对一些语句进行解释:
find $DATA/train -name 15001*.jpg 是在文件加下找到所有前几位名为15001的图片
cut -d '/' -f4-5 是以'/'为分界符,找到第四至五段的内容截取下来
sed "s/$/ 0/" 在截取的文件名后面加一个空格和一个标签0
MY/train.txt 存储到train.txt中
在caffe目录下运行该文件,命令为:./examples/myfile4/create_filelist.sh。运行完后,会在myfile4/data文件夹下生成train.txt和val.txt文件。得到的train.txt的内容如下:
三、转化为db文件
接着把.txt文件转换成caffe能识别的db文件。还是在myfile4下建立该文件,文件名为create_lmdb.sh。内容如下:
#!/usr/bin/env sh
MY=examples/myfile4
TRAIN_DATA_ROOT=/home/sst/caffe/examples/myfile4/data/
VAL_DATA_ROOT=/home/sst/caffe/examples/myfile4/data/
echo "Create train lmdb.."
rm -rf $MY/img_train_lmdb
build/tools/convert_imageset \
--resize_height=32 \
--resize_width=32 \
--shuffle \
$TRAIN_DATA_ROOT \
$MY/data/train.txt \
$MY/img_train_lmdb
echo "Create test lmdb.."
rm -rf $MY/img_val_lmdb
build/tools/convert_imageset \
--resize_height=32 \
--resize_width=32 \
--shuffle \
$VAL_DATA_ROOT \
$MY/data/val.txt \
$MY/img_val_lmdb
echo "All Done.."
对代码进行一些解释:
MY=examples/myfile4设置lmdb文件要存储的位置。
TRAIN_DATA_ROOT=/home/sst/caffe/examples/myfile4/data/ 该图片存储的绝对路径。是从linux的根目录开始的
VAL_DATA_ROOT=/home/sst/caffe/examples/myfile4/data/ 数据列表的存储位置
build/tools/convert_imageset 这句是利用caffe自带的图片处理工具对图片进行处理。
convert_imageset命令行使用格式 convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME FLAGS是处理的参数,像图片的大小,随机抽取还是怎么样。ROOTFOLDER是图片存放的绝对目录。LISTFILE是文件列表清单。DB_NAME是生成的文件存放的位置。想要了解更详细的自行百度,我也不太清楚。
运行这个文件./examples/myfile4/create_lmdb.sh运行完后会在myfile4文件夹下生成img_val_lmdb和img_train_lmdb文件夹里面就是我们想要的caffe能识别的db文件。
四、计算均值
计算均值的原因是保证所有特征都在0附近,在大多数情况下,我们并不关心所输入图像的整体明亮程度,比如对象识别任务中,图像的整体明亮程度,并不会影响图像中存在的是什么物体,我们对图像的平均亮度感兴趣,所以可以减去这个值来进行均值规整化。
创建的文件名为,create_meanfile.sh 代码如下:
EXAMPLE=examples/myfile4
DATA=examples/myfile4/
TOOLS=build/tools
$TOOLS/compute_image_mean $EXAMPLE/img_train_lmdb $DATA/mean1.binaryproto
echo "Done."
也是利用caffe自带的均值处理工具进行处理。
$EXAMPLE/img_train_lmdb要处理的文件的位置,$DATA/mean1.binaryproto文件的存储位置
像上面一样运行该文件,就会得到均值文件。
至此,图像的前期处理已经结束。接下来便是正式的训练
正式的训练的地址如下: