【置顶】基于深度学习的目标检测

前言

下面对每篇文章及模型的亮点和优势进行了简单总结, 点击标题可以跳转至相关论文解读 (难免存在纰漏或者词不达意的地方, 望谅解)

基于深度学习的目标检测发展轨迹

下面是自R-CNN以来有关目标检测的文章,其中,加粗的部分为具有标志性意义的检测模型。

R-CNN (CVPR, 2013) $\longrightarrow$ OverFeat (ICLR, 2014) $\longrightarrow$ MultiBox (CVPR, 2014) $\longrightarrow$ SPPNet (ECCV, 2014) $\longrightarrow$ FastR-CNN (ICCV, 2015) $\longrightarrow$ FasterR-CNN (NIPS, 2015) $\longrightarrow$ OHEM (CVPR, 2016) $\longrightarrow$ YOLOv1 (CVPR, 2016) $\longrightarrow$ SSD (ECCV, 2016) $\longrightarrow$ R-FCN (NIPS, 2016) $\longrightarrow$ DSSD (Arxiv, 2017) $\longrightarrow$ YOLOv2 (CVPR, 2017) $\longrightarrow$ FPN (CVPR, 2017) $\longrightarrow$ Speed-Accuracy TradeOff (CVPR, 2017) $\longrightarrow$ DCN (ICCV, 2017) $\longrightarrow$ Couple Net (ICCV, 2017) $\longrightarrow$ RetinaNet (ICCV, 2017) $\longrightarrow$ Mask R-CNN(ICCV, 2017) $\longrightarrow$ YOLOv3 (Arxiv, 2018) $\longrightarrow$ RefineDet (CVPR, 2018) $\longrightarrow$ Cascade R-CNN (CVPR, 2018) $\longrightarrow$ RFBNet (ECCV, 2018) $\longrightarrow$ Pelee (NIPS, 2018)

主流框架模型对比

模型 特点 性能
Faster R-CNN RPN 精度高, 速度慢
YOLO Darknet, One-Stage 小目标效果不好, 速度很快
SSD MultiBox+Anchor, One-Stage 精度尚可, 速度较快
FPN 特征金字塔 -
RetinaNet Focal Loss -
Mask R-CNN 实例分割 -

Trick

其他

R-CNN (CVPR, 2014)

(1) 利用SS (Selective Search)提取候选区域框:
本篇文章利用SS(Selective Search) 算法首先生成大约2000个候选区域框

(2) 将CNN用于目标检测任务:
CNN拥有十分强大的特征提取能力, 并且无需人为设计特征算子, 对提取出来的每个候选区域框进行CNN计算, 获取到固定长度的特征向量

(3) 利用SVM分类器对候选框分类:
训练SVM分类器, 对候选区域框的特征向量进行分类.

(4) 使用回归其精细修正候选框位置

注: 以上几个步骤是独立训练的, 这也是R-CNN后续改进的空间

OverFeat (ICLR, 2014)

(1) Multi-Scale Classification:
在分类任务上, 虽然训练时采用和AlexNet相同的multi crop方法, 但是在预测阶段没有使用AlexNet的crop投票策略, 而是提出了Multi-Scale Classification方法, 一句话概括就是 对整个图片以不同的尺寸, 并且对每一个location进行模型预测

(2) 利用了全卷积的思想代替全连接
降低了滑动窗口的计算代价, 同时支持任意尺寸的图片输入

(3) 可以用同一个模型完成分类, 定位, 检测任务:
同一个模型, 只需要用回归层替换分类层, 即可完成目标定位任务, 同时利用了贪心策略来融合最终的定位结果

MultiBox-CVPR2014

(1) 将目标边框检测转化为回归问题:
将物体检测问题定义为输出多个bounding box的回归问题. 同时每个bounding box会输出关于是否包含目标物体的置信度, 使得模型更加紧凑和高效

(2) 通过损失函数将检测器训练过程整合到神经网络内部:
将训练bounding box检测器作为整个网络训练过程的一部分, 也就是说在损失函数中包含了关于bounding box的损失项. 通过联合训练, 不仅利用了神经网络强大的特征表示能力, 而且将检测器的训练集成到了网络中

(3) 无类别监督训练, 使得边框推荐复杂度与类别无关, 易于扩展
作者将本文的目标边框检测器在无监督的样本下训练, 由于本方法主要完成的功能就是画框, 并不会输出框中包含的物体类别, 因此训练的时候无需知道样本的类别信息. 这也使得该方法的计算复杂度与类别信息几乎无关, 可以轻易的推广到未知的类别当中. (当然也可以进行相关类别的训练, 对每个类别都训练一个检测器, 模型的总参数会随着类别数线性增加)

SPPNet-ECCV2014

(1) 提出了一种新的池化方法: 空间金字塔池化SPP:

  • 可以接受任意尺寸的输入图片,并生成固定长度的表征向量
  • 可以进行多尺度的联合训练, 提升模型精度
  • 这种池化方法是比较general的, 可以提升不同模型架构的性能(分类任务)

(2) 将SPP用于目标检测, 并且使用了先求卷积特征图谱, 后取区域的的策略(并不是首次提出):
大大提升了模型训练和预测的速度(在预测阶段, 比R-CNN快24~102倍, 同时取得了更好的精度).

