Mobilenet-SSD训练VOC数据集

                                                          Mobilenet-SSD网络训练:VOC数据集

        首先,用 Mobilenet-SSD网络进行训练,需要配置好自己的cuda环境,跑 Mobilenet-SSD的前提是要使用SSD框架,所以要编译安装caffe的ssd分支,caffe-ssd下载地址:https://github.com/weiliu89/caffe/tree/ssd;下载好后像编译caffe一样对齐进行编译,编译好后,下载Mobilenet-SSD--地址:https://github.com/chuanqi305/MobileNet-SSD,将其解压到caffe-ssd的example文件夹下,进入MobileNet-SSD文件夹,里面存放了一个作者的预训练模型:加载模型和网络以及测试图片存放的文件夹:这里我的

caffe_root = '/home/xxx/Danbin/caffe-ssd/' 

net_file= 'MobileNetSSD_deploy.prototxt' 

caffe_model='MobileNetSSD_deploy.caffemodel' 

test_dir = "images"

然后运行demo.py脚本,进行环境测试,一般都没问题,;好吧,下面进入主题,用Mobilenet-ssd进行VOC数据集训练。

MobileNet-SSD默认使用Pascal VOC的2007和2012数据集,
下载以下数据集,并解压到同一个目录下:

  • VOC2007 - training/validation data
  • VOC2007 - test data
  • VOC2012 - training/validation data
  • VOC2012 - test data

解压后目录如下图所示:

Mobilenet-SSD训练VOC数据集_第1张图片

因为这里下载网上较慢,我只下载了VOC2012用做训练集;然后用caffe-ssd提供的 VOC数据集处理工具 对数据集进行处理:

  1. 按实际情况修改并执行脚本$CAFFE_ROOT/data/VOC0712/create_list.sh
    第3行root_dir变量修改为你的VOC数据集目录,比如按照我的目录树,则设置为$HOME/data/VOCdevkit
     [1] #!/bin/bash
     [2] 
     [3] root_dir=$HOME/data/VOCdevkit/
     [4] sub_dir=ImageSets/Main
     [5] bash_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
    
  2. 按实际情况修改并执行脚本$CAFFE_ROOT/data/VOC0712/create_data.sh
    第7行data_root_dir变量修改为你的VOC数据集目录,比如按照我的目录树,则设置为$HOME/data/VOCdevkit
     [1] cur_dir=$(cd $( dirname ${BASH_SOURCE[0]} ) && pwd )
     [2] root_dir=$cur_dir/../..
     [3] 
     [4] cd $root_dir
     [5] 
     [6] redo=1
     [7] data_root_dir="$HOME/data/VOCdevkit"
     [8] dataset_name="VOC0712"
     [9] mapfile="$root_dir/data/$dataset_name/labelmap_voc.prototxt"
    

执行完毕后将会自动在$data_root_dir目录下生成VOC0712子目录,里边包含了从数据集VOC2007和VOC2012提取的图片和标记信息,并构建caffe能够高效读取的lmdb文件。

ok,到这里VOC的训练数据就准备完毕了,很多人都说需要创建数据软连接,其实创不创建没有什么关系,软连接就相当于一种快捷方式,其核心是在自己的训练/测试网络中指定自己刚刚生产lmdb格式数据的地址而已,所以建议不创建,到时候直接在网络文件中指定数据源就ok了,不然很多人会晕这是什么。

下面就可以开始训练模型了。

把VOC的标签映射文件复制过来:这对应VOC数据集的21个训练类别

cp $CAFFE_ROOT/data/VOC0712/labelmap_voc.prototxt $CAFFE_ROOT/examples/MobileNet-SSD/labelmap.prototxt

生成模型文件:

./gen_model.sh 21

这里21指的是VOC数据集包括21个类别(含负样本20+1),生成的模型文件默认放置在example目录下,末尾的类别会自动设为我们输入的类别数;

如果需要修改训练参数和测试参数,可以分别修改目录下的solver_train.protxtsovler_test.protxt文件,
默认使用example目录下的训练模型和测试模型;

如果需要指定GPU和初始化权重,可以修改目录下的train.shtest.sh文件,这里可以加载作者提高的预训练模型,这样加快网络收敛速度。

除此之外,如果需要继续之前中断的训练,还可以指定snapshot参数。

运行train.sh脚本(运行前像训练其他网络一样,检查一下网络我那件,数据源路径,slover,加载的预训练模型等是否一一对应)

训练一定step后/或者发现loss差不多已经收敛,停掉训练。

最后,为了提高模型运行速度,作者在这里将bn层合并到了卷积层中,相当于bn的计算时间就被节省了,对检测速度可能有小幅度的帮助,运行merge_bn.py:其命令为:

其中model:为去除了bn层的网络文件,weights:为你自己训练的模型

python merge_bn.py --model deploy.prototxt --weights snapshot/mobilenet_iter_xxxxxx.caffemodel

这样就得到了可用于测试的模型了,这里说明去掉bn层后的模型不能同来继续恢复训,接下来就可以在demo.py中加载模型,进行测试了。

训练VOC格式的数据集相对来说还是比较简单,难点在于参数调试等如何让模型有一个良好的效果,下一篇会介绍一下如何用Mobilenet-ssd训练人脸检测模型。

你可能感兴趣的:(Mobilenet-SSD训练VOC数据集)