深度学习简明教程系列 —— 经典模型(合集)

本教程是深度学习简明教程系列的第二部分,旨在提取最精炼且必备的深度学习知识点,供读者快速学习及本人查阅复习所用,大多内容是本人结合个人理解补充细节整合而成,参考链接放在文章最后。

目录

第一章  AlexNet

1.1  结构与参数

1.2  网络细节

第二章  VGGNet

2.1  VGG简介

2.2  网络结构与参数

2.3  网络细节

2.4  总结

第三章  GoogleNet

3.1  Naive Inception

3.2  GoogleNet Inception V1

3.3  GoogleNet Inception V2

3.4  GoogleNet Inception V3

3.5  GoogleNet Inception V4

3.6  Xception

第四章  ResNet

4.1  意义

4.2  网络结构

4.3  ResNet50和ResNet101

4.4  基于ResNet101的Faster RCNN

第五章  DenseNet

5.1  意义

5.2  网络结构

第六章  DetNet

6.1  背景

6.2  网络结构

第七章  目标检测系列

7.1  目标检测常见算法

7.2  R-CNN

7.3  Fast R-CNN

7.4  Faster R-CNN

7.5  YOLO v1

7.6  YOLO v2

7.7  YOLO v3

7.8  YOLO v4

7.9  YOLO v5

7.10  SSD

第八章  语义分割系列

8.1  语义分割背景

8.2  语义分割常见方法

8.3  Patch classification

8.4  全卷积网络

8.5  Encoder-Decoder架构

8.6  基于金字塔网络的模型

8.7  DeepLab家族

8.8  注意力机制模型


第一章  AlexNet

1.1  结构与参数

AlexNet的网络结构如下图所示:

深度学习简明教程系列 —— 经典模型(合集)_第1张图片 RAlexNet网络结构图

网络参数如下:

  • 卷积层:5层
  • 全连接层:3层
  • 深度:8层
  • 参数个数:60M
  • 神经元个数:650k
  • 分类数目:1000类

1.2  网络细节

1.2.1  分组卷积

由于当时的显卡容量问题,AlexNet 的60M个参数无法全部放在一张显卡上操作,所以采用了两张显卡分开操作的形式,其中在C3,R1,R2,R3层上出现交互,所谓的交互就是通道的合并,是一种串接操作。

1.2.2  全连接层

全连接层负责逻辑推断,所有的参数都需要学习得到。AlexNet中第一层全连接层用于链接卷积层的输出,并去除空间信息(通道数),是一种将三维矩阵变成向量的过程(一种全卷积操作),其操作如下:

深度学习简明教程系列 —— 经典模型(合集)_第2张图片

输入特征图是W×H×C,那么卷积核的尺寸为W×H×C,这样的话整个输入特征图就变成了一个数,一共有k个数(第一层全连接层的神经元个数),就有K个W×H×C的卷积核,所以全连接层(尤其是第一层)的参数量是非常可怕的。

1.2.3  Softmax层

Softmax层不属于CNN中单独的层,一般要用CNN做分类的话,要将神经元的输出变成概率的形式,Softmax就是做这个的:

深度学习简明教程系列 —— 经典模型(合集)_第3张图片

深度学习简明教程系列 —— 经典模型(合集)_第4张图片

通过Softmax输出的就是概率,最后我们按照这个概率的大小确定到底属于哪一类(AlexNet最后的分类数目为1000)。

1.2.4  AlexNet中的参数量

深度学习简明教程系列 —— 经典模型(合集)_第5张图片

在R1中卷积核尺寸是6×6×256而不是13×13×256,是因为在C1,C2,C5的卷积操作后,图像做了最大池化。可以看到,全连接层(尤其是第一层)参数数量占了绝大部分。

 

第二章  VGGNet

2.1  VGG简介

VGG 是 Visual Geometry Group 的缩写,它相对于 AlexNet 的改进手段在于两方面:

  1. 在第一层卷积层上采用更小的的卷积核,和更小的 stride;

  2. 在 AlexNet 的基础上加深它的卷积层数量。

2.2  网络结构与参数

AlexNet 有 5 层卷积层,而 VGG 就是针对这 5 层卷积层进行改造,共进行了 6 种配置,得到了 6 种网络结构,下面是配置图。

VGG的6种网络结构

 

深度学习简明教程系列 —— 经典模型(合集)_第6张图片 VGG网络结构图

 

VGG参数量

2.3  网络细节

2.3.1  3x3 卷积核

VGG 和 AlexNet 最大的不同就是 VGG 用大量的 3x3 卷积核替换了 AlexNet 的卷积核,3x3 卷积核是能够感受到上下、左右、重点的最小的感受野尺寸, 使用3x3 卷积核的好处在于:相同感受野下,参数更少,层数加深。对于C个通道的卷积核,7x7含有参数7x7xCxN, 3个3x3的参数个数为3x(3x3xCxN),参数大大减少。

2.3.2  1x1 卷积核

引入1x1卷积核的缘由:有的时候,我们想在不增加感受野的情况下,让网络加深,为的就是引入更多的非线性;

1x1卷积核的用处:不改变感受野的情况下,对特征图进行升维和降维,同时也加深了网络的深度(参数比3x3少)。

例如:如果输入图片通道是 3,卷积核的数量是 6 ,那么生成的 feature map 通道就是 6,这就是升维,如果卷积核的数量是 1,那么生成的 feature map 只有 1 个通道,这就是降维度。

2.3.3  其他细节

  1. 所有的 VGG 网络中,卷积核的 stride 是 1,padding 是 1

  2. max-pooling 的滑动窗口大小是 2x2 ,stride 也是 2

2.4  总结

VGG论文给出了一个非常振奋人心的结论:卷积神经网络的深度增加和小卷积核的使用对网络的最终分类识别效果有很大的作用。

 

第三章  GoogleNet

获得高质量模型最保险的做法就是增加模型的深度(层数)或者是其宽度(层核大小或者神经元数),但是这种设计思路的容易出现如下的缺陷:

  1. 参数太多,若训练数据集有限,容易过拟合;
  2. 网络越大计算复杂度越大,难以应用;
  3. 网络越深,梯度越往后传越容易消失,难以优化模型。

