caffe学习系列:训练自己的图片集(超详细教程)

https://blog.csdn.net/qq_27923041/article/details/54139887

    学习的caffe的目的,不是简单的做几个练习,而是最终落实到自己的项目或科研中去。因此,本文介绍一下,从自己的原始图片到lmdb数据,再到训练和测试的整个流程。

一、数据的准备

    有条件的同学,可以去ImageNet的官网点击打开链接,下载ImageNet图片来训练。但是我没有下载,因为我注册过程中一直出现bug。哭

    也可以去这个网盘(点击打开链接)下载图像数据,包括手写数字.jpg,手写数字.csv,人脸检测正负样本224*224,image.zip,.CASIA-WebFace.zip

    我重新找了500张图片来代替,分为大巴车、恐龙、大象、鲜花和马五个类,每个类100张。需要的同学,可以去这个网盘下载点击打开链接

    编号分别以3,4,5,6,7开头,各为一类。我从其中每类选出20张作为测试,其余80张作为训练。因此最终训练图片400张,测试图片100张,共5类。我将图片放在caffe-master根目录下的data文件下。即训练图片目录:data/re/train/,测试图片目录:data/re/test/

二、转换为lmdb格式

    首先在examples下面创建一个myfile的文件夹,来用存放配置文件和脚本文件。然后编写一个脚本create_filelist.sh,用来生成train.txt和test.txt清单文件

    #sudo mkdir examples/myfile

    #sudo vi examples/myfile/create_filelist.sh

    编辑create_filelist.sh文件,并写入如下代码,并保存

    #!/usr/bin/env sh
    DATA=data/re/
    MY=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 '/' -f4-5 | 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 '/' -f4-5 | sed "s/$/ $i/">>$MY/test.txt
    done
    echo "All done"

    注: 这个脚本文件中,用到了rm,find,cut,sed,cat等linux命令

    rm:删除文件

    find:寻找文件

    cut :截取路径

    sed:在每行的最后面加上标注。本例中将找到的“i*.jpg”文件加入标注为i,比如“3*.jpg”标注为3

    cat:将两个类别合并在一个文件里。

    然后,运行此脚本

    #sudo sh examples/myfile/create_filelist.sh

    成功的话,就会在examples/myfile/文件下生成train.txt和test.txt两个文本文件,里面就是图片的列表清单

    打开train.txt可以看到如下内容,同样test.txt文件里面的内容也是如此,二者仅数量不同。

    注:在此处,我们手动的通过查找替换功能,将train.txt文件和test.txt文件里面的图片编号依次由3,4,5,6,7改为0,1,2,3,4。之所以要改编号的原因是,编号从3~7会影响训练精度。修改完后,train.txt内容如下图所示

;

    由于上述生成的train.txt文件和test.txt文件是加权限文件,因此需要修改权限,以方面修改。Linux命令为:chmod a+w examples/myfile/train.txt

    接着再编写一个脚本文件,调用convert_imageset命令来转换数据格式

    #sudo vi examples/myfile/create_lmdb.sh

    插入:

    #!/usr/bin/env sh
    MY=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/data/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/data/re/
    $MY/test.txt
    $MY/img_test_lmdb


    echo "All Done.."

    注:代码中的shuffle为,打乱图片顺序。/home/xxx/caffe/data/re为下载的图像数据保存的绝对路径。

    最后,运行这个脚本

    #sudo sh examples/myfile/create_lmdb.sh

    因为图片大小不一,因此统一转换成256*256大小。运行成功后,会在examples/myfile下面生成两个img_test_lmdb和img_train_lmdb,分别用于保存图片转换后的lmdb文件。

三、计算均值并保存

    图片减去均值再训练,会提高训练速度和精度。因此,一般都会有这个操作。

    caffe程序提供了一个计算均值的文件compute_image_mean.cpp,我们直接使用就可以了

    #sudo build/tools/compute_image_mean examples/myfile/img_train_lmdb examples/myfile/mean.binaryproto

    compute_image_mean带两个参数,第一个参数时lmdb训练数据位置,第二个参数设定均值文件的名字及保存路径。

    运行成功后,如下图所示

    

四、创建模型并编写配置文件

    模型就用程序自带的caffenet模型,位置在models/bvlc_reference_caffenet/文件夹下,将需要的两个配置文件,复制到myfile文件夹内

    #sudo cp models/bvlc_reference_caffenet/solver.prototxt examples/myfile/

    #sudo cp models/bvlc_reference_caffenet/train_val.prototxt examples/myfile/

    修改其中的solver.prototxt

    #sudo vi examples/myfile/solver.prototxt

    输入以下内容:

     net: "examples/myfile/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
    solver_mode: GPU

    注:电脑没有GPU的同学,solver_mode:CPU

    100个测试数据,batch_size为50,因此test_iter设置为2,就能全覆盖了。在训练过程中,调整学习率,逐步变小。

    修改train_val.prototxt,只需要修改两个阶段的data层就可以了,其他可以不用管。

    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
    }
   }

    实际上就是修改两个data layer的mean_file和source这两个地方,其他都没有变化。

五、训练

    如果前面都没有问题,数据准备好了,配置文件也配置好了,这一步就比较简单了。

    #sudo build/tools/caffe train -solver examples/myfile/solver.prototxt

    运行时间和最后的精度,会根据机器配置,参数设置的不同而不同。我的机器运行500次,大约15分钟左右,精度为95%。如下图所示:

    

    注:运行时,可能会出现以下问题

    原因:由图可以看出,出现问题的上面一行提示loading mean file from:data/ilsvrc12/imagenet_mean.binaryproto,说明载入均值文件时,路径出现问题。

    解决方法:因为训练时,我们用到两个脚本文件solver.prototxt和train_val.prototxt文件。所以首先,我们查看solver.prototxt文件,看看第一句net:"examples/myfile/train_val.prototxt"里面的地址对不对(本文的问题就出在这里,it works after fixed.).如果还没有解决,继续查看train_val.prototxt文件里面的data路径,建议都写成绝对路径。毕竟caffe里面大部分问题都是由路径不对引起的。

    该类问题还可以参考以下博客解决http://blog.csdn.net/dongfang1984/article/details/53259297

_________________________________________________________________________________________________________________________________________________
每一个不曾起舞的日子,都是对生命的辜负。
But it is the same with man as with the tree. The more he seeks to rise into the height and light, the more vigorously do his roots struggle earthward, downward, into the dark, the deep - into evil.
其实人跟树是一样的,越是向往高处的阳光,它的根就越要伸向黑暗的地底。----尼采
原文地址:https://www.cnblogs.com/leoking01/p/14547400.html