caffe 练习2用自己的数据集在ImageNet 测试

目的:使用自己的数据集,使用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

对于这个脚本,我们打开,根据自己的路径做更改;

原脚本:

[plain] view plain copy
  1. #!/usr/bin/env sh  
  2. # Create the imagenet lmdb inputs  
  3. # N.B. set the path to the imagenet train + val data dirs  
  4.   
  5. EXAMPLE=examples/imagenet    %@@ 这里是一些路径,根据自己的路径修改  
  6. DATA=data/ilsvrc12  
  7. TOOLS=build/tools  
  8.   
  9. TRAIN_DATA_ROOT=/path/to/imagenet/train/  
  10. VAL_DATA_ROOT=/path/to/imagenet/val/  
  11.   
  12. # Set RESIZE=true to resize the images to 256x256. Leave as false if images have  
  13. # already been resized using another tool.  
  14. RESIZE=false                   %@@ 这是设置RESIZE = true,caffe就可以帮我们修改好图片的尺寸  
  15. if $RESIZE; then  
  16.   RESIZE_HEIGHT=256  
  17.   RESIZE_WIDTH=256  
  18. else  
  19.   RESIZE_HEIGHT=0  
  20.   RESIZE_WIDTH=0  
  21. fi  
  22.   
  23. if [ ! -d "$TRAIN_DATA_ROOT" ]; then  
  24.   echo "Error: TRAIN_DATA_ROOT is not a path to a directory: $TRAIN_DATA_ROOT"  
  25.   echo "Set the TRAIN_DATA_ROOT variable in create_imagenet.sh to the path" \  
  26.        "where the ImageNet training data is stored."  
  27.   exit 1  
  28. fi  
  29.   
  30. if [ ! -d "$VAL_DATA_ROOT" ]; then  
  31.   echo "Error: VAL_DATA_ROOT is not a path to a directory: $VAL_DATA_ROOT"  
  32.   echo "Set the VAL_DATA_ROOT variable in create_imagenet.sh to the path" \  
  33.        "where the ImageNet validation data is stored."  
  34.   exit 1  
  35. fi  
  36.   
  37. echo "Creating train lmdb..."  
  38.   
  39. GLOG_logtostderr=1 $TOOLS/convert_imageset \    %@@ 这里会调用作者已经写好的 convert_imageset 函数  
  40.     --resize_height=$RESIZE_HEIGHT \    %@@ 通过该函数可以产生lmdb的数据  
  41.     --resize_width=$RESIZE_WIDTH \  
  42.     --shuffle \  
  43.     $TRAIN_DATA_ROOT \  %@@ 训练图片的路径  
  44.     $DATA/train.txt \   %@@ 输入train.txt的路径  
  45.     $EXAMPLE/ilsvrc12_train_lmdb %@@输出train_lmdb的路径  
  46.   
  47. echo "Creating val lmdb..."  
  48.   
  49. GLOG_logtostderr=1 $TOOLS/convert_imageset \  
  50.     --resize_height=$RESIZE_HEIGHT \  
  51.     --resize_width=$RESIZE_WIDTH \  
  52.     --shuffle \  
  53.     $VAL_DATA_ROOT \  <span style="font-family: Arial, Helvetica, sans-serif;">%@@ 训练图片的路径</span>  
  54.     $DATA/val.txt \   %@@ 输入val.txt的路径  
  55.     $EXAMPLE/ilsvrc12_val_lmdb %@@输出val_lmdb的路径  
  56.   
  57. echo "Done."  

ps:注意,要设置 RESIZE = true。因为imagenet这个网络结构输入图片的大小都必须是227*227的,设置RESIZE = true后,caffe就可以帮我们将图片的大小变换好;


3 计算图像均值

输入数据需要训练图片的均值图像

官方提供脚本帮助我们计算,如下:

./examples/imagenet/make_imagenet_mean.sh
计算完后得到一个文件:

data/ilsvrc12/imagenet_mean.binaryproto.

当然,跟上面一样,我们使用需要更改脚本对应的路径

脚本原文件:

[plain] view plain copy
  1. #!/usr/bin/env sh  
  2. # Compute the mean image from the imagenet training lmdb  
  3. # N.B. this is available in data/ilsvrc12  
  4.   
  5. EXAMPLE=examples/imagenet  
  6. DATA=data/ilsvrc12  
  7. TOOLS=build/tools  
  8.   
  9. $TOOLS/compute_image_mean $EXAMPLE/ilsvrc12_train_lmdb \  
  10.   $DATA/imagenet_mean.binaryproto  
  11.   
  12. echo "Done."  

根据我的路径修改后的文件:(注意,你的跟我的不一定一样)
[plain] view plain copy
  1. #!/usr/bin/env sh  
  2. # Compute the mean image from the imagenet training lmdb  
  3. # N.B. this is available in data/ilsvrc12  
[plain] view plain copy
  1. ROOT=/home/a216/caffe-master  
  2. EXAMPLE=$ROOT/sloanqin/examples/godpool  
  3. DATA=$ROOT/sloanqin/data/godpool/txt   
  4. TOOLS=$ROOT/build/tools  
  5.   
  6. $TOOLS/compute_image_mean $EXAMPLE/godpool_train_lmdb \  
  7.   $DATA/godpool_mean.binaryproto  
  8.   
  9. echo "Done."  

4 配置网络结构文件

网络模型文件在  models/bvlc_reference_caffenet/train_val.prototxt 文件中;

这里我们直接使用caffe提供的这个网络结构,以后我们再根据自己的想法做更改;

注意:大家需要打开这个文件,更改里面的路径

5 训练参数文件

训练参数文件在:models/bvlc_reference_caffenet/solver.prototxt中

我对solver.prototxt 修改后的参数如下:

[html] view plain copy
  1. net: "/home/a216/caffe-master/sloanqin/data/godpool/txt/train_val.prototxt"  
  2. test_iter: 4  //测试的时候,输入4个batch  
  3. test_interval: 1000 //每迭代1000次,测试一次  
  4. base_lr: 0.01  // 初始的学习率是0.01  
  5. lr_policy: "step"  
  6. gamma: 0.1  
  7. stepsize: 3000 //每迭代3000次,调整一次学习率  
  8. display: 20  //每20次迭代,显示一次  
  9. max_iter: 12000 //最大迭代12000次  
  10. momentum: 0.9  
  11. weight_decay: 0.0005  
  12. snapshot: 5000  
  13. snapshot_prefix: "/home/a216/caffe-master/sloanqin/data/godpool/txt/caffenet_train"  
  14. solver_mode: GPU  
ps:你要根据自己的路径做修改

知识点说明:查看我们train_val.prototxt文件,发现batch_size: 50;我们的test图片是200张,200/50=4,所以

[html] view plain copy
  1. test_iter=4  

6  开始训练

./build/tools/caffe train --solver=/home/a216/caffe-master/sloanqin/data/godpool/txt/solver.prototxt

当然,上面的命令,需要根据你自己的路径相应的改下

7 结果

训练过程中,可以看到正确率在不断提升;最后的准确率是50%;

我们的样本数很少,当图片到百万数量级的时候,效果会很大提升;

而且我提供的数据是淘宝的图片,本身的难度很大,就是人也很难分清楚;

猜你喜欢

转载自blog.csdn.net/Bruce_0712/article/details/80287547