解决上述缺点的根本方法是将全连接甚至一般的卷积都转化为稀疏连接(参数最好大部分为0,但是,计算机软硬件对非均匀稀疏数据的计算效率很差,现在的问题是有没有一种方法,既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。

3.1  Naive Inception

Inception架构的主要思想是找出如何用密集成分来近似最优的局部稀疏解。

深度学习简明教程系列 —— 经典模型(合集)_第7张图片

Naive Inception 模块的作用:

  1. Naive Inception 模块一层内采用了不同大小的卷积核,并将输出拼接起来融合了不同尺度的特征;
  2. 使用这种结构可以让网络自行学习是否需要该层卷积或池化操作,以及使用什么类型的卷积核(部分卷积、池化模块参数为0,于是具有了稀疏性)。

3.2  GoogleNet Inception V1

Naive Inception模块中使用到了5x5的卷积核,计算量极大,为了降低参数量,Inception V1中使用了1x1的卷积核来进行降维,在3x3和5x5的过滤器前面,max pooling后面分别加上了1x1的卷积核,最后将它们全部Concatnate起来,卷积的参数数量比原来减少了4倍,得到的Inception V1模块如下图所示:

深度学习简明教程系列 —— 经典模型(合集)_第8张图片

GoogleNet Inception V1主要是围绕如下两个思路设计的:

  1. 深度文章采用了22层,为了避免梯度消失问题,GoogleNet巧妙的在不同深度处增加了两个loss来减弱梯度回传消失的现象;
  2. 宽度增加了多种核 1x1,3x3,5x5,还有直接max pooling的获得特征图,为减少参数采用了Inception V1 模块,最终GoogleNet采用了9个Inception模块化结构。

深度学习简明教程系列 —— 经典模型(合集)_第9张图片

网络的参数信息如下:

深度学习简明教程系列 —— 经典模型(合集)_第10张图片

3.3  GoogleNet Inception V2

大尺寸的卷积核可以带来更大的感受野,也意味着更多的参数,为此,作者提出可以用2个连续的3x3卷积层(stride=1)组成的小网络来代替单个的5x5卷积层,这便是Inception V2结构:

深度学习简明教程系列 —— 经典模型(合集)_第11张图片

同时,在GoogleNet Inception V2中还提出了著名的Batch Normalization。

3.4  GoogleNet Inception V3

任意 nxn 的卷积都可以通过 1xn 卷积后接 nx1 卷积来替代(节约大量参数,同时增加了深度,非线性表达能力增强),Inception V3模块考虑了使用 nx1 卷积核来取代原本3x3卷积:

深度学习简明教程系列 —— 经典模型(合集)_第12张图片

注意:作者发现在网络的前期使用这种分解效果并不好,在中度大小的feature map上使用效果才会更好(建议feature map尺寸在12到20之间,用nx1卷积来代替大卷积核,文章中设定n=7来应对17x17大小的feature map)。

根据上述研究结果,Inception V3优化了Inception模块的结构,处理35x35、17x17和8x8三种不同输入,这些Inception模块只在网络后部出现,前面还是普通卷积层。

3.5  GoogleNet Inception V4

Inception V4结构结合了残差神经网络ResNet。

3.6  Xception

当时提出Inception的初衷可以认为是:特征的提取和传递可以通过1*1卷积,3*3卷积,5*5卷积,pooling等,到底哪种才是最好的提取特征方式呢?Inception结构将这个疑问留给网络自己训练,也就是将一个输入同时输给这几种提取特征方式,然后做concat。Inception v3和Inception v1对比主要是将5*5卷积换成两个3*3卷积层的叠加。

深度学习简明教程系列 —— 经典模型(合集)_第13张图片

于是从Inception v3联想到了一个简化的Inception结构,就是Figure 2。

深度学习简明教程系列 —— 经典模型(合集)_第14张图片

再将Figure2延伸,就有了Figure3,表示对于一个输入,先用一个统一的1*1卷积核卷积,然后连接3个3*3的卷积层吗,每个卷积层的卷积核数量为1/3 channel。再从Figure3延伸就得到Figure4,也就是3*3卷积的个数和1*1卷积的输出channel个数一样,每个3*3卷积核都是和1个输入channel做卷积。

深度学习简明教程系列 —— 经典模型(合集)_第15张图片

这就是我们常说的深度可分离卷积,其实就是把标准卷积分解成深度卷积(depthwise convolution)和逐点卷积(pointwise convolution),这么做的好处就是可以再损失精度不多的情况下大幅度降低参数量和计算量。

深度学习简明教程系列 —— 经典模型(合集)_第16张图片

下图是Xception的结构图。这里的sparsableConv就是depthwise separable convolution。

深度学习简明教程系列 —— 经典模型(合集)_第17张图片

Xception作为Inception v3的改进,主要是在Inception v3的基础上引入了depthwise separable convolution,在基本不增加网络复杂度的前提下提高了模型的效果。

 

第四章  ResNet

4.1  意义

随着网络的加深,模型参数更难学习,会出现准确率下降的现象。作者针对这个问题提出了一种全新的网络,叫深度残差网络,它允许网络尽可能的加深。ResNet提出了两种mapping:

  1. 一种是identity mapping,指的就是下图中”弯弯的曲线”;
  2. 另一种是residual mapping,指的就是除了”弯弯的曲线“那部分;

所以最后的输出是 y=F(x)+x ,identity mapping是指“恒等映射”,也就是公式中的x,而residual mapping是指“残差映射”,也就是y−x,所以残差指的就是F(x)部分。

深度学习简明教程系列 —— 经典模型(合集)_第18张图片

Q:为什么ResNet可以解决“随着网络加深,准确率下降”的问题?

A:

  1. 相比于直接学习信号,学习残差在许多研究中被证明更为有效,可以简化学习的过程;
  2. 使用残差结构,由于它包含了恒等映射,网络加深后仍能够有效的进行梯度反向传播,有利于参数学习;
  3. ResNet打破了网络的对称性,可以减缓网络退化的问题;
  4. 深层的残差网络可以看做是不同深度的浅层神经网络的ensemble,这么做可以增强网络的泛化能力。

4.2  网络结构

ResNet使用了shortcut connection,即跳远连接,论文分别针对ResNet34(左图)和ResNet50/101/152(右图)设计了两种结构:

深度学习简明教程系列 —— 经典模型(合集)_第19张图片

一般称整个结构为一个”building block“。其中右图又称为“bottleneck design”,目的一目了然,就是为了降低参数的数目。

Q:如果F(x)和x的channel个数不同怎么办,channel不同怎么相加呢?

A: 如图所示,我们可以清楚的“实线”和“虚线”两种连接方式

深度学习简明教程系列 —— 经典模型(合集)_第20张图片

  1. 实线的的Connection部分(“第一个粉色矩形和第三个粉色矩形”)都是执行3x3x64的卷积,他们的channel个数一致,所以采用计算方式:y=F(x)+x;
  2. 虚线的的Connection部分(“第一个绿色矩形和第三个绿色矩形”)分别是3x3x64和3x3x128的卷积操作,他们的channel个数不同(64和128),所以采用计算方式:y=F(x)+Wx,其中W是卷积操作,用来调整x的channel维度。

4.3  ResNet50和ResNet101

论文把所有的ResNet网络都分成5部分,分别是:conv1,conv2_x,conv3_x,conv4_x,conv5_x,之后的其他论文也会专门用这个称呼指代ResNet50或者101的每部分。网络结构如下:

深度学习简明教程系列 —— 经典模型(合集)_第21张图片

4.4  基于ResNet101的Faster RCNN

文章中把ResNet101应用在Faster RCNN上取得了更好的结果,基于ResNet101的Faster RCNN的结构图如下:

深度学习简明教程系列 —— 经典模型(合集)_第22张图片

上图展示了整个Faster RCNN的架构,其中蓝色的部分为ResNet101,可以发现conv4_x的最后的输出为RPN和RoI Pooling共享的部分,而conv5_x(共9层网络)都作用于RoI Pooling之后的一堆特征图(14 x 14 x 1024),特征图的大小维度也刚好符合原本的ResNet101中conv5_x的输入;一定要记得最后要接一个average pooling,得到2048维特征,分别用于分类和框回归。

 

第五章  DenseNet

5.1  意义

在深度学习网络中,随着网络深度的加深,梯度消失问题会愈加明显,目前很多论文都针对这个问题提出了解决方案,比如ResNet,Highway Networks,Stochastic depth,FractalNets等,尽管这些算法的网络结构有差别,但是核心都在于:create short paths from early layers to later layers(在前层和后层之间建立捷径)。延续这个思路,DenseNet就是在保证网络中层与层之间最大程度的信息传输的前提下,直接将所有层连接起来,通过对feature的极致利用达到更好的效果和更少的参数。

5.2  网络结构

5.2.1  Dense Block

在传统的卷积神经网络中,如果你有L层,那么就会有L个连接,但是在DenseNet中,会有L(L+1)/2个连接。简单讲,就是每一层的输入来自前面所有层的输出。如下图:x0是input,H1的输入是x0(input),H2的输入是x0和x1(x1是H1的输出)……

深度学习简明教程系列 —— 经典模型(合集)_第23张图片

这种Dense Connection相当于每一层都直接连接input和loss,因此就可以减轻梯度消失现象,这样就可以使用更深的网络。另外作者还观察到这种Dense Connection有正则化的效果,因此对于过拟合有一定的抑制作用。

注意:与ResNet不同的是,DenseNet对输出的特征图做的是通道合并操作(Concatnate),而ResNet是将输出特征图做值的相加,通道数是不变的。

5.2.2  DenseNet

DenseNet的结构图如下,在这个结构图中包含了3个dense block。作者将DenseNet分成多个dense block,原因是希望各个dense block内的feature map的size统一,这样在做concatenation就不会有大小不统一的问题。

深度学习简明教程系列 —— 经典模型(合集)_第24张图片 网络结构

 

深度学习简明教程系列 —— 经典模型(合集)_第25张图片 具体结构参数

这个表中的k=32,k=48中的k是growth rate,表示每个dense block中每层输出的feature map个数。为了避免网络变得很宽,作者都是采用较小的k,比如32这样,作者的实验也表明小的k可以有更好的效果。根据dense block的设计,后面几层可以得到前面所有层的输入,因此concat后的输入channel还是比较大的。

另外这里每个dense block的3*3卷积前面都包含了一个1*1的卷积操作,就是所谓的bottleneck layer,目的是减少输入的feature map数量,既能降维减少计算量,又能融合各个通道的特征,何乐而不为。另外作者为了进一步压缩参数,在每两个dense block之间又增加了1*1的卷积操作。因此在后面的实验对比中,如果你看到DenseNet-C这个网络,表示增加了这个Translation layer,该层的1*1卷积的输出channel默认是输入channel的一半。如果你看到DenseNet-BC这个网络,表示既有bottleneck layer,又有Translation layer。

综上,DenseNet有如下几个优点:

  1. 通过密集连接,减轻了梯度消失;

  2. 加强了feature的传递,可以更有效地利用feature;

  3. 一定程度上较少了参数数量。

 

第六章  DetNet

6.1  背景

随着时间推移,基于 CNN 的物体检测器也开始暴漏出一些弊端,其 backbone 往往针对 ImageNet 分类任务而设计,并不适用于检测任务。分类 backbone 用于物体检测主要存在两个问题:

  1. 相较于 ImageNet backbone,FPN 、 RetinaNet 等检测器迁移到检测问题上时通常会添加一个额外的 stage 来处理大尺度目标,这一层是没办法在ImageNet上预训练的;
  2. 传统的 backbone 感受野通常较大,这有利于图像分类,却会折中空间分辨率,导致无法精确定位大物体和识别小物体。

不管是 one-stage(比如 YOLO,SSD,RetinaNet)还是 two-stage(比如 Faster R-CNN,RFCN,FPN)的模型,针对检测任务而设计的 backbone 仍是一项空白,所以才有了 DetNet,一个针对物体检测的更优的 backbone。

6.2  网络结构

DetNet 针对不同大小的物体像 FPN 一样使用了更多的 stage。即便如此,它优于 ImageNet 预训练模型的地方在于成功保留了特征的空间分辨率,但同时也会增加神经网络的计算和内存成本。为保证 DetNet 的效率,本文引入了低复杂度的 dilated bottleneck。由此,DetNet 做到了较高分辨率和较大感受野的兼得。

深度学习简明教程系列 —— 经典模型(合集)_第26张图片

DetNet的主要特点如下:

  1. 在 stage 4 之后把空间分辨率固定为 16x 下采样,增加了网络高层输出特征的分辨率;

  2. 由于空间尺寸在 stage 4 之后是固定的,为引入一个新 stage,本文在 stage5,6 开始处使用一个带有 1x1 卷积投影(上图 B)的 dilated bottleneck;

  3. 引入 dilated bottleneck 增加网络的感受野,以缓解第一个改进点引起的感受野减小;

  4. 在stage 5,6中保持通道数为256,减小网络高层的宽度,以减少整体计算量。

相较于把传统分类网络用于物体检测而言,DetNet 有以下优势:

  1. DetNet 在 ImageNet 上预训练和训练物体检测时的stage数目一致;
  2. 受益于最后 stage 中的高分辨率特征图,DetNet 在定位大物体边界框和发现小物体方面更为强大。

 

第七章  目标检测系列

7.1  目标检测常见算法

目标检测常见的算法大致可以分为传统方案和深度方案,具体如下:

传统方案

候选区域+手工特征+分类器

深度方案

1)两阶段法

