SSD(Single Shot MultiBox Detector)算是一个比较不错的目标检测算法,主攻方向是速度,当然精度也比Yolo提高了一些,最近在ubuntu16.04下实现了代码运行,此博文主要内容来自原作者的github,加上了一些个人理解,欢迎探讨。
PS:SSD代码和模型常常在更新,我给的链接可能不是最新版,如运行出错请参看官方github。
准备工作:linux+cuda+caffe是标配,我就不详述了,推荐博客:
ubuntu16.04+nvidia gt740m+cuda7.5+caffe安装、测试经历 http://blog.csdn.net/WoPawn/article/details/52313914
下面正式开始:
git clone https://github.com/weiliu89/caffe.git
cd caffe
git checkout ssd
说明:SSD采用的是在caffe文件夹中内嵌例程的方式,作者改动了原版caffe,所以你需要把原来的caffe文件夹移除,git命令会新建一个带有SSD程序的caffe文件夹,当然,这个新的caffe要重新编译一次。
cd /home/mx/caffe
cp Makefile.config.example Makefile.config
1)Makefile.config文件中
将USE_CUDNN :=1取消注释
2)Makefile.config文件中
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include后面打上一个空格,
然后添加/usr/include/hdf5/serial, 如果没有这一句会报一个找不到hdf5.h的错误
3)makefile文件中
替换NVCCFLAGS += -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
为NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
保存退出。
继续输入命令
make -j8 #8线程
make py
make test -j8
make runtest -j8 #貌似不是必须的,跑一遍用了10多分钟
节省时间的做法是,直接下载原作者最终弄好的模型:
http://www.cs.unc.edu/~wliu/projects/SSD/models_VGGNet_VOC0712_SSD_300x300.tar.gz
解压后将voc0712文件夹放入/home/mx/caffe/models/VGGNet/之下
OR:条件较好的同学可以下载图片数据和预训练模型,进行finetuning,得到最终可用的模型,步骤如下:
1)下载预训练模型
https://gist.github.com/weiliu89/2ed6e13bfd5b57cf81d6
将其放入新建的文件夹/home/mx/caffe/models/VGGNet/
2)下载voc2007和voc2012数据集
cd /home/mx/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
解压文件,按照顺序来
cd /home/mx/data
tar -xvf VOCtrainval_11-May-2012.tar
tar -xvf VOCtrainval_06-Nov-2007.tar
tar -xvf VOCtest_06-Nov-2007.tar
3)将图片转化为LMDB文件,用于训练
cd /home/mx/caffe
./data/VOC0712/create_list.sh
./data/VOC0712/create_data.sh
echo "export PYTHONPATH=/home/username/caffe/python:$PYTHONPATH" >> ~/.profile
source ~/.profile
echo $PYTHONPATH #检查环境变量的值
设好环境变量后,重新运行命令就不会出错了
4)训练模型(finetuning)
cd caffe/
python examples/ssd/ssd_pascal.py
4.演示效果
PS:之前有说过,SSD代码和模型常在更新,如果有同学遇到“shape mismatch. Source param shape is 12 512 3 3 (55296); target param shape is 16 512 3 3 (73728)”这种错误,请一定去github下载最新的模型。
SSD的作者在/home/mx/caffe/examples/ssd/文件夹下,放了好几个Python文件,都是直接调用,可以检测图片,视频,以及电脑前置摄像头
1)图片测试集
python examples/ssd/score_ssd_pascal.py
2)电脑前置摄像头
python examples/ssd/ssd_pascal_webcam.py
下图为检测效果,身在实验室,只能对准天花板了:
3)视频检测
python examples/ssd/ssd_pascal_video.py
当然,这样直接跑肯定不行,要先用vim打开该文件,定位到51行,修改视频路径为已有本地视频,然后运行才不报错。
博主在youtube下载了一段车载视频,以下是检测效果图,还不错:
原作者说SSD运行时能有几十帧,可是人家用的是Titan X,我运行时只有10帧只能是GTX850M显卡太渣了。。。
参考文献:https://github.com/weiliu89/caffe/tree/ssd
下一步方向:研究SSD的python源代码,然后训练和检测自己的数据