网络结构

参照 MobileNet-SSD(chuanqi305)的caffe模型(prototxt文件) | github,绘制出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、4、4;
    MobileNet-SSD中用的都是1x1大小的卷积核,缺省框数量依次是3、6、6、6、6、6;
    这一部分的改动不是很能理解,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]+bconv[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−−−−−−−√+β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−−−−−−−√+βbn[j]=x[i]γ⋅w[0]variance+x[i+1]γ⋅w[1]variance+…+x[i+k]γ⋅w[k]variance+γ⋅bvariance−γ⋅meanvariance+β

两式对比可以得到,

wnew=γ⋅wvariance−−−−−−−√wnew=γ⋅wvariance

βnew=β+γ⋅bvariance−−−−−−−√−γ⋅meanvariance−−−−−−−√=β+γ(b−mean)variance−−−−−−−√βnew=β+γ⋅bvariance−γ⋅meanvariance=β+γ(b−mean)variance

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

原文摘录如下:

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

MobileNet-SSD网络解析相关推荐

  1. 【opencv有趣应用】基于MobileNet + SSD的物体检测

    今天学习使用另外的模型进行物体检测 当前目标检测的算法有很多,如rcnn系列.yolo系列和ssd,前端网络如vgg.AlexNet.SqueezeNet,一种常用的方法是将前端网络设为MobileN ...

  2. android sdk 固态硬盘,使用TVM在android中进行Mobilenet SSD部署

    所谓TVM,按照正式说法:就是一种将深度学习工作负载部署到硬件的端到端IR(中间表示)堆栈.换一种说法,可以表述为一种把深度学习模型分发到各种硬件设备上的.端到端的解决方案,关于更多TVM的信息大家可 ...

  3. mmdetection学习系列(1)——SSD网络

    1. 概述 本文是本人自学mmdetection的第一篇文章,因为最近一段时间在做目标检测相关的内容,为了更好地研究领域内相关知识,特意花了不少时间熟悉mmdetection框架(https://gi ...

  4. 【轻量型卷积网络】ResNeXt网络解析

    [轻量型卷积网络]ResNeXt网络解析 文章目录 [轻量型卷积网络]ResNeXt网络解析 1. 介绍 2. 模型 2.1 组卷积 2.2 ResNeXt-block 2.3 为什么 group = ...

  5. 使用自己的数据训练MobileNet SSD v2目标检测--TensorFlow object detection

    使用自己的数据训练MobileNet SSD v2目标检测--TensorFlow object detection 1. 配置 1.1 下载models-1.12.0 2. 准备数据集 3. 配置文 ...

  6. 【神经网络】(14) MnasNet 代码复现,网络解析,附Tensorflow完整代码

    各位同学好,今天和大家分享一下如何使用 Tensorflow 复现谷歌轻量化神经网络 MnasNet  通常而言,移动端(手机)和终端(安防监控.无人驾驶)上的设备计算能力有限,无法搭载庞大的神经网络 ...

  7. 【深度学习】Swin-Unet图像分割网络解析(文末提供剪枝仓库)

    [深度学习]Swin-Unet图像分割网络解析(文末提供剪枝仓库) 文章目录 1 概述 2 Swin-Unet架构 3 bottleneck理解 4 具体结构4.1 Swin Transformer ...

  8. opencv 多线程_深度学习和OpenCV的对象检测(MobileNet SSD视频流实时识别)

    上期文章,我们分享了如何使用opencv 与MobileNet SSD模型来检测给定的图片,有网友反馈能否提供一下视频流的实时检测代码,其实我们在分享人脸识别的时候,分享了如何使用cv2.videoC ...

  9. 『TensorFlow』SSD源码学习_其二:基于VGG的SSD网络前向架构

    Fork版本项目地址:SSD 参考自集智专栏 一.SSD基础 在分类器基础之上想要识别物体,实质就是 用分类器扫描整张图像,定位特征位置 .这里的关键就是用什么算法扫描,比如可以将图片分成若干网格,用 ...

  10. cnn stride and padding_经典CNN网络解析

    NIN网络-Network In Network​blog.csdn.net 梦里寻梦:(四十二)通俗易懂理解--CNN网络框架演进:LeNet至DenseNet​zhuanlan.zhihu.com ...

最新文章

  1. goto是python的保留字吗,基于python goto的正确用法说明
  2. 把tomcat默认的8080段口改成80端口
  3. js最全的十种跨域解决方案
  4. linux apache 大文件,Apache下error.log文件太大的处理方法
  5. Docker 安装Node-Exporter+ Prometheus Server +Grafana
  6. 应用计算机金融 pdf,金融保险计算机技术及其在金融业中的应用.pdf
  7. Java 并发 —— 读写锁(ReadWriteLock)
  8. Oracle中记录被锁解锁方法
  9. 电机与拖动知识点及试题
  10. 一款陌生人状态社交软件--same
  11. 回归分析beta值的标准_标准回归系数引用
  12. 高速收费员招聘考试题计算机题,高速公路面试题和考官题本及答案44套
  13. 谷哥学术2022年2月资源分享下载列表 08/20
  14. monkey 压力测试 随机
  15. luogu P2852 [USACO06DEC]牛奶模式Milk Patterns
  16. JAVA 实现《飞机大战-II》游戏
  17. 什么是Socket?websocket和socket区别?
  18. 电磁兼容(EMC)的标准与测试内容(三)
  19. java 内存 pdf_jvm内存模型高清版.pdf
  20. 上海交通大学转专业到计算机,上海交通大学转专业难吗

热门文章

  1. S-MAC协议的相关知识
  2. Mysql数据库的tinyint类型
  3. Windows10 adb安装与环境变量配置
  4. word图片自动生成域
  5. 使用深度学习自动给图片生成文字描述
  6. KMSpico 无后门下载
  7. mysql sql练习题_Mysql----sql语句练习题(一)
  8. Java基础知识——JavaIO
  9. Termux安装Python
  10. 使用robo3t操作mongodb以及文档的插入、更新、删除以及查询操作