检测、分割用什么轻量级网络呢?

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达b5fada1891a09d18d7c547885a871316.png

由于深度学习的关系,计算机视觉领域发展迅速,各大榜单精度刷的很高,但是这些性能强大的模型却没有用武之地,在现实场景下,更加需要的是轻量级的模型。

本文将从轻量级网络(MobileNetV2、ShuffleNetV2)、轻量级检测(Light-Head R-CNN、ThunderNet)、轻量级分割(BiSeNet、DFANet)3个方面进行介绍。

轻量级网络

好的论文不仅教你为什么,而且教你怎么做,这两篇论文堪称典范,强烈建议多读几遍(就是有点难懂,流下了不学无术的泪水~~ )!!!最近ShuffleNetV2还在VALSE上拿了最佳学生论文,膜~~

1.MobileNetV2

Motivation

检测、分割用什么轻量级网络呢?_第1张图片

对于一个feature,先通过一个给定的变换规则T,将它映射到它的embedding space中,再在该embedding space中,利用一个ReLU去处理该feature,最后再把这个feature以同样的变换规则(逆方向)给映射回原始空间,这时我们会发现这个feature已经改变了。

维度低的feature,分布到ReLU的激活带上的概率小,因此经过后信息丢失严重,甚至可能完全丢失。而维度高的feature,分布到ReLU的激活带上的概率大,虽然可能也会有信息的部分丢失,但是无伤大雅,大部分的信息仍然得以保留。

由上述分析可以得到两条性质:

1.如果the manifold of interest经过ReLU之后信息保持完整,那么该操作实际上退化成了线性变换。

2.如果输入的manifold位于输入空间的低维子空间,那么ReLU能够保留输入manifold的复杂信息。

因此,the manifold of interest应该位于高维激活空间的低维子空间中。

MobileNetV2引入了两种结构Linear Bottleneck和 Inverted Residual Blocks,既能够去除高维度feature的冗余信息,又能够去除低维度feature的信息坍塌。

Linear Bottleneck

检测、分割用什么轻量级网络呢?_第2张图片

与MoblieNetV1的相同点:

都采用了Depth-wise Convolution和Point-wise Convolution组合的方式(Depth-wise Separable Convolution)来提取特征。该操作可以成倍减少时间复杂度和空间复杂度。

与MoblieNetV1的不同点:

1.在Depth-wise Separable Convolution前面添加一个Point-wise Convolution。通过PW操作升维,在高维特征空间中提取特征。

2.去掉Depth-wise Separable Convolution后面的ReLU,等价于一个Linear Bottleneck结构。

由于DW中的PW操作降维,得到一个低维特征空间,由上述分析可知,ReLU会导致低维特征空间坍塌,所以去除PW后面的ReLU可以提升性能。

Inverted Residual Block

检测、分割用什么轻量级网络呢?_第3张图片

和ResNet的相同点:

1.都采用了1x1 -> 3x3 -> 1x1的模式。

2.都使用了Shortcut操作将输入输出相加。

和ResNet的不同点:

1.ResNet通过标准卷积提取特征,MoblieNetV2通过DW卷积提取特征。

2.ResNet先降维,卷积,再升维,而MoblieNetV2先升维,卷积,再降维(即ResNet是沙漏形,而MobileNetV2是纺锤形)。

通过Linear Bottleneck和 Inverted Residual Blocks,MobileNetV2能够更加充分高效的提取特征。

该部分借鉴了2位大佬的笔记,受益匪浅~~,感兴趣的可以看看大佬的笔记

黄二二:对ResNet本质的一些思考

Michael Yuan:MobileNet V2 论文初读

2.ShuffleNetV2

Motivation

以往的工作都是用FLOPs来衡量计算复杂度的,然而FLOPs不是一个直接的指标,我们真正关心的是speed。

两个原则

FLOPs和speed指标之间的差异主要有两个原因:

1.FLOPs指标没有考虑到几个影响速度的重要因素。一个是内存访问成本(MAC),大部分来自于组卷积。另一个是并行度。

2.有着相同FLOPs的各种操作,在不同平台下的运行时间不同。

基于这些观察,作者提出2个原则:

