下面对每篇文章及模型的亮点和优势进行了简单总结, 点击标题可以跳转至相关论文解读 (难免存在纰漏或者词不达意的地方, 望谅解)
下面是自RCNN以来有关目标检测的文章,其中,加粗的部分为具有标志性意义的检测模型。
RCNN (CVPR, 2013) ⟶ \longrightarrow ⟶ OverFeat (ICLR, 2014) ⟶ \longrightarrow ⟶ MultiBox (CVPR, 2014) ⟶ \longrightarrow ⟶ SPPNet (ECCV, 2014) ⟶ \longrightarrow ⟶ FastRCNN (ICCV, 2015) ⟶ \longrightarrow ⟶ FasterRCNN (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)](#Speed-Accuracy TradeOff) ⟶ \longrightarrow ⟶ DCN (ICCV, 2017) ⟶ \longrightarrow ⟶ [Couple Net (ICCV, 2017)](#Couple Net) ⟶ \longrightarrow ⟶ [RetinaNet (ICCV, 2017)](#Focal Loss) ⟶ \longrightarrow ⟶ [Mask R-CNN(ICCV, 2017)](#Mask R-CNN) ⟶ \longrightarrow ⟶ YOLOv3 (Arxiv, 2018) ⟶ \longrightarrow ⟶ RefineDet (CVPR, 2018) ⟶ \longrightarrow ⟶ [Cascade R-CNN (CVPR, 2018)](#Cascade R-CNN) ⟶ \longrightarrow ⟶ [RFB Net (ECCV, 2018)](#RFB Net) ⟶ \longrightarrow ⟶ Pelee (NIPS, 2018)
模型 | 特点 | 性能 |
---|---|---|
Faster R-CNN | RPN | 精度高, 速度慢 |
YOLO | Darknet, One-Stage | 小目标效果不好, 速度很快 |
SSD | MultiBox+Anchor, One-Stage | 精度尚可, 速度较快 |
FPN | 特征金字塔 | - |
RetinaNet | Focal Loss | - |
Mask R-CNN | 实例分割 | - |
本文是一种工程上的艺术成就, 成功的将CNN运用到了目标检测任务当中, 开启了CNN统治目标检测领域的时代.
(1) 利用SS (Selective Search)提取候选区域框:
本篇文章利用SS(Selective Search) 算法首先生成大约2000个候选区域框
(2) 将CNN用于目标检测任务:
CNN拥有十分强大的特征提取能力, 并且无需人为设计特征算子, 对提取出来的每个候选区域框进行CNN计算, 获取到固定长度的特征向量
(3) 利用SVM分类器对候选框分类:
训练SVM分类器, 对候选区域框的特征向量进行分类.
(4) 使用回归其精细修正候选框位置
注: 以上几个步骤是独立训练的, 这也是RCNN后续改进的空间
(1) Multi-Scale Classification:
在分类任务上, 虽然训练时采用和AlexNet相同的multi crop方法, 但是在预测阶段没有使用AlexNet的crop投票策略, 而是提出了Multi-Scale Classification方法, 一句话概括就是 对整个图片以不同的尺寸, 并且对每一个location进行模型预测
(2) 利用了全卷积的思想代替全连接
降低了滑动窗口的计算代价, 同时支持任意尺寸的图片输入
(3) 可以用同一个模型完成分类, 定位, 检测任务:
同一个模型, 只需要用回归层替换分类层, 即可完成目标定位任务, 同时利用了贪心策略来融合最终的定位结果
(1) 将目标边框检测转化为回归问题:
将物体检测问题定义为输出多个bounding box的回归问题. 同时每个bounding box会输出关于是否包含目标物体的置信度, 使得模型更加紧凑和高效
(2) 通过损失函数将检测器训练过程整合到神经网络内部:
将训练bounding box检测器作为整个网络训练过程的一部分, 也就是说在损失函数中包含了关于bounding box的损失项. 通过联合训练, 不仅利用了神经网络强大的特征表示能力, 而且将检测器的训练集成到了网络中
(3) 无类别监督训练, 使得边框推荐复杂度与类别无关, 易于扩展
作者将本文的目标边框检测器在无监督的样本下训练, 由于本方法主要完成的功能就是画框, 并不会输出框中包含的物体类别, 因此训练的时候无需知道样本的类别信息. 这也使得该方法的计算复杂度与类别信息几乎无关, 可以轻易的推广到未知的类别当中. (当然也可以进行相关类别的训练, 对每个类别都训练一个检测器, 模型的总参数会随着类别数线性增加)
(1) 提出了一种新的池化方法: 空间金字塔池化SPP:
(2) 将SPP用于目标检测, 并且使用了先求卷积特征图谱, 后取区域的的策略(并不是首次提出):
大大提升了模型训练和预测的速度(在预测阶段, 比RCNN快24~102倍, 同时取得了更好的精度).
PS:
注1: 在特征图谱上使用检测方法不是该文首次提出, 而SPP的贡献在于结合了deep CNN结构强大的特征提取能力和SPP的灵活性, 使得精度和速度同时提高
注2: 相比于RCNN, SPPNet使用了EdgeBoxes( 0.2 s / i m g 0.2s/img 0.2s/img )的方法来进行候选区域推荐, 而不是Selective Search( 1 ∼ 2 s / i m g 1\sim 2s/img 1∼2s/img )
注3: SPPNet在ILSVRC2014的目标检测任务上取得第二名, 在图片分类任务上取得第三名
大幅提升了RCNN的训练时间和预测时间, 并且在PASCAL VOC 2007 上测试的准确率相差无几.
(1) 直接在特征图谱上获取候选框:
在用SS算法得到候选框的坐标以后, 将整张图片直接送入卷积网络, 然后, 将所有候选框的坐标映射到特征图谱上, 直接从特征图谱上获取到候选框的特征子图.
(2) 提出RoI Pooling层:
受到SPPNet的启发, FastRCNN 提出了一种RoI Pooling层, 它可以看作是SPP层在单一pyramid level上的一种特殊情况. RoI Pooling会将不同size的候选区域特征图片转化成固定尺寸的特征向量, 突破了全连接层对输入尺寸的限制.
(3) 其他变动:
(1) Region Proposals Network:
抛弃了外部的候选区域推荐算法, 提出RPN网络结构, 将候选区域推荐过程整合到神经网络里面, 至此, 目标检测中的所有过程都被统一到了一个网络中, 可以进行完全的端到端训练. RPN最终推荐的候选区域个数为 W × H × k W\times H \times k W×H×k , W × H W\times H W×H 为卷积特征图谱size, k k k 为anchor boxes的数量.
(2) 共享计算:
RPN网络与前面的卷积层共享同样的卷积计算结果, 加快了模型速度. 提高了模型的精度.
(3) 其他要点:
(1) 将检测问题看做是回归问题
对于给定的输入图像, YOLO会使用一个单一的网络 同时 给出bounding box的预测结果和对应的类别概率.
(2) 没有Region Proposal的过程
YOLO将输入图片划分成 S × S S\times S S×S 的网格, 如果某个物体的中心落在了某个cell里, 那么这个cell就负责该物体的检测.
PS:
注一: YOLO中采用 S × S S\times S S×S 的网格划分来确定候选框, 这实际上是一种很粗糙的选框方式, 同时也导致了YOLO在面对小目标物以及群落目标物时, 性能较差.(因为YOLOv1的同一个cell无法预测多个目标, 也就是说YOLOv1理论上最多检测出49个物体).
提出了一种在线的难样例挖掘算法:
作者根据每个RoIs的loss的大小来决定哪些是难样例, 哪些试试简单样例, 通过这种方法, 可以更高效的训练网络, 并且可以使得网络获得更小的训练loss. 同时, OHEM还具有以下两个优点:
注: 在实现OHEM上, 作者为了提升速度和效率, 特意设计了两个RoI网络, 以减少无用的计算.
(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 k k 个默认box, 对于这 k k k 个默认box中的每一个box, 都会计算 c c c 个类别score和4个相对偏移量. 因此, 对于每一个location, 需要有 ( c + 4 ) k (c+4)k (c+4)k 个输出, 也就是需要
( c + 4 ) k (c+4)k (c+4)k 个卷积核. 又因为特征图谱的大小为 m n mn mn, 所以最终的输出为 ( c + 4 ) k m n (c+4)kmn (c+4)kmn, 其中 k m n kmn kmn 为box的数量, ( c + 4 ) (c+4) (c+4) 为每个box带有的值.
(4) 使用了数据增广, 难样例挖掘, atrous算法等trick大幅度提升精度和速度
这个其实算不上亮点, 只不过作者确实使用这些技术提升性能不少
(1) 利用position sensitive score map将目标位置信息融合进RoI
在一般情况下, 分类任务具有平移不变性, 而检测任务却要求对目标的平移做出正确响应. 在Faster RCNN类的方法中RoI pooling之前都是卷积, 具有平移不变性, 但是一旦经过RoI pooling 之后, 后面的网络结果就不再具备平移不变性了. 因此, 本文提出了position sensitive score map来将目标位置的信息融合进RoI.
(2) 让更多的层共享计算
对于Faster RCNN等基于感兴趣区域的检测方法来说, 实际上是 分成了几个subnetwork, 第一个用来在整张图上做比较耗时的conv, 这些操作与region无关, 是计算共享的. 第二个subnetwork是用来产生候选区域(如RPN), 第三个subnetwork是用来分类或者进一步对box进行回归的, 这个subnetwork和region是有关系的, 衔接在这个subnetwork和前两个subnework中间的就是RoI pooling. 本文希望将耗时的卷积都尽量移到前面共享的subnetwork上面去, 因此与FasterRCNN相比(前91层共享, RoI pooling之后, 后10层不共享)不同, 将ResNet所有的101层都放在的前面共享的subnetwork中, 最后用来进行prediction的卷积只有1层, 大大减少了计算量.
本文实现了一个灵活统一的目标检测框架, 并对三个主流的目标检测模型做了详细客观的分析和讨论
通过该框架, 本文对目前主流的各个模型(Faster, R-FCN, SSD)影响精确度和速度的各个因素展开了详细的分析和讨论, 以此希望能够帮助从业者在面对真实应用场景时, 能够选择适当的模型来解决问题. 同时, 本文还发现了一些新的trick, 使得可以在保持精度的前提下, 提升模型的速度.
(1) 利用反卷积模块向特征图谱中添加更多的上下文信息
主要是对SSD的一点改进, SSD使用了不同阶段的卷积特征图谱进行目标检测, 而DSSD受到人体姿态识别任务的启发, 将这些不同阶段的卷积特征图谱通过反卷积模块连接起来, 然后再进行目标检测的预测任务.
(2), 预测模块采用Residual模块
这个不算是亮点, 不过也是改动之一, 基本来说就说原始的SSD是直接在特征图谱预测结果并计算损失的, 而DSSD在预测之前会先经过一个Residual模块做进一步的特征提取, 然后在进行预测.
提出了多尺度的特征金字塔结构:
将最后一层特征图谱进行不断尽快上采样, 并与每一个金字塔阶级的特征图谱进行加法合并操作, 得到新的表征能力更强的不同金字塔层次的特征图谱, 然后将RoI按照尺寸分别映射到这些特征图谱上, 再在每个特征图谱上进行类别和位置预测. 可以直观感受到, 这种多尺度的特征图谱在面对不同尺寸的物体时, 具有更好的鲁棒性, 尤其是在面对小型物体时. 同时, 这种特征金字塔结构是一种通用的特征提取结构, 可以应用到不同的网络框架中, 显著提高(5~8%)模型的召回率(因为提出了更多不同尺度, 不同特征信息的anchor box), 并且可以广泛提高(2~3%)模型的mAP.
YOLOv2 实际上没有提出任何新的想法或者点子, 它的主要贡献在于尝试了当时几乎所有的可以提升模型性能的方法, 并且通过大量实验找出了一个相对比较好的参数组合.(作者在使用这些方法时有一个基本原则—保持检测速度, 所以YOLOv2最终不仅精度提升, 其检测速度依然很快)
(1) 使用了anchor box思想:
YOLOv1是基于每个cell的 B B B 个bounding box来预测物体的, 因此同一个cell只能预测出一种物体, 如果有两个物体的中心都落在了同一个cell里面, 则不能全都检测出来. 而 YOLOv2 结合了anchor box的思想 (不同尺寸和大小的anchor box, 可以检测到不同的物体) , 同时将网络的输入调整到416×416, 经过多个卷积层和池化层以后, 得到了13×13 (5个池化层,缩小32倍)的feature map, 然后在这个feature map上面使用anchor box(作者选了k=5种), 最终会生成 13 × 13 × 5 = 845 13\times 13\times 5 = 845 13×13×5=845 个候选区域框(相比于YOLOv1的98个, 多多了).
下降的原因, 个人觉得是YOLO在采用anchor box获取候选框的同时, 依然采用YOLOv1的训练方法, YOLOv2的损失函数是一个非常复杂的形式, 导致其在更新参数时很容易顾不过来, 因此其出错的概率也相应提升.
(2) 在每个卷积层之后都是用了BN
(3) 网络舍弃了全连接层, 采用全卷积FCN:
(4) 使用了跨层连接
借鉴了ResNet恒等映射的思想. 其中一个好处就是使得梯度更容易传播.
1) 引入了可以自调节感受野大小的deformable convolution和deformable RoI 模块
该模块通过额外学习一组采样偏移量来决定卷积操作和RoI pooling操作的采样位置, 通过这种方式, 是的网络模型可以根据输入的图谱自动调节感受野的大小的分布.
2) 上面的两种deformable模块均可以无痛的添加到现有模型中
由于deformable convolution和deformable RoI 模块并不会改变原始的输入输出大小, 因此可以很轻易的替换到现有网络中, 并且可以有其他多种提升精度的trick想叠加, 在多个视觉任务上(检测, 分割)都表现出色.
在进行区域分类时, 同时使用了全局信息,上下文信息和局部信息综合判断
提出了一个新颖的全卷积网络, 并称之为CoupleNet, 它可以在目标检测中结合使用全局和局部信息. 具体来说, CoupleNet会将由RPN网络产生的候选区域送入到coupling module中, 该模块包含两个分支. 第一条分支利用position-sensitive RoI pooling来捕获物体的局部信息, 另一条分支利用RoI pooling对全局上下文信息进行编码. 接着, 我们设计了不同的coupling策略和归一化方法来使用这些不同分支格子的优势.
(1) 分析并指出了One Stage方法精度不高的原因:
(2) 提出了解决正负样本比例和easy example 问题的Focal loss:
F L ( p t ) = { − ( 1 − p t ) γ l o g ( p t ) 当 y = 1 − p t γ l o g ( 1 − p t ) 当 y = 0 FL(p_t) = \begin{cases} -(1-p_t)^{\gamma}log(p_t) & 当y=1 \\ -p_t^{\gamma}log(1-p_t) & 当y=0 \end{cases} FL(pt)={−(1−pt)γlog(pt)−ptγlog(1−pt)当y=1当y=0
核心思想很简单, 就是在优化过程中逐渐减低那些easy example的权重, 这样会使得训练优化过程对更有意义的样本有更高的偏置. 所谓easy example指的就是那些预测概率与真实概率十分相近的样本, 这些样本已经被网络很容易切正确的分类了, 所以应该适当减少他们的loss以降低他们对参数更新的影响程度. 以上面的公式为例, 当真实标签为1时, 如果预测概率(假设二分类) p t p_t pt 接近于1, 则此样本是easy样本, 因此, 前面的 ( 1 − p t ) γ (1-p_t)^{\gamma} (1−pt)γ , 就会非常小, 起到了抑制简单样本的作用.
注1: γ \gamma γ 的值越大, 则简单样本对于loss的贡献程度越小, 当 γ = 0 \gamma = 0 γ=0 时, 会退化到普通的交叉熵函数.
注2: 文中在使用 γ \gamma γ 参数的情况下, 还是用了另一个参数 α \alpha α ,如下所示:
F L ( p t ) = { − α ( 1 − p t ) γ l o g ( p t ) 当 y = 1 − ( 1 − α ) p t γ l o g ( 1 − p t ) 当 y = 0 FL(p_t) = \begin{cases} -\alpha (1-p_t)^{\gamma}log(p_t) & 当y=1 \\ -(1-\alpha) p_t^{\gamma}log(1-p_t) & 当y=0 \end{cases} FL(pt)={−α(1−pt)γlog(pt)−(1−α)ptγlog(1−pt)当y=1当y=0
在经过一系列调参之后, 得到 α = 0.25 , γ = 2 \alpha=0.25, \gamma = 2 α=0.25,γ=2 为最优组合. 可以看到, 加在正样本前面的 α \alpha α 要更小, 个人猜测这是因为使用了Focal Loss之后, 原本在数量上不在优势的前景区域或许在对loss的贡献度上反超了后景区域, 因此, 需要对前景区域赋予更低的权重.
(3) 基于Focal Loss设计并实现了RetinaNet
PS:
注一: 为什么Focal Loss没有用在Two Stage方法上面? 这是因为以RCNN为代表的一系列Two Stage会在区域候选推荐阶段采用两个问题来降低正负样本比例和easy example问题带来的影响:
1) 提出了一个简单,灵活,通用的实例分割模型框架
MaskRCNN 在 FasterRCNN 的基础上进行改进, 在模型的head部分引入了一个新的mask预测分支, 在训练阶段, 该分支会与其他分支并行执行, 在测试阶段, 虽然不是并行执行, 但是利用 NMS 减少了需要计算的候选框个数, 因此 MaskRCNN 模型整体增加的额外开销较小.
2) 提出了RoI Align来解决 RoI 与 pooling后的特征图谱之间的不对齐问题
Fast/FasterRCNN 原始的 RoIPool 操作在进行池化时, 会进行两次粗糙的量化操作, 这使得池化后的特征图谱与 RoI 中的信息不能很好的对其, 对于像素级任务实例分割来说, 这种非对齐会使得模型性能大大降低, 因此 MaskRCNN 提出用基于双线性插值法的 RoI Align 代替 RoI Pool, 以此来解决非对齐问题.
https://www.zhihu.com/people/big-big-stone/posts
结合了one-stage方法和two-stage方法各自的优势, 提出了一个基于single-shot的检测模型:
模型主要包含两大模块, 分别是anchor精化模块和物体检测模块. 网络采用了类似FPN的思想, 通过 Transfer Connection Block 将特征图谱在两个模块之间传送, 不仅提升了的精度, 同时还在速度方面取得了与one-stage方案相媲美的表现
本文针对检测问题中正负样本区分的 IoU 阈值选择问题提出了一种新的目标检测框架, Cascade R-CNN
周所周知, 在 two-stage 的目标检测模型当中, 需要设置 IoU 阈值来区分正样本和负样本, 通常, 阈值选的越高, 正样本的框就与真实框越接近, 但是这样就会使得正样本的数量大大降低, 训练时容易产生过拟合问题, 而如果阈值选的较低, 就会产生大量的假正例样本. 根据经验和实验证明可知, 当输入的 proposals 和真实框的 IoU 的值, 与训练器训练时采用的 IoU 的阈值比较接近的时候, 训练器的性能会比较好, 为此, 作者提出了一种级联式的阈值训练方法, 先在较低的阈值上训练检测器, 得到具体更高 IoU 的候选框输出, 然后在此基础上进行训练, 不断提升 IoU 的阈值, 这样一来, 最终生成的候选框质量会变得更高 (与真实框的 IoU 更大). 作者提出这种框架的启发来自于图1©, 整体来说, 输入的 proposals 的 IoU 在经过检测器边框回归以后, 其输出的边框与真实框会有更大的 IoU, 因此可以将这个具有更大 IoU 的框作为下一个检测器的输入, 同时调高训练时的 IoU, 进而得到质量更高的框
本文从感受野大小的角度出发, 提出了 RFB 模块, 可以融合多个感受野特征, 进而提升轻量级网络(SSD)的特征表达能力
相比于不断增加模型复杂度(深度,宽度)来增强特征的表达能力, 本文通过一种人工设计的机制来增强轻量级模型的特征表达能力, 以期获得一种既快又好的检测模型.
针对BN对batch size的依赖问题, 提出了一种新的通用型归一化方法
提出了一个用于替代BN的简单算法, 称之为GN(Group Normalization). GN将输入图谱的通道分成不同的组, 并且计算每一组的mean和variance, 然后将其进行归一化. GN的计算复杂度与batch size 的大小是相互独立的, 并且它的准确度在不同范围内的batch size下仍然是稳定的. 并且在整体表现和不同任务上的效果均强于其他类型的归一化方法(LN,IN等)
提出了一种NMS的变体, 通过利用该变体, 基本上可以提升任何模型的检测准确率
作者们提出了一种新式的NMS算法, 并且利用该算法, 可以普遍提高当前现有模型的召回率(尤其是面对重叠程度大的物体), 同时, 由于可以不增加复杂度的情况下直接用该算法替换传统NMS算法, 因此, 在替换SoftNMS时, 无需更改模型的任何参数, 也无需重新训练模型, 就可以达到提升召回率的作用. (对mAP的提升大约为1%左右)
1) 提出了 non-local operations 来解决 CNN 网络中的 long-range dependencies 问题
传统 CNN 的卷积操作由于输出神经元只会与输入图谱上的一部分区域有关系, 因此, 在面对那些 long-range dependencies 的时候, 往往不能捕获到足够的信息来表征数据, 为此, 作者提出了 non-locl operations, 其相当于构造了一个和特征图谱尺寸一样大的卷积核, 从而可以维持更多信息.
2) non-local module 可以作为一种通用的模块应用在各项任务上
作者通过实验证明, non-local 的有效性不仅仅局限于某一类特殊任务(如视频分类), 同时还可以轻易的整合到其他现有模型中, 如将其整合到 MaskRCNN 中, 可以当做是一种 trick 来提供 MaskRCNN 在目标检测/分割, 姿态识别等任务上的性能表现.
提出了一种新的边框回归损失函数和NMS算法
作者提出了一种 基于KL散度的边框回归损失函数, 可以同时学习到边框的形变量和位置变化量. 最终产生的位置变化量会与位置的精确度有很强的联系, 然后将其使用在本文提出的 新的NMS 算法上, 以此提高准确度.