前言
Mobilenet SSD学习系列一(https://blog.csdn.net/ltshan139/article/details/101064590)说过,caffe_ssd框架不支持depthwise convolution的实现,只能用convolution来近似代替,所以会大大增加Mobilenet-SSD模型的推理运行。
Depthwise Convolution的gpu实现
下面来讲如何使得caffe-ssd框架支持Depthwise Convolution的cpu及gpu实现。
1)下载代码
git clone https://github.com/yonghenglh6/DepthwiseConvolution.git depthwise_conv
2)将上面这个开源项目的depthconv实现代码(*.cpp, *.cu 以及*.hpp)拷贝到caffe-ssd对应目录下
cd depthwise_conv
sudo cp -f caffe/src/caffe/layers/depthwise_conv_layer.c* /work/xxx/caffe_ssd/src/caffe/layers/
sudo cp -f caffe/include/caffe/layers/depthwise_conv_layer.hpp /work/xxx/caffe_ssd/include/caffe/layers/
3)重新对caffe-ssd框架代码进行编译:
sudo make clean
sudo make -j8
sudo make pycaffe -j8
使得caffe-ssd真正支持depthwise convolution layer的支持。
4)最后一步是 修改mobilenet-SSD下面的deploy.prototxt
sudo vi voc/MobileNetSSD_deploy.prototxt
a)把13个“engine: CAFFE” 重新都注释掉
b)conv1/dw到conv13/dw 的type从”Convolution”替换成”DepthwiseConvolution”,总共也有13个地方。
下面以conv1/dw为例来看修改内容如红框所示。
效果验证
首先在demo.py的detect函数中添加time模块如下图所示。
在gpu模式下,使用原始的deploy.prototxt,即用convlution来近似代替depthwise convolution,其检测测试图片(./images) 所花时间如下所示:
time=0.0463089942932s
time=0.0358200073242s
time=0.0369169712067s
time=0.0367810726166s
time=0.0381460189819s
time=0.037379026413s
time=0.0422718524933s
而基于update的deploy.prototxt,即真正使用depthwise convolution layer的实现后,同样测试图片识别 所消耗时间如下所示。
time=0.036953878403s
time=0.00506377220154s
time=0.00571703910828s
time=0.0045220661163s
time=0.0079579162598s
time=0.0368349552155s
time=0.0831339359283s
可以看出 后者方式所化时间大为减少。