Object-detection SSD安装和训练
Object-detection —— SSD(single shot multibox detector)
1. SSD的安装
自己的系统: Ubuntu
SSD GitHub: 传送门
首先先把代码拷下来:
cd path/to/your/ssd/living
git clone https://github.com/weiliu89/caffe.git
cd caffe
git checkout ssd
紧接着我们就要编译caffe:
①caffe目录下,把Makefile.config.example 改名成Makefile.config
②make
③make py
编译这一步会出现一些链接错误或者其他错误:
比如说:找不到hdf5相关的so,找不到cv相关的函数定义,找不到Openblas相关的动态链接库。
解决方法:
hdf5:
在Makefile.config文件里面添加路径:
INCULDE_DIRS := path/to/hdf5/serial
LIBRARY_DIRS := path/to/hdf5/serial
Openblas :
BLAS_INCLUDE := path/to/OpenBLAS/include
BLAS_LIB := path/to/OpenBLAS/lib
如果还有其他错误,需要自己Google了。
到此,如果没有Error出现,那么就已经编译好了caffe。
2.训练
接下来的所有步骤,都在caffe目录下面(./表示caffe目录)
在caffe目录下面,接下来需要关注的文件夹有下面几个:
data(数据集), examples(执行训练的脚本文件)
此时我们需要下载VOC2007 VOC2012 test 数据集,放在./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
上面这一步是为了得到相关的目录结构。
现在开始创建自己的数据集:
cd ./data
mkdir mydataset
cd mydataset
#把./data/VOC0712目录下面的create_list.sh create_data.sh labelmap_voc.prototxt 拷贝到mydataset下面:
cp ./data/VOC0712/create* ./
cp ./data/VOC0712/label* ./
labelmap_voc.prototxt这个文件是你要检测的object
在./data/VOCdevkit目录下面创建mydataset,并且生成自己的目录结构:
cd ./data/VOCdevkit
mkdir mydataset
cd mydataset
mkdir Annotations
mkdir ImageSets
mkdir JPEGImages
cd ImageSets
mkdir Layout
mkdir Main
mkdir Segmentation
上面这些文件夹的作用:
Annotations:存放xml文件,这个文件夹下面不能有子目录,必须全部是.xml文件。(object 的 bnbbox,name等)
ImageSets:下面三个子目录都需要放入train.txt, trainval.txt, test.txt 这三个文件(图片的文件名,不带后缀)。
JPEGImages:放入所有的图片,不能有子目录,必须所有图片塞进这个文件夹里面。
建立好这些文件夹之后,把自己的所有数据放进去包含自己数据的xml文件,图片,图片的文件名。
确保放好数据后再进行下一步
在 ./examples下面新建mydataset目录
cd ./examples
mkdir mydataset
这个mydataset目录下面是存放生成的lmdb文件的。
之后需要修改刚才那两个create开头的shell文件:
create_list.sh
把里面的root_dir改成你自己的VOCdevkit的路径
your/path/to/caffe/data/VOCdevkit
修改下面的for循环,把VOC2007 VOC2012 去掉:
for name in mydataset
保存退出create_data.sh
把里面的data_root_dir 改成VOCdevkit的路径(跟上面一样)
把dataset_name改成mydataset
保存退出
好了,现在就可以执行这两个文件了。
Warning : 注意执行顺序
./data/mydataset/create_list.sh
./data/mydataset/create_data.sh
这一步可能会出现找不到libopenblas.so.0 的错误,解决方法:在/usr/lib下面制作一个软连接,链接到具体的libopenblas.so.0所在的路径
执行完(没有错误)之后,会在./examples/mydataset/文件夹下面会生成两个链接。
接下来修改./examples/ssd/ssd_pascal.py(训练脚本)文件:
(1)在文件开头添加路径,开头类似于:
from __future__ import print_function
import sys
sys.path.insert(0, '/datastore2/lishigang/SSD/caffe/python')
(2)train_data:修改成上面生成的链接(train)
(3) test_data:修改成上面生成的链接(test)
(4)save_dir,snapshot_dir, job_dir,output_result_dir
修改成 自己的文件夹名字(前面路径不动,只修改/{}前面的就好)
(5)name_size_file, label_map_file : ./data/mydataset/test_name_size.txt
./data/mydataset/labelmap_voc.prototxt
(6) num_classes 需要检测的object数量+1
(7) num_test_image :测试图片数量
(8) gpu的编号:0,1,2,3 用哪个写哪个。
保存退出
然后退回到caffe目录下面
执行:
python ./examples/ssd/ssd_pascal.py
这样就可以训练了。
上面可能会有一些python库找不到,需要用python install来安装,具体的包和库复制错误Google,* 上面都可以找到答案。
训练完之后,可以修改ssd_detector.py中模型的路径,然后进行识别。