1.使用直接指标speed。

2.该指标在相同平台下评估。

四个准则

对轻量级网络各种操作的运行时间进行分析,作者提出了4个准则:

G1:通道宽度均衡可以最小化MAC。

G2:增加组卷积会增加MAC。

G3:网络碎片化降低了并行度。

G4:元素操作是不可忽略的。

检测、分割用什么轻量级网络呢?_第4张图片

ShuffleNetV1

ShuffleNetV1采用了pointwise组卷积和类似bottleneck的结构。另外引入一个channel shuffle操作使得不同组的通道信息流通。

由上述4个准则可知,pointwise组卷积和bottleneck结构增加MAC,这违反了G1和G2。使用过多的组数违反了G3。逐元素相加违反了G4。

因此,为了实现较高的模型容量和效率,关键问题是如何保持大量且同样宽的通道,既没有密集卷积也没有太多的分组。

ShuffleNetV2

在每个单元的开始,输入通道数为c的feature通过channel split分成了2个分支,按照准则G3,一个分支作为identity,另一个分支由3个输入输出通道数相同的卷积组成(满足准则G1)。两个1x1卷积不再是group-wise的了,一部分原因是准则G2,另一部分原因是channel split操作已经分成了两组。卷积后,两个分支concat操作,因此输出通道数和输入通道数保持相同(满足准则G1)。随后引入channel shuffle使得两个分支的通道信息流通。

值得注意的是,ShuffleNetV2去掉了Add操作,元素操作比如ReLU和depth-wise convolutions只在一个分支中存在。并且3个连续的操作Concat、Channel Shuffle和Channel Split被合并成一个元素操作。按照准则G4,这些改变对精度是有帮助的。

对于带有下采样的模块,需要稍微修改一下模块,移除掉channel split操作。输出的通道数增加一倍。

官方解读:

机器之心:旷视科技提出新型轻量架构ShuffleNet V2

轻量级检测

大家都知道的One-stage轻量级检测器如YOLO系列、SSD系列就不说了,这里主要介绍一下Two-stage轻量级检测器。

3.Light-Head R-CNN

Motivation

Faster R-CNN和R-FCN在RoI warping之前和之后进行密集计算。Faster R-CNN有2个全连接层,而R-FCN产生大的score maps。这些模型由于heavy-head的设计导致速度变慢。即使显著减小backbone,计算开销还是很大。

作者使用薄的feature map和简单的R-CNN子网络(池化和单个全连接组成),使得网络的head尽可能的轻。

检测、分割用什么轻量级网络呢?_第5张图片

Basic feature extractor

对于L设置来说,用ResNet来提取特征,对于S设置来说,用Xception-like来提取特征。

Thin feature maps

检测、分割用什么轻量级网络呢?_第6张图片

作者在 outside_default.png 层后面接一个large separable convolution, outside_default.png 设置为15,对S设置 outside_default.png ,对L设置 outside_default.png 。将 outside_default.png 设置为10 x p x p(R-FCN中为classes x p x p)。large kernel的有效感受野更大,池化后的feature maps的特征会更强。

R-CNN subnet

采用一个2048维的全连接层,后面接2个并行的全连接层来预测分类和回归。

4.ThunderNet

Light-Head R-CNN的做法总的来说还是比较粗糙的,而最近新出的ThunderNet对二阶段检测器进行了全面压缩,从backbone部分到detection部分,从RPN部分到detection head部分,能压缩的全压缩了一遍。不得不说,旷视在轻量级模型设计这一块太厉害了~~ (笔记提到的6篇除了MobileNetV2全是旷视的,膜 ~~ )

Motivation

与小的backbone相结合时,Light-Head R-CNN仍然花费大量的计算在detection部分,这导致了弱backbone和强detection部分的不匹配。这种不平衡不仅导致巨大的计算冗余,而且使网络容易过拟合。

检测、分割用什么轻量级网络呢?_第7张图片

ThunderNet的优化目标是二阶段检测器中计算开销大的结构。在backbone部分,设计了轻量级网络SNet,在detection部分,借鉴Light-Head R-CNN的思路,并进一步压缩RPN和R-CNN子网络。为了避免性能的衰退,设计了2个高效的结构CEM和SAM来改善性能。

