目的:使用自己的数据集,使用caffe自带的ImageNet网络结构,训练测试
参考官网链接:http://caffe.berkeleyvision.org/gathered/examples/imagenet.html
我自己准备的数据集:http://pan.baidu.com/s/1o60802I
我们的数据集图片分10个类,每个类有100个train图片(train文件夹下,一共1000),20个test图片(val文件夹下,一共200)
1 首先准备自己的数据集
我们需要准备的文件有:
1 文件夹train:里面放训练的图片
2 文件夹val:里面放val的图片
3 train.txt :训练图片的文件名和对应的类别
4 val.txt:测试图片的文件名和对应的类别
我已经为大家准备好了,下载链接:http://pan.baidu.com/s/1o60802I
以后大家自己准备数据集,就按照上面的方式将 图片和txt文件,放入对应目录下
2 创建lmdb格式数据集
在caffe安装的根目录下执行下面的脚本可以创建lmdb文件,用于caffe的数据输入;
./examples/imagenet/create_imagenet.sh
对于这个脚本,我们打开,根据自己的路径做更改;
原脚本:
- #!/usr/bin/env sh
- # Create the imagenet lmdb inputs
- # N.B. set the path to the imagenet train + val data dirs
- EXAMPLE=examples/imagenet %@@ 这里是一些路径,根据自己的路径修改
- DATA=data/ilsvrc12
- TOOLS=build/tools
- TRAIN_DATA_ROOT=/path/to/imagenet/train/
- VAL_DATA_ROOT=/path/to/imagenet/val/
- # Set RESIZE=true to resize the images to 256x256. Leave as false if images have
- # already been resized using another tool.
- RESIZE=false %@@ 这是设置RESIZE = true,caffe就可以帮我们修改好图片的尺寸
- if $RESIZE; then
- RESIZE_HEIGHT=256
- RESIZE_WIDTH=256
- else
- RESIZE_HEIGHT=0
- RESIZE_WIDTH=0
- fi
- if [ ! -d "$TRAIN_DATA_ROOT" ]; then
- echo "Error: TRAIN_DATA_ROOT is not a path to a directory: $TRAIN_DATA_ROOT"
- echo "Set the TRAIN_DATA_ROOT variable in create_imagenet.sh to the path" \
- "where the ImageNet training data is stored."
- exit 1
- fi
- if [ ! -d "$VAL_DATA_ROOT" ]; then
- echo "Error: VAL_DATA_ROOT is not a path to a directory: $VAL_DATA_ROOT"
- echo "Set the VAL_DATA_ROOT variable in create_imagenet.sh to the path" \
- "where the ImageNet validation data is stored."
- exit 1
- fi
- echo "Creating train lmdb..."
- GLOG_logtostderr=1 $TOOLS/convert_imageset \ %@@ 这里会调用作者已经写好的 convert_imageset 函数
- --resize_height=$RESIZE_HEIGHT \ %@@ 通过该函数可以产生lmdb的数据
- --resize_width=$RESIZE_WIDTH \
- --shuffle \
- $TRAIN_DATA_ROOT \ %@@ 训练图片的路径
- $DATA/train.txt \ %@@ 输入train.txt的路径
- $EXAMPLE/ilsvrc12_train_lmdb %@@输出train_lmdb的路径
- echo "Creating val lmdb..."
- GLOG_logtostderr=1 $TOOLS/convert_imageset \
- --resize_height=$RESIZE_HEIGHT \
- --resize_width=$RESIZE_WIDTH \
- --shuffle \
- $VAL_DATA_ROOT \ <span style="font-family: Arial, Helvetica, sans-serif;">%@@ 训练图片的路径</span>
- $DATA/val.txt \ %@@ 输入val.txt的路径
- $EXAMPLE/ilsvrc12_val_lmdb %@@输出val_lmdb的路径
- echo "Done."
ps:注意,要设置 RESIZE = true。因为imagenet这个网络结构输入图片的大小都必须是227*227的,设置RESIZE = true后,caffe就可以帮我们将图片的大小变换好;
3 计算图像均值
输入数据需要训练图片的均值图像
官方提供脚本帮助我们计算,如下:
./examples/imagenet/make_imagenet_mean.sh
计算完后得到一个文件:
data/ilsvrc12/imagenet_mean.binaryproto
.
脚本原文件:
- #!/usr/bin/env sh
- # Compute the mean image from the imagenet training lmdb
- # N.B. this is available in data/ilsvrc12
- EXAMPLE=examples/imagenet
- DATA=data/ilsvrc12
- TOOLS=build/tools
- $TOOLS/compute_image_mean $EXAMPLE/ilsvrc12_train_lmdb \
- $DATA/imagenet_mean.binaryproto
- echo "Done."
根据我的路径修改后的文件:(注意,你的跟我的不一定一样)
- #!/usr/bin/env sh
- # Compute the mean image from the imagenet training lmdb
- # N.B. this is available in data/ilsvrc12
- ROOT=/home/a216/caffe-master
- EXAMPLE=$ROOT/sloanqin/examples/godpool
- DATA=$ROOT/sloanqin/data/godpool/txt
- TOOLS=$ROOT/build/tools
- $TOOLS/compute_image_mean $EXAMPLE/godpool_train_lmdb \
- $DATA/godpool_mean.binaryproto
- echo "Done."
4 配置网络结构文件
网络模型文件在 models/bvlc_reference_caffenet/train_val.prototxt 文件中;
这里我们直接使用caffe提供的这个网络结构,以后我们再根据自己的想法做更改;
注意:大家需要打开这个文件,更改里面的路径
5 训练参数文件
训练参数文件在:models/bvlc_reference_caffenet/solver.prototxt中
我对solver.prototxt 修改后的参数如下:
- net: "/home/a216/caffe-master/sloanqin/data/godpool/txt/train_val.prototxt"
- test_iter: 4 //测试的时候,输入4个batch
- test_interval: 1000 //每迭代1000次,测试一次
- base_lr: 0.01 // 初始的学习率是0.01
- lr_policy: "step"
- gamma: 0.1
- stepsize: 3000 //每迭代3000次,调整一次学习率
- display: 20 //每20次迭代,显示一次
- max_iter: 12000 //最大迭代12000次
- momentum: 0.9
- weight_decay: 0.0005
- snapshot: 5000
- snapshot_prefix: "/home/a216/caffe-master/sloanqin/data/godpool/txt/caffenet_train"
- solver_mode: GPU
知识点说明:查看我们train_val.prototxt文件,发现batch_size: 50;我们的test图片是200张,200/50=4,所以
- test_iter=4
6 开始训练
./build/tools/caffe train --solver=/home/a216/caffe-master/sloanqin/data/godpool/txt/solver.prototxt
当然,上面的命令,需要根据你自己的路径相应的改下
7 结果
训练过程中,可以看到正确率在不断提升;最后的准确率是50%;
我们的样本数很少,当图片到百万数量级的时候,效果会很大提升;
而且我提供的数据是淘宝的图片,本身的难度很大,就是人也很难分清楚;