本文根据此博客遇到的问题所做出的更改:http://www.cnblogs.com/denny402/p/5083300.html http://www.cnblogs.com/denny402/p/5137534.html
我的图片放在caffe/examples/images/中
一.create_filelist.sh中代码内容更改如下:
#!/usr/bin/env sh
DATA=/home/xxx(自己的电脑名称)/caffe/examples/images/re
MY=/home/xxx/caffe/examples/myfile
echo "Create train.txt..."
rm -rf $MY/train.txt
for i in 3 4 5 6 7
do
find $DATA/train -name $i*.jpg | cut -d '/' -f8-10 | sed "s/$/ $i/">>$MY/train.txt
done
echo "Create test.txt..."
rm -rf $MY/test.txt
for i in 3 4 5 6 7
do
find $DATA/test -name $i*.jpg | cut -d '/' -f8-10 | sed "s/$/ $i/">>$MY/test.txt
done
echo "All done"
二.create_lmdb.sh代码内容更改如下:
#!/usr/bin/env sh
MY=/home/xxx/caffe/examples/myfile
echo "Create train lmdb.."
rm -rf $MY/img_train_lmdb
build/tools/convert_imageset \
--shuffle \
--resize_height=256 \
--resize_width=256 \
/home/xxx/caffe/examples/images/re/ \
$MY/train.txt \
$MY/img_train_lmdb
echo "Create test lmdb.."
rm -rf $MY/img_test_lmdb
build/tools/convert_imageset \
--shuffle \
--resize_width=256 \
--resize_height=256 \
/home/xxx/caffe/examples/images/re/ \
$MY/test.txt \
$MY/img_test_lmdb
echo "All Done.."
三.创建模型并编写数据文件
①关于solver.prototxt的修改
net: "examples/myfile/train_val.prototxt" #(该train_val.prototxt文件所在的位置) test_iter: 2 test_interval: 50 base_lr: 0.001 lr_policy: "step" gamma: 0.1 stepsize: 100 display: 20 max_iter: 500 momentum: 0.9 weight_decay: 0.005
snapshot:500 #
snapshot_prefix: "examples/myfile/my_train" #我觉得这两个参数没必要删除,定义了最后训练出的模型所存储的位置和前缀
solver_mode: CPU #因为我的电脑没有GPU所以该成了CPU训练
②关于train_val.prototxt的修改
这里的train_val我并没有用的bvlc_reference_caffnet模型中的trian_val.prototxt。我是用digits将数据转换程lmdb,然后用digits训练模型但是失败了,不过过程中产生了solver.prototxt deploy.prototxt trian_val.prototxt (我也不知道是不是这个失败的过程产生的,反正是有了这些文件),这些文件的不同之处在于,当你把bvlc_reference_caffenet中的train_val.prototxt的内容复制到digits中Custom Network时修改时把那些均值文件的路径和lmdb数据的路径都删除了,因为会自动生成这些文件并更改到这些生成文件的路径。事实确实如此。不过我觉得像之前一样直接把bvlc_reference_caffnet中的solver.prototxt trian_val.prototxt两个文件复制过来更改也是可以的(但是我之前这么弄训练的时候总是发散也不知道是为什么)。主要是保证其中均值文件和lmdb数据路径是正确的。还有要把fc8层的名字改为fc8-re(虽然我也不知道为什么),并且将num_output改为5(因为我们这个例子是分的5类),下面贴出更改部分的train_val.prototxt文件代码。
name: "CaffeNet" layer { name: "data" type: "Data" top: "data" top: "label" include { phase: TRAIN } transform_param { mirror: true crop_size: 227 mean_file: "examples/myfile/mean.binaryproto" ## } data_param { source: "examples/myfile/img_train_lmdb" ## batch_size: 256 backend: LMDB } } layer { name: "data" type: "Data" top: "data" top: "label" include { phase: TEST } transform_param { mirror: false crop_size: 227 mean_file: "examples/myfile/mean.binaryproto" ### } data_param { source: "examples/myfile/img_test_lmdb" ###这四个地方改成自己的路径 batch_size: 50 backend: LMDB } }
layer { name: "fc8-re" type: "InnerProduct" bottom: "fc7" top: "fc8" param { lr_mult: 1.0 decay_mult: 1.0 } param { lr_mult: 2.0 decay_mult: 0.0 } inner_product_param { num_output: 5 #输出分为5类 weight_filler { type: "gaussian" std: 0.01 } bias_filler { type: "constant" value: 0.0 } } }
更改完毕。下面开始训练,希望都可以成功。
训练完我们的模型后,我们肯定想拿来测试自己的图片是吧。# sudo build/tools/caffe train -solver examples/myfile/solver.prototxt
那么我们需要这些文件:描述性文件deploy.prototxt(这个是在那个用digits训练模型时的失败的过程中产生的,如果不用这个可能要在bvlv_reference_caffenet中复制那里面的过来吧)、模型权值文件my_train_iter_500.caffemodele(也就是我们训练得到的,或许你的不叫这个)、图像均值文件mean.binaryproto、labels.txt(图片类别标签信息,这个自己创建个txt文件也行,反正也就5类)、img.jpg(输入的待分类的图像)
这些都找到之后:(caffe根目录下)
$ ./build/examples/cpp_classification/classification.bin \
>examples/myfile/deploy.prototxt \
>examples/myfile/my_train_iter_500.caffemodel \
>examples/myfile/mean.binaryproto \
>examples/myfile/labels.txt \
>examples/images/re/test/300.jpg
(这些文件都是我自己的路径,这个可以根据你们自己的文件路径更改)
运行:
运气好就成功了,运气不好可能会出现以下错误:
F0827 14:57:28.427697 25511 insert_splits.cpp:35] Unknown bottom blob 'label' (layer 'accuracy', bottom index 1)
现在就需要打开所用的deploy.prototxt文件看一看了,看最下面两层是不是accuracy和loss这两层,如果是那么删掉这两层保存,再运行一次。应该就正确了。如果没有仍然出错了那我也不知道为什么了,我也没有遇到。