目标检测: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目标检测_github


移动端目标检测模型 mobilenet目标检测_目标检测_02


当然,模型训练,我们也可以用自己的数据集来训练这个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的提速十分明显,可以说是立竿见影。