FightingCV

V1

2022/12/19阅读:59主题:默认主题

【CV知识点汇总与解析】| 技术发展篇

【CV知识点汇总与解析】| 技术发展篇

【写在前面】

本系列文章适合Python已经入门、有一定的编程基础的学生或人士,以及人工智能、算法、机器学习求职的学生或人士。系列文章包含了深度学习、机器学习、计算机视觉、特征工程等。相信能够帮助初学者快速入门深度学习,帮助求职者全面了解算法知识点。

1、图像分类网络的发展

LeNet(1998)

网络基本架构为:conv1 (6) -> pool1 -> conv2 (16) -> pool2 -> fc3 (120) -> fc4 (84) -> fc5 (10) -> softmax,括号内数字表示channel数。这是个很小的五层网络(特指卷积或者全连接层),图中subsampling下采样是pooling layer, kernel size 是2x2, stride 2,feature map刚好为上层一半大小。该网络用于对支票(还是邮政?)的手写数字分类。网络受制于当时的硬件条件和训练数据大小,并未带来神经网络的爆发。

AlexNet(2012)

AlexNet是2012年ILSVRC(ImageNet Large Scale Visual Recognition Challenge)冠军,以高出10%的正确率力压第二名,这是CNN网络首次获胜,将卷积神经网络的巨大优势带入人们视野。ILSVRC 历年top5错误率及神经网络深度(层数):

AlexNet基本架构为:conv1 (96) -> pool1 -> conv2 (256) -> pool2 -> conv3 (384) -> conv4 (384) -> conv5 (256) -> pool5 -> fc6 (4096) -> fc7 (4096) -> fc8 (1000) -> softmax。AlexNet有着和LeNet相似网络结构,但更深、有更多参数。conv1使用11×11的滤波器、步长为4使空间大小迅速减小(227×227 -> 55×55)。

AlexNet的特点:

  • 第一次使用ReLU激活函数,有更好的梯度特性、训练更快。
  • 使用了随机失活(dropout),p=0.5,可以防止过拟合
  • 大量使用数据扩充技术
  • 使用SGD,Momentum 0.9
  • learning rate 1e-2 (0.01), reduced by 10 manually when val accuracy plateaus
  • L2 weight decay 5e-4
  • batch size 128
  • 使用Norm layers(不再使用)

由于当时GPU不够强大,网络有两个分支,放在两个GPU上分别训练,当前已经不存在这个问题了,因此也常见到只有一个分支的网络结构图。另外需说明的是,图上表的输入图片大小是224,其实应该是227,否则网络跑不通。

VGGNet

需注意的是,VGGNet之所以使用更小的kernel,是因为3个3x3的conv和1个7x7的conv具有的感受野是相同的,但是3层3x3带来更深的网络结构,非线性更强,另外参数量更少:3*(3x3xCxC)vs 7x7xCxC (这里C是channel数,同时认为kernel数也是C,等价于输出的channel是C)

tricks:由于主要参数消耗在fc6(各层命名见后图)这一层,可以替换为对上一层7x7x512的feature map 在7x7上做average pooling,得到512个数,也是可行的(Andrej Karpathy在2016 CS231n课上讲的),这点在GoogLeNet中有应用。

VGGNet特点:

  • 结构简单,只有3x3,stride 1,pad 1的卷积和2x2,stride 2的max pooling,每过一次pooling,feature map大小降低一半。
  • 参数量大(参数和内存解析见上图)
  • 合适的网络初始化
  • 使用batch normalization
  • FC7提取的特征对其他任务有帮助。FC7始于AlexNet,表示某一全连接层,该层提取特征用于分类任务。

VGG16中对各层的命名如下:

GoogLeNet

GoogLeNet是ILSVRC2014冠军,取名源自作者所处单位Google,其中L大写是为了向LeNet致敬。该网络如之前所提,使用average pooling代替了最耗参数(相应的也最耗时间)的全连接层,同时使用inception模块来代替简单的卷积层(inception的名字来源于盗梦空间中的we need to go deeper的梗);另外,使用1x1的卷积进行了降维。

ResNet

ResNet是ILSVRC 2015的冠军。ResNet最大的贡献在于解决了深层网络难以训练的问题(反向传播梯度弥散),它的网络深度达到了152层!ResNet网络结构如下图所示。

ResNet网络之所以能够训练下去主要得益于residual block(残差模块)的使用。残差模块是一种短路连接,如下图所示。通常的“plain”结构如左侧所示,而residual网络如右侧所示,加了一条短路路径,使得前面的输入可以直接连接到输出。原本图中几层要学习的是H(x),现在由于多加了输入x的影响,网络层需要拟合的变成了F(x) = H(x) - x

ResNet的特点:

  • 使用BN(Batch Normalization)layer在每个conv layer后
  • 每个residual block包含两个3x3 conv layer
  • 周期性的使用stride 2 pooling降低维度,相当于除2
  • 最耗时的FC层使用pool代替
  • SGD + Momentum 0.9
  • learning rate 0.1, divided by 10 when validation error plateaus
  • Mini-batch size 256
  • Weight decay 1e-5
  • 不使用dropout

DenseNet

受Resnet的启发,提出了dense block模块,每个dense block里的任何两层之间都有连接,从而有着比ResNet更加密集的残差,

以下是一个dense block

整个网络是由数个dense block以及其他的卷积、池化、全连接等层拼接而成:

SqueezeNet

SqueezeNet引入了一个叫Fire Module的模块,用的都是小尺寸卷积,甚至1x1卷积。

同样受ResNet启发,引入bypass结构,本质上就是ResNet的Residual block

MobileNet

MobileNet改造了卷积,引入了Depthwise Convolution。

普通卷积为大家所熟悉,对于每个卷积核,所有的源feature map都参与卷积,计算量较大。

而depthwise卷积长这样

卷积核就这么被降维了,一个featuremap单独产生一个featuremap,卷积不改变featuremap个数,不同featuremap之间在卷积中不产生直接作用。

如果想改变featuremap个数,可以在后面接上Pointwise Convolution,说白了就是1x1卷积核的卷积。

因为Depthwise Convolution的参与,MobileNet做到了更少的参数。而Depthwise Convolution本质上是Group Convolution的极端形式,所谓Group Convolution就是把传入的featuremap分组,然后每一组以普通卷积的形式计算,然后整体输出。然而,Group Convolution此时也并非新概念,早在AlexNet时,我们回忆一下这两个并行,实际上就是Group Convolution。

甚至在LeNet中的C3层里,Group Convolution就已经在使用。

MobileNet这是一种在嵌入式上使用较多的网络,被使用在了各种场合,所以叫MobileNet。

ShuffleNet

ShuffleNet也一样,引入DepthWise Convolution和Group Convolution。

之所以叫ShuffleNet,在于网络从中间引入shuffle,将各组feature map重新分组送入下一轮分组卷积

之前MobileNet采用1x1卷积将不同的featuremap关联在一起,而这里只是简单的用shuffle来进行信息渗透,不产生计算量,以之达到类似的效果。

Vision Transformer(ViT)

ViT的标题中的“AN IMAGE IS WORTH 16X16 WORDS”可以看出,ViT将图片分割为固定数量的patches,每个patch都视作一个token,同时引入了多头自注意力机制去提取包含了关系信息的特征信息。

同样,缺点也非常明显,

  1. 计算量大:计算复杂度与token的平方相关,如果输入特征图为56*56的特征图,那么会涉及3000+长宽的矩阵运算,计算量很大,同时在原始Transformer计算过程中token数以及hidden size保持不变,所以后来的研究者采用了几个方法是解决计算量大的问题。参考resnet结构使用金字塔的结构,越高层的token数量越少;使用局部窗口自注意,分别考虑特征图的一部分做自注意,再想办法把这些局部信息进行交互;使用卷积来代替全连接层,以减少参数;在生成Q,K,V过程中,对K,V的特征图或者是token做池化,减少计算复杂度。
  2. 训练数据需求量高:自注意力机制的inductive-bias较CNN和RNN弱,CNN具有空间不变形的假设,所以它可以用卷积核去滑窗处理整个特征映射;而RNN具有时间不变性,但是自注意力机制并没有这些假设,所以需要更多的数据去学习这些假设。
  3. 堆叠层数数量受限:存在过度平滑问题,不同的Block之间的相似性随着模型的加深而增加;不同token之间的相似性随着随着模型的加深而增加。
  4. 模型本身无法编码位置:需要各种各样的位置编码,目前了解到的包括:固定的与可学习的,绝对的和相对的,还有利用卷积的特性使用卷积去作为位置编码的。
  5. 参数数量大:以上4点导致的问题 或者 也可以与第2点合并

根据以上这5条缺点,后人有针对性地做出了一些改进。

PVT(Pyramid Vision Transformer)

引入了CNN的金字塔结构,在stage之间通过卷积缩小token数量,并对 X→(Q,K,V) 中的 K,V 使用额外的卷积核以缩小特征映射图的大小。PVT一般用于目标检测的特征提取阶段,用提取多层次语义特征。

Swin Transformer

同样引入了金字塔结构,在stage之间通过拼接2*2范围内的像素点,再通过线性变换缩小token数量,并使用局部窗口降低计算复杂度,使用窗口移动使前后两层不同的窗口存在信息交流。

Twins

相较于PVT,Twins使用了相对位置编码去替代绝对位置编码,并使用局部与全局自注意力机制交替的结构一定程度上降低了计算量。

DeiT

引入了Distillation token,在训练过程中引入了蒸馏损失。算是缩小版的ViT。

CeiT

CeiT

使用多个卷积与池化代替ViT中的一个大卷积;在FFN中引入Depth Width Conv2d以融合不同patch的信息。

LV-ViT

使用Re-labeling给予每个patch一个软标签进行辅助训练。

DeepViT

在Re-Attention模块中增大了hidden size

CaiT

CaiT使用了LayerScale,使用可学习参数对FFN/SA的输出在hidden size维度进行不同程度的缩放。此外,加大深层的Dropout,并使用Talking-Heads Attention。再者将CLS延后,具体为什么这么做可以看下论文。

Refiner

在经过softmax的自注意力图后使用线性变换在head处提升维度,经过Depth Width Conv2d增强局部信息交互,再通过线性变换映射回原维度。

DVT

DVT认为每个图像都有自己的特征,理想情况下,tokens数量应以每个单独的输入为条件。事实上,对于相当多的“简单”图像,它们可以用仅仅数量的 4x4 标记准确预测,而只有一小部分“难”图像需要更精细的表示。

LeViT

用于快速推理的视觉Transformer。

ViT-Lite