PS:
注1: 在特征图谱上使用检测方法不是该文首次提出, 而SPP的贡献在于结合了deep CNN结构强大的特征提取能力和SPP的灵活性, 使得精度和速度同时提高
注2: 相比于R-CNN, SPPNet使用了EdgeBoxes( $0.2s/img$ )的方法来进行候选区域推荐, 而不是Selective Search( $1\sim 2s/img$ )
注3: SPPNet在ILSVRC2014的目标检测任务上取得第二名, 在图片分类任务上取得第三名

FastR-CNN

R-CNN 的效率很低, 低的原因主要是因为需要分别计算每一个 object proposal 的特征, 为此 Fast R-CNN 从共享卷积计算结果的角度出发, 提出了一个新的训练框架, 大幅提升了 R-CNN 检测模型的检测速度, 并且得益于新的损失函数和 RoI Pooling 的反向传播 机制, 使得 Fast R-CNN 的精度也有所提高. 具体来说, Fast R-CNN 网络首先会对整张图片进行计算并获得对应的特征图谱. 然后, 对于给定的每一个 object proposal, 都会通过 RoI Pooling 从特征图谱上提取到固定长度的特征向量, 每一个特征向量都会经过一系列全连接层, 最终被送到两个并行的输出层, 其中一个输出层是由全连接层和 Softmax 组成的分类层, 会预测物体属于每一个类别的可能概率, 另一个输出层是用于计算 bounding box 坐标偏移量的回归层(通过输入为 num_inputs, 输出为 class x 4 的全连接层实现). 同时, 由于 Fast R-CNN 使用了较多的全连接层, 因此原文利用了 SVD 奇异值分解来降低计算量, 提升模型速度.

其他变动:

  • 用softmax分类器替换了svm分类器
  • 用Smooth L1损失替换了L2损失
  • 在全连接层用SVD奇异值矩阵分解来降低计算成本
  • 在训练SVM的时候不需要额外的硬盘存储特征

Faster R-CNN(NIPS, 2015)

Faster R-CNN 的整体结构和 Fast R-CNN 差不多, 主要的区别在于 proposal 阶段的候选框生成方式不同, 在 Fast R-CNN 中, 使用的是 Selective Search 方式生成候选框, Faster R-CNN 则采用了卷积神经网络来生成 proposals, 这个网络就是 RPN 网络. RPN 网络通过 anchor 来生成不同大小的 proposals. 具体来说, 对于 backbone 网络的最后一层卷积层输出的特征图谱, 我们在它的上面添加一个核为 $3\times 3$ 大小的卷积层, 卷积层的卷积操作可以看做是在特征图谱上的滑动窗口, 在每一个滑动窗口处, 我们都会预测 $k$ 个 proposals, 这 $k$ 个 proposals 是根据 $k$ 个预定好的 anchors 获得的, RPN 的学习目标就是学的从 anchor 到 proposals 所需有变换函数. 得到这些 proposals 之后, 根据它们与真实物体的 IoU 大小来确定正负样本, 并按照 1:3 的比例进行采样, 将采样后的 proposals(训练时越 2000 个, 检测时越 300 个) 作为 Fast R-CNN 的输入. 在训练的时候, 可以采用 RPN 和 Fast R-CNN 交替训练的方式来共享卷积层的参数, 具体来说, 我们先对 RPN 进行训练, 使用 ImageNet 预训练的模型进行初始化(对于新添加的层, 使用均值 0 方差 0.01 的高斯分布或者 Xavier 初始化), 并对 RPN 网络的 regioin proposal 任务进行 fine-tuning; 然后我们利用训练好的 RPN 生成的 proposals 来训练 Fast R-CNN 网络, 网络的参数同样是用 ImageNet 预训练的模型进行初始化的, 所以说到这里两个网络之间还不具有参数共享的网络层. 当训练好 Fast R-CNN 以后, 我们用 Fast R-CNN 模型的参数来重新初始化 RPN 网络的参数, 同时要固定住这些来自 Fast R-CNN 网络的共享参数, 然后继续进行 region proposals 任务的 fine-tuning, 并且只对那些独属于 RPN 的网络层进行 fine-tuning. 最后, 同样保持 Fast R-CNN 中的共享层参数不变, 只对独属于 Fast R-CNN 的网络层进行 fine-tuning. 通过这种训练方式, 两个网络可以达到共享参数的目的.

RPN 最终推荐的候选区域个数为 $W\times H \times k$ , $W\times H$ 为卷积特征图谱size, $k$ 为anchor boxes的数量.

FCN (CVPR, 2015)

全连接层本身可以看做是卷积核大小覆盖整个输入图谱的卷积层, 因此FCN 将传统 CNN 中的全连接层全部都转化成一个个的卷积层. 这么做有两个好处, 一个是可以接受任意尺度的图片输入, 另一个是可以通过让卷积网络在更大的输入图片上以滑动的方式一次性得到多个输出, 从而可以加快模型的计算速度. 在进行分割任务时, FCN 会利用最后一层的特征图谱进行像素级别的类别预测, 但是由于最后一层特征图谱的下采样步长较大, 使得图谱中缺少足够的低级语义信息, 因此, 直接在最后一层特征图谱上进行像素类别预测的效果不是特别好. 因此, FCN 利用反卷积对特征图谱进行放大, 反卷积相对于双线性插值来说有一个好处就是可以参数进行学习, 而不是固定不变的. 将多个反卷积层和激活层堆叠起来甚至可以学习到非线性的上采样过程. 然后将上采样以后的图谱和前一层卷积层输出的具有相同尺度的特征图谱进行融合, 这样, 融合后的特征图谱不仅包含了浅层的低级语义信息, 同时还包含了深层的高级语义信息, 这样预测出来的结果会更加精细, 在 FCN 中, 分别在步长为 16 和 步长为 8 的特征图谱进行了分割预测, 结果也显示越精细的特征图谱, 分割的结果也越好. 只不过随着步长的缩短, 获得的提升也慢慢变小了.

