目标检测:Mobilenet-SSD实现
1.引言
众所周知,mobilenet以快著称。所以单一的Mobilenet分类不是关注重点,如何将其应用到目标检测领域才是关键,本文重点研究:Mobilenet+SSD实现。
Mobilenet的速度是很快的,如果配上Depthwise layer,在TitanX应该能达到150fps,如果能将检测精度提升到70%以上,将会是一个很好的检测网络。
2.实现
GitHub项目地址:https://github.com/chuanqi305/MobileNet-SSD
chuanqi大神在Caffe平台上初步实现了Mobilenet-SSD
模型分析
通过分析Mobilenet的模型结构和MobileNet-SSD的模型结构, 可以看出,conv13是骨干网络的最后一层,作者仿照VGG-SSD的结构,在Mobilenet的conv13后面添加了8个卷积层,然后总共抽取6层用作检测,没有使用分辨率为38*38的层。
网络复现
1. 本机配置
Ubuntu16.04
CUDA 8.0 & CUDNN5.1
python2.7
caffe-ssd
opencv3.1
2.具体实现
项目既然叫MobileNet-SSD,那首先要求能正常运行基础版本的SSD
(1)安装caffe-ssd
(2)下载MobileNet-SSD
(3)将MobileNet-SSD放入caffe-ssd中examples文件夹中
(4)下载模型或自己训练产生模型
基本过程如下:
克隆项目:
$ git clone https://github.com/chuanqi305/MobileNet-SSD.git
可以在主目录(/home目录)下得到MobileNet-SSD文件夹,其中重要文件简介如下:
- template 存放4个网络定义的公用模板,可以由gen.py脚本修改并生成
- MobileNetSSD_deploy.prototxt 运行网络定义文件
- solver_train.prototxt 网络训练超参数定义文件
- solver_test.prototxt 网络测试超参数定义文件
- train.sh 网络训练脚本
- test.sh 网络测试脚本
- gen_model.sh 生成自定义网络脚本(调用template文件夹内容)
- gen.py 生成公用模板脚本(暂不用)
- demo.py 实际检测脚本(图片存于images文件夹)
- merge_bn.py 合并bn层脚本,用于生成最终的caffemodel
接下来下载已经训练好的caffemodel放入项目文件夹:
模型下载地址:https://pan.baidu.com/s/1sln2cUx
最后打开demo.py脚本,根据个人情况修改以下路径:
caffe_root = '/home/yaochuanqi/ssd/caffe/'
net_file= 'MobileNetSSD_deploy.prototxt'
caffe_model='MobileNetSSD_deploy.caffemodel'
test_dir = "images"
然后运行demo.py脚本:
./demo.py
之后就可以看到检测结果了,检测截图如下:
当然,模型训练,我们也可以用自己的数据集来训练这个MobileNet-SSD模型。
Mobilenet使用Depthwise Layer
理论上Mobilenet的运行速度应该是VGGNet的数倍,但实际运行下来并非如此,即使是合并bn层后的MobileNet-SSD也只比VGG-SSD快那么一点点,主要的原因是Caffe中暂时没有实现depthwise convolution,目前都是用的group。这里group相当于一个for循环,需要依次计算,如果能使用深度卷积,那就可以一次性计算完,节省不少时间。
经过大量实验,终于找到能让mobilenet加速的方法,项目地址:DepthwiseConvolution:https://github.com/yonghenglh6/DepthwiseConvolution, 十分感谢该项目作者。
用上了depthwise convolution layer,对于mobilenet的提速十分明显,可以说是立竿见影。