用SSD训练自己的数据集(VOC2007格式)

用SSD训练自己的数据集(VOC2007格式)

一. 配置caffe环境

ubunt16.04下caffe环境安装

二. 下载,编译及测试ssd源码

(一)下载源码

github链接

或者执行 git clone https://github.com/weiliu89/caffe.git

(二)编译源码

编译过程中可能会出现缺失一些python模块,按提示安装

(1)修改Markfile配置

参考ubunt16.04下caffe环境安装
中修改Makefile.config

(2)编译python接口

make -j8  多核编译,时间较长
make pycaffe

(3)下载训练好的模型

下载链接原始链接可能需要,可自行找其他链接下载,文件名为models_VGGNet_VOC0712_SSD_300x300.tar.gz,解压至CAFFE_ROOT/目录下

(4) 下载VOC2007数据

cd $CAFFE_ROOT/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
tar -xvf VOCtrainval_11-May-2012.tar
tar -xvf VOCtrainval_06-Nov-2007.tar
tar -xvf VOCtest_06-Nov-2007.tar

(5) 产生LMDB格式数据集文件

在data/VOC0712/中生成trainval.txt, test.txt, and test_name_size.txt in
可以通过修改create_list.sh和create_data.sh来针对自己的数据集产生LMDB文件

cd $CAFFE_ROOT
./data/VOC0712/create_list.sh
./data/VOC0712/create_data.sh

产生的trainval和test数据位于CAFFE_ROOT/data/VOCdevkit/VOC0712/lmdb/VOC0712_trainval_lmdb和CAFFE_ROOT/data/VOCdevkit/VOC0712/lmdb/VOC0712_test_lmdb

(三)测试源码

score_ssd_pascal.py里面的test_image_num应该是4952的,源程序有报相关错误可以改一下

cd $CAFFE_ROOT
python examples/ssd/score_ssd_pascal.py

应该会得到0.77*左右的MAP score,说明模型可以正常运行

三. 使用SSD训练自己的数据集

(一)下载预训练参数及模型

下载链接

(二)制作数据集

制作自己的图片数据集(VOC2007格式)

将制作好的VOC2007文件夹放置在data/VOCdevkit文件夹下,没有则新建VOCdevkit文件夹

(三)修改配置文件

(1)修改$CAFFE_ROOT/data/$dataset_name/下create_list.sh和create_data.sh两个文件
create_list.sh:

root_dir=$HOME/data/VOCdevkit/
sub_dir=ImageSets/Main
bash_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
for dataset in trainval test
do
dst_file=$bash_dir/$dataset.txt
if [ -f $dst_file ]
then
    rm -f $dst_file
fi
for name in VOC2007 VOC2012  # 数据集文件夹名称$dataset_name

create_data.sh,其中数据集文件夹名称$dataset_name,这个文件夹是指存放create_list.sh和create_data.sh两个文件及labelmap文件的地方的文件夹名,建议和VCOdevkit下面的数据集名称一致

data_root_dir="$HOME/data/VOCdevkit" # 为了避免错误可以用绝对路径
dataset_name="VOC0712"
mapfile="$root_dir/data/$dataset_name/labelmap_voc.prototxt"

(2)修改$CAFFE_ROOT/data/$dataset_name/下labelmap_voc.prototxt

name: "cat" # xml文件中的类别名
label: 1
display_name: "Cat" # 检测时显示的类别名

(3)修改训练文件$CAFFE_ROOT/data/example/ssd/ssd_pascal.py

  1. 改了数据集文件夹名称的话讲程序路径里面的VOC0712都替换为你的数据集名称$dataset_name,否则不需要修改,为了不要覆盖原来的模型建议修改数据集名称
  2. 类别数:num_classes = open(label_map_file).read().count(‘label’)
  3. 测试图片数量:num_test_image = len(open(name_size_file).readlines())

(4)$CAFFE_ROOT/example/ssd/ssd_pascal.py参数设置

  1. solver_param 中’max_iter’: 120000, 表示最大迭代次数
  2. solver_param 中’test_interval’: 10000, 每次评估模型效果的间隔迭代次数,用于观察是否收敛及过拟合
  3. 其他参数可酌情修改

(四)开始训练

cd $CAFFE_ROOT
python example/ssd/ssd_pascal.py

成功训练后在ssd_pascal.py文件中的job_dir路径下生成日志文件,snapshot_dir路径下存有断点模型,训练中断后会从最大迭代次数继续训练,

(五)测试训练结果

(1)修改example/ssd/score_ssd_pascal.py文件
修改方式与ssd_pascal.py相同,其中在det_eval_param添加’show_per_class_result’: True参数可现实每个类别的AP(average precision)

(2)进行测试

cd $CAFFE_ROOT
python example/ssd/score_ssd_pascal.py

四. 曾出现过的bug

(1) 原文件中num_classes和num_test_image经常变动的话容易忘记修改而报错,可通过读取labelmap和testfile自动得到相应数值

(2) 修改test_batch_size似乎不影响测试速度

你可能感兴趣的:(深度学习,图像检测)