YOLOv1 (CVPR, 2016)

YOLOv1 首先将图像分成 $S\times S$ 的格子(cell), 如果一个目标物体的中心落入格子, 那么该格子就负责检测该目标. 每一个格子都会预测 B 个 bbox, 每一个 bbox 包含 5 个值, 分别是坐标和置信度(表示是否包含物体). YOLOv1 的损失函数综合了坐标, 分类标签和分类置信度三部分, 都使用了平方和损失进行计算, 并且通过不同的权重系数平衡了 loss 之间的贡献度.

YOLOv1 的缺点: YOLO 的每一个网络只预测两个 boxes 和一套分类概率值(供两个 boxes 共享), 这导致模型对相邻目标的预测准确率下降, 因此, YOLO 对成群的目标识别准确率低

PS:
注一: YOLO中采用 $S\times S$ 的网格划分来确定候选框, 这实际上是一种很粗糙的选框方式, 同时也导致了YOLO在面对小目标物以及群落目标物时, 性能较差.(因为YOLOv1的同一个cell无法预测多个目标, 也就是说YOLOv1理论上最多检测出49个物体).

YOLOv2

OHEM (CVPR, 2016)

提出了一种在线的难样例挖掘算法:
作者根据每个RoIs的loss的大小来决定哪些是难样例, 哪些试试简单样例, 通过这种方法, 可以更高效的训练网络, 并且可以使得网络获得更小的训练loss. 同时, OHEM还具有以下两个优点:

  • 消除FastR-CNN系列模型中的一些不必要这参数 , 这些参数大多都是为了解决难样例问题服务的, 在使用OHEM以后, 不仅无需在对这些超参数进行调优, 同时还能获得更好的性能表现.
  • OHEM算法可以与其他多种提升模型精度的trick相结合, 对于大多数模型(R-CNN系列), 在使用了OHEM以后, 都能够获得精度上的提高, 可以看做是一种普适性的提升精度的方法.

注: 在实现OHEM上, 作者为了提升速度和效率, 特意设计了两个RoI网络, 以减少无用的计算.

SSD (ECCV, 2016)

SSD 是一种 one-stage 检测模型, 它最主要的特点就是使用了多尺度的特征图谱进行预测, 具体来说, SSD 在 VGGNet 之后又添加了五个卷积段, 每个卷积段都是用 $1\times 1$ 和 $3\times 3$ 大小的卷积核组成的, 然后在加上 VGGNet 的 conv4_3 卷积层, 总共可以得到六种不同尺度的特征图谱. 然后对数每一个特征图谱上的每一个 location, 都会有 $k$ 个 default boxes 作为初始的候选框, 不同尺度的特征图谱对应的 $k$ 的大小也不一定相同(4, 6, 6, 6, 4, 4). 也就是说, 对于一个尺度为 $m \times n$ 的特征图谱来说, 它具有的 default box 的个数就是 $m\times n\times k$, 又因为 one-stage 模型会在回归的同时进行分类, 因此, 最终输出结果的形式是一个 $m\times n\times k\times (c + 4)$ 的 tesor, $k$ 就代表了 $k$ 个 default box, $(c+4)$ 代表了每个 box 的分类得分和坐标偏移量.

(1) 在不同尺度的feature map上进行预测:

YOLO的网格划分法精度较低, 但是速度很快, 而Faster的anchor box法, 精度很高, 但是速度很慢, SSD同时考虑了这两种方法的优劣, 提出了在不同层的feature map上面进行anchor box选取的方法, 并在这些不同尺度的feature map上面进行物体类别检测和box检测. (这一点不同于OverFeat和YOLO, 它们只会在同一个feature map上面进行分类预测和box回归).

(2) 添加了一些额外的卷积层来进行预测任务:
在对不同尺度的feature map进行预测时, SSD使用了额外的层进行预测. 在这些层上的每一个location, 都会产生响应的box (对于特征图谱的每一个像素点, 都会产生一定数量的anchor box), 并对box进行预测和回归

(3) 默认box和宽高比:
在每一个feature map的cell里面, 预测默认框相对于cell的偏移量, 同时预测该box属于每个类别的score. 具体来说, 对于每一个cell(location), 都会有 $k$ 个默认box, 对于这 $k$ 个默认box中的每一个box, 都会计算 $c$ 个类别score和4个相对偏移量. 因此, 对于每一个location, 需要有 $(c+4)k$ 个输出, 也就是需要
$(c+4)k$ 个卷积核. 又因为特征图谱的大小为 $mn$, 所以最终的输出为 $(c+4)kmn$, 其中 $kmn$ 为box的数量, $(c+4)$ 为每个box带有的值.

(4) 使用了数据增广, 难样例挖掘, atrous算法等trick大幅度提升精度和速度
这个其实算不上亮点, 只不过作者确实使用这些技术提升性能不少

R-FCN (NIPS, 2016)

(1) 利用position sensitive score map将目标位置信息融合进RoI
在一般情况下, 分类任务具有平移不变性, 而检测任务却要求对目标的平移做出正确响应. 在Faster R-CNN类的方法中RoI pooling之前都是卷积, 具有平移不变性, 但是一旦经过RoI pooling 之后, 后面的网络结果就不再具备平移不变性了. 因此, 本文提出了position sensitive score map来将目标位置的信息融合进RoI.

(2) 让更多的层共享计算
对于Faster R-CNN等基于感兴趣区域的检测方法来说, 实际上是 分成了几个subnetwork, 第一个用来在整张图上做比较耗时的conv, 这些操作与region无关, 是计算共享的. 第二个subnetwork是用来产生候选区域(如RPN), 第三个subnetwork是用来分类或者进一步对box进行回归的, 这个subnetwork和region是有关系的, 衔接在这个subnetwork和前两个subnework中间的就是RoI pooling. 本文希望将耗时的卷积都尽量移到前面共享的subnetwork上面去, 因此与FasterR-CNN相比(前91层共享, RoI pooling之后, 后10层不共享)不同, 将ResNet所有的101层都放在的前面共享的subnetwork中, 最后用来进行prediction的卷积只有1层, 大大减少了计算量.

Speed-Accuracy TradeOff (CVPR, 2017)

本文实现了一个灵活统一的目标检测框架, 并对三个主流的目标检测模型做了详细客观的分析和讨论
通过该框架, 本文对目前主流的各个模型(Faster, R-FCN, SSD)影响精确度和速度的各个因素展开了详细的分析和讨论, 以此希望能够帮助从业者在面对真实应用场景时, 能够选择适当的模型来解决问题. 同时, 本文还发现了一些新的trick, 使得可以在保持精度的前提下, 提升模型的速度.

DSSD (Arxiv, 2017)

(1) 利用反卷积模块向特征图谱中添加更多的上下文信息
主要是对SSD的一点改进, SSD使用了不同阶段的卷积特征图谱进行目标检测, 而DSSD受到人体姿态识别任务的启发, 将这些不同阶段的卷积特征图谱通过反卷积模块连接起来, 然后再进行目标检测的预测任务.

(2), 预测模块采用Residual模块
这个不算是亮点, 不过也是改动之一, 基本来说就说原始的SSD是直接在特征图谱预测结果并计算损失的, 而DSSD在预测之前会先经过一个Residual模块做进一步的特征提取, 然后在进行预测.

FPN (CVPR, 2017)

提出了多尺度的特征金字塔结构:
将最后一层特征图谱进行不断尽快上采样, 并与每一个金字塔阶级的特征图谱进行加法合并操作, 得到新的表征能力更强的不同金字塔层次的特征图谱, 然后将RoI按照尺寸分别映射到这些特征图谱上, 再在每个特征图谱上进行类别和位置预测. 可以直观感受到, 这种多尺度的特征图谱在面对不同尺寸的物体时, 具有更好的鲁棒性, 尤其是在面对小型物体时. 同时, 这种特征金字塔结构是一种通用的特征提取结构, 可以应用到不同的网络框架中, 显著提高(5~8%)模型的召回率(因为提出了更多不同尺度, 不同特征信息的anchor box), 并且可以广泛提高(2~3%)模型的mAP.

思想: 浅层特征负责感知和检测小物体, 但是欠缺足够深度的高级语义信息, 因此将具备深层语义信息的特征层通过反卷积的方式扩大 feature map 的 size, 然后结合浅层和深层的特征图谱来进行预测.

YOLOv1%2Ffig2.jpg

YOLOv1%2Ffig3.jpg

YOLOv2 (CVPR, 2017)

YOLOv1 对于 bbox 的定位不是很好, 同时在精度上和同类网络还有一定差距, 所以 YOLOv2 对于速度和精度都做了很大的优化, 并且吸收了同类网络的有点, 主要包括以下几点:

  • 提高图片分辨率: 将预训练阶段的输入图片的分辨率扩大到 $448\times 448$, mAP 提升了 4%.
  • 使用 BN: 利用 BN 起到正则化作用, 从而舍弃了 dropout 层, mAP 提升了 2.4%
  • 引入 anchor: 在检测时使用了 $416\times 416$ 的图片大小, YOLOv2模型下采样的总步长是 32, 因此最终得到的特征图大小为 $13\times 13$, 维度控制成奇数, 这样特征图谱恰好有一个中心位置, 对于一些大物体, 它们中心点往往落入图片中心位置, 此时使用特征图的一个中心点来预测这些物体的边界框相对容易些. YOLOv1 上一个 cell 的两个 boxes 共用一套分类概率值, 而 YOLOv2 的每个 anchor box 都会单独预测一套坐标, 一个置信度, 和一套分类概率值. (这和 SSD 类似, 不过 SSD 没有预测置信度, 而是将背景作为一个类进行处理)
  • 用 k-mean 来确定 anchor 的初始形状: 根据训练集的聚类分析结果, 选取 $k$ 个聚类中心作为 anchor 的初始形状设置.
  • Direct location prediction: Faster R-CNN 中的偏移公式是无约束的, 这样预测的边界框就可能落在图片的任何位置, 这导致模型训练时的不稳定性, 需要训练很长时间才能预测出正确的偏移量. 因此, YOLOv2 沿用了 YOLOv1 的方法, 预测的是边界框中心相对于网格单元位置的位置坐标. 综合 anchor + kmean + driect, mAP 提升了 5%.
  • 利用 ResNet 的 identity mapping 获得细粒度的特征图谱: YOLOv2 的输入图片大小为 $416\times 416$, 最终 max pooling 以后得到 $13\times 13$ 大小的特征图谱, 这样的图谱预测大物体相对足够, 但是对于小物体还需要更精细的特征图, 因此 YOLOv2 利用 identity mapping 的思想将前一段的特征图谱 $26\times 26 \times 512$ reshape 成 $13\times 13 \times 2048$ 的特征图谱, 然后与原来的 $13\times 13 \times 1024$ 的特征图谱连接在一起形成 $13\times 13 \times 3072$ 的特征图谱, 然后在此特征图谱上进行预测. 该方法提升 mAP 1%.
  • Multi-Scale Training: 在训练过程中, 每隔一定(10)的 iterations 之后就随机改变输入图片的大小, 图片大小为一系列 32 倍数的值(因为总的 stride 为 32): {320, 352, …, 608}.
  • Darknet-19: YOLOv2 采用了一个新的模型(特征提取器), 包括 19 个卷积层和 5 个 maxpooling 层(卷积层分配为 1,1,3,3,5,5+1). Darknet-19 与 VGG16 模型的设计原则是一致的, 主要采用 $3\times 3$ 卷积和 $2\times 2$ 的 maxpooling 层. Darknet-19 最终采用 global avgpooling 做预测, 并且在 $3\times 3$ 卷积之间利用 $1\times 1$ 卷积来压缩特征图的通道数以降低模型的计算量和参数.

