您的位置:首页 > 理论基础 > 计算机网络

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

2017-11-01 09:48 726 查看
之前用了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 := 1
28 CUDA_DIR := /usr/local/cuda
36 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/include
70 # Anaconda Python distribution is quite popular. Include path:
71 # Verify anaconda location, sometimes it's in root.
72 ANACONDA_HOME := $(HOME)/anaconda2
73 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/lib
84 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/VOCdevkit
13 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 = 4
338 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 parameters
367    '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开始愉快地训练地输出了,训练很慢。。。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: