目录

  1. 简述
  2. One-Stage 算法
  3. Two-Stage 算法
  4. 检测的方法分析
  5. 后续
  6. 总结

简述

目标检测(Object Detection),在计算机视觉领域的任务就是给定一张图片,将图片中的物体识别并且框定出来。随着近年来的发展,其主要分成了两大类别,Two-Stage检测算法(以Faster R-CNN为代表)和以及One-Stage检测算法(以YOLO为代表)。

PS:Multi-Stage检测算法的Selective Search、Feature extraction、Location regression、Class SVM等环节都是分开训练,操作繁杂而且效果不好,所以这里默认忽视。

Two-Stage检测算法可以通过ROI pooling layer(以Faster R-CNN为例)进行结构划分,前部分提出可能存在目标的区域,后部分即目标分类和定位回归。结构如下
目标检测算法笔记(一)综述
上图中two-stage主要处理的几个问题是:backbone进行特征提取、proposal建议区域的生成、分类和定位回归。

PS:简单说一下ROI pooling,它能接收不同尺寸的图像特征输出固定尺寸的图像特征一遍后续传入卷积网络

One-Stage检测算法的初衷是提升速度,而Two-Stage中比较耗时就是proposal建议区域生成,所以索性One-Stage方法就是直接从图像建议区域提取特征进行分类和定位回归。

目标检测算法笔记(一)综述
注意这里的图像建议区域是直接从backbone的特征层中进行密集选取,所以一些one-stage算法也称为密集检测器。同时可以看出,one-stage主要处理的问题是:特征提取、分类和定位回归。即关键点全部在特征提取这一块上。

后面主要是按照时间顺序分类简单介绍著名的Baselines,然后分析综合一下目标检测的方法以及后续扩展。

Two-Stage 算法

R-CNN

R-CNN算是鼻祖了,虽然它不能算是Two-Stage算法,但这里还是将其简单提一下

R-CNN检测器包含4个模块:目标检测算法笔记(一)综述

  1. 使用选择性搜索方法(Selective Search)生成类别独立的区域建议
  2. 从每一个建议区域中提取固定长度的特征向量
  3. 一系列特定类别的SVMs来对目标进行分类
  4. Bounding Box Regression(定位回归预测)使得定位更加准确

Fast R-CNN (1 year after R-CNN)

Fast R-CNN对R-CNN进行了许多改进:

  • 从建议区域提取特征是不再是包裹的操作而是提出了ROI Pooling层并且直接输送到下一步分类和定位回归预测中
  • 直接在标记的ROI上计算多任务损失化简了训练

但Fast R-CNN还是使用SS进行建议区域搜索(速度很慢且不高效的操作),但此时Fast R-CNN以及具有Two-Stage算法框架的雏形

Faster R-CNN (3 month after Fast R-CNN)

非常经典的提出了RPN网络来替代SS方法生成建议区域,共享了卷积的图像特征以及一些检测网络的组件使得RPN网络生成Proposal快速且高效(相比SS);同时还提出了anchor机制,不再需要输入图像特征的多种尺度,使得准确性也得到了非常大的提升。

Mask R-CNN

Mask R-CNN是将Faster R-CNN扩展用于实例分割任务上所提出的。不管它的mask分支,Mask R-CNN可以看作是更为精确地目标检测。其使用Faster R-CNN以及一个ResNet-FPN模块(一种将ROI特征从不同的特征层根据其不同的尺度提取出图像特征,能够更好挖掘图像中的特征信息),从而达到了非常好的准确性同时处理速度也不慢;同时Mask R-CNN还使用ROI Align来替代ROI Pooling(存在两次量化导致精度降低)来更好的处理不同尺寸的ROI。

One-Stage 算法

YOLOv1

YOLOv1是在Faster R-CNN之后被提出来的,其主要贡献是提出了一个实时监测的方法。YOLOv1当时的速度是Faster R-CNN的5倍以上。

其思路首先是将图像分成S x S个cell区域,如果一个目标的中心落入一个cell中,则这个cell要负责对应目标的检测;每一个cell都预测B个bounding box (x, y, w, h)以及对应的C维的分类置信度;B个bounding box可以大致涵盖目标的形状以及大小,C维对应分类的C种目标;另外置信分数对于每个bbox由一个P(object)代表时候包含目标的概率以及IoU的值组成。

