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数据集,
下载以下数据集,并解压到同一个目录下:
解压后目录如下图所示:
因为这里下载网上较慢,我只下载了VOC2012用做训练集;然后用caffe-ssd提供的 VOC数据集处理工具 对数据集进行处理:
$CAFFE_ROOT/data/VOC0712/create_list.sh
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)"
$CAFFE_ROOT/data/VOC0712/create_data.sh
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.protxt
和sovler_test.protxt
文件,
默认使用example
目录下的训练模型和测试模型;
如果需要指定GPU和初始化权重,可以修改目录下的train.sh
或test.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训练人脸检测模型。