点击蓝字关注我们

AI研习图书馆,发现不一样的世界

图像识别MobileNets算法解析

本篇文章来介绍一个深度学习模型轻量化和加速的算法:MobileNets,可以在基本不影响准确率的前提下大大减少计算时间和参数数量。

论文题目:MobileNets Efficient Convolutional Neural Networks for Mobile Vision Applications

论文链接:MobileNets

Caffe框架代码:MobileNet-Caffe

算法简介

深度学习网络广泛应用在图像分类,目标检测任务中,但是网络结构复杂,参数过多,计算时间过长使其不容易在移动端应用。因此像模型压缩、模型加速应该会是未来深度学习比较活跃的一个领域。

本文提出一种将传统的卷积结构改造成两层卷积结构的网络:MobileNets,采用类似ResNext里面的group操作来实现。这种新的结构可以在基本不影响准确率的前提下大大减少计算时间(约为原来的1/9)和参数数量(约为原来的1/7)。

本篇文章中若不特殊强调的话,卷积核默认都是三维,这三维分别对应长、宽和输入通道数,因为不同人对卷积核维度的理解不同。对于常规卷积而言,假设输入特征通道数是M,卷积核的长宽分别是DK和DK,卷积核的数量是N,那么可以说是有N个M*DK*DK卷积核,也可以说是有N组卷积核,每组有M个DK*DK的卷积核。不管是哪种理解,都不影响卷积层的本质:该层有N*M*DK*DK个参数。

算法笔记

MobileNet模型的核心就是将原本标准的卷积操作因式分解成一个depthwise convolution和一个1*1的卷积(文中叫pointwise convolution)操作。简单讲就是将原来一个卷积层分成两个卷积层,其中前面一个卷积层的每个filter都只跟input的每个channel进行卷积,然后后面一个卷积层则负责combining,即将上一层卷积的结果进行合并。

如下图:M表示输入特征的通道数,N表示输出特征的通道数(也是本层的卷积核个数)。因此如果假设卷积核大小是DK*DK*M*N,输出是DF*DF*N,那么标准卷积的计算量是DK*DK*M*N*DF*DF。

这个式子可以这么理解,先去掉M*N,那么就变成一个二维卷积核去卷积一个二维输入feature map;那么如果输出feature map的尺寸是DF*DF,由于输出feature map的每个点都是由卷积操作生成的,而每卷积一次就会有DK*DK个计算量,因此一个二维卷积核去卷积一个二维输入feature map就有DF*DF*DK*DK个计算量;如果有M个输入feature map和N个卷积核,那么就会有DF*DF*DK*DK*M*N计算量。

本文的算法是用上图中的(b)+(c)代替(a),接下来详细讲解下具体是怎么卷积的。

依然假设有N个卷积核,每个卷积核维度是DK*DK*M,输入feature map的通道数是M,输出feature map为DF*DF*N。那么(b)表示用M个维度为DK*DK*1的卷积核去卷积对应输入的M个feature map,然后得到M个结果,而且这M个结果相互之间不累加(传统的卷积是用N个卷积核卷积输入的所有(也就是M个)feature map,然后累加这M个结果,最终得到N个累加后的结果),注意这里是用M个卷积核而不是N个卷积核,所以(b)中没有N,只有M。因此计算量是DF*DF*DK*DK*M。(b)生成的结果应该是DF*DF*M,图中的(b)表示的是卷积核的维度。

(c)表示用N个维度为1*1*M的卷积核卷积(b)的结果,即输入是DF*DF*M,最终得到DF*DF*N的feature map。这个就可以当做是普通的一个卷积过程了,所以计算量是DF*DF*1*1*M*N(联系下前面讲的标准卷积是DF*DF*DK*DK*M*N,就可以看出这个(c)其实就是卷积核为1*1的标准卷积)。

所以最重要的来了,采用这种算法的计算量变成了DF*DF*DK*DK*M+DF*DF*M*N。具体和原来相比减少了多少计算量?可以看下面这个式子:

也就是说如果卷积核大小为3*3,那么差不多卷积操作的时间能降到原来的1/9左右!

所以看看Fig3表达的标准卷积(左边)和因式分解后的卷积(右边)的差别。注意到卷积操作后都会跟一个Batchnorm和ReLU操作。

然后看看这个网络结构:如果把depthwise和pointwise看做不同层的话,MobileNet一共包含28层。第一个卷积层不做分解,另外最后有个均值pooling层,全连接层和softmax层。这里dw就表示depthwise。

这个Table2介绍了网络中不同类型层的计算时间在总时间中的比例以及参数的数量在总的参数数量中的比例。

前面讲的都是在计算时间和参数的减少,现在看看计算准确率的对比:Table4,表示本文卷积和标准卷积的对比。可以看出Accuracy减少得不是很明显,但是却大大减少了计算时间和参数数量。

为了得到更小和更快的模型,作者介绍了两个概念:Width Multiplier 和 Resolution Multiplier。前者表示输入channel变成baseline的多少倍,如Table6;后者表示对输入图像做缩放,如Table7。

其他更多实验对比可以参看论文。

一个细节:实际中L2正则项的系数要比较小,因为本身参数已经减少许多了。

总结

作者主要提出了一种将标准卷积层拆分成两个卷积层的MolileNet网络,可以在基本保证准确率的前提下大大减少计算时间和参数数量。个人认为应该对于全卷积网络(ResNet等)的提升效果比较明显,可以在最近的object detection算法中借鉴。另外模型加速和压缩应该会是最近几年比较活跃和值得关注的领域。

图像识别系列经典算法笔记不断更新中,学习笔记,在此记录~

推荐阅读文章

[1] AI入门-人工智能的前世今生[2] AI入门-深度学习综述[3] AI入门-计算机视觉学习指南[附资源][4] 深度学习框架总结—国际篇[5] 深度学习-CNN结构设计技巧[6] 资源分享-深度学习及数据分析等资源合集

[7] 今日分享—统计学习方法

[8] 算法总结—人脸检测算法

[9] 目标检测算法-YOLOv4

[10] 项目总结—人脸检测

[11] 项目实战-人脸口罩检测

[12] 深度学习基础-二十种损失函数

[13] 深度学习-目标检测的十九个研究方向

[14] 项目实战-车辆检测案例实现

[15] Python学习-实战小案例

[16] 数据结构与算法-Python语言案例实现

......

点击"在看"了解更多精彩内容转载是一种动力 分享是一种美德公众号 :AI研习图书馆CSDN博客:算法之美DLGitHub:statisticszhang

关注AI研习图书馆,发现不一样的精彩世界

图像识别算法_图像识别—MobileNets算法详解相关推荐

  1. matlab中k-means算法_机器学习 | KMeans聚类分析详解

    大量数据中具有"相似"特征的数据点或样本划分为一个类别.聚类分析提供了样本集在非监督模式下的类别划分.聚类的基本思想是"物以类聚.人以群分",将大量数据集中相似 ...

  2. 国密算法Go语言实现(详解)(九) ——SM2(椭圆曲线公钥密码算法)

    国密算法Go语言实现(详解)(九) --SM2(椭圆曲线公钥密码算法) 原创代码:https://github.com/ZZMarquis/gm 引用时,请导入原创代码库.本文仅以注释方式详解代码逻辑 ...

  3. c语言将AOE网络的数据写入TXT文档中,数据结构与算法学习辅导及习题详解.张乃孝版-C/C++文档类资源...

    数据结构与算法学习辅导及习题详解.张乃孝版.04年10月 经过几年的努力,我深深体会到,编写这种辅导书要比编写一本湝通教材困难得多. 但愿我的上述理想,在本书中能够得以体现. 本书的组织 本书继承了& ...

  4. EMD算法之Hilbert-Huang Transform原理详解和案例分析

    目录 Hilbert-Huang Transform 希尔伯特-黄变换 Section I 人物简介 Section II Hilbert-Huang的应用领域 Section III Hilbert ...

  5. 扩展Euclidean算法求乘法逆原理详解与算法实现

    [利用扩展Euclidean算法求乘法逆] 1. Equipment (1) operating system version :WIN 10 (2) CPU instruction set: x 6 ...

  6. python模拟手写笔迹_Python实现基于KNN算法的笔迹识别功能详解

    本文实例讲述了Python实现基于KNN算法的笔迹识别功能.分享给大家供大家参考,具体如下: 需要用到: Numpy库 Pandas库 手写识别数据 点击此处本站下载. 数据说明: 数据共有785列, ...

  7. 算法问题:整数除法详解(Java方向)

    算法问题:整数除法详解(Java方向) 1.力扣题目 2.结果代码分析 3.完整的结果代码 4.代码出处和教学出处 5.博主 边学习边记录算法的学习 1.力扣题目 1.给定两个整数 a 和 b ,求它 ...

  8. 分治算法小结(附例题详解)

    分治算法小结(附例题详解) 我的理解: 分治算法我的理解就是看人下菜碟,我们要解决的问题就好像一群人构成的集体,要我们解决这个问题,那我们就要满足这群人里面每个人不同的需求,也就是写出解决的代码,把每 ...

  9. 基于密度的聚类算法(3)——DPC详解

    基于密度的聚类算法(1)--DBSCAN详解 基于密度的聚类算法(2)--OPTICS详解 基于密度的聚类算法(3)--DPC详解 1. DPC简介 2014年,一种新的基于密度的聚类算法被提出,且其 ...

  10. 【备战蓝桥】 算法·每日一题(详解+多解)-- day1

    [备战蓝桥] 算法·每日一题(详解+多解)-- day1 ✨博主介绍 什么是蓝桥杯 第一题: 第二题 第三题 第四题 第五题 第六题 第七题

最新文章

  1. Qt/Linux 下的摄像头捕获(Video4Linux2)
  2. 新媒观察:把网络安全阀抓在自己手中
  3. python统计特定类型文件数量_分享一些常见的Python编程面试题及答案
  4. tableau必知必会之通过 Tableau 计算挖掘数据真相
  5. android studio scala插件,Scala 语言开发Andorid ,开发环境的搭建(一)
  6. poj 2346(DP)
  7. 建造者模式源码解析(jdk-guava+mybatis)
  8. 程序员的项目周期(表情包版)
  9. 分布式作业 Elastic-Job 快速上手指南
  10. matlab getsplitpic,MATLAB_9-模式识别笔记
  11. Compile error: Cannot find a C++ compiler that supports both C++11 and the specified C++ flags
  12. 水晶报表中对某一栏位值进行处理_从主流报表工具的报价看报表行业的报价水深-----常用报表工具对比---主流报表价格对比...
  13. mysql relay log参数汇总
  14. pb语言是什么计算机语言,pb编程语言
  15. Oracle的学习视频
  16. Linux Stress测压工具安装与使用详解
  17. 创业者不能盲目的跟风,不然结局很凄凉
  18. MissionPlanner MP地面站添加三维地图支持
  19. Django分页+增删改查
  20. 微幅波的解析解求解及弥散方程的推导

热门文章

  1. Java知识点总结(JavaIO-File类)
  2. Android5.1 在init.rc 中添加自己的服务【转】
  3. 修炼Python基础篇-字典(Dictionary)学习
  4. 新安装的mysql设置密码
  5. 收藏一篇关于 用两个栈实现一个队列功能的帖子
  6. 转两好文防丢:Debian 版本升级/降级 Linux 应用程序失去输入焦点问题的解决...
  7. 蓝桥杯 算法提高 奥运会开幕式 deque
  8. fastjson SerializerFeature 详解
  9. python多维数据聚类可视化_基于python3的可视化数据聚类系统(k-means算法和k-中心点算法)...
  10. mac安装linux 键盘不能用了,Parallels Desktop 9在Mac虚拟机安装Linux Ubuntu系统