1. Caffe-SSD
Mobilenet是替换了SSD中的VGG网络层,因此要首先安装caffe-ssd,参考之前的博客进行配置
https://blog.csdn.net/lukaslong/article/details/81390276
此处建议先不急着编译,转到第3节,添加DepthwiseConvolution后再进行编译。
2. MobileNet
首先把chuanqi大神的项目克隆到本地:
git clone https://github.com/chuanqi305/MobileNet-SSD.git
得到MobileNet-SSD文件夹(本人是clone到$HOME/Documents/下),其中重要文件简介如下:
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
另外项目已经包含了已经训练好的模型,mobilenet_iter_73000.caffemodel可以直接通过demo.py使用
打开demo.py,修改caffe_root为自己的caffe根目录,我的是$HOME/Documents/caffe/,然后运行:
python demo.py
会报错:CUDNN_STATUS_NOT_INITIALIZED,原因是计算力不够。
理论上Mobilenet的运行速度应该是VGGNet的数倍,但实际运行下来并非如此,前一章中,即使是合并bn层后的MobileNet-SSD也只比VGG-SSD快那么一点点,主要的原因是Caffe中暂时没有实现depthwise convolution,目前都是用的group。这里group相当于一个for循环,需要依次计算,如果能使用深度卷积,那就可以一次性计算完,节省不少时间。
上一节提到,本应更快的Mobilenet却在普通电脑上跑步起来,因此有了DepthwiseConvolution
首先克隆项目到本地:(同样是在$HOME/Documents/下)
git clone https://github.com/yonghenglh6/DepthwiseConvolution.git
将项目中的depthwise_conv_layer.hpp,depthwise_conv_layer.cpp和depthwise_conv_layer.cu这三个文件放到SSD(即caffe)的相应位置中,这里的操作是从基础卷积类中派生了深度卷积这个类,此处并不需要对caffe.proto文件进行修改。稍后,需要重新编译Caffe,这样才能识别新增的depthwise convolution layer。
接下来需要修改MobileNetSSD_deploy.prototxt,将其中所有名为convXX/dw(XX代指数字)的type从”Convolution”替换成”DepthwiseConvolution”,总共需要替换13处,从conv1/dw到conv13/dw,然后把“engine: CAFFE”都注释掉,这个新的网络文件可以另存为MobileNetSSD_deploy_depth.prototxt。在运行网络的时候,caffemodel模型不用动,只需要指定新的prototxt文件和含有depthwise convolution layer的Caffe即可。
此时再运行第2节中的demo.py方可正常运行。
4. 训练
参考我之前的博客https://blog.csdn.net/lukaslong/article/details/81509855
将数据集分成训练集和测试集的Python脚本:
或参考https://blog.csdn.net/Chris_zhangrx/article/details/80458515
另外本文参考了https://blog.csdn.net/Jesse_Mx/article/details/78680055