Backbone Part

输入分辨率设置为320x320,作者指出输入分辨率应该和backbone的能力相匹配。

作者提出三种SNet的backbones:SNet49推理更快,SNet535性能更好,SNet146速度和性能折中。SNet在ShuffleNetV2的基础上进行了以下两点修改:

1.将ShuffleNetV2中所有3x3 depthwise convolutions换成5x5 depthwise convolutions。

2.SNet146和SNet535中去掉Conv5并且增加前面阶段的通道数。SNet49中将Conv5的通道数压缩成512,并且增加前面阶段的通道数。

Detection Part

Compressing RPN and Detection Head

压缩RPN:用一个5x5 depthwise convolution和一个256通道的1x1卷积来替换256通道的3x3卷积。

压缩Detection Head:Light-Head R-CNN产生5 x p x p的feature map,RoI warping采用PSRoI align。

R-CNN subnet:采用一个1024维的全连接层,后面接2个并行的全连接层来预测分类和回归。

Context Enhancement Module

检测、分割用什么轻量级网络呢?_第8张图片

feature maps由三个尺度融合得到, outside_default.png 是全局平均池化得到的特征,在每个feature map上使用一个1x1卷积来压缩通道数。 outside_default.png 进行2倍上采样, outside_default.png 进行广播,得到三个分辨率相同的feature map,最后三个feature map进行特征融合。比起FPN结构,CEM只添加了2个卷积和一个fc层,计算开销上更加友好。

Spatial Attention Module

检测、分割用什么轻量级网络呢?_第9张图片

SAM的输入有两个,一个是来自RPN的feature map,另一个是来自CEM的feature map。

输出定义为:

d60ddc3133af09a876ca92556ae86cc3.png

outside_default.png 转换通道维度,使通道数匹配。

SAM利用RPN的知识来精炼feature map的特征分布,对RoI warping之前的feature map进行权值重标定。

SAM有两个函数,第一个函数,通过增强前景特征并且抑制背景特征来精炼特征分布,第二个函数,来自R-CNN子网络的梯度使得RPN的训练更加稳定。

轻量级分割

以下两篇论文剖析前人工作的部分,分析的非常透彻,很有启发性。

5.BiSeNet

Motivation

检测、分割用什么轻量级网络呢?_第10张图片

实时语义分割主要有三种做法来加速模型(图a):

1.通过crop或者resize限制输入尺寸,减少计算复杂度。但是这种方法会导致空间细节的丢失。

2.剪枝网络浅层的通道。但是这种方法会减少空间容量。

3.drop模型的最后阶段。但是这种方法丢弃了最后阶段的下采样,导致感受野不足以覆盖大的目标。

为了弥补空间细节的丢失,实时语义分割使用U-shape的结构(图b)。通过融合网络的层级特征,U-shape逐渐增加空间分辨率并且补充了一些缺失的细节。但是,这种做法有两个缺点:

1.因为高分辨率feature maps的额外计算,U-shape结构降低模型的速度。

2.剪枝和裁剪造成的空间信息的丢失是难以恢复的。

Bilateral Segmentation Network

基于对过去工作的分析,作者提出了Bilateral Segmentation Network(图c),引入了2个组件Spatial Path和Context Path,分别用来解决空间信息的丢失和感受野的不足。为了在速度不降低的情况下提升精度,作者还引入了FFM和ARM结构,分别进行两个分支的融合和精炼预测结果。

检测、分割用什么轻量级网络呢?_第11张图片

Spatial path

Spatial path包含3层,每层包含步长为2的卷积、BN和ReLU。分辨率降为输入的1/8。这种编码方式可以保留丰富的空间信息。

Context path

Context path利用轻量级网络和全局平均池化来提供大的感受野。轻量级网络能迅速下采样得到大的感受野,编码高级的语义上下文信息。随后,通过一个全局平均池化,得到最大感受野。最后,将全局池化后的feature上采样和轻量级网络的feature进行融合(最后两个阶段进行U-shape结构融合)。

Attention refinement module

