前言
Mobilenet是针对移动端提出来的一种轻量级网络模型结构。其创新性地应用了深度可分离卷积技术来大大减少网络参数和计算量。业界比较流行的做法就是,将它应用到目标检测领域中,和SSD模型相结合,形成一种新的高效目标检测算法模型叫Mobilenet-SSD。
环境搭建
上面已提到,Mobilenet-SSD是在SSD基础上引入了Mobilenet这种新型卷积网络所形成的一种高效的轻量级目标检测模型。所以我们的环境也是基于SSD框架(其环境搭建可以参考我的博客:https://blog.csdn.net/ltshan139/article/details/100932628)来运行。换句话说,首先必须保证SSD框架代码能够编译、运行正常。然后再开始Mobilenet-SSD的搭建。
1)获取代码到本地,其中路径xxx要根据自己平台情况来设定。
git clone https://github.com/chuanqi305/MobileNet-SSD.git xxx/mobilenet_ssd
2)修改demo.py 如下所示。
caffe_root = '/work/xxx/caffe_ssd/'
... ...
net_file= 'deploy.prototxt'
caffe_model='mobilenet_iter_73000.caffemodel'
test_dir = "images"
其中,caffe_root是SSD框架的根目录。 net_file,caffe_model以及test_dir也需要根据自己的情况来指定。这里的值都是缺省值。
Demo运行
如果SSD基础框架已经搭建好了,我们可以在修改完demo,py就能运行推理mobilenet-ssd模型来识别测试图片了。
重点来了,这时很可能会遇到下面的问题:
I0920 15:01:10.332813 4189 net.cpp:408] conv12/dw -> conv12/dw
F0920 15:01:11.168864 4189 cudnn_conv_layer.cpp:53] Check failed: status == CUDNN_STATUS_SUCCESS (4 vs. 0) CUDNN_STATUS_INTERNAL_ERROR
网上说是运行权限问题,运行demo.py时前面加sudo即可。但我试验了一下,问题依旧存在。
一个临时的解决办法就是将deploy.txt中的"#engine: CAFFE"的注释符号#去掉,即使用CAFFE的cpu方式(也叫group方式)来实现depthwise conv。 里面有13个(conv1/dw~conv13/dw)地方需要修改,如下所示。
修改完后再运行,就能看到测试图片的检测结果了,如下所示。
结论
对于CUDNN_STATUS_INTERNAL_ERROR,目前一个临时解决办法就是使用caffe cpu方式来执行深度可分离卷积,这意味着经典的caffe框架对dw的gpu实现方式有bug。 因为cpu方式会导致识别速度很慢,所以接下来有机会我们来探讨一下如何修改caffe框架来支持gpu实现depthwise convolution。