紧凑型Vision Transformer,更小更简单。

Mobile-ViT

参数个数小于MobileNetv3同时精确率和召回率较MobileNetv3有一定的提升。

2、语义分割网络的发展

► 基于全卷积的对称语义分割模型

1.FCN

首先将一幅 RGB 图像输入到卷积神经网络后,经过多次卷积及池化过程得到一系列的特征图,然后利用反卷积层对最后一个卷积层得到的特征图进行上采样,使得上采样后特征图与原图像的大小一样,从而实现对特征图上的每个像素值进行预测的同时保留其在原图像中的空间位置信息,最后对上采样特征图进行逐像素分类,逐个像素计算 softmax 分类损失。

主要特点:

  • **不含全连接层(fc)**的全卷积(fully conv)网络。从而可适应任意尺寸输入。
  • 引入增大数据[1]尺寸的反卷积(deconv)层,能够输出精细的结果。
  • 结合不同深度层结果的跳级(skip)结构。同时确保鲁棒性和精确性。

2.SegNet

针对 FCN 在语义分割时感受野固定和分割物体细节容易丢失或被平滑的问题, SegNet被提出。SegNet和FCN思路十分相似,编码部分主要由VGG16网络的前 13 个卷积层和 5 个池化层组成,解码部分同样也由 13 个卷积层和 5 个上采样层组成,最后一个解码器输出的高维特征被送到可训练的softmax 分类器中,用于分类每个独立的像素。特别地,SegNet 网络采用了 pooling indices 来保存图像的轮廓信息,降低了参数数量。

3.Unet及各种变体

U-net 对称语义分割模型,该网络模型主要由一个收缩路径和一个对称扩张路径组成,收缩路径用来获得上下文信息,对称扩张路径用来精确定位分割边界。U-net 使用图像切块进行训练,所以训练数据量远远大于训练图像的数量,这使得网络在少量样本的情况下也能获得不变性和鲁棒性。

主要特点:

  • U 形的对称结构,左半部分收缩路径采用卷积,RELU 和最大池化获得图像的上下文信息,右边的扩展层直接复制过来,然后裁剪到与上采样的图片大小一样,再将它们连接起来,实现了不同层特征相结合的上采样特征图。
  • 模型实现了很好的分割效果,但只能处理 2D 图像

► 基于全卷积的扩张卷积语义分割模型

基于全卷积对称语义分割模型得到分割结果较粗糙,忽略了像素与像素之间的空间一致性关系。于是 Google 提出了一种新的扩张卷积语义分割模型,考虑了像素与像素之间的空间一致性关系,可以在不增加参数量的情况下增加感受野。

1、DeepLab系列

DeepLabv1 是由深度卷积网络和概率图模型级联而成的语义分割模型,由于深度卷积网络在重复最大池化和下采样的过程中会丢失很多的细节信息,所以采用扩张卷积算法增加感受野以获得更多上下文信息。考虑到深度卷积网络在图像标记任务中的空间不敏感性限制了它的定位精度,采用了完全连接条件随机场(Conditional Random Field,CRF)来提高模型捕获细节的能力。

DeepLabv2 语义分割模型增加了 ASPP(Atrous spatial pyramid pooling)结构,利用多个不同采样率的扩张卷积提取特征,再将特征融合以捕获不同大小的上下文信息。

DeepLabv3 语义分割模型,在 ASPP 中加入了全局平均池化,同时在平行扩张卷积后添加批量归一化,有效地捕获了全局语境信息。

DeepLabv3+语义分割模型在 DeepLabv3 的基础上增加了编-解码模块和 Xception 主干网络,增加编解码模块主要是为了恢复原始的像素信息,使得分割的细节信息能够更好的保留,同时编码丰富的上下文信息。增加 Xception 主干网络是为了采用深度卷积进一步提高算法的精度和速度。在inception结构中,先对输入进行11的卷积,之后将通道分组,分别使用不同的33卷积提取特征,最后将各组结果串联在一起作为输出。

主要特点:

  • 在多尺度上为分割对象进行带洞空间金字塔池化(ASPP)
  • 通过使用 DCNNs (空洞卷积)提升了目标边界的定位
  • 降低了由 DCNN 的不变性导致的定位准确率。

2.RefineNet

RefineNet采用了通过细化中间激活映射并分层地将其连接到结合多尺度激活,同时防止锐度损失。网络由独立的RefineNet模块组成,每个模块对应于ResNet。每个RefineNet模块由三个主要模块组成,即:剩余卷积单元(RCU),多分辨率融合(MRF)和链剩余池(CRP)。RCU块由一个自适应块组成卷积集,微调预训练的ResNet权重对于分割问题。MRF层融合不同的激活物使用卷积和上采样层来创建更高的分辨率地图。最后,在CRP层池中使用多种大小的内核用于从较大的图像区域捕获背景上下文。

主要特点:

  • 提出一种多路径refinement网络,称为RefineNet。这种网络可以使用各个层级的features,使得语义分割更为精准。
  • RefineNet中所有部分都利用residual connections(identity mappings),使得梯度更容易短向或者长向前传,使段端对端的训练变得更加容易和高效。
  • 提出了一种叫做chained residual pooling的模块,它可以从一个大的图像区域捕捉背景上下文信息。

► 基于全卷积的残差网络语义分割模型

深度卷积神经网络的每一层特征对语义分割都有影响,如何将高层特征的语义信息与底层识别的边界与轮廓信息结合起来是一个具有挑战性的问题。

PSPNet

金字塔场景稀疏网络语义分割模型(Pyramid Scene Parsing Network,PSP)首先结合预训练网络 ResNet和扩张网络来提取图像的特征,得到原图像 1/8 大小的特征图,然后,采用金字塔池化模块将特征图同时通过四个并行的池化层得到四个不同大小的输出,将四个不同大小的输出分别进行上采样,还原到原特征图大小,最后与之前的特征图进行连接后经过卷积层得到最后的预测分割图像。

主要特点:

  • 金字塔场景解析网络是建立在FCN之上的基于像素级分类网络。将大小不同的内核集中在一起激活地图的不同区域创建空间池金字塔。
  • 特性映射来自网络被转换成不同分辨率的激活,并经过多尺度处理池层,稍后向上采样并与原始层连接进行分割的feature map。
  • 学习的过程利用辅助分类器进一步优化了像ResNet这样的深度网络。不同类型的池模块侧重于激活的不同区域地图。

► 基于全卷积的GAN语义分割模型

生成对抗网络模型(Generative Adversarial Nets,GAN)同时训练生成器 G 和判别器 D,判别器用来预测给定样本是来自于真实数据还是来自于生成模型。

利用对抗训练方法训练语义分割模型,将传统的多类交叉熵损失与对抗网络相结合,首先对对抗网络进行预训练,然后使用对抗性损失来微调分割网络,如下图所示。左边的分割网络将 RGB 图像作为输入,并产生每个像素的类别预测。右边的对抗网络将标签图作为输入并生成类标签(1 代表真实标注,0 代表合成标签)。

► 基于全卷积语义分割模型对比

名称 优点 缺点
FCN 可以接受任意大小的图像输入;避免了采用像素块带来的重复存储和计算的问题 得到的结果不太精确,对图像的细节不敏感,没有考虑像素与像素之间的关系,缺乏空间一致性
SegNet 使用去池化对特征图进行上采样,在分割中保持细节的完整性;去掉全连接层,拥有较少的参数 当对低分辨率的特征图进行去池化时,会忽略邻近像素的信息
Deconvnet 对分割的细节处理要强于 FCN,位于低层的filter 能捕获目标的形状信息,位于高层的 filter能够捕获特定类别的细节信息,分割效果更好 对细节的处理难度较大
U-net 简单地将编码器的特征图拼接至每个阶段解码器的上采样特征图,形成了一个梯形结构;采用跳跃连接架构,允许解码器学习在编码器池化中丢失的相关性 在卷积过程中没有加pad,导致在每一次卷积后,特征长度就会减少两个像素,导致网络最后的输出与输入大小不一样
DeepLab 使用了空洞卷积;全连接条件随机场 得到的预测结果只有原始输入的 1/8 大小
RefineNet 带有解码器模块的编码器-解码器结构;所有组件遵循残差连接的设计方式 带有解码器模块的编码器-解码器结构;所有组件遵循残差连接的设计方式
PSPNet 提出金字塔模块来聚合背景信息;使用了附加损失 采用四种不同的金字塔池化模块,对细节的处理要求较高
GCN 提出了带有大维度卷积核的编码器-解码器结构 计算复杂,具有较多的结构参数
DeepLabV3 ASPP 采用了Multigrid;在原有的网络基础上增加了几个 block;提出了ASPP,加入了 BN 不能捕捉图像大范围信息,图像层的特征整合只存在于 ASPP中
GAN 提出将分割网络作为判别器,GAN 扩展训练数据,提升训练效果;将判别器改造为 FCN,从将判别每一个样本的真假变为每一个像素的真假 没有比较与全监督+半监督精调模型的实验结果,只体现了在本文中所提创新点起到了一定的作用,但并没有体现有效的程度

3、实例分割网络的发展

3.1 DeepMask

DeepMask 网络采用 VGGNet 对输入图像提 取特征, 生成分割提议, 提取的特征为两个分支所 共享, 第 1 个分支对选中的物体预测一个分割掩码, 第 2 个分支对输入的 Patch 预测一个目标得分. 该 网络在 PASCAL VOC 2007 和 MS COCO 数据集 上进行了验证, 分割精度良好。

3.2 Fast-CNN

Fast RCNN解决了RCNN的一些问题,从而提高了目标检测能力。Fast RCNN使用检测器的端到端训练。它通过同时学习softmax分类器和类特定的BBox回归简化了训练过程,而不是像RCNN那样单独训练模型的各个组件。快速RCNN共享区域方案的卷积计算,然后在最后一个卷积层和第一个全连接层之间添加一个ROI池化层,提取每个区域方案的特征。聚类利用特征层扭曲的概念来实现图像层扭曲。将ROI池化层特征分解为一组全连通层,最后分解为目标类别预测软最大概率和类别建议精细化偏移量两层。与RCNN相比,Fast RCNN在很大程度上提高了效率,训练速度提高了3倍,测试速度提高了10倍。

3.3 Mask R-CNN (2017.3)