YOLO 利用 anchor 会生成 $13\times 13\times 5 = 845$ 个候选区域框, 相比于YOLOv1的98个, 多多了, 所以会大大提高召回率, 但是会降低准确率. 下降的原因, 个人觉得是YOLO在采用anchor box获取候选框的同时, 依然采用YOLOv1的训练方法, YOLOv2的损失函数是一个非常复杂的形式, 导致其在更新参数时很容易顾不过来, 因此其出错的概率也相应提升.

YOLOv2的训练包含三个阶段: 预训练(224), finetune(448), 检测模型训练

对样本的处理方式: 和 YOLOv1 相同, 对于训练图片中的 ground truth, 如果其中心落在了某个 cell 内, 那么该 cell 内的 5 个 anchor 就负责预测该物体, 并且最终只有一个边界框会与之匹配, 其他的会被 NMS 掉. 所以 YOLOv2 同样假定每个 cell 至多含有一个 ground truth, 而在实际上基本不会出现多于一个的情况. 与 gt 匹配的 anchor 会计算坐标误差, 置信度误差, 和分类误差, 而其他的边框则只计算置信度误差. YOLO 中一个 gt 只会与一个 anchor 匹配, 这与 Faster R-CNN 和 SSD 有所区别.

损失函数 YOLOv2 的 loss 形式如下:

YOLOv3

DCN (ICCV, 2017)

Deformable ConvNet 从目标检测任务中物体的几何形变角度发出, 在神经网络中引入了具有学习空间几何形变能力的可形变卷积网络(convolutional neutral networks). 该网络主要由两个模块组成, 分别是 deformable convolution 和 deformable RoI. 对于可形变卷积来说, 通过在每个卷积核的采样点上加一个偏移量来达到更好的采样效果. 对于可形变 RoI pooling 来说, 通过对传统的 RoI bins 添加一个偏移量还使得 RoI pooling 中的窗口具有能够适应几何形变的效果.
Deformable ConNet 一个比较好的性质就是它不会对原有检测模型的整体结构进行更改, 也不会增加过多的计算量, 因此可以很容易的添加到现有的检测模型当中, 同时还可以和其他多种提升精度的 trick 叠加使用.

Couple Net (ICCV, 2017)

在进行区域分类时, 同时使用了全局信息,上下文信息和局部信息综合判断
提出了一个新颖的全卷积网络, 并称之为CoupleNet, 它可以在目标检测中结合使用全局和局部信息. 具体来说, CoupleNet会将由RPN网络产生的候选区域送入到coupling module中, 该模块包含两个分支. 第一条分支利用position-sensitive RoI pooling来捕获物体的局部信息, 另一条分支利用RoI pooling对全局上下文信息进行编码. 接着, 我们设计了不同的coupling策略和归一化方法来使用这些不同分支格子的优势.

Focal Loss (ICCV, 2017)

(1) 分析并指出了One Stage方法精度不高的原因:

  • 极度不平衡的正负样本比例: anchor是一种类似sliding windows的选框方式, 这会使得正负样本的比例接近1000:1, 而且绝大部分负样本都是easy example.
  • 梯度优化过程被easy example过度影响: 这些easy example的loss虽然不高, 但由于数量众多, 最终合起来会对loss有很大的贡献, 从而导致优化的时候过度关注这些easy example, 这样会收敛到一个不够好的结果.

(2) 提出了解决正负样本比例和easy example 问题的Focal loss:

核心思想很简单, 就是在优化过程中逐渐减低那些easy example的权重, 这样会使得训练优化过程对更有意义的样本有更高的偏置. 所谓easy example指的就是那些预测概率与真实概率十分相近的样本, 这些样本已经被网络很容易切正确的分类了, 所以应该适当减少他们的loss以降低他们对参数更新的影响程度. 以上面的公式为例, 当真实标签为1时, 如果预测概率(假设二分类) $p_t$ 接近于1, 则此样本是easy样本, 因此, 前面的 $(1-p_t)^{\gamma}$ , 就会非常小, 起到了抑制简单样本的作用.

