mobilenet-ssd

网络结构

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

图片中从上到下分别是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从Conv0到Conv13的配置与MobileNet v1模型是完全一致的,相当于只是去掉MobileNet v1最后的全局平均池化、全连接层和Softmax层;
  • 再看SSD部分
    • 在VGG16-SSD的方案中,用Conv6和Conv7分别替代了原VGG16的FC6和FC7;
    • MobileNet-SSD和VGG16-SSD都是从六个不同尺度的特征图上提取特征来做Detections,它们的大小为:
        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
      
      • 从通道数量上看,两者是完全一致的
      • 从特征图分辨率上看,MobileNet-SSD都只有VGG16-SSD的一半
        • 这意味着什么?
          打个比方,假设对于那个分辨率最大的特征图,都能用4x4的感受野检测出一只猫,如下图所示,黑色是头,红色是身体,棕色是腿,黄色是尾巴。


          那用MobileNet-SSD可以检测出占原图419≈0.211419≈0.211大小的猫,而VGG16-SSD却可以检测出占原图438≈0.105438≈0.105大小的猫;
        • 那为什么MobileNet-SSD为什么不和VGG16-SSD一样,从38x38分辨率的特征图开始做Detections呢?
          回到上一篇博文《SSD框架解析 - 网络结构| Hey~YaHei!》,VGG16是从Conv4_3也就是第10层卷积层取出38x38分辨率的特征图;
          再观察一下MobileNet v1-300的模型,想要取出38x38分辨率的特征图,最深也只能从Conv5也就是第6层卷积层取出,这个位置比较浅,实在很难保证网络提取出了足够有用的特征可以使用;
        • 那可以通过增加最初输入图片的分辨率来解决这个问题吗?
          倒也可以,比如把输入图片大小扩大到512x512,那么Conv11的输出就变为32x32,按上上一点的描述,可以检测出占原图432=0.125432=0.125大小的猫;
          但要付出相应的代价,仅考虑基础网络部分(Conv0到Conv13),参数数量和乘加运算量均提高为原来的 (512300)2≈2.913(512300)2≈2.913 倍(不考虑padding的影响,计算方式可以参考《MobileNets v1模型解析 - 效率比较 | Hey~YaHei!》),MobileNet本身小模型的低参数量、低运算量优势变得不再明显。
    • 还有一个小细节,观察特征图到Detections的路径
      VGG16-SSD中用的都是3x3大小的卷积核,缺省框数量依次是4、6、6、6、44
      MobileNet-SSD中用的都是1x1大小的卷积核,缺省框数量依次是3、6、6、6、66
      这一部分的改动不是很能理解,3x3卷积改1x1卷积可能是实践中发现改动后效果差不多但可以减少运算量;缺省框数量改动的原因就不得而知了~

BN层合并

对比chuanqi305的 train模型 和 deploy模型 还能发现一件有趣的事情——
deploy模型中的BN层和scale层都不见啦!!!
BN层是这样随随便便就能丢弃的么?没道理啊!

几经辗转,查阅资料之后发现,原来BN层是可以合并进前一层的卷积层或全连接层的,而且这还有利于减少预测用时。
参考《Real-time object detection with YOLO - Converting to Metal

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

数学推导也很简单:
假设图片为 xx ,卷积层权重为 ww 。
那么对于卷积运算有,

conv[j]=x[i]w[0]+x[i+1]w[1]+x[i+2]w[2]+…+x[i+k]w[k]+b


BN层运算为,

bn[j]=γ(conv[j]−mean)variance−−−−−−−⎷+β=γ⋅conv[j]variance−−−−−−−⎷−γ⋅meanvariance−−−−−−−⎷+β


代入conv[j]conv[j]变为,

bn[j]=x[i]γ⋅w[0]variance−−−−−−−⎷+x[i+1]γ⋅w[1]variance−−−−−−−⎷+…+x[i+k]γ⋅w[k]variance−−−−−−−⎷+γ⋅bvariance−−−−−−−⎷−γ⋅meanvariance−−−−−−−⎷+β


两式对比可以得到,

wnew=γ⋅wvariance−−−−−−−⎷

 

bnew=β+γ⋅bvariance−−−−−−−⎷−γ⋅meanvariance−−−−−−−⎷=β+γ(b−mean)variance−−−−−−−⎷


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

 

原文摘录如下:

Converting to Metal


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

### Mobilenet-SSD 模型介绍 Mobilenet-SSD 是一种高效的目标检测算法,它结合了MobileNet作为特征提取器和Single Shot Multibox Detector (SSD)框架来执行多类别的目标定位与分类[^2]。这种组合不仅继承了MobileNet的轻量化特性,还利用了SSD快速而准确的特点,在保持较高精度的同时极大地减少了计算成本。 #### 特点 - **轻量级设计**:通过采用深度可分离卷积代替标准卷积操作,显著降低了参数数量和运算复杂度。 - **高效率**:能够在移动设备和其他资源受限环境中实现实时性能。 - **广泛应用**:适用于多种应用场景下的对象识别任务,如自动驾驶汽车中的行人车辆监测、智能家居监控等。 --- ### 实现方式 对于Mobilenet-SSD的具体实现,通常基于Caffe或其他流行的机器学习平台完成训练过程。GitHub上存在多个开源版本可供参考,例如`LISA-on-SSD-mobilenet`项目就提供了一个完整的实现案例[^1]: 该项目包含了详细的安装指南以及预处理脚本用于准备数据集;定义网络架构并配置相应的prototxt文件以指定各层之间的连接关系;最后则是权重初始化及迭代更新策略的选择等方面的内容说明。 此外还有其他一些改进措施可以进一步提升模型的表现力,比如将批量归一化(Batch Normalization, BN)层融合到卷积层内从而加速推理阶段的速度[^4]。 ```bash # 修改merge_bn.py中的路径设置以便于BN层合并 caffe_root = '/path/to/your/caffe/' train_proto = 'MobileNetSSD_train.prototxt' train_model = 'MobileNetSSD_train.caffemodel' deploy_proto = 'MobileNetSSD_deploy.prototxt' save_model = 'MobileNetSSD_deploy.caffemodel' ``` --- ### 教程指导 要开始使用Mobilenet-SSD进行开发工作,可以从以下几个方面入手: - **环境搭建**:确保拥有合适的硬件设施(GPU/CPU),并且按照官方文档指示安装必要的依赖库和服务端口。 - **数据收集与标注**:获取高质量的数据源,并对其进行适当标记形成适合训练使用的格式。 - **模型调整与优化**:根据实际需求微调超参数设定,尝试不同的损失函数形式或是正则项强度等因素影响最终结果的好坏程度。 - **部署上线**:当满意实验成果之后就可以考虑将其集成至产品线当中去了,这期间需要注意接口兼容性和安全性等问题。 特别值得一提的是,在Raspberry Pi这样的嵌入式平台上也有成功的实践记录显示如何借助Intel NCS系列神经计算棒配合Realsense相机达成高效的视觉感知能力[^3][^5]。 --- ### 性能优化建议 为了使Mobilenet-SSD更好地适应特定的任务要求,这里给出几点常见的优化技巧: - **剪枝技术的应用**:去除那些对整体表现贡献较小甚至无益的部分节点或通道,以此达到减少冗余的目的。 - **量化感知训练**:允许在网络内部直接支持低比特宽度数值表示法,进而降低内存占用率同时也加快前向传播速率。 - **异构计算的支持**:充分利用CPU/GPU/FPGA等多种类型的处理器协同作业的优势互补效应,提高吞吐量水平。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值