Mask R-CNN 由 He 等[39] 提出, 是在 Faster RCNN[40] 基础上扩展而来的一种全新的实例分割模 型. Mask R-CNN 属于两阶段方法, 第 1 阶段使用RPN (Region proposal network) 来产生 ROI (Region of interest) 候选区域. 第 2 阶段模型对每个 ROI 的类别、边界框偏移和二值化掩码进行预测. 掩码由新增加的第 3 个分支进行预测, 这是 Mask R-CNN 与其他方法的不同点. 此外, Mask R-CNN 提出了 ROIAlign, 在下采样时对像素进行对准, 使 得分割的实例位置更加准确.

RCNN集成了AlexNet和使用选择性搜索技术的区域方案。RCNN模型的训练包括以下步骤。第一步涉及计算使用选择性搜索获得的类不可知区域建议。下一步是CNN模型微调,包括使用区域建议微调预先训练的CNN模型,如AlexNet。接下来,利用CNN提取的特征来训练一组类特异性支持向量机(SVM)分类器,该分类器取代了通过微调学习的softmax分类器。然后使用CNN获得的特征对每个对象类进行类特异性边界盒回归训练。

其结构与Faster RCNN非常类似,但有3点主要区别:

  • 在基础网络中采用了较为优秀的ResNet-FPN结构,多层特征图有利于多尺度物体及小物体的检测。原始的FPN会输出P2、P3、P4与P54个阶段的特征图,但在Mask RCNN中又增加了一个P6。将P5进行最大值池化即可得到P6,目的是获得更大感受野的特征,该阶段仅仅用在RPN网络中。
  • 提出了RoI Align方法来替代RoI Pooling,原因是RoI Pooling的取整做法损失了一些精度,而这对于分割任务来说较为致命。Maks RCNN提出的RoI Align取消了取整操作,而是保留所有的浮点,然后通过双线性插值的方法获得多个采样点的值,再将多个采样点进行最大值的池化,即可得到该点最终的值。
  • 得到感兴趣区域的特征后,在原来分类与回归的基础上,增加了一个Mask分支来预测每一个像素的类别。具体实现时,采用了FCN(Fully Convolutional Network)的网络结构,利用卷积与反卷积构建端到端的网络,最后对每一个像素分类,实现了较好的分割效果。

Mask R-CNN算法的主要步骤为:

  • 首先,将输入图片送入到特征提取网络得到特征图。
  • 然后对特征图的每一个像素位置设定固定个数的ROI(也可以叫Anchor),然后将ROI区域送入RPN网络进行二分类(前景和背景)以及坐标回归,以获得精炼后的ROI区域。
  • 对上个步骤中获得的ROI区域执行论文提出的ROIAlign操作,即先将原图和feature map的pixel对应起来,然后将feature map和固定的feature对应起来。
  • 最后对这些ROI区域进行多类别分类,候选框回归和引入FCN生成Mask,完成分割任务。

总的来说,在Faster R-CNN和FPN的加持下,Mask R-CNN开启了R-CNN结构下多任务学习的序幕。它出现的时间比其他的一些实例分割方法(例如FCIS)要晚,但是依然让proposal-based instance segmentation的方式占据了主导地位(尽管先检测后分割的逻辑不是那么地自然)。

Mask R-CNN利用R-CNN得到的物体框来区分各个实例,然后针对各个物体框对其中的实例进行分割。显而易见的问题便是,如果框不准,分割结果也会不准。因此对于一些边缘精度要求高的任务而言,这不是一个较好的方案。同时由于依赖框的准确性,这也容易导致一些非方正的物体效果比较差。

3.4 PANet

PANet 是 Liu 等[41] 提出的一种两阶段实例分 割模型. 为了缩短信息通路, 该模型利用低层精确 的定位信息提升特征金字塔, 创建了自底向上的路 径增强. 为了恢复候选区域和所有特征层之间被破 坏的信息通路, Liu 等[41] 开发了自适应特征池化, 用 来汇聚每个候选区域所有特征层的特征. 此外, 模 型用全连接层来增强掩码预测, 由于具有全卷积网 络的互补特性, 模型获得了每个候选区域的不同视 图. 由于这些改进, PANet 在 MS COCO 2017 实 例分割任务上排名第一. 提出了一种用于实例分割任务的基于框架,旨在提高信息的流动。改进了深层网络的特征层次,在底层使用与定位相关的特定信号。这个过程称为自底向上路径增强。它使得底层和深层网络顶层特征之间的信息路径更短。还提出了一种被称为自适应特性池的技术,它将特征网格和所有层次的特征联系起来。由于这种技术,在每一级特征的相关信息流到后续子网络用于产生建议。一个备用的分支段捕获各种提议视图,以增强生成掩码的预测

3.5 YOLCAT(2019.4)

  • YOLACT将掩模分支添加到现有的一阶段(one-stage)目标检测模型,其方式与Mask R-CNN对 Faster-CNN 操作相同,但没有明确的定位步骤
  • YOLACT将实例分割任务拆分成两个并行的子任务:(1)通过一个Protonet网络, 为每张图片生成 k 个 原型mask;(2)对每个实例,预测k个的线性组合系数(Mask Coefficients)。最后通过线性组合,生成实例mask,在此过程中,网络学会了如何定位不同位置、颜色和语义实例的mask。
  • YOLACT将问题分解为两个并行的部分,利用 fc层(擅长产生语义向量)和 conv层(擅长产生空间相干掩模)来分别产生“掩模系数”和“原型掩模” 。然后,因为原型和掩模系数可以独立地计算,所以 backbone 检测器的计算开销主要来自合成(assembly)步骤,其可以实现为单个矩阵乘法。通过这种方式,我们可以在特征空间中保持空间一致性,同时仍然是一阶段和快速的。