注1: $\gamma$ 的值越大, 则简单样本对于loss的贡献程度越小, 当 $\gamma = 0$ 时, 会退化到普通的交叉熵函数.

注2: 文中在使用 $\gamma$ 参数的情况下, 还是用了另一个参数 $\alpha$ ,如下所示:

在经过一系列调参之后, 得到 $\alpha=0.25, \gamma = 2$ 为最优组合. 可以看到, 加在正样本前面的 $\alpha$ 要更小, 个人猜测这是因为使用了Focal Loss之后, 原本在数量上不在优势的前景区域或许在对loss的贡献度上反超了后景区域, 因此, 需要对前景区域赋予更低的权重.

(3) 基于Focal Loss设计并实现了RetinaNet

PS:
注一: 为什么Focal Loss没有用在Two Stage方法上面? 这是因为以R-CNN为代表的一系列Two Stage会在区域候选推荐阶段采用两个问题来降低正负样本比例和easy example问题带来的影响:

  • 采用NMS算法将物体位置候选框降低到一到两千个,更重要的是,这一到两千个可能位置并不是随机选取的,它们移除了大量的易分类负样本(背景框)
  • 采用了biased-minibatch的采样策略, 比如,保证正样本和负样本的比例为1:3进行训练(这其实相当于起到了 $\alpha$ 因子的作用

Mask R-CNN (ICCV,2017)

Mask R-CNN 的大体框架还是 Faster R-CNN, 它在 Faster R-CNN 模型中添加了一个与分类和回归分支平行的掩膜预测分支. 掩膜分支(mask branch) 是一个小型的 FCN 网络, 它会作用在每一个 RoI 上, 以像素到像素的方式来预测一个分割掩膜. Mask R-CNN 的掩膜预测分支对于每一个 RoI 的输出维度为 $Km^2$, 也就是每一个类别都会单独输出一个 $m\times m$ 大小的掩膜. 在预测掩膜时非常关键的一点就是要对分类任务和分割任务解耦, 否则对于多分类任务会引起类别之间的竞争, 因此, Mask R-CNN 使用了基于单像素的 sigmoid 二值交叉熵来替换基于单像素的 Softmax 多项式交叉熵. 另外, 在 Faster R-CNN 中使用的 RoI pooling 需要经过两次量化取整(图像坐标到特征图谱坐标, 特征图谱划分固定网格)才能获得固定长度的特征向量. 这种粗糙的量化操作会造成 RoI 和特征图谱之间的不对齐, 这对精度要求较高的的分割任务来说有较大影响. 为了克服这个问题, Mask R-CNN 提出了 RoI Align 层来替代 RoI Pooling, RoI Align 的核心思想就是避免在 RoI 边界上或者 bins 中执行任何量化计算. 它在处理每一个 RoI 的时候, 会保持其浮点边界的值而不进行量化操作, 然后将 RoI 划分成的 $k\times k$ 大小的网格, 对于每一个网络, 都会固定四个采样点, 并利用双线性插值法来计算每个采样点的数值, 最后根据这些数值进行池化操作. 除了这些比较重要的点之外, Mask R-CNN 也有一些其他的优化, 比如说更多的 anchor, 更大的 batch size, 更强的 backbone 网络(ResNeXt+FPN)等等.

YOLOv3 (Arxiv, 2018)

YOLOv3 加入了更多被验证过的有效技术, 使得 YOLO 模型的 mAP 可以与 SSD 系列相媲美, 同时速度依然很快(约为 SSD 的三倍). YOLOv3 的改进主要如下:

  • Bounding Box Prediction: YOLOv3 使用了和 YOLOv2 相同的 bbox 回归策略, 都是预测相对于 cell 左上角的偏移量进行回归. YOLO 中每个 gt box 只会与负责它的 cell 中的一个 anchor box 匹配(IoU 最大), 其他的 anchor box 只会计算 objectness 置信度损失, 而不会计算坐标和分类损失.
  • 类别预测: 由于有的物体可能不止属于一个标签, 如 “人” 和 “女人”. 因此, 为了减少类别之间的对抗性, YOLOv3 没有使用 softmax 计算分类损失, 而是采用了 二值交叉熵 来预测类别(属于某类或其他类).
  • 采用特征金字塔: 使用类似于 FPN 的方法(upsample and top-down)提取到不同尺度的特征图谱(文中使用了3个), 在每个尺度的特征图谱上的都会预测三个boxes, 因此, 每个尺度的特征图谱的输出为: $N\times N \times [3\times (4+1+80)]$. 在确定 anchor 大小时, 利用 kmean 聚类选出 9 个聚类中心, 然后划分成 3 个簇分别赋给 3 个尺度的特征图谱.
  • Darknet-53: 使用了残差模块的思想, 提出了层数为 53 的 Darknet-53 网络 (1, 2, 8, 8, 4). 在 ImageNet 上, Darknet-53 is better than ResNet-101 and 1.5x faster. Darknet-53 has similar performance to ResNet-152 and is 2x faster.

在使用了 anchor 和 multi-scale 之后, YOLOv3 在小物体的检测上有所改善.
Focal Loss 对 YOLOv3 不起作用的原因可能是 YOLO 的选框策略和损失函数(objectness+cls)使得 YOLO 在背景样本不均衡问题上影响较小.

RefineDet (CVPR, 2018)

RefineDet 从 SSD 的 bbox 回归上入手, 分析了相对于 one-stage 方法来说, two-stage 方法精度较高的原因主要有三点: (1) 使用了启发式的规则(正负样本比例控制在 1:3)来处理样本不均衡问题; (2) 具有两个级联的物体边框回归阶段(这样可以使得回归后的 bbox 更加精确); (3) 利用两级特征来描述一个物体, 以 Faster R-CNN 为例, 第一阶段提取的特征是针对于有无物体的二分类问题, 第二阶段则是针对物体具体类别的多分类检测问题.
而复杂的结构和流程就意味着效率的牺牲和计算时间的延长, 因此, one-stage 方法的特点就是简化检测流程, 直接在特征图谱进进行分类和回归任务训练. 作者为了提升 one-stage 方法的性能, 结合one-stage方法和two-stage方法各自的优势, 提出了一个新的的检测模型: 该模型主要包含两大模块, 分别是 Anchor Refinement Module(ARM) 和 Object Detection Module(ODM).
具体来说, ARM 的作用有两点: (1), 移除 negative anchors 来减少二分类器的搜索空间;(难负样例挖掘, 控制样本不均衡问题) (2), 粗略的调整 anchors 的 locations 和 sizes, 为后续的回归器提供更好地初始 anchors. ODM 的作用是: 将 ARM refine 后的 anchor 作为输入, 进一步的提升 bbox reg 和 multi-class pred 的精度.

在代码具体实现上:
RefineDet 的网络框架设计和 SSD 类似, 首先在常规的 SSD 金字塔特征图谱上(即: conv4_3, conv5_3, conv_fc7, conv6_2) 产生预定义的固定数量的 default boxes, 然后每一个特征图都会有两个子网络分支, 分别为 anchor 的回归网络和二分类预测网络. 这一步产生的负样本置信度高于 0.99 的 anchor 不会传入 ODM 阶段. 然后, 将 ARM 阶段得到的特征图谱结合从深层网络反卷积来的特征图谱通过 TCB 单元得到新的特征图谱, 并传入 ODM 中(由两个子网络构成, 分别进行回归和分类任务), 最终输出所有物体类别的 scores 以及相对于 refined anchor box 的唯一(第二次回归).

  • RefineNet 使用了 two-stage 的边框回归过程, 为什么还说它是 one-stage 模型?

SNIP (CVPR, 2018)

RelationNet (CVPR, 2018)

Cascade R-CNN (CVPR, 2018)

本文针对检测问题中正负样本区分的 IoU 阈值选择问题提出了一种新的目标检测框架, Cascade R-CNN
在 two-stage 的目标检测模型当中, 需要设置 IoU 阈值来区分正样本和负样本, 通常, 阈值选的越高, 正样本的框就与真实框越接近, 但是这样就会使得正样本的数量大大降低, 训练时容易产生过拟合问题, 而如果阈值选的较低, 就会产生大量的假正例样本. 根据经验和实验证明可知, 当输入的 proposals 和真实框的 IoU 的值, 与训练器训练时采用的 IoU 的阈值比较接近的时候, 训练器的性能会比较好, 为此, 作者提出了一种级联式的阈值训练方法, 先在较低的阈值上训练检测器, 得到具体更高 IoU 的候选框输出, 然后在此基础上进行训练, 不断提升 IoU 的阈值, 这样一来, 最终生成的候选框质量会变得更高 (与真实框的 IoU 更大). 作者提出这种框架的启发来自于图1(c), 整体来说, 输入的 proposals 的 IoU 在经过检测器边框回归以后, 其输出的边框与真实框会有更大的 IoU, 因此可以将这个具有更大 IoU 的框作为下一个检测器的输入, 同时调高训练时的 IoU, 进而得到质量更高的框

DetNet (ECCV, 2018)

Fitness NMS (ECCV, 2018)

STDNet (ECCV, 2018)

RFBNet (ECCV, 2018)

本文从感受野大小的角度出发, 提出了 RFB 模块, 可以融合多个感受野特征, 进而提升轻量级网络(SSD)的特征表达能力
相比于不断增加模型复杂度(深度,宽度)来增强特征的表达能力, 本文通过一种人工设计的机制来增强轻量级模型的特征表达能力, 以期获得一种既快又好的检测模型.

Group Normalization (ECCV, 2018)

针对BN对batch size的依赖问题, 提出了一种新的通用型归一化方法
提出了一个用于替代BN的简单算法, 称之为GN(Group Normalization). GN将输入图谱的通道分成不同的组, 并且计算每一组的mean和variance, 然后将其进行归一化. GN的计算复杂度与batch size 的大小是相互独立的, 并且它的准确度在不同范围内的batch size下仍然是稳定的. 并且在整体表现和不同任务上的效果均强于其他类型的归一化方法(LN,IN等)

SoftNMS (ICCV, 2017)

提出了一种NMS的变体, 通过利用该变体, 基本上可以提升任何模型的检测准确率
作者们提出了一种新式的NMS算法, 并且利用该算法, 可以普遍提高当前现有模型的召回率(尤其是面对重叠程度大的物体), 同时, 由于可以不增加复杂度的情况下直接用该算法替换传统NMS算法, 因此, 在替换SoftNMS时, 无需更改模型的任何参数, 也无需重新训练模型, 就可以达到提升召回率的作用. (对mAP的提升大约为1%左右)

Non-local Neural Networks (CVPR, 2018)

1) 提出了 non-local operations 来解决 CNN 网络中的 long-range dependencies 问题
传统 CNN 的卷积操作由于输出神经元只会与输入图谱上的一部分区域有关系, 因此, 在面对那些 long-range dependencies 的时候, 往往不能捕获到足够的信息来表征数据, 为此, 作者提出了 non-locl operations, 其相当于构造了一个和特征图谱尺寸一样大的卷积核, 从而可以维持更多信息.

