date: 2018/08/08


上一篇文章《SSD框架解析 - 网络结构| Hey~YaHei!》和上上篇文章《MobileNets v1模型解析 | Hey~YaHei!》我们分别解析了SSD目标检测框架和MobileNet v1分类模型。

在本文中将会把两者综合起来,一起分析chuanqi305是如何把MobileNets和SSD结合得到MobileNet-SSD网络的。


网络结构


参照 MobileNet-SSD(chuanqi305)的caffe模型(prototxt文件) | github,绘制出MobileNet-SSD的整体结构如下(忽略一些参数细节):

mobilenet-ssd.jpg


图片中从上到下分别是MobileNet v1模型(统一输入大小为300x300)、chuanqi305的Mobilenet-SSD网络、VGG16-SSD网络。且默认都是用3x3大小的卷积核,除了MobileNet-SSD的Conv14_1、Conv15_1、Conv16_1、Conv17_1和VGG16-SSD的Conv8_1、Conv9_1、Conv10_1、Conv11_1用的是1x1大小的卷积核。

图中每个立方体代表对应层的输出特征图;


MobileNet-SSD   |   VGG16-SSD
----------------+-----------------
19 x 19 x  512  |   38 x 38 x  512
10 x 10 x 1024  |   19 x 19 x 1024
 5 x  5 x  512  |   10 x 10 x  512
 3 x  3 x  256  |   5  x  5 x  256
 2 x  2 x  256  |   3  x  3 x  256
 1 x  1 x  128  |   1  x  1 x  128


BN层合并


对比chuanqi305的 train模型deploy模型 还能发现一件有趣的事情——

deploy模型中的BN层和scale层都不见啦!!!

BN层是这样随随便便就能丢弃的么?没道理啊!


几经辗转,查阅资料之后发现,原来BN层是可以合并进前一层的卷积层或全连接层的,而且这还有利于减少预测用时。

参考《Real-time object detection with YOLO - Converting to Metal


合并的原理:卷积层、全连接层和BN层都是纯粹的线性转换。


数学推导也很简单:

假设图片为 x ,卷积层权重为 w 。

那么对于卷积运算有,

BN层运算为,

代入变为,

两式对比可以得到,

注意,其中 都是训练出来的量,在预测阶段相当于一个常量。


原文摘录如下:

Converting to Metal.png


本文介绍了chuanqi305的MobileNet-SSD网络是如何组成的以及实用的MergeBN技术,在下一篇博文中我们将尝试用该网络进行训练并部署在RK3399的Tengine平台上,并且进一步对该网络进行改进以满足我们实际场景的需要。