Backbone:Resnet 101+FPN,与RetinaNet相同;Protonet:接在FPN输出的后面,是一个FCN网络,预测得到针对原图的原型mask;Prediction Head:相比RetinaNet的Head,多了一个Mask Cofficient分支,预测Mask系数,因此输出是4*c+k。

可以看到head上增加了一支mask系数分支用于将prototypes进行组合得到mask的结果。当然按NMS的位置看,其同样需要有bbox的准确预测才行,并且该流程里不太适合用soft NMS进行替代。需要注意的是,在训练过程中,其用groundtruth bbox对组合后的全图分割结果进行截取,再与groundtruth mask计算损失。这同样需要bbox结果在前作为前提,以缓解前后景的像素不均衡情况。

至于后续的YOLCAT++,则主要是加入了mask rescoring的概念和DCN结构,进一步提升精度。(1)参考Mask Scoring RCNN,添加fast mask re-scoring分支,更好地评价实例mask的好坏;(2)Backbone网络中引入可变形卷积DCN;(3)优化了Prediction Head中的anchor设计。

3.6 PolarMask (2019.10)

PolarMask则是进一步细化了边界的描述,使得其能够适应mask的问题。PolarMask最重要的特点是:(1) anchor free and bbox free,不需要出检测框;(2) fully convolutional network, 相比FCOS把4根射线散发到36根射线,将instance segmentation和object detection用同一种建模方式来表达。

PolarMask 基于极坐标系建模轮廓,把实例分割问题转化为实例中心点分类(instance center classification)问题和密集距离回归(dense distance regression)问题。同时,我们还提出了两个有效的方法,用来优化high-quality正样本采样和dense distance regression的损失函数优化,分别是Polar CenterNess和 Polar IoU Loss。没有使用任何trick(多尺度训练,延长训练时间等),PolarMask 在ResNext 101的配置下 在coco test-dev上取得了32.9的mAP。 这是首次,证明了更复杂的实例分割问题,可以在网络设计和计算复杂度上,和anchor free物体检测一样简单。

PolarMask网络架构图

整个网络和FCOS一样简单,首先是标准的backbone + fpn模型,其次是head部分,我们把fcos的bbox分支替换为mask分支,仅仅是把channel=4替换为channel=n, 这里n=36,相当于36根射线的长度。同时我们提出了一种新的Polar Centerness 用来替换FCOS的bbox centerness。可以看到,在网络复杂度上,PolarMask和FCOS并无明显差别。

3.7 SOLO (2019.12)

SOLO将一张图片划分S×S的网格,这就有了S*S个位置。不同于TensorMask和DeepMask将mask放在了特征图的channel维度上,SOLO参照语义分割,将定义的物体中心位置的类别放在了channel维度上,这样就保留了几何结构上的信息。

本质上来说,一个实例类别可以去近似一个实例的中心的位置。因此,通过将每个像素分类到对应的实例类别,就相当于逐像素地回归出物体的中心、这就将一个位置预测的问题从回归的问题转化成了分类的问题。这么做的意义是,分类问题能够更加直观和简单地用固定的channel数、同时不依赖后处理方法(如分组和学习像素嵌入embedding)对数量不定的实例进行建模。

对于尺寸的处理,SOLO使用了FPN来将不同尺寸的物体分配到不同层级的特征图上,依次作为物体的尺寸类别。这样,所有的实例都被分别开来,就可以去使用实例类别去分类物体了。

SOLO网络架构图

SOLO将图片划分成S×S的网格,如果物体的中心(质心)落在了某个网格中,那么该网格就有了两个任务:(1)负责预测该物体语义类别(2)负责预测该物体的instance mask。这就对应了网络的两个分支Category Branch和Mask Branch。同时,SOLO在骨干网络后面使用了FPN,用来应对尺寸。FPN的每一层后都接上述两个并行的分支,进行类别和位置的预测,每个分支的网格数目也相应不同,小的实例对应更多的的网格。

Category Branch:Category Branch负责预测物体的语义类别,每个网格预测类别S×S×C,这部分跟YOLO是类似的。输入为Align后的S×S×C的网格图像,输出为S×S×C的类别。这个分支使用的损失函数是focal loss

Mask Branch:预测instance mask的一个直观方法是类似语义分割使用FCN,但FCN是具有空间不变性(spatiallly invariant)的,而我们这边需要位置上的信息。因此,作者使用了CoordConv,将像素横纵坐标x,y(归一化到[-1,1])与输入特征做了concat再输入网络中。这样输入的维度就是 HW(D+2)了。

3.8 RDSNet(2019.12)

RDSNet方法的出发点是检测阻碍不应该成为分割效果的阻碍,两种应该循环相互促进。有可能存在的情况是分割本身是比较准确的,但是因为定位不准,导致分割结果也比较差;这时候如果能提前知道分割的结果,那么检测的结果也会更好些。

有用到YOLCAT的方式,去获得提取获取分割结果。当然这里从embedding的角度出发,还结合了前后景的处理(实验中说明前后景correlation比单前景linear combination要好)。得到bbox预测结果后是需要进行NMS,以及expand操作的,以确保尽可能多的有效区域被选进来(训练时1.5,测试时1.2)。之后再通过Mask-based Boundary Refinement模块对物体的边框进行调整

