SSD区域检测网络配置+训练自己的数据

来源:互联网 发布:乐视视频mac 编辑:程序博客网 时间:2024/06/17 12:17

之前用了faster-rcnn训练数据后,查资料的时候发现了ssd这种end-to-end的检测网络,所以决定跑一跑之前制作好的数据集试试。网上教程不是很多,而且感觉步骤简略,自己琢磨了一晚上走了很多弯路才勉强把网络跑起来,所以决定写一个踩坑跳坑小教程。

SSD的安装

安装还是比较简单的,直接从github上下载然后创建分支:

git clone https://github.com/weiliu89/caffe.git
cd caffe
git checkout ssd(出现“分支”则说明copy-check成功)

编译ssd caffe

cd /home/usrname/caffe
cp Makefile.config.example Makefile.config

之前我在其他地方编译过caffe,这里再编译一次,我就把已经写好的Makefile.config文件复制了一份,大概改的地方有这几个,改的时候把前面的’#’去掉就行,首先是有GPU的,用cudnn加速,第5行、28行、36行、50行:

5  USE_CUDNN := 128 CUDA_DIR := /usr/local/cuda36 CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \50 BLAS := atlas

Python我用的是anaconda库的python2.7,所以要把默认的去掉,

68 #PYTHON_INCLUDE := /usr/include/python2.7 \69 #        /usr/lib/python2.7/dist-packages/numpy/core/include70 # Anaconda Python distribution is quite popular. Include path:71 # Verify anaconda location, sometimes it's in root.72 ANACONDA_HOME := $(HOME)/anaconda273 PYTHON_INCLUDE := $(ANACONDA_HOME)/include \74       $(ANACONDA_HOME)/include/python2.7 \75       $(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include

还有

83 #PYTHON_LIB := /usr/lib84 PYTHON_LIB := $(ANACONDA_HOME)/lib

下面一步比较重要,要加上hdf的路径,不然会报错找不到

93 # Whatever else you find you need goes here.94 INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/95 LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial

修改完毕Makefile.config之后,进行编译,注意是在caffe的目录底下进行,而且要用root模型,要不然会报错:
对‘TIFFIsTiled@LIBTIFF_4.0’未定义的引用

sudo su
make all -j16
make test -j16

编译caffe完成后是编译pycaffe,需要退出之前的root模式,不然会报错
‘找不到’Python.h’

make pycaffe -j16

制作自己数据

1、这里我就不跑VOC2007和VOC2012了,直接上自己的数据集。制作自己数据的方法和faster-rcnn很相似,这方面的教程也很多,我主要用到的标签标注软件是labelImg,可以搜索下该软件怎么下载使用。使用自己数据集的方法:

cd /data
mkdir mydataset
mkdir VOCdevkit
cd VOCdevkit
mkdir mydataset

2、在建立好的caffe/data/VOCdevkit/mydataset文件夹中拷贝Annotations,ImageSets,JPEGImages。没有下图的lmdb文件夹,这是后来生成lmdb数据生成的。
这里写图片描述
其中Annotations放标注好的XML文件,ImageSets放训练和测试数据,JPEGImages是源图片文件

3、回到data文件夹下,再把/data/VOC0712目录下的create_list.sh 、create_data.sh、labelmap_voc.prototxt 这三个文件拷贝到/mydataset下:

cp VOC0712/create* ./mydataset
cp VOC0712/label* ./mydataset

4、修改create_list.sh :

12 root_dir=$HOME/你的caffe路径/data/VOCdevkit13 for name in mydataset

如果自己数据集的图片不是jpg格式是png格式的话还需要修改:

25 sed -i "s/$/.png/g" $img_file

5、修改create_data.sh:

7 data_root_dir="$HOME/你的caffe路径/data/VOCdevkit"8 dataset_name="mydataset"

png图片的话还需要修改:

17 extra_cmd="--encode-type=png --encoded"

6、修改labelmap_voc.prototxt, 此文件定义label
有些教程上没有说修改这个文件,导致我创建lmdb文件的时候出现错误:

F1031 21:35:56.938661  4014 io.cpp:292] Unknown name: glasses*** Check failure stack trace: ***    @     0x7fc3963d05cd  google::LogMessage::Fail()    @     0x7fc3963d2433  google::LogMessage::SendToLog()    @     0x7fc3963d015b  google::LogMessage::Flush()    @     0x7fc3963d2e1e  google::LogMessageFatal::~LogMessageFatal()    @     0x7fc3969e2151  caffe::ReadXMLToAnnotatedDatum()    @     0x7fc3969e3a38  caffe::ReadRichImageToAnnotatedDatum()    @           0x4052b3  main    @     0x7fc395312830  __libc_start_main    @           0x406149  _start    @              (nil)  (unknown)

这里需要把这个文件中的标签改成你自己设置的标签,第0个标签background不需要修改。
7、运行生成lmdb文件
先在example文件夹中创建mydataset文件夹存放lmdb文件:

cd example
mkdir mydataset

回到caffe根目录然后运行

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

运行的时候如果出现

Traceback (most recent call last):    label_map = caffe_pb2.LabelMap()AttributeError: 'module' object has no attribute 'LabelMap'

需要添加环境变量

sudo gedit ~/.bashrc
在最后一行添加:

export PYTHONPATH=$你的caffe路径/python:$PYTHONPATH

source ~/.bashrc

成功的话会输出
这里写图片描述

这里写图片描述

8、 下载预训练模型VGG_ILSVRC_16_layers_fc_reduced.caffemodel
链接:http://pan.baidu.com/s/1miDE9h2 密码:0hf2,下载完成后保存在:

caffe/models/VGGNet/

链接是从别人教程中搬运过来的,原文:http://lib.csdn.net/article/deeplearning/53859

9、数据集准备完毕后就是修改/examples/ssd/ssd_pascal.py

cd /examples/ssd
vim sd_pascal.py, 修改如下:
57行: train_data路径;
59行:test_data路径;
197-203行:save_dir、snapshot_dir、job_dir、output_result_dir路径;
216-220行: name_size_file、label_map_file路径;
223行:num_classes 修改为1 + 类别数
315行:num_test_image:测试集图片数目

另外, 如果你只有一个GPU, 需要修改285行:,否则,训练的时候会出错。

gpus=”0,1,2,3” ===> 改为”0”

如果出现:

Check failed: error == cudaSuccess (2 vs. 0) out of memory

说明GPU内存不足,需要改小batch_size:

336 # Divide the mini-batch to different GPUs.337 batch_size = 4338 accum_batch_size = 4

如果还出现:

Train net output #0: mbox_loss = nan (* 1 = nan loss)

损失值溢出,需要修改base_lr,乘以0.1,改为0.0001,在ssd_pascal.py文件中修改

365 solver_param = {366    # Train parameters367    'base_lr': base_lr*0.1,

把base_lr*0.1变成0.0001,ctrl+c中断程序后,再重新执行,需要删除/home/idc/deep/gjj/caffe/models/VGGNet/VOC0712/SSD_300x300路径下的临时文件,不然会从中断点继续执行。

10、愉快地开始训练
完成以上步骤后就可以看见GPU开始愉快地训练地输出了,训练很慢。。。
这里写图片描述

原创粉丝点击