YOLOv2

YOLOv1提出的时候只是速度很快,准确性并不高,所以作者在YOLOv2对YOLOv1做了许多改进:

  • 增加了BatchNorn层,加速了网络收敛的同时还在一定程度上防止了网络过拟合的风险
  • 使用了更高分辨率分类网络,fine-tune环节对于预训练模型的输入尺度从224 x 224提高到448 x 448
  • 使用了anchor机制,YOLOv1中预测box的坐标是直接通过全连接层得到,这里使用anchor box作为参照生成偏移预测box,YOLOv2虽然因为使用这个mAP下降了0.3%,但是recall增加了7%
  • 使用维度聚类预测anchor机制的超参数设置,对数据进行横纵比和尺度大小聚类挑选后性能有一定提升
  • 使用了细粒度特征。YOLO系列都存在的问题:对小物体的识别效果不好,所以YOLOv2提出将卷积层浅层Feature Map与深层Feature Map进行对应通道的堆叠,有一定程度的提升
  • 为了让网络更加健壮使用了多尺度训练,调整网络适用只要是输入图像尺寸是32的倍数即可进行训练。每10个Batch就随机从[320, 608]中选择一个尺寸进行训练,此方法对精度提升较高

此外,YOLOv2还提出了一个新的backbone叫darknet-19,包含19卷积层以及5个max pooling,需要的浮点数操作量较少的同时还有不错的性能

YOLOv3

YOLOv3使用多标签分类(细化标签做成类似树结构的分类标签)来适应更为复杂的数据集;使用三个不同尺度的特征图预测bounding box,最后预测框预测3-d tensor,其包含类别预测、是否含目标概率、Bounding box;基于ResNet提出了Darknet-53。

SSD

目标检测算法笔记(一)综述

SSD是用于多类别的一次性目标检测器,一次性完成类别分数预测以及在不同大小的Feature Map中固定一系列默认bounding box的偏移预测;不同的Feature Map中的bounding box有不同的横纵比和大小尺度;训练时这些默认bounding box与ground truth box进行匹配,匹配成功为正样本,否则视为负样本;作者还使用hard negative minning(训练好的网络预测负样本集,取得分较高的负样本作为最终的负样本集,一般正样本集:负样本集 = 1:3)来平衡正负样本数量。

DSSD

对SSD做了一些改动。主要是增加预测module以及deconvolution momdule;选用ResNet-101作为backbone对于预测模组;每一层deconvolution层后面都跟这一个预测层;每一个预测层都增加了残差快,对应元素进行相加。DSSD可以由此预测大量不同尺度的物体。

目标检测算法笔记(一)综述

RetinaNet

此网络算是One-Stage检测算法中比较好的一种算法,它提出了处理One-Stage算法中密集检测正负样本不平衡的有效处理方法:focal loss function,对不同的样本进行不同的赋权从而使使得大量的负样本不会严重影响网络的训练,使得网络有大量样本能够进行训练提升精度的同时还保持了速度;此文还设计了一个网络并运用了focal loss,此网络就是RetinaNet;focal loss的实现也不仅仅局限于文中的公式,更多的是思路。

M2DNet

虽然在RetinaNet提出后One-Stage在精度和速度都有着不错的效果,但是对于一些困难的目标识别情况:对象的各种各样的规模变化,此算法提出了多层特征金字塔网络(MLFPN),其构建了更加有效地FPN,能够更为有效的提取图像特征。

目标检测算法笔记(一)综述
目标检测算法笔记(一)综述
作者使用三步来获得最后的增强特征金字塔:

  1. 类似FPN一样从backbone中提取多层的特征
  2. 将基本的特征输入进一个由交替连接的U-Shape模块和特征融合模块组成的部分,然后将TUM的decoder层作为下一步的特征
  3. 通过集成同等尺寸的decode层构建一个FPN

其余后续部分与SSD大致相同

RefineDet

整个RefineDet包含两个内连的检测模组,通过一个转移连接块转移并增强前模组的特征方便后模组更好的预测膜表;训练方法是一个end-to-end方式,包含预处理、检测以及NMS;作者还发现使用两步叠加回归方法可以更好的预测难以检测的目标,特别是对于小型物体,同时还能提高定位准确性。

检测方法分析

目标检测Pipelines一般有四个步骤:图像预处理、特征提取、分类和定位、后处理。

其中图像预处理一般是:图像尺寸处理、翻转、旋转、图像变换、高斯噪声etc,也可以通过GANs来生成所需要的图像。

特征提取则是目标检测一个关键步骤,决定了目标检测准确性的上限,一些常见的特征增强方法如下:

  • 类似FPN网络根据目标尺寸分成不同的级别分别从中提取特征(一般浅层属于细粒特征,深层属于抽象、总体特征)
  • 类似WeaveNet将相邻尺度的上下文迭代地编制在一起,以支持更复杂的上下文推理
  • 图像中不同物体或者区域的语义联系可以帮助检测遮挡以及小物体
  • 场景的上下文联系也可以提供有用的信息帮助精确识别
  • 利用注意力机制模块可以让网络关注到重要的区域
  • 完全有效的利用目标区域可以促进准确性

总之有效的特征提取(包含特征增强)能够有效的提升检测准确性。

分类和定位(卷积网络和Bounding Box Regression etc)以及后处理(NMS、Soft-NMS etc)可以依据具体的情况进行设计即可。

这里额外说几点小trick:

  • 提升定位准确性:设计一个有效合理的loss函数,比如GIoU、DIoU etc,一般重新有针对性的设计一个新的合理的损失函数可以有效提升性能
  • 处理正负样本不平衡方法:hard negative minning()、IoU-balanced sampling etc
  • 提升后处理NMS方法:IoU-Net中的IoU-guided-nms、soft-nms、adaptive-nms通过目标密度决定阈值动态抑制 etc
  • 大部分sota方法使用现有的分类backbone,其实从头设计或者训练对应需求的网络可以提升最终的检测性能。
  • 设计新的网络结构。定位需要细粒度特征表示,分类则需要高语义信息。由此对于特定task设计新的结构可以更好的完成需求。

后续

这里后续有许多点的,但个人精力有效不能关注所有,简单挑几个讲讲

Anchor-free

基于anchor方法的检测其虽然性能很好,但还是存在一下一些问题

  1. 预先定义的anchor boxes是一系列手工定义的,其对数据敏感并且大幅影响检测性能
  2. 训练过程中anchor各个属性是固定的,下一次迭代不能获得适应性的变化,同时检测器不一定能有效处理所有的尺寸
  3. 密集的anchor boxes其计算花费代价高并带来过度的处理步骤
  4. 许多预定义的anchor是负样本,由此带来的正负样本不平衡虽然可以通过设计loss进行有所平衡,但还是会存在并且影响

所以,anchor-free系列的方法就被提了出来。比如CenterNet定位一个目标的中心点以及左上和右下点等。Anchor-free是研究的一个新的方向。

其余

  1. 构建新结构
  2. 提取丰富的特征
  3. 使用更好的特征表示
  4. 提升处理速度
  5. 解决复杂场景问题
  6. 合并onw-stage与two-stage
  7. 提升后处理nms
  8. 处理正负样本之间的不平衡的问题

趋势

  1. One-stage和two-stahe进行合并
  2. 视频目标检测,视频中目标检测有运动模糊、小目标、遮挡以及截断等等
  3. 高效后处理方法。使用更加高效的后处理方法从而进一步为检测带来准确和高效的结果是未来方向之一
  4. 弱监督目标检测方法。终归有数据不够的情况,发展弱监督目标检测方法是一个非常有意义的方向
  5. 多领域目标检测
  6. 3D目标检测
  7. 显著目标检测
  8. 无监督目标检测
  9. 多任务学习
  10. 多源信息辅助

具体感兴趣希望自行查阅,这里仅抛转。

总结

目标检测发展至今成熟又不成熟,成熟是它已经可以应用于一些对准确性要求不高的场景了,不成熟是对于具体现实中的某些问题它还是不能很好地处理和解决。

不管怎么样,它都是CV的基底之一,它的发展能与别的技术的发展相辅相成,所以学好目标检测还是很有意义的。

此文主要是介绍,具体个人建议多看代码以及详细的解读。

参考文献:

A Survey of Deep Learning-based Object Detection