3.9 PointRend (2019.12)

PointRend借鉴了Render的思想,在尺度方式变化时由于采样的方式(不是连续坐标的设定吗),使得锯齿现象不会很明显。因此PointRend是利用一种非均匀采样的方式来确定在分辨率提高的情况下,如何确定边界上的点,并对这些点归属进行判别。本质上其实是一个新型上采样方法,针对物体边缘的图像分割进行优化,使其在难以分割的物体边缘部分有更好的表现。

PointRend 方法要点总结来说是一个迭代上采样的过程

while 输出的分辨率 < 图片分辨率:

  1. 对输出结果进行2倍双线性插值上采样得到 coarse prediction_i。
  2. 挑选出 N 个“难点”,即结果很有可能和周围点不一样的点(例如物体边缘)。
  3. 对于每个难点,获取其“表征向量”,“表征向量”由两个部分组成,其一是低层特征(fine-grained features),通过使用点的坐标,在低层的特征图上进行双线性插值获得(类似 RoI Align),其二是高层特征(coarse prediction),由步骤 1 获得。
  4. 使用 MLP 对“表征向量”计算得到新的预测,更新 coarse prediction_i 得到 coarse prediction_i+1。这个 MLP 其实可以看做一个只对“难点”的“表征向量”进行运算的由多个 conv1x1 组成的小网络。

3.10 BlendMask (2021.1)

BlendMask是一阶段的密集实例分割方法,结合了Top-down和Bottom-up的方法的思路。它通过在anchor-free检测模型FCOS的基础上增加了Bottom Module提取low-level的细节特征,并在instance-level上预测一个attention;借鉴FCIS和YOLACT的融合方法,提出了Blender模块来更好地融合这两种特征。最终,BlendMask在COCO上的精度(41.3AP)与速度(BlendMask-RT 34.2mAP, 25FPS on 1080ti)都超越了Mask R-CNN。

detector module直接用的FCOS,BlendMask模块则由三部分组成:bottom module用来对底层特征进行处理,生成的score map称为Basetop layer串接在检测器的box head上,生成Base对应的top level attention;最后是blender来对Base和attention进行融合。

BlendMask 的优势

  • 计算量小:使用一阶段检测器FCOS,相比Mask R-CNN使用的RPN,省下了对positon-sensitive feature map及mask feature的计算,
  • 还是计算量小:提出attention guided blender模块来计算全局特征(global map representation),相比FCN和FCIS中使用的较复杂的hard alignment在相同分辨率的条件下,减少了十倍的计算量;
  • mask质量更高:BlendMask属于密集像素预测的方法,输出的分辨率不会受到 top-level 采样的限制。在Mask R-CNN中,如果要得到更准确的mask特征,就必须增加RoIPooler的分辨率,这样变回成倍增加head的计算时间和head的网络深度;
  • 推理时间稳定:Mask R-CNN的推理时间随着检测的bbox数量增多而增多,BlendMask的推理速度更快且增加的时间可以忽略不计
  • Flexible:可以加到其他检测算法里面

3.11 TensorMask

TensorMask将实例分割视为 4D 张量预测, TensorMask 表示的核心想法是使用结构化的 4D tensors 表示空间域上的 mask

TensorMask 是一个 dense sliding-window 实例分割框架,首次在定性和定量上都接近于 Mask R-CNN 框架。TensorMask 为实例分割研究建立了一个概念互补的方向。

3.12 主要方法在在COCO数据集上的指标对比:

4、为什么要设计残差连接

深度CNN网络达到一定深度后再一味地增加层数并不能带来进一步地分类性能提高,反而会招致网络收敛变得更慢,原因就是网络退化。于是ResNet提出了res-block结构,

思想其实很朴素,resblock基于一个假设:当把浅层网络特征恒等映射传到深层网络时,深层网络的效果一定会比浅层网络好(至少不会差),所以resblock构造了一个恒等映射,就是增加了一个跳跃结构,让前面的信息直接流入后面的网络层,这样就不怕网络退化了。简化了学习过程,增强了梯度传播

5、讲一下 mobileNet系列,ResNet系列

mobileNet系列

  1. MobileNet V1

    是谷歌在2017年提出了,专注于移动端或者嵌入式设备中的轻量级CNN网络。该论文最大的创新点是,提出了深度可分离卷积(depthwise separable convolution)。前面已经讲过,不再赘述

    v1中使用了RELU6作为激活函数,这个激活函数在float16/int8的嵌入式设备中效果很好,能较好地保持网络的鲁棒性。

  2. MobileNet V2

    时隔一年,谷歌的又一力作。V2在V1的基础上,引入了Inverted Residuals和Linear Bottlenecks。本人水平有限,Inverted Residuals和Linear Bottlenecks暂时扯不清楚。

  3. MobileNet V3

    发表于2019年,该v3版本结合了v1的深度可分离卷积、v2的Inverted Residuals和Linear Bottleneck、SE模块,提出了h-switch作为激活函数,利用NAS(神经结构搜索)来搜索网络的配置和参数(NAS就是不需要人工调参,自动搜索,要先给出搜索空间和搜索方式)。

