利用caffe-ssd训练物体检测模型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yudiemiaomiao/article/details/77897832

一.简介
1. 资源

  • code:https://github.com/weiliu89/caffe/tree/ssd
  • paper:https://arxiv.org/abs/1512.02325
    1. 主要文件夹的用途
  • examples/ssd/,存放了训练,测试的脚本,是主要操作的脚本
  • data/,存放了训练、验证和测试所需的数据和代码
  • python/caffe/model_libs.py,存放了生成网络主体的代码
  • models/,存放了Proto文件,是由 examples/ssd/中的脚本生成
  • jobs/,存放了训练、测试文件,是由 examples/ssd/中的脚本生成

    1. 安装与配置
  • 安装ssd:
    下载caffe-ssd.zip,放至主文件夹下(即/home/*(服务器名字)这个目录);
    进入caffe-ssd主目录,即

    cd caffe-ssd;
    

    创建ssd分支:git checkout ssd(出现“分支”则说明copy-check成功);

  • 配置ssd(caffe)
    终端输入:

    cd /home/**(服务器的名字)/caffe
    cp Makefile.config.example Makefile.config
    

    打开Makefile.config,修改Makefile.config,也可之间将编译通过的caffe下的Makefile.config复制过来;
    终端输入:

    make all
    # Make sure to include $CAFFE_ROOT/python to your PYTHONPATH.
    make py
    make test
    make runtest
    

二、针对VOC数据集的训练

  1. 预训练模型下载
    下载地址:
    链接:http://pan.baidu.com/s/1slpaEO9 密码:loxo
    在caffe/models文件夹下新建文件夹,命名为VGGNet,将刚刚下载下来的文件放入这个VGGNet文件夹当中;
  2. 下载VOC2007和VOC2012
    在主文件夹下(即/home/**(服务器的名字)/)新建文件夹,命名为data;
    终端输入:

    cd /home/**(服务器的名字)/data
    wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
    wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
    wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
    

    解压文件:

    cd /home/**(服务器的名字)/data
    tar -xvf VOCtrainval_11-May-2012.tar
    tar -xvf VOCtrainval_06-Nov-2007.tar
    tar -xvf VOCtest_06-Nov-2007.tar
    

    生成训练所需的LMDB文件:

    cd /home/**(服务器的名字)/caffe-ssd
    ./data/VOC0712/create_list.sh
    ./data/VOC0712/create_data.sh
    

若出现no module named caffe或者是no module named caffe.proto,则在终端输入:

    export PYTHONPATH=$PYTHONPATH:/home/**(服务器的名字)/caffe-ssd/Python

3. 训练与测试
- 训练:
打开caffe-ssd/examples/ssd/ssd_pascal.py这个文件,找到gpus=’0,1,2,3’这一行,如果您的服务器有一块显卡,则将123删去,如果有两个显卡,则删去23,以此类推。如果您服务器没有gpu支持,则注销以下几行,程序会以cpu形式训练。(这个是解决问题cudasuccess(10vs0)的方法)

    #Ifnum_gpus >0:
    #batch_size_per_device =int(math.ceil(float(batch_size) / num_gpus))
    #iter_size =int(math.ceil(float(accum_batch_size) / (batch_size_per_device * num_gpus)))
    #solver_mode =P.Solver.GPU
    #device_id =int(gpulist[0])

保存后终端运行:

    cd  /home/**(服务器的名字)/caffe
    python examples/ssd/ssd_pascal.py

如果出现问题cudasuccess(2vs0)则说明您的显卡计算量有限,再次打开caffe/examples/ssd/ssd_pascal.py这个文件,找到batch_size =32这一行,修改数字32,可以修改为16,或者8,甚至为4,保存后再次终端运行python examples/ssd/ssd_pascal.py。

  • 测试
    终端输入:

    python examples/ssd/score_ssd_pascal.py(演示detection的训练结果,数值在0.718左右)
    

三、利用自己的数据集训练检测模型
1. 将数据集做成VOC2007格式,可参考博文(http://blog.csdn.net/ yudiemiaomiao/article/details/71635257)假定数据集名称为MyDataSet,则在MyDataSet目录下需包含Annotations、ImageSets、JPEGImages三个文件夹:


ImageSet目录下包含Main文件下,在ImageSets\Main里有四个txt文件:test.txt train.txt trainval.txt val.txt;

txt文件中的内容为图片名字(无后缀)。

  1. 在caffe-ssd/data目录下创建一个自己的文件夹MyDataSet:

    cd data
    mkdir MyDataSet
    

    把data/VOC0712目录下的create_list.sh 、create_data.sh、labelmap_voc.prototxt 这三个文件拷贝到MyDataSet下:

    cp VOC0712/create_list.sh MyDataSet/
    cp VOC0712/create_data.sh MyDataSet/
    cp VOC0712/labelmap_voc.prototxt MyDataSet/
    
  2. 在/home/**(服务器的名字)/data目录下创建MyDataSet, 并放入自己的数据集;

  3. 在caffe-ssd/examples下创建MyDataSet文件夹:

    mkdir MyDateSet
    

    用于存放后续生成的lmdb文件;

  4. 修改labelmap_voc.prototxt文件(改成自己的类别),以及create_list.sh和create_data.sh文件中的相关路径;

    #labelmap_voc.prototxt需修改:
    item {
      name: "none_of_the_above"
      label: 0
      display_name: "background"
    }
    item {
      name: "aeroplane"
      label: 1
      display_name: "person"
    }
    
    #create_list.sh需修改:
    root_dir=/home/yi_miao/data/Mydataset/
    ...
    for name in yourownset
    ...
    #if [[ $dataset == "test" && $name == "VOC2012" ]]
    # then
    #  continue
    # fi
    
    #create_data.sh需修改:
    root_dir=/home/yi_miao/caffe-ssd
    data_root_dir="/home/yi_miao/data/Mydataset"
    dataset_name="Mydataset"
    

    运行命令:

    ./data/mydataset/create_list.sh
    ./data/mydataset/create_data.sh
    

    此时,在examples/mydataset/文件夹下可以看到两个子文件夹, mydataset_trainval_lmdb, mydataset_test_lmdb;里面均包含data.dmb和lock.dmb;

    到此为止,我们的数据集就做好了。接下来就开始训练了。训练程序为/examples/ssd/ssd_pascal.py,运行之前,我们需要修改相关路径代码,ssd_pascal.py作如下修改:

    82行:train_data路径;
    84行:test_data路径;
    237-246行:model_name、save_dir、snapshot_dir、job_dir、output_result_dir路径;
    259-263行:name_size_file、label_map_file路径;
    266行:num_classes修改为1 + 类别数;
    360行:num_test_image:测试集图片数目
    

    另外, 如果你只有一个GPU, 需要修改285行: gpus=”0,1,2,3” ===> 改为”0”
    否则,训练的时候会出错。
    修改完后运行

    python ./examples/ssd/ssd_pascal.py 
    

四、出现的错误总结

  1. 在训练的过程中,从迭代开始一直显示 mbox_loss = 0 (* 1 = 0 loss);
    原因是数据集制作错误,如果使用VOC作为参考,需要严格按照其格式,包括数据类型,例如bndbox:

    <bndbox>
       <xmin>60</xmin>
       <ymin>27</ymin>
       <xmax>385</xmax>
       <ymax>331</ymax>
    </bndbox>
    

    解决方法:
    bndbox参数必须为整数,如果是小数60.0,运行时不会报错,但是训练模型不会成功,持续是loss=0。

猜你喜欢

转载自blog.csdn.net/yudiemiaomiao/article/details/77897832