候选区域+深度学习分类器,如:R-CNN(Selective Search + CNN + SVM)、Fast R-CNN(Selective Search + CNN + ROI Pooling)、Faster R-CNN(RPN + CNN + ROI Pooling)

2)回归法

将目标检测视为回归问题,直接回归出检测框位置和类别,如:YOLO/SSD/DenseBox 等方法,以及最近出现的结合RNN算法的RRC detection,结合DPM的Deformable CNN等。

传统目标检测面临的主要问题是:

  1. 基于滑动窗口的区域选择策略没有针对性,时间复杂度高,窗口冗余;
  2. 手工设计的特征对于多样性的变化没有很好的鲁棒性。

7.2  R-CNN

为了解决传统目标检测方案的缺陷,学者们做了很多的尝试,终于,在2014年学界出现了大幅提高目标检测性能的开山之作R-CNN。

R-CNN算法总体步骤如下:

  1. 利用选择性搜索(Selective Search)算法,提取出大约2000个候选区域;
  2. 对每个候选区域的图像进行拉伸形变,使之成为固定大小的正方形图像,并将该图像输入到AlexNet卷积神经网络中,由 FC7 层输出特征向量;
  3. 再采用支持向量机对FC7层的特征向量进行分类;
  4. 最后对候选框以及标定框完成边框回归,修正候选框的位置。

7.2.1  选择性搜索(Selective Search)

思路:选择性搜索算法首先通过基于图的图像分割算法将图像分割成很多小块,使用贪心策略,计算每两个相邻区域的相似度,然后每次合并最相似的两块,直至最终只剩下一块完整的图片。这其中每次产生的图像块(区域外框)包括合并的图像块我们都保存下来,这样就得到图像的所有候选框。

相似度:选择性搜索算法主要是通过颜色、纹理、大小和形状交叠来计算两个区域的像素度,最终的相似度是这四个值的加权和。

7.2.2  卷积神经网络

R-CNN中使用的是AlexNet,首先将该模型在ImageNet上进行预训练,然后在Pascal voc 2007上进行fine-tuning,将最后分类数改成21(20个目标类别+背景),将候选区域调整为227x227输入CNN提取特征,将第七层FC7的输出特征向量存储下来。

7.2.3  支持向量机(SVM)

每个类别对应一个SVM分类器,将2000×4096维候选特征与20个SVM组成的权值矩阵4096×20相乘【20种分类,SVM是二分类器,则有20个SVM】,获得2000×20维矩阵表示每个建议框是某个物体类别的得分;分别对上述2000×20维矩阵中每一列即每一类进行非极大值抑制得到该类中得分最高的一些建议框。

7.2.4  边框回归

每次分类完之后,都要对边界框的进行调整,对于窗口一般使用四维向量 (x,y,w,h) 来表示,分别表示窗口的中心点坐标和宽高。对于下图,红色的框 P 代表原始的Proposal, 绿色的框 G 代表目标的 Ground Truth, 我们的目标是寻找一种关系使得输入原始的窗口 P 经过映射得到一个跟真实窗口 G 更接近的回归窗口 \hat{G}

深度学习简明教程系列 —— 经典模型(合集)_第27张图片

边框回归的目标即:给定一个(,,,h),寻找一种映射,使得(,,,h)=(,,,h),并且(,,,h) ≈ (,,,h)

深度学习简明教程系列 —— 经典模型(合集)_第28张图片

1、边框回归模型的输入

模型的输入是候选区域对应的CNN特征( R-CNN 中的 Pool5 feature),训练阶段还应包括Ground Truth, 即:t_*=(t_x,t_y,t_w,t_h)

深度学习简明教程系列 —— 经典模型(合集)_第29张图片

2、边框回归模型的输出

模型的输出是候选框需要进行的平移变换和尺度缩放因子 d_*(P)=(d_x (P),d_y (P),d_w (P),d_h(P)) ,目标函数为 d_* (P)=w_*^T \phi _5 (P) ,其中 \phi _5 (P) 为输入的卷积层特征向量,w_* 是要学习的参数,我们通过不断优化损失函数 ,即可得到最佳参数,从而求解到因子 d_* (P),修正目标框。

7.2.5  小结

虽然R-CNN算法相较于传统目标检测算法取得了50%的性能提升,但其仍存在很多缺点:

  1. 重复计算。2000个候选框都需要单独提取卷积特征,计算量依然很大,候选框之间会有重叠,因此有不少其实是重复计算。
  2. 训练测试不简洁。候选区域提取、特征提取、分类、回归都是分开操作,中间数据还需要单独保存。
  3. 速度慢。前面的缺点最终导致R-CNN出奇的慢,处理一张图片需要几十秒。
  4. 输入的图片Patch必须强制缩放成固定大小,会造成物体形变,导致检测性能下降。

7.3  Fast R-CNN

RCNN由于存在上述多个缺点,速度实在太慢,于是学者借鉴SPP-Net算法结构,提出了Fast R-CNN算法,其主要改进如下:

  1. 不再单独对每个候选区域提取卷积特征,而是先对整张图提取卷积特征,再将Selective Search得到的候选区域映射成CNN网络最后卷积层输出特征图中的感兴趣区域(ROI),以此节省大量计算;
  2. 借鉴SPP-Net,设计了一种RoI Pooling的池化层结构,有效解决R-CNN算法必须将图像区域剪裁、缩放到相同尺寸大小的问题;
  3. 提出了多任务损失函数(Multi-task Loss),将边框回归任务直接加入到CNN网络中训练,同时完成候选区域分类和边框回归。

7.3.1  RoI Pooling

RoI Pooling实际上是单层的SPP Layer,它可以将候选区域映射成固定大小的特征图(如7x7),下面我们通过一个例子来直观的进行了解:

深度学习简明教程系列 —— 经典模型(合集)_第30张图片

  1. 假设卷积网络用的VGG16,最后的卷积层输出大小为原图1/32、共512层的特征图(图800x800,最后一层特征图feature map大小:25x25);
  2. 假定原图中有一候选区域,大小为665*665,映射到特征图中的大小为:665/32=20.78,即20.78*20.78(Roi Pooling的源码中在计算的时会进行取整操作),即映射的特征图大小为20x20;
  3. 假定要固定成7x7的特征图,则将上面20x20的特征图划分成49个同等大小的区域,每个小区域的大小为20/7=2.86,取整后区域大小变成2x2;
  4. 在每个2x2的小区域里,作Max Pooling,49个小区域就输出49个像素值,组成7*7大小的特征图。

经过两次取整量化,原本在特征图上映射的20x20大小的region proposal,最终大小变为14x14,这样的像素偏差势必会对后层的回归定位产生影响,因此后面还提出了替代方案——RoI Align。

7.3.2  RoI Align

在计算特征图时保留浮点数,利用双线性插值法计算最终每个小区域的像素值(例如,上述方案中保留浮点数后,最终每个小区域大小为2.97x2.97,假定采样点数为4个,就会在小区域中计算出4个像素值,再进行Max Pooling)。

深度学习简明教程系列 —— 经典模型(合集)_第31张图片

7.3.3  多任务损失函数(Multi-task Loss)

Fast R-CNN统一了分类任务和边框回归任务,RoI Pooling后的特征图经过全连接层后进入两个并列的输出层,对应两个损失函数:分类损失(SoftMax Loss)和回归损失(Smooth L1 Loss),两个任务共享卷积特征,因此可对两个任务进行联合训练,实现除候选框提取外的端到端。其中,分类采用softmax代替SVM进行分类,共输出N(类别)+1(背景)类;回归损失输出的是4*N(类别),4表示的是(x,y,w,h)。

深度学习简明教程系列 —— 经典模型(合集)_第32张图片

7.4  Faster R-CNN

Fast R-CNN在速度上虽然得到了极大提升,但因使用选择性搜索寻找候选区域,所以仍存在较大速度瓶颈。为此,Faster R-CNN引入Region Proposal Network(RPN)替代Selective Search,其中还引入了anchor box应对目标形状的变化问题,同时,共享CNN主干网络,实现了真正意义上的端到端检测。由于原论文写得挺乱,网上的解析都copy来copy去,关键点讲不清楚,我参考了很多资料按个人理解作了梳理,仅供参考。

算法流程

  1. 输入待测图像,通过Backbone提取特征图;
  2. 通过RPN在最后一层特征图上提取候选区域;
  3. 通过RoI Pooling将每个候选区域生成固定大小的特征图;
  4. 继续经过两个全连接层得到特征向量,特征向量再经由各自的FC层,得到两个输出向量。一个用于分类(softmax),一个用于每一类的bounding box回归。
深度学习简明教程系列 —— 经典模型(合集)_第33张图片 Faster-RCNN网络结构图

上面是具体的网络结构图,下面附上一个很形象的网络图,https://zhuanlan.zhihu.com/p/37998710

深度学习简明教程系列 —— 经典模型(合集)_第34张图片 Faster-RCNN流程示意图

7.4.1  Anchor机制

Anchors是一堆固定的边界框,是利用不同尺度和比例在原图上得到的一堆候选区域(虽然 Anchors 是基于卷积特征图定义的,但最终的 Anchos 是相对于原始图片的)。我们知道,特征图上的一点可以映射成原图上的一个区域,在Fast R-CNN中,通过设置这个区域的尺度和比例,就可以得到若干个Anchor,论文中将原图尺寸调整为800x600,用到三种尺度分别是小(蓝128)中(红256)大(绿512),三个比例分别是1:1、1:2、2:1,组合起来总共9种Anchor。

深度学习简明教程系列 —— 经典模型(合集)_第35张图片

7.4.2  RPN详解

下图就是RPN的网络结构图,它是一个全卷积神经网络,输入是卷积特征图,输出是原图上的候选区域。那么,要理解这个网络,重点就在于理解:输入CNN得到的卷积特征图,通过RPN怎么就可以得到原图上对应的候选区域。

深度学习简明教程系列 —— 经典模型(合集)_第36张图片 RPN网络结构图

要解决这个问题,我们首先得理解Anchor概念。了解了Anchor后,我们再来看RPN,通常来说RPN其实可以分为如下几步:

  1. 假设我们通过主干网络提取到的卷积特征图维度为(HxWxC),以每个像素点为中心在原图上生成HxWx9个Anchor(论文中有20000个左右);
  2. 通过3x3x256的卷积核先对输入特征图进行一次same卷积,得到HxWx256的一个特征图(个人觉得是扩大感受野,将Anchor周围区域的信息融合来提高检测效果);
  3. 分成两路,均采用1x1的卷积核来改变每个特征向量的通道数,分类支路的通道数为2K,边框回归支路的通道数为4K(特征图上每个像素点有K=9个Anchor,每个Anchor要分foreground和background这2个类别,且都有[x, y, w, h]对应4个偏移量),也就是说,对于特征图上的每个点,最后都会得到一个18维的分类特征向量和一个36维的边框回归特征向量,分别表示每个Anchor的类别概率和偏移量;
  4. 根据提取Anchor的分类结果,应用NMS,选出2000个正样本候选框进行RoI Pooling,将RoI Pooling后的每个特征图都通过FC层,进行分类和定位。

注意:

1)在训练时,我们并不使用全部Anchor,而是通过将与某个ground truth的IoU超过0.7的Anchor作为正样本,将IoU低于0.3的Anchor作为负样本,然后随机在里面选取128个正样本+128个负样本用于训练;同时,在推理时则是采用NMS来得到若干个候选区域。

2)RPN分类支路的softmax前后都接一个reshape layer是为了便于softmax分类。在caffe基本数据结构blob中以如下形式保存数据:blob=[batch_size, channel, height, width],对应上面保存bg/fg anchors的特征图,其在caffe blob中的存储形式为[1, 18, H, W]。而在softmax分类时需要进行fg/bg二分类,所以reshape layer会将其变为[1, 2, 9*H, W]大小,即单独“腾空”出来一个值为2的维度以便softmax分类,之后再reshape恢复原状。

3)在RPN的训练中,对于分类,我们在所有Anchor中选取了128个正样本+128个负样本计算交叉熵损失;同时,仅对128个正样本进行计算边框回归损失。

其中,i表示min-batch中的第i个Anchor,p表示属于前景的概率,t表示偏移量。

7.5  YOLO v1

Faster R-CNN是主流的目标检测方法,但速度上并不能满足实时的要求,同时,采用proposal训练方式容易把背景区域误检为特定目标。因此,基于回归思想的目标检测方法显现出其重要性,它们将整张图作为网络的输入,直接在图上回归出目标的边界框及所属类别。YOLO便是一种基于回归思想的CNN网络,可一次性预测多个边框位置及其类别,实现了端到端的目标检测和识别,其最大的优势就是速度快,并且,由于直接选用整图训练模型(充分利用全局信息),可以更好的区分目标和背景区域。

算法流程

1)将输入图像Resize成448x448大小,然后将其划分成SxS大小的栅格(YOLO里面取S=7);

2)对于每个栅格我们都预测B个边框(YOLO中B=2,每个边框包括x, y, w, h, confidence这5个值):

  • 坐标x,y代表了预测的bounding box的中心与栅格边界的相对值;
  • 坐标w,h代表了预测的bounding box的width、height相对于整幅图像width,height的比例;
  • confidence就是预测的bounding box和ground truth box的IoU值(训练时是IoU,测试时是直接输出的一个置信度);

3)同时,每个栅格还要预测C个条件类别概率Prob(class i|obj)(YOLO中C=20),即在一个栅格包含目标的前提下,它属于某个类的概率;

4)将confidence和Prob(class i|obj)相乘得到候选框的confidence score,对其应用NMS,排除可能性较低的框,最后输出剩余的所有目标框。

注意:

1)测试阶段,模型置信度是直接输出的,然后用置信度乘上分类的prob,得到score;训练阶段,置信度就是与真实框IOU最大的那个框,如果格子内有物体prob设为1,否则设为0。

2)Prob(class i|obj)是针对每个栅格的,confidence score是针对每个候选框的。

7.5.1  网络结构

YOLO主要采用GoogleNet作为基础网络,但它没有采用Inception模块,而是直接使用1x1的卷积层+3x3的卷积层简单替代,我们从图中也可以看到,其总共包含24个卷积层和2个全连接层,最终输出的特征向量为7x7x30(SxSx(Bx5+C))。

深度学习简明教程系列 —— 经典模型(合集)_第37张图片

7.5.2  损失函数

深度学习简明教程系列 —— 经典模型(合集)_第38张图片

1、边框损失

YOLO论文中提到,在训练时,我们对每一个目标只希望有一个边框预测器,因此我们将与Ground Truth有最高IoU的预测框设置 \mathbb{I}_{ij}^{obj}=1,其余置零。随后,计算负责该目标的预测框中心坐标的偏差;然后,由于在大小不同的边框预测中,大边框定位偏差对总体损失造成的影响要弱于小边框定位偏差造成的影响,因此,论文中对宽高进行了开根号,来提高对小目标的预测效果。

2、置信度损失

在置信度损失中,对于不包含目标的边框我们设置 \mathbb{I}_{ij}^{noobj}=1C_i 是预测的置信度,\hat{C_i} 是预测边框与Ground Truth的IoU。

3、类别损失

YOLO论文中提到,只要一个目标中心落在栅格中,这个栅格就负责预测这个目标,因此,损失函数中将第i个栅格设置 \mathbb{I}_{ij}^{obj}=1,其余置零。随后,对这些有目标的栅格是否属于某一类做一个正常的分类损失。

注意:由于将边框回归与分类赋予相同权重是不合理的,同时,对不包含目标栅格的置信度损失赋予较大权重也是不合理的。因此,作者在损失函数里面加了两个Loss Weight,通常=5,=0.5

7.5.3  YOLO v1的缺点

  1. 精度低于SOTA;
  2. 每个栅格只能预测一类物体,两个目标,因此对于小目标的效果不好;
  3. YOLO中边框回归的宽高是相对整张图像的,难以适应不同形状的目标,直接造成了定位不准确的问题。

7.6  YOLO v2

YOLO v2的论文全名为YOLO9000: Better, Faster, Stronger,YOLO v2相比YOLO v1做了很多方面的改进,这也使得YOLO v2的mAP有显著的提升,并且速度依然很快,保持着自己作为one-stage方法的优势,YOLO v2和Faster R-CNN, SSD等模型的效果对比如下图所示。

深度学习简明教程系列 —— 经典模型(合集)_第39张图片

下面我们直接来介绍YOLOv2的改进策略:

1)YOLO v2采用了新的Backbone,称为Darknet-19,主要是通过Bottleneck结构减少了参数;

2)YOLO v2中,每个卷积层后面都添加了BN层,mAP提高了2%;

3)为了提高对小目标的检测效果,YOLOv2提出了一种passthrough层来利用模型前面更精细的特征图,具体来说,它会将最后一个maxpooling层前26x26x512的特征图上每个2x2的局部区域转化到Channel维度上,变成一个13x13x2048的新特征图,再与后面13x13x1024的特征图进行Concate形成13x13x3072的特征图,在此基础上再通过1x1的卷积改变通道数去做预测;

4)YOLO v2借鉴RPN的思想(其实整个网络就是RPN的变形),引入Anchor  Box的机制来进行目标预测,YOLO v1中一个栅格只能预测两个BBox,且它们共享一个类别,而在YOLO v2中每个Anchor  Box都要预测位置偏移和归属类别。具体来说,YOLO v2取消了全连接层,直接将passthrough层的输出特征图通过1x1的卷积改变成13x13x(Bx(5+C)),其中B就是Anchor  Box的个数,5是位置偏移和置信度,C是预测类别数;

5)使用K-Means聚类来求取方框先验,即确定Anchor  Box的宽高,作者在这里选取了5种Anchor;

6)先用448x448的输入分辨率在ImageNet上微调10个epochs后,再去检测数据集上进行微调,mAP提高了4%;

7)多尺度训练,每10个batch随机选择一个新的image size。

深度学习简明教程系列 —— 经典模型(合集)_第40张图片 YOLO v2网络结构表

 

YOLO v2网络结构示意图

7.7  YOLO v3

YOLO-v3在YOLO-v2的基础上进行了一些改进:

1)采用了新的Backbone,称为Darknet-53,大量使用了跳远连接和Bottleneck结构,且摒弃了Pooling层,直接用步长为2的Conv层来进行下采样;

深度学习简明教程系列 —— 经典模型(合集)_第41张图片 Darknet53网络结构表

2)为了提高对小目标的检测效果,YOLO v3采用了类似FPN上采样和融合的方式,引出了3条预测支路,尺度分别为13x13、26×26和52×52,每个尺度上都有三个Anchor,每个Anchor预测C个类别、4个坐标、1个目标置信度,所以每个尺度的输出特征图通道数为3x(C+5)。

在这里插入图片描述 YOLO v3网络结构图

3)YOLO v3采用logistic regression对方框置信度进行回归(即预测该位置是目标的可能性有多大)。如果候选框不是置信度最高的,即使它超过我们设定的IoU阈值,我们还是不会对它进行预测,因此可以去掉不必要anchor,减少计算量。

4)对每个类别独立地使用logistic regression,用二分类交叉熵损失作为类别损失,可以很好地处理多标签任务;

深度学习简明教程系列 —— 经典模型(合集)_第42张图片 YOLO v3损失函数

7.8  YOLO v4

YOLO-v4算法是在原有YOLO目标检测架构的基础上,采用了近些年CNN领域中最优秀的优化策略,从数据处理、主干网络、网络训练、激活函数、损失函数等各个方面都有着不同程度的优化,通过应用一系列的Tricks,实现了目前最优的实验结果:43.5%的AP,在Tesla V100上,MS COCO数据集的实时速度约为65FPS。

7.8.1  网络调优技巧概述

如上图所示,目前检测器不管是two-stage还是one-stage都通常可以分为以下几个部分,只不过各类目标检测算法设计改进侧重在不同位置:

  1. Input部分:Image,Patches,Images Pyramid(图像金字塔)
  2. Backbone部分:VGG16,ResNet-50,SpineNet,EfficientNet-B0 / B7,CSPResNeXt50,CSPDarknet53
  3. Neck部分:
    • Additional blocks:SPP,ASPP,RFB,SAM
    • Path-aggregation blocks:FPN,PAN,NAS-FPN,Fully-connected FPN,BiFPN,ASFF,SFAM
  4. Heads部分:
    • Dense Predictions(one-stage):
      • RPN,SSD,YOLO,RetinaNet (基于anchor)
      • CornerNet,CenterNet,MatrixNet,FCOS(无anchor)
    • Sparse Predictions(two-stages):
      • Faster R-CNN,R-FCN,Mask R-CNN(基于anchor)
      • RepPoints(无anchor)

同时,作者还把所有的调优手段分为了两大类:

  1. Bag of freebies(免费礼包):是指在离线训练阶段为了提升精度而广泛使用的调优手段,而这种技巧并不在推断中使用,不会增加推断时间。
    1. 数据类:

      数据增强(random erase/CutOut/hide-and-seek/grid mask/MixUp/CutMix/GAN)

      数据分布:two-stage的有难例挖掘,one-stage的有focal loss。

    2. 正则化类:

      DropOut/DropConnect/DropBlock

    3. 损失函数类:

      MSE/ IoU loss/L1、L2 loss/GIoU loss/DIoU loss/CIoU loss

  2. Bag of specials(特价包):是指在推断过程中增加的些许成本但能换来较大精度提升的技巧。
    1. 增大感受野类:

      SPP/ASPP/RFB
    2. 注意力类:

      Squeeze-and-Excitation (SE)/Spa-tial Attention Module (SAM)
    3. 特征集成类:

      SFAM/ASFF/BiFPN
    4. 激活函数类:

      ReLu/LReLU/PReLU/ReLU6/Scaled ExponentialLinear Unit (SELU)/Swish/hard-Swish/Mish 
    5. 后处理类:

      Soft NMS/DIoU NMS

7.8.2  YOLO v4 架构选择

作者选择架构主要考虑几方面的平衡:输入网络分辨率/卷积层数量/参数数量/输出维度。最终YOLO v4整体架构如下:

  • Backbone:CSPDarknet53
  • Additional Block:SPP-block
  • Path-aggregation Neck:PANet
  • Heads:YOLOv3的heads
在这里插入图片描述 YOLO v4网络结构图

1、CSPNet

Cross Stage Partial(CSP)从网络结构设计的角度来解决以往工作在推理过程中需要很大计算量的问题,能够在降低20%计算量的情况下保持甚至提高CNN的能力。作者认为推理计算过高的问题是由于网络优化中的梯度信息重复导致的。CSPNet通过将梯度的变化从头到尾地集成到特征图中,在减少了计算量的同时可以保证准确率。CSPNet是一种处理的思想,可以和ResNet、ResNeXt和DenseNet结合。下图是将CSP模型应用到ResNeXt或者ResNet中:

也就是说,CSPNet会将浅层特征映射为两个部分,一部分经过Res Block,另一部分直接与Res Block输出进行concate,获得最终的特征图。从实验结果来看,分类问题中,使用CSPNet可以降低计算量,但是准确率提升很小;在目标检测问题中,使用CSPNet作为Backbone带来的提升比较大,可以有效增强CNN的学习能力,同时也降低了计算量。在YOLO v4中,作者将Darknet53加入了CSP思想,具体结构参见:https://blog.csdn.net/weixin_41560402/article/details/106119774

2、SPP思想

YOLO v4中还应用了空间金字塔池化(SPP),目的是为了增加感受野,实现是对layer107进行 5×5 、9×9 、13×13 的最大池化,分别得到layer 108,layer 110和layer 112,完成池化后,将layer 107,layer 108,layer 110和layer 112进行concatenete,连接成一个特征图layer 114并通过 1×1 卷积降维到512个通道。

在这里插入图片描述

在这里插入图片描述

3、PANet

PANet主要做了三点贡献:

1)自底向上路径增强

在FPN中每个proposal只负责金字塔特定的一层,预测只基于单一尺度视角,因此,与FPN相比,PANet 在DownSample之后又加了UpSample的操作,也就是在FPN的后面添加一个自底向上的金字塔,将低层的强定位特征传递上去,再进行预测。

在这里插入图片描述

2)动态特征池化

FPN中的每个proposal根据其大小分配给不同的特征层,但这样可能不够好,PANet中通过特征池化层,将同一个proposal在不同尺度特征图上的RoI进行了融合,更有利于定位和分类。

深度学习简明教程系列 —— 经典模型(合集)_第43张图片

金字塔上四个灰色区域对应的是同一个proposal,根据特征图相应缩放,分别进行RoIAlign取到四个特征图后,分别全连接,然后采取max,或者sum,或者相乘进行特征融合。

3)全连接融合

主要是在原来的mask支路(Figure4上面那条支路,也就是传统的FCN结构)上增加了Figure4下面那条支路做融合。增加的这条支路包含2个3*3的卷积层(其中第二个为了降低计算量还将通道缩减为原来的一半),然后接一个全连接层,再经过reshape操作得到维度和上面支路相同的前背景mask,也就是说下面这条支路做的是前景和背景的二分类,因此输出维度类似文中说到的28*28*1。上面这条支路,也就是传统的FCN结构将输出针对每个类别的分类mask,因此输出的通道就是类别的数量,输出维度类似28*28*K,K表示类别数。最终,这两条支路的输出mask做融合得到最终的结果。因此可以看出这里增加了关于每个像素点的前背景分类支路,通过融合这部分特征得到更加精确的分割结果。

深度学习简明教程系列 —— 经典模型(合集)_第44张图片

4、YOLO v4 Heads

YOLO v4采用了和YOLO v3一样的Heads,只是尺度不一样罢了。

7.8.3  YOLO v4 调优选择

目标检测训练中,通常对CNN的优化改进方法如下(YOLO v4采用了黑色加粗部分):

  • 激活函数:ReLU,leaky-ReLU,parameter-ReLU,ReLU6,SELU,Swish 或 Mish
  • 回归loss函数:MSE,IoU,GIoU,CIoU,DIoU
  • 数据增强:CutOut,MixUp,CutMix
  • 正则化方法:DropOut,DropPath,Spatial DropOut 或 DropBlock
  • 通过均值和方差对网络激活进行归一化:Batch Normalization (BN), Cross-GPU Batch Normalization (CGBN or SyncBN), Filter Response Normalization (FRN), or Cross-Iteration Batch Normalization (CBN)
  • 跨连接:Residual connections, Weightedresidual connections, Multi-input weighted residualconnections, or Cross stage partial connections (CSP)

1、Mish

Mish激活函数的表达式为

                                                                                    Mish = x \cdot tanh(ln(1+e^{x}))

深度学习简明教程系列 —— 经典模型(合集)_第45张图片

Mish激活函数的特点:

  1. Mish激活函数保证了每一点的平滑,从而更好训练;
  2. 在输入x是正值时,Mish函数的梯度可以很好的传播;
  3. 当输入x是负值时,输入不会完全死掉,而仅是有一定概率被dropout掉,在激活中引入了随机正则的思想。

2、CIoU

CIoU考虑了目标与anchor之间的距离、重叠率、尺度以及长宽比,具体损失函数如下:

其中,其中,b  ,b^{gt} 分别代表了预测框和真实框的中心点,且 \rho 代表的是计算两个中心点间的欧式距离。c  代表的是能够同时包含预测框和真实框的最小闭包区域的对角线距离,\alpha 是权重函数,v 用来度量长宽比的相似性,定义为:

最后,CIoU loss的梯度类似于DIoU loss,但还要考虑 v 的梯度。在长宽在 [0,1] 的情况下,w^2+h^2  的值通常很小,会导致梯度爆炸,因此在 \frac{1}{w^2+h^2} 实现时将替换成1。

深度学习简明教程系列 —— 经典模型(合集)_第46张图片 参数示意图

3、CutMix

  • Mixup:将随机的两张样本按比例混合,分类的结果按比例分配;
  • Cutout:随机的将样本中的部分区域cut掉,并且填充0像素值,分类的结果不变;
  • CutMix:就是将一部分区域cut掉但不填充0像素而是随机填充训练集中的其他数据的区域像素值,分类结果按一定的比例分配。

7.8.4  其他改进

为了使设计的检测器更适合于单GPU上的训练,作者做了如下的附加设计和改进:

  • 介绍了一种新的数据增强Mosaic法和 Self-Adversarial Training 自对抗训练法。

  • 应用遗传算法选择最优超参数。

  • 改进SAM,改进PAN,和交叉小批量标准化(CmBN),使我们的设计适合于有效的训练和检测。

1、Mosaic

是一种将4张训练图片混合成一张的新数据增强方法,这样可以丰富图像的上下文信息。如下图所示:

这种做法的好处是允许检测上下文之外的目标,增强模型的鲁棒性。此外,在每一层从4个不同的图像批处理标准化计算激活统计,这大大减少了对大mini-batch处理size的需求。

2、Self-Adversarial Training 

这是一种新的数据扩充技术,该技术分前后两个阶段进行。

  1. 第一阶段是在一张图上,让神经网络反向更新图像,对图像做改变扰动。通过这种方式,神经网络对自身执行一种对抗性攻击,改变原始图像,从而造成图像上没有目标的假象。
  2. 在第二阶段,训练神经网络对修改后的图像进行正常的目标检测来训练模型。

3、CmBN

BN是对当前mini-batch进行归一化,CBN是对当前以及当前往前数3个mini-batch的结果进行积累并归一化,本文提出的CmBN则是仅仅在这个Batch中进行累积。

4、SAM和PAN的改进

将SAM从空间上的attention修改为点上的attention,并将PAN的short-cut连接改为拼接,分别如下图所示:

7.9  YOLO v5

YOLO V5 在性能上稍弱于YOLO V4,但是在灵活性与速度上远强于YOLO V4,在模型的快速部署上具有极强优势。下面便来讲讲YOLO v5的几个不同点。

7.9.1  自适应锚框计算

YOLO V3中,采用 k 均值和遗传学习算法对自定义数据集进行分析,获得适合自定义数据集中对象边界框预测的预设锚定框。在YOLO V5 中锚定框是基于训练数据自动学习的。

7.9.2  自适应图片缩放

以往图片前处理的方式,是将原始图片统一缩放到一个标准尺寸,再送入检测网络中。比如Yolo算法中常用416*416,608*608等尺寸,比如对下面800*600的图像进行缩放。

深度学习简明教程系列 —— 经典模型(合集)_第47张图片

作者认为,在项目实际使用时,很多图片的长宽比不同,因此缩放填充后,两端的黑边大小都不同,而如果填充的比较多,则存在信息冗余,影响推理速度。因此动态的自适应的对图片填充最少的黑边:

深度学习简明教程系列 —— 经典模型(合集)_第48张图片

7.9.3  四种网络结构控制

YOLO V5的网络结构非常简洁,而且YOLO V5 s,m,l,x四种模型的网络结构是一样的。原因在于作者通过depth_multiple,width_multiple两个参数分别控制模型的深度以及卷积核的个数。

7.10  SSD

针对YOLO类算法定位精度不足的问题,学者将YOLO的回归思想和Faster R-CNN的anchor box机制结合,提出了SSD(Single Shot MultiBox Detector)算法,兼顾了检测速度和检测准确度。

7.10.1  网络结构

深度学习简明教程系列 —— 经典模型(合集)_第49张图片

SSD采用VGG16作为基础网络,并对网络进行了一定修改:

  1. 分别将VGG16的全连接层FC6和FC7转换成 3x3 的卷积层 Conv6和 1x1 的卷积层Conv7;

  2. 将原来池化层Pool5中stride=2的2x2卷积核替换成stride=1的3x3卷积核;

  3. 去掉了所有的Dropout层和最后的FC8层;

  4. 增加空洞卷积,减小计算量,提高感受野;

  5. 在VGG的Conv7后面又增加了卷积层来获得更多的特征图做检测用。

算法流程

1)输入原始图像,将其裁剪为300x300,或者512x512大小,通过改进VGGNet提取卷积特征图;

2)按上图中所示,在6个位置的卷积特征图上对每个像素点都预设K个Default Box(论文取K=4 or 6),每个Default Box都有C个类别Score和4个Offset,所以每个像素点需要预测(C+4)x K个值,因此,用维度为3 x 3 x (C+4) x K的卷积核对6个特征图进行一次same卷积,得到6个H x W x (C+4) x K的新特征图;

深度学习简明教程系列 —— 经典模型(合集)_第50张图片

 

 

3)上面6个新的特征图就汇集了所有Default Box属于某类的概率值及坐标偏移值,将所有Default Box采用Fast NMS进行筛选,输出筛选得到的Default Box作为结果。

7.10.2  算法细节

1、多尺度

算法在6个不同尺度的特征图上选取 Default Box,由于每个特征图的感受野不同,这步操作就自然获得了多种尺度的候选框(浅层保留了更多位置信息,深层提取了更多语义信息);

2、Default Box生成规则

论文中以各个Feature Map上每个像素点的中点为中心,生成一系列同心的Default Box,实际与Faster RCNN中的Anchor一个意思。Default Box的大小主要由scale和aspect ratio控制,scale最小为0.2,最大0.9,假如总共选取了m个scale,则各个scale的scale值按下式计算:

这些scale都是通过计算得到的,其中每层有各自的min⁡_和max⁡_,如下:

深度学习简明教程系列 —— 经典模型(合集)_第51张图片

同时,aspect ratio选取为[1, 2, 3, 1/2, 1/3],在论文中,正方形Default Box的最小边长为 minsize,最大边长为 \sqrt{minsize \times maxsize},根据aspect ratio,还会生成2或4个长方形,长宽为 \sqrt{aspectratio} \times minsize 和 \frac{1}{\sqrt{aspectratio}} \times minsize

深度学习简明教程系列 —— 经典模型(合集)_第52张图片

3、数据增强

每一张训练图像,随机的进行如下几种选择:

  • 使用原始的图像;
  • 随机裁剪出一个 patch,与物体之间最小的 jaccard overlap (IoU)为:0.1,0.3,0.5,0.7与0.9;
  • 随机的采样一个 patch,采样的 patch 是原始图像大小比例是 [0.1,1],aspect ratio 在 1/2 与 2 之间。当 GT Box 的中心在采样的 patch 中时,保留重叠部分。在这些采样步骤之后,每一个采样的 patch 被 resize 到固定的大小,并且以 0.5的概率随机的水平翻转。

综上,SSD算法使用了多种数据增强的方法,包括水平翻转(horizontal flip),随机裁剪(random crop)、颜色扭曲(color distortion 或者对比度调整),随机采集块域(Randomly sample a patch)以获取更多训练样本。

7.10.3  SSD损失函数

SSD算法的损失函数分为两部分:Default Box与目标类别的confidence loss及定位损失location loss。其中,对于正样本计算两种损失,对于负样本只计算分类损失。我们可以用一张图进行总结:

深度学习简明教程系列 —— 经典模型(合集)_第53张图片

在上述损失函数中,N是匹配到GT的Prior Box数量,如果N=0,则将损失设为0;而 α 参数用于调整Confidence Loss和Location Loss之间的比例,默认 α=1。具体来说:

1)SSD中的Confidence Loss是在多类别置信度上的Softmax Loss,公式如下:

 

上式中,前半部分为正样本的损失,后半部分为负样本的损失。其中,i表示Default Box的序号,j表示GT的序号,p表示类别序号,p=0表示背景。=0,1,取1时表示第i个Default Box匹配上了第j个类别为p的GT Box。表示第i个Default Box预测为类别p的概率。

2)Location Loss(位置回归)是典型的Smooth L1 Loss:

深度学习简明教程系列 —— 经典模型(合集)_第54张图片

 

其中,l为预测框,g为真实框,cx和cy为偏移后Default Box的中心坐标,w和h为Default Box的宽高。

7.10.4  总结

SSD由于采用了Anchor的机制,并通过数据增广提高了检测的精度;同时,由于SSD是一个One-Stage的算法,且把全连接层改成了卷积层,并采用Atrous卷积等Trick减少了计算量,保证了检测的速度。但是,其仍存在一定缺点:

  1. 需要人工设置prior box的min_size,max_size和aspect_ratio值;

  2. 虽然采用了pyramdial feature hierarchy的思路,但是对小目标的recall依然一般。

 

第八章  语义分割系列

8.1  语义分割背景

语义分割(semantic segmentation)就是按照“语义”给图像上的每个像素点分一类标签,使得不同种类的目标在图像上被区分开来,可以理解成像素级别的分类任务。

  • 输入:(H x W x 3)原始图像
  • 输出:( H x W x Class )每一个pixel位置,都有Class数目个channel,每一个channel对应一个class,channel的值对应那个像素属于该class的预测概率(可以视为图片上每个点的one-hot表示)

评价标准

  • 像素精度(pixel accuracy):每一类像素正确分类的个数/ 每一类像素的实际个数;
  • 均像素精度(mean pixel accuracy ):每一类像素的精度的平均值;
  • 平均交并比(Mean Intersection over Union):求出每一类的IOU取平均值;
  • 权频交并比(Frequency Weight Intersection over Union):每一类出现的频率作为权重,计算交并比的加权平均值。

8.2  语义分割常见方法

传统方案

在深度学习方法流行之前,TextonForest和基于随机森林分类器等语义分割方法是用得比较多的方法。不过在深度卷积网络流行之后,深度学习方法比传统方法提升了很多,所以这里就不详细讲传统方法了。

深度学习方案

深度学习方法在语义分割上得到了巨大成功,部分深度学习方法解决语义分割问题可以概括为几种思路:Patch classification、全卷积网络、Encoder-Decoder架构、基于金字塔网络的模型、DeepLab家族、注意力机制模型,下面我们一一进行介绍。

8.3  Patch classification

最初的深度学习方法应用于图像分割就是Patch classification,顾名思义,该方法就是将图像切成块喂给深度模型的,然后对像素进行分类。使用图像块的主要原因是因为全连接层需要固定大小的输入图像。

8.4  全卷积网络

FCN是语义分割的开山之作,主要特色有两点:

  • 使用卷积层替换全连接层换
  • 使用跳级连接融合不同尺度的信息

8.5  Encoder-Decoder架构

8.5.1  U-net

U-net遵循与FCN一样的基本原理,用于解决小样本的简单问题分割(比如医疗影片的分割),其主要有两个特色:

  • Encoder-Decoder结构:前半部分为多层卷积池化,不断扩大感受野,用于提取特征;后半部分上采样恢复图片尺寸。
  • 更丰富的信息融合:在上采样过程中,Decoder采用逐步恢复的形式,将Encoder中不同尺度的特征图与逐层上采样得到的特征图进行Concat,融合了更多的前后层之间的信息(这里采用Concat,区别于FCN的逐元素加和)。注意的是,在串联之前,需要把前层的特征图crop到和后层一样的大小。
深度学习简明教程系列 —— 经典模型(合集)_第55张图片 UNet网络结构

8.5.2  SegNet

深度学习简明教程系列 —— 经典模型(合集)_第56张图片

从结构上看,SegNet和U-net其实大同小异,都是编码-解码结构。其特色在于:SegNet没有直接融合不同尺度的层的信息,为了解决为止信息丢失的问题,SegNet使用了带有坐标(index)的池化。

深度学习简明教程系列 —— 经典模型(合集)_第57张图片

在Max pooling时,选择最大像素的同时,记录下该像素在Feature map的位置(左图);在反池化的时候,根据记录的坐标,把最大值复原到原来对应的位置,其他的位置补零(右图)。上采样后的卷积层可以把0的元素给填上,这样一来,就解决了由于Encoder多次池化造成的位置信息的丢失。

8.6  基于金字塔网络的模型

8.6.1  PSPNet

PSPNet全称Pyramid Scene Parsing Network,其主要有三个特色:

  • 采用添加了空洞卷积的ResNet网络作为Backbone提取特征
  • 引入了金字塔池化模块,以更好的整合全局与局部信息
  • 引入了辅助loss
深度学习简明教程系列 —— 经典模型(合集)_第58张图片 PSPNet网络结构

具体来说,首先,输入图像会经过一个带空洞卷积的ResNet101,得到一个缩小了8倍的特征图;在Pyramid Pooling Module中构建了深度为4的特征金字塔,将该特征图分别划分成1x1、2x2、3x3、6x6块,然后通过区域平均池化得到1x1、2x2、3x3、6x6的金字塔特征图;随后,通过1x1的卷积核,将每个特征图的通道数减少为原来的1/4;最后,将这些金字塔特征图进行双线性插值,保持与ResNet的输入特征图相同尺度,并将这5个特征图进行Concate;最后通过卷积和双线性插值将Concate后的特征图恢复到原图大小,通道数为类别数,取概率最大的值作为像素的类别。

8.6.2  Mask RCNN

Mask RCNN沿用了Faster RCNN的思想,特征提取采用ResNet-FPN的架构,另外多加了一个Mask预测分支。总结就是Mask RCNN=ResNet-FPN+Fast RCNN+Mask。

深度学习简明教程系列 —— 经典模型(合集)_第59张图片 Mask RCNN网络结构

1、ResNet-FPN

FPN是一种通用架构,可以结合各种骨架网络使用,比如VGG,ResNet等。Mask RCNN文章中使用了ResNNet-FPN网络结构。如下图:

深度学习简明教程系列 —— 经典模型(合集)_第60张图片

从上图中我们可以看到,ResNet-FPN首先将ResNet作为Backbone,根据feature map的大小分为5个stage,其中,stage2、3、4、5各自最后一层输出定义为conv2、3、4、5。随后,采用线性插值的方式进行上采样,同时采用1 x 1的卷积对conv2、3、4、5进行通道降维(全降为256),然后将两者进行add操作。最后,还会用3 x 3的卷积对融合后的特征图进行处理,目的是消除上采样的混叠效应(Aliasing Effect)。

注:实际上,上图少绘制了一个分支:M5还会经过步长为2的max pooling下采样得到 P6。作者指出使用P6是想得到更大的anchor尺度512×512。但P6是只用在RPN中用来得到region proposal的,并不会作为后续Fast RCNN的输入。总之,ResNet-FPN作为RPN输入的feature map是 [P2P3P4P5P6] ,而作为后续Fast RCNN的输入则是[P2P3P4P5]

2、ResNet-FPN+Fast RCNN

深度学习简明教程系列 —— 经典模型(合集)_第61张图片

与Faster RCNN不同的是,FPN产生了特征金字塔[P2,P3,P4,P5,P6],而非单独一个特征图。特征金字塔里的每张特征图都会通过RPN产生一部分Region Proposal(Mask RCNN采用了scale为[32, 64, 128, 256, 512],ratio为[0.5, 1, 2],共15种Anchor)。主干网络Fast RCNN会根据Region Proposal在[P2,P3,P4,P5]中选择一张特征图于其上切出这些ROI,选择哪张特征图由如下公式决定:

上式中,224表示用于预训练的ImageNet图片的大小;0表示面积×h=224×224的ROI所在的层级。作者将0设置为4,意指×h=224×224的ROI是从P4中切出来的,假设ROI的尺度为112×112,那么=4−1=3,此时会从分辨率更高的P3中切出ROI,可以看出这种方法还是比较合理的,因为大尺度的ROI要从低分辨率的feature map上切,有利于检测大目标,小尺度的ROI要从高分辨率的feature map上切,有利于检测小目标。

3、ResNet-FPN+Fast RCNN+Mask

Mask RCNN与Faster RCNN的区别之一就在于,它加入了一个Mask分支,该分支通过在ROI Align层后获得的ROI特征上接上一个FCN,最终得到一个与ROI区域相对应的mask map出来。这个mask map有K个channels(K在这里表示目标可能的类别数目),每个channel的mask map上面都是二元信息,分别表示ROI区域上面的某位置点是前景还是背景。

深度学习简明教程系列 —— 经典模型(合集)_第62张图片 mask分支(下面)

注意:在training时将目标的gt mask resize到和mask 分支的output一致;在inference时则是反过来。

4、模型训练

Mask RCNN生成的每个ROI如果最终与某个Ground truth box的IOU为0.5以上,那么就可视为一个positive box,若小于0.5则为negative box。最终每个image经RPN网络生成出4*N个候选ROI,正负样本的比例保持为1:3(以naive Resnet为主干网络时,N为64;以FPN为主干网络时,N为256)。

Mask RCNN定义多任务损失:L=L_{cls}+L_{bbx}+L_{mask},前两个损失与Faster RCNN一样,而 L_{mask} 需要特别说明。假设mask分割分支的输出维度是××,对于×个像素点,都会生成个二值输出,计算loss的时候,该像素属于哪个类,哪个类的sigmoid输出才要计算损失(使用平均二值交叉熵损失):

深度学习简明教程系列 —— 经典模型(合集)_第63张图片

注意:在inference的时候,我们是通过分类分支预测的类别来选择相应通道的mask预测,实现了分类和分割的解耦。

8.7  DeepLab家族

8.7.1  DeepLab V1

DeepLab V1采用VGG16作为骨架,是在FCN的基础上进行改进的,其主要有三个特色:

  1. 在conv5处采用空洞卷积增加感受野;
  2. 采用全连接CRF作为后处理,以改善分割边界;
  3. 通过两种方式来进行多尺度的处理:
    • 将原始图像的多种尺度喂给网络进行训练;
    •  通过平行的不同空洞率的空洞卷积层来获得。

深度学习简明教程系列 —— 经典模型(合集)_第64张图片

Fully Connected CRF

在最终的分割图上,每个像素都有一个类别标签和一个对应的观测值,这样在无向图中每个像素点都成为某一个节点,若使用像素与像素之间的关系作为边连接,这样就组成了条件随机场。最终目的就是使用观测值来推测这个像素本来拥有的类别标签,如下图所示:

深度学习简明教程系列 —— 经典模型(合集)_第65张图片

全连接条件随机场使用二元势函数解释了一个像素与另一个像素之间的关系,给像素关系紧密的两个像素赋予相同的类别标签,而关系相差很大的两个像素会赋予不同的类别标签,这个“关系”的判断与像素的颜色值、像素间的相对距离都有关系。

8.7.2  DeepLab V2

DeepLab V2相较于V1作出了如下改进:

  1. 将基础网络改成了ResNet;
  2. 提出了atrous spatial pyramid pooling (ASPP),整合多尺度信息。

深度学习简明教程系列 —— 经典模型(合集)_第66张图片

ASPP层就是为了融合不同级别的语义信息,其选择了不同扩张率的带孔卷积去处理输入特征图,由于感受野不同,得到的信息的级别也就不同,ASPP层把这些不同层级的特征图concat到一起(rate越大padding越大,保持特征图尺度一致),进行信息融合。

8.7.3  DeepLab V3

DeepLab V3在V2的基础上作出了如下改动:

1、改进了ASPP模块(纵向结构)

深度学习简明教程系列 —— 经典模型(合集)_第67张图片

ASPP的改进主要包括两点:

  1. 在ASPP后面加入BN层;
  2. ASPP中引入了1x1的卷积,以及一个全局平均池化:

关键一:论文中解释,当扩张率等于特征图大小时,空洞卷积就退化成了1x1的卷积;

关键二:在旧的ASPP中,我们以为在扩张率足够大的时候,感受野足够大,所以获得的特征倾向于全局特征。但实际上,扩张率过大的情况下,Atrous conv出现了“权值退化”的问题,感受野过大,都已近扩展到了图像外面,大多数的权重都和图像外围的zero padding进行了点乘,这样并没有获取图像中的信息。有效的权值个数很少,往往就是1。于是我们加了全局平均池化,再进行双线性插值上采样,强行利用全局信息。

最后,将ASPP中的5个特征图进行Concat,输出Stride=16的特征图。

2、借鉴HDC思想,复用ResNet后面的Block(横向结构)

如下图所示,复制conv4的结构3次,后面的每个block都有一个基准dilation Rat

深度学习简明教程系列 —— 经典模型(合集)_第68张图片

3、舍弃了全连接CRF

8.7.4  DeepLab V3+

深度学习简明教程系列 —— 经典模型(合集)_第69张图片

  1. DeepLab V3+改进了网络结构,可以看成是把Deeplab v3作为编码器(上半部分),后面再进行解码,并且在解码的过程中在此运用了不同层级特征的融合。
  2. 此外,在encoder部分加入了Xception的结构(深度可分离卷积)减少了参数量,提高运行速递。

8.8  注意力机制模型

为了有效地完成场景分割的任务,我们需要更好的去区分一些容易被混淆的类别,例如草原与牧场有时候是很难区分的,公路上的车也存在尺度、视角、遮挡与亮度等的变化使之难以区分。

现有解决方案

  1. 利用多尺度上下文信息融合,结合不同的空洞卷积和池化操作;
  2. 使用分解结构增大卷积核尺寸或在网络顶部引入有效的编码层,来捕获更丰富的全局信息;
  3. 编码器-解码器结构来融合中级和高级语义特征。
  4. 使用RNN捕捉长程依赖关系,从而提高分割精度

以上方法可以捕获不同尺度的目标,但是它没有利用到目标之间的关系。而如果是使用RNN,其有效性在很大程度上依赖于长期记忆的学习结果。

8.8.1  Dual Attention Network

为解决以上问题,提出了双重注意力网络(DANet),基于注意力机制来分别捕获空间维度和通道维度中的特征依赖关系。具体而言,本文在dilated ResNet后附加了2种注意力模块,分别对空间维度和通道维度上的语义依赖关系进行建模。

深度学习简明教程系列 —— 经典模型(合集)_第70张图片

  • 采用 Dilated ResNet (DeepLab V2的主干网络)作为主干,删除了下采样操作并在最后两个ResNet块中使用了空洞卷积,最终特征映射的大小是输入图像的1/8;
  • Dilated ResNet 产生的特征图进行卷积降维再送入两个平行的注意力模块中;
  • 最后融合两个注意力模块的输出特征,以获得更好的特征表示。

1、Position Attention Module

PAM使用注意力机制捕获特征图在任意两个位置之间的空间依赖关系,通过加权求和对所有位置的特征进行聚合更新,权重是由对应两个位置的特征相似性决定的。因此,任何两个现有相似特征的位置可以相互贡献提升,而不管它们之间的距离。

  1. 特征图A(C×H×W)先分别通过3个卷积层得到3个特征图B、C、D,然后将B、C、D reshape为C×N,其中N=H×W;
  2. 随后,将reshape后的B的转置(NxC)与reshape后的C(CxN)相乘,再通过softmax得到Spatial Attention Map S(N×N);
  3. 最后,将reshape后的D(CxN)与S(NxN)执行矩阵乘法,再乘以尺度系数α(α初始化为0,并逐渐的学习得到更大的权重),再reshape为原来形状(C×H×W),最后与A逐像素相加得到最后的输出E。

以上操作如下式所示:

从上式中可以看出,Spatial Attention Map S中聚合了各个像素之间的关系,特征图E将所有位置与原始位置进行了加权聚合,因此它具有全局上下文视图,并能根据空间注意力图有选择地聚合上下文。

2、Channel Attention Module

每个高层次特征的通道图都可以看作是一个特定于类的响应,CAM通过挖掘通道图之间的相互依赖关系,可以突出相互依赖的特征图,提高特定语义的特征表示。

深度学习简明教程系列 —— 经典模型(合集)_第71张图片

  1. 分别对A做reshape(CxN)和reshape与transpose(NxC);
  2. 将得到的两个特征图相乘,再通过softmax得到Channel Attention Map X(C×C);
  3. 接着把X(CxC)与reshape的A(CxN)做矩阵乘法,再乘以尺度系数β(β初始化为0,并逐渐的学习得到更大的权重),再reshape为原来形状,最后与A相加得到最后的输出E。

以上操作如下式所示:

从上式中可以看出,Channel Attention Map X中,特征图E将所有通道特征与原始特征进行了加权聚合,实现了对不同通道特征图之间的长程语义依赖关系建模,有助于提高特征的辨别性。

最后,将两个注意力模块的输出先进行元素求和,再进行一次卷积生成最终预测图。该注意力模块很简单,可以直接插入到现在的FCN中,而且它们不会增加太多参数,还能有效地增强特征表示。


参考:

  1. https://blog.csdn.net/chaipp0607/article/details/72847422

  2. https://blog.csdn.net/briblue/article/details/83792394

  3. https://blog.csdn.net/whz1861/article/details/78111606

  4. https://blog.csdn.net/loveliuzz/article/details/79135583

  5. https://blog.csdn.net/lanran2/article/details/79057994

  6. https://blog.csdn.net/u014380165/article/details/75142710

  7. https://blog.csdn.net/u014380165/article/details/75142664/

  8. https://zhuanlan.zhihu.com/p/39702482

  9. https://zhuanlan.zhihu.com/p/46710723

  10. https://blog.csdn.net/qq_35451572/article/details/80273088

  11. https://blog.csdn.net/zijin0802034/article/details/77685438

  12. https://blog.csdn.net/lty_sky/article/details/90767956

  13. https://blog.csdn.net/kk123k/article/details/86563425?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-2

  14. https://baijiahao.baidu.com/s?id=1619537209443232394&wfr=spider&for=pc

  15. https://blog.csdn.net/liuxiaoheng1992/article/details/81983280

  16. https://blog.csdn.net/shengyan5515/article/details/84036734

  17. https://blog.csdn.net/ytusdc/article/details/86577939

  18. https://blog.csdn.net/qq_35451572/article/details/80320708

  19. https://zhuanlan.zhihu.com/p/137393450

  20. https://blog.csdn.net/weixin_41560402/article/details/106119774

  21. https://www.zhihu.com/question/399884529

  22. https://zhuanlan.zhihu.com/p/37801090

  23. https://zhuanlan.zhihu.com/p/37618829

  24. https://blog.csdn.net/JianqiuChen/article/details/105332206?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight

  25. https://blog.csdn.net/py184473894/article/details/84205779

  26. https://zhuanlan.zhihu.com/p/54510782

  27. https://blog.csdn.net/wumenglu1018/article/details/95949039

  28. https://zhuanlan.zhihu.com/p/59055363

  29. https://zhuanlan.zhihu.com/p/37998710

 

你可能感兴趣的:(机器视觉,深度学习,神经网络,机器学习)