2) non-local module 可以作为一种通用的模块应用在各项任务上
作者通过实验证明, non-local 的有效性不仅仅局限于某一类特殊任务(如视频分类), 同时还可以轻易的整合到其他现有模型中, 如将其整合到 MaskR-CNN 中, 可以当做是一种 trick 来提供 MaskR-CNN 在目标检测/分割, 姿态识别等任务上的性能表现.

SofterNMS (Arxiv, 2018)

提出了一种新的边框回归损失函数和NMS算法
作者提出了一种 基于KL散度的边框回归损失函数, 可以同时学习到边框的形变量和位置变化量. 最终产生的位置变化量会与位置的精确度有很强的联系, 然后将其使用在本文提出的 新的NMS 算法上, 以此提高准确度.

CornerNet (ECCV, 2018)

在 CornerNet 中, 我们利用一对关键点(左上角和右下角)来检测物体. 卷积网络会预测两组热图(heatmaps)来表示不同物体类别的 corners locations, 一组用于表示左上角, 一组用于表示右下角. 同时, 网络还会为每个检测到的 corner 预测一个 embedding vector, 其特点是同一个物体的两个角点(corners)的 embeddings vector 之间的距离会非常小. 为了产生更紧密的边界框, 网络还会预测偏移量, 以稍微调整焦点的位置. 得到预测的 heatmaps, embeddings 和 offsets 之后, 我们会使用简单的后处理算法来获取最终的 bboxes.