ResNet系列

  1. ResNet V1

    提出了残差模块,不再赘述。

  2. Wider ResNet

    Wider ResNet提出,每一个Block中的卷积应该更宽。

    就是将残差模块的恒等映射分支加宽,网络的深度和宽度都可以使得网络性能变好。

  3. ResNetv2

    ResNetv2加入了BN,探索了ReLU和BN放不同的位置对网络性能的影响。

    最终选择了(e)。ResNetv2采用pre-activation,先BN再ReLU再权重层。这使得网络更易于训练并且泛化性能也得到提升。

  4. ResNeXt

    ResNeXt 同时采用 VGG 堆叠的思想和 Inception 的 split-transform-merge 思想。主要就是单路卷积变成多个支路的多路卷积,不过分组很多,结构一致,进行分组卷积。

  5. DenseNet

    DenseNet针对ResNet中的shorcut进行改进。既然shortcut有效,多加点!

    DenseNet 的核心思想:对每一层都加一个单独的 shortcut,使得任意两层之间都可以直接相连。

6、手写nms

def nms(dets, thresh):
  x1 = dets[:, 0#xmin
  y1 = dets[:, 1#ymin
  x2 = dets[:, 2#xmax
  y2 = dets[:, 3#ymax
  scores = dets[:, 4#confidence
  
  areas = (x2 - x1 + 1) * (y2 - y1 + 1# 每个boundingbox的面积
  order = scores.argsort()[::-1# boundingbox的置信度排序
  keep = [] # 用来保存最后留下来的boundingbox
  while order.size > 0:     
      i = order[0# 置信度最高的boundingbox的index
      keep.append(i) # 添加本次置信度最高的boundingbox的index
  
      # 当前bbox和剩下bbox之间的交叉区域
      # 选择大于x1,y1和小于x2,y2的区域
      xx1 = np.maximum(x1[i], x1[order[1:]]) #交叉区域的左上角的横坐标
      yy1 = np.maximum(y1[i], y1[order[1:]]) #交叉区域的左上角的纵坐标
      xx2 = np.minimum(x2[i], x2[order[1:]]) #交叉区域右下角的横坐标
      yy2 = np.minimum(y2[i], y2[order[1:]]) #交叉区域右下角的纵坐标
  
      # 当前bbox和其他剩下bbox之间交叉区域的面积
      w = np.maximum(0.0, xx2 - xx1 + 1)
      h = np.maximum(0.0, yy2 - yy1 + 1)
      inter = w * h
  
      # 交叉区域面积 / (bbox + 某区域面积 - 交叉区域面积)
      ovr = inter / (areas[i] + areas[order[1:]] - inter)
      #保留交集小于一定阈值的boundingbox
      inds = np.where(ovr <= thresh)[0]
      order = order[inds + 1]
  
  return keep

【项目推荐】

面向小白的顶会论文核心代码库:https://github.com/xmu-xiaoma666/External-Attention-pytorch[2]

面向小白的YOLO目标检测库:https://github.com/iscyy/yoloair[3]

面向小白的顶刊顶会的论文解析:https://github.com/xmu-xiaoma666/FightingCV-Paper-Reading[4]

【技术交流】

已建立深度学习公众号——FightingCV,关注于最新论文解读、基础知识巩固、学术科研交流,欢迎大家关注!!!

请关注FightingCV公众号,并后台回复ECCV2022即可获得ECCV中稿论文汇总列表。

推荐加入FightingCV交流群,每日会发送论文解析、算法和代码的干货分享,进行学术交流,加群请添加小助手wx:FightngCV666,备注:地区-学校(公司)-名称

参考:

https://cloud.tencent.com/developer/article/1677166[5]

https://blog.csdn.net/Enochzhu/article/details/106690236[6]

https://zhuanlan.zhihu.com/p/432126306[7]

https://cloud.tencent.com/developer/article/1759087[8]

https://zhuanlan.zhihu.com/p/412675982[9]

https://www.nowcoder.com/issue/tutorial?zhuanlanId=qMKkxM\&uuid=6395f27385714c55a5964e5c1be5a67f[10]

参考资料

[1]

大数据: https://cloud.tencent.com/solution/bigdata?from=10680

[2]

https://github.com/xmu-xiaoma666/External-Attention-pytorch: https://github.com/xmu-xiaoma666/External-Attention-pytorch

[3]

https://github.com/iscyy/yoloair: https://github.com/iscyy/yoloair

[4]

https://github.com/xmu-xiaoma666/FightingCV-Paper-Reading: https://github.com/xmu-xiaoma666/FightingCV-Paper-Reading

[5]

https://cloud.tencent.com/developer/article/1677166: https://cloud.tencent.com/developer/article/1677166

[6]

https://blog.csdn.net/Enochzhu/article/details/106690236: https://blog.csdn.net/Enochzhu/article/details/106690236

[7]

https://zhuanlan.zhihu.com/p/432126306: https://zhuanlan.zhihu.com/p/432126306

[8]

https://cloud.tencent.com/developer/article/1759087: https://cloud.tencent.com/developer/article/1759087

[9]

https://zhuanlan.zhihu.com/p/412675982: https://zhuanlan.zhihu.com/p/412675982

[10]

https://www.nowcoder.com/issue/tutorial?zhuanlanId=qMKkxM&uuid=6395f27385714c55a5964e5c1be5a67f: https://www.nowcoder.com/issue/tutorial?zhuanlanId=qMKkxM&uuid=6395f27385714c55a5964e5c1be5a67f

分类:

人工智能

标签:

人工智能

作者介绍

FightingCV
V1

公众号 FightingCV