ARM利用全局平均池化来捕获全局信息并且计算得到一个attention向量来引导特征学习。该设计能够精炼Context Path每个阶段的输出特征。

Feature fusion module

因为Spatial Path的输出特征是低级的,而Context Path的输出特征是高级的,所以两个分支的特征不能直接相加融合。

FFM首先将Spatial Path和Context Path分支的输出特征concat,然后利用BN来平衡特征的尺度,最后采用类SENet模块对特征进行权值重标定。

官方解读:

旷视科技:旷视科技提出双向网络BiSeNet:实现实时语义分割

ycszen:语义分割江湖的那些事儿——从旷视说起

6.DFANet

Motivation

检测、分割用什么轻量级网络呢?_第12张图片

实时语义分割的两种方法:

1.使用多个分支来进行多尺度的特征抽取并且保留图像的空间细节(图a)。但是这种方法缺乏对由并行分支结合而成的高级特征的处理,另外,并行分支的特征缺乏信息交流,还有,在高分辨率图像上额外添加分支对速度有影响。

2.使用空间金字塔池化(SPP)模块来处理高级特征(图b)。但是这种方法非常耗时。

受到以上两种方法的启发,作者提出对网络输出进行上采样,然后用另一个子网络对特征进行精炼(图c)。这种做法不同于SPP模块,feature maps在更大的分辨率上进行精炼同时能够学到亚像素的细节。但是这种方法,随着整个结构深度的增长,高维度特征和感受野通常会出现精度损失。

为了进一步提升精度,作者提出stage-level的方法为语义理解提供低级特征和空间信息(图d)。因为所有的子网络有相似的结构,stage-level方法通过conat相同分辨率的层精炼产生多阶段的上下文信息。

Deep Feature Aggregation

检测、分割用什么轻量级网络呢?_第13张图片

DFANet的特征聚合策略由子网络聚合和子阶段聚合组成。

Sub-network Aggregation

子网络聚合在网络层级进行高级特征的结合。通过将上一个bacebone的输出上采样4倍,然后输入到下一个backbone中,实现子网络聚合。子网络聚合对高级特征进行处理,用以进一步评估和重新评估更高阶的空间关系。

Sub-stage Aggregation

子阶段聚合在阶段层级进行语义合空间信息的融合。在子网络相同深度下对不同阶段进行特征融合。具体的,就是前一个子网络的某个阶段输出是下一个子网络对应阶段的输入。

子阶段聚合公式如下:

检测、分割用什么轻量级网络呢?_第14张图片

在每个阶段的开始,学习一个残差公式 outside_default.png 。然后使用concat将残差两个分支的特征融合起来。

Network Architecture

DFANet可以看成是一个encoder-decoder的结构。encoder是由3个Xception聚合的,包括子网络聚合和子阶段聚合。decoder简单的设计为特征上采样,然后融合低级和高级特征。所有backbone有相同的结构和相同预训练权重初始值。

Backbone

轻微修改的Xception模型作为backbone。保留来自ImageNet预训练的全连接层来增强语义抽取。在fc层后面使用一个1x1卷积,减少通道数和feature maps匹配。得到的编码向量对输入特征进行权值重标定。

Decoder

首先将3个backbone的深层的高级特征上采样后进行融合。然后将3个backbone的浅层的低级特征上采样后进行融合。最后将融合得到的高级特征和低级特征相加再4倍上采样得到最终的预测结果。

官方解读:

旷视科技:旷视实时语义分割技术DFANet:高清虚化无需双摄

Reference

1.MobileNetV2: Inverted Residuals and Linear Bottlenecks

2.ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design

3.Light-Head R-CNN: In Defense of Two-Stage Object Detector

4.ThunderNet: Towards Real-time Generic Object Detection

5.BiSeNet: Bilateral Segmentation Network for Real-time Semantic Segmentation

6.DFANet: Deep Feature Aggregation for Real-Time Semantic Segmentation

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

检测、分割用什么轻量级网络呢?_第15张图片

检测、分割用什么轻量级网络呢?_第16张图片

你可能感兴趣的:(卷积,python,计算机视觉,机器学习,人工智能)