图1

图6

PFPNet (ECCV, 2018)

Pelee (NIPS, 2018)

本文在 DenseNet 的基础上进行改进, 提出了一个适用于移动设配的轻量级模型(模型大小只有 MobileNet 的 66%). 主要的改进有:

  • 受 Inception 结构启发的 Two-way Dense Layer
    图1
  • 受 Inception-V4 启发的 Stem Block
    图2
  • 更改了 Bottleneck 结构中的通道数量
  • 移除了 DenseNet 的压缩因子
  • 用传统的后激活方式(conv+bn+relu)替换预激活来加快 inference 速度

另外, 对于目标检测模型, 也在 SSD 的基础上进行有速度优化, 主要有:

  • 不使用 $38\times 38$ 的大特征图谱进行预测
  • 在预测层(head)设计了 Residual Prediction Block 结构.
  • 在 Residual Prediction Block 结构中使用了更小的卷积核($1\times 1$)进行预测.
    图4

MetaAnchor (NIPS, 2018)

SNIPER (NIPS, 2018)

M2Det (AAAI, 2019)

M2Det 从特征金字塔的构建角度出发, 认为现有的 sota 的特征金字塔的构建方式存在两个缺点, 一是直接简单利用了 backbone 网络固有的金字塔式的特征图谱来构建, 但这些 backbone 实际上是针对分类任务设计的, 因此不足以表示针对目标检测任务的特征. 二是构建的金字塔中每一个尺度的特征仅仅来自于 backbone 中单一层级(level)的特征. 这样一来, 小尺度的特征图谱往往缺少浅层低级的语义信息, 而大尺度的特征图谱又缺少深层的高级语义信息(同尺寸的物体可能本身所需的语义层级不同, 如人和交通灯). 因此, 作者就提出了融合多个层级特征的 MLFPN (multi-level FPN). MLFPN 主要由三个模块组成, 分别是: 特征融合模块(Feature Fusion Module, FFM), 简化的 U-shape 模块(Thinned U-shape Module, TUM), 以及尺度特征聚合模块(Scale-wise Feature Aggregation Module, SFAM). 首先, FFMv1 融合了 backbone 网络中浅层和深层的特征来生成 base feature, 具体来说就是 VGGNet 的 conv4_3 和 conv5_3. 其次, 若干个 TUMs 和 FFMv2 交替连接. 具体的说, 每一个 TUM 都会生成多个不同尺度的 feature maps. FFMv2 融合了 base feature 和前一个 TUM 输出个最大的 feature map. 融合后的 feature maps 会被送到下一个 TUM 中. 最终, SFAM 会通过按照尺度划分的特征连接操作(scale-wise feature concatenation operation)和通道注意力机制(channel-wise attention mechanism)来聚集 multi-level multi-scale features, 形成最终的特征金字塔结构. 最后用两个卷积层在特征金字塔上分别进行回归和分类预测. 可以看出, 整体的流程和 SSD 类似, 不同之处就在于特征金字塔的构建方式.

图2

图4

Bag of Freebies (Arxiv, 2019)

Fovea: 视野(物体)的中心具有最高的视觉敏感度。

FoveaBox 的整体结构比较简单, 由一个 Backbone 网络和两个分支网络组成, backbone 负责提取特征, 分支网络一个负责像素级别的分类, 另一个在每个像素点上进行 bounding box 的回归预测, 因此, 两个子网络的输出分别是 $W\times H\times K$ 和 $W\times H\times 4$. 同时, FoveaBox 的 backbone 网络上还使用了 FPN 来构建多尺度的特征金字塔, 以此来解决多尺度检测的问题,

参考文献: