1、概述

目标检测的任务是找出图像中所有感兴趣的目标(物体),确定它们的位置和大小,是机器视觉领域的核心问题之一。由于各类物体有不同的外观,形状,姿态,加上成像时光照,遮挡等因素的干扰,目标检测一直是机器视觉领域最具有挑战性的问题。

1.1、什么是目标检测

目标检测的任务是找出图像中所有感兴趣的目标(物体),确定它们的位置和大小,是机器视觉领域的核心问题之一。由于各类物体有不同的外观,形状,姿态,加上成像时光照,遮挡等因素的干扰,目标检测一直是机器视觉领域最具有挑战性的问题。

计算机视觉中图像识别的四大任务:

  1. 分类-Classification:解决“是什么? ”的问题,即给定一张图片或一段视频判断里面包含什么类别的目标。
  2. 定位-Location:解决“在哪里? ”的问题,即定位出这个目标的的位置。
  3. 检测-Detection:解决“是什么?在哪里? ”的问题,即定位出这个目标的的位置并且知道目标物是什么。
  4. 分 割 -Segmentation: 分 为 实 例 的 分 割 ( Instance-level) 和 场 景 分 割( Scene-level),解决“每一个像素属于哪个目标物或场景”的问题。

目标检测要解决的核心问题:

  1. 目标可能出现在图像的任何位置
  2. 目标有各种不同的大小。
  3. 目标可能有各种不同的形状
     

如果用矩形框来定义目标,则矩形有不同的宽高比。由于目标的宽高比不同,因此采用经典的滑动窗口+图像缩放的方案解决通用目标检测问题的成本太高。

1.2、目标检测的应用

  • 行人检测
  • 车辆检测
  • 交通标志检测
  • 材质表面缺陷检测
  • 农作物病虫害检测
  • 肿瘤检测

2、经典目标检测算法

2.1、R-CNN(Region CNN)算法

Region CNN(简称 R-CNN)由 Ross Girshick(江湖人称 RBG 大神, Felzenszwalb 的学生)提出,是利用深度学习进行目标检测的里程碑之作,奠定了这个子领域的基础。

R-CNN 检测时的主要步骤为

  1. 使用 Selective Search 算法从待检测图像中提取 2000 个左右的区域候选框, 这些候选框可能包含要检测的目标。
  2. 把所有侯选框缩放成固定大小(原文采用 227×227)。
  3. 用 DCNN 提取每个候选框的特征,得到固定长度的特征向量。
  4. 把特征向量送入 SVM 进行分类得到类别信息,送入全连接网络进行回归得到对应位置坐标信息。
     

R-CNN 不采用滑动窗口方案的原因一是计算成本高,会产生大量的待分类窗口;另外不同类型目标的矩形框有不同的宽高比,无法使用统一尺寸的窗口对图像进行扫描。用于提取特征的卷积网络有 5 个卷积层和 2 个全连接层,其输入是固定大小的 RGB 图像,输出为4096 维特征向量。对候选区域的分类采用线性支持向量机,对每一张待检测图像计算所有候选区域的特征向量,送入支持向量机中进行分类;同时送入全连接网络进行坐标位置回归。

目标检测中你认为的关键问题有哪些 目标检测的主要任务_深度学习

R-CNN 虽然设计巧妙,但仍存在很多缺点:

  1. 重复计算。 R-CNN 虽然不再是穷举,但通过 Proposal(Selective Search)的方案依然有两千个左右的候选框,这些候选框都需要单独经过 backbone 网络提取特征,计算量依然很大,候选框之间会有重叠,因此有不少其实是重复计算。
  2. 训练测试不简洁。候选区域提取、特征提取、分类、回归都是分开操作,中间数据还需要单独保存。
  3. 速度慢。前面的缺点最终导致 R-CNN 出奇的慢, GPU 上处理一张图片需要十几秒,CPU 上则需要更长时间。
  4. 输入的图片 Patch 必须强制缩放成固定大小(原文采用 227×227),会造成物体形变,导致检测性能下降。
     

2.2、SPPNet

MSRA 的 Kaiming He 等人在 R-CNN 的基础上提出了 SPPNet,该方法虽然还依赖候选框的生成,但将提取候选框特征向量的操作转移到卷积后的特征图上进行,将 R-CNN中的多次卷积变为一次卷积,大大降低了计算量。

           R-CNN 的卷积网络只能接受固定大小的输入图像。 为了适应这个图像尺寸,要么截取这个尺寸的图像区域,这将导致图像未覆盖整个目标;要么对图像进行缩放,这会产生扭曲。在卷积神经网络中,卷积层并不要求输入图像的尺寸固定,只有第一个全连接层需要固定尺寸的输入,因为它和前一层之间的权重矩阵是固定大小的,其他的全连接层也不要求图像的尺寸固定。如果在最后一个卷积层和第一个全连接层之间做一些处理,将不同大小的图像变为固定大小的全连接层输入就可以解决问题。

          SPPNet 引入了 Spatial Pyramid pooling 层,对卷积特征图像进行空间金字塔采样获得固定长度的输出,可对特征层任意长宽比和尺度区域进行特征提取。具体做法是对特征图像区域进行固定数量的网格划分,对不同宽高的图像,每个网格的高度和宽度是不规定的,对划分的每个网格进行池化,这样就可以得到固定长度的输出。下图是 SPP 操作示意图:

目标检测中你认为的关键问题有哪些 目标检测的主要任务_目标检测中你认为的关键问题有哪些_02

相比 R-CNN, SPPNet 的检测速度提升了 24 ~ 102 倍。

  • crop:这种方法就是从原图中裁剪出固定大小的图片,这样的方式会使得部分图像的信息丢失。
  • warp:这种方法就是直接将图片resize到规定的大小,这样会导致图片发生形变。

下图是 R-CNN 和 SPPNet 检测流程的比较:

目标检测中你认为的关键问题有哪些 目标检测的主要任务_目标检测中你认为的关键问题有哪些_03

下图是 SPPNet 的原理:

目标检测中你认为的关键问题有哪些 目标检测的主要任务_目标检测中你认为的关键问题有哪些_04

                                                                                  SPPNet 检测框架图
       SPPNet 和 R-CNN 一样,它的训练要经过多个阶段,中间特征也要进行存储; backbone网络参数沿用了分类网络的初始参数,没有针对检测问题进行优化。

SPP Net训练过程

  • Single-size training:由于具体实现的原因,训练时一般输入尺寸固定,如224*224
  • Multi-size training:
  • 上述方法其实没有完全体现出SPP Net的优势。本方法训练时,输入可以有不同大小尺寸。
  • 具体实现时,同一batch中输入图片尺寸一般都固定,不同batch中可以不同。
  • 过程:首先从图片中先获取一个224*224的区域,进行一次训练,再将224*224的区域直接变形为180*180图片,再进行一次训练。
  • 注意事项:以上两类都只是训练过程,与测试无关。测试时一般直接使用原图。

不足之处:

  1. 整个过程还是multi-stage pipeline,还是需要额外保存feature map以供输入SVM进行分类,因此空间的消耗也还是很大。
  2. 在fine-tune的时候SPP-net不像R-CNN一样,Spp-net不会更新spatial pyramid pooling layer之前的conv layer,所以这就限制了准确性。

2.3、Fast R-CNN

Ross Girshick 针对 SPPNet 做了进一步改进提出的 FRCNN ,其主要创新是 RoI Pooling层,它将不同大小候选框的卷积特征图统一采样成固定大小的特征。 ROI 池化层的做法和SPP 层类似,但只使用一个尺度进行网格划分和池化。该层可以直接求导,训练时直接将梯度传导到 backbone 网络进行优化。 FRCNN 针对 R-CNN 和 SPPNet 在训练时是多阶段的和训练的过程中很耗费时间空间的问题进行改进。将深度网络和后面的 SVM 分类两个阶段整合到一起,使用一个新的网络直接做分类和回归。使得网络在 Pascal VOC 上的训练时间从R-CNN 的 84 小时缩短到 9.5 小时,检测时间更是从 45 秒缩短到 0.32 秒。

重要的是 Fast RCNN 的 backbone 网络也可以参与训练了。

目标检测中你认为的关键问题有哪些 目标检测的主要任务_深度学习_05

目标检测中你认为的关键问题有哪些 目标检测的主要任务_卷积_06

                                                                             Fast RCNN训练示意图

目标检测中你认为的关键问题有哪些 目标检测的主要任务_卷积_07

                                                                          Fast RCNN测试示意图

目标检测中你认为的关键问题有哪些 目标检测的主要任务_卷积_08

                                                                       Fast R-CNN训练时的损失函数

2.4、Faster R-CNN

SPPNet 和 Faster RCNN 都需要独立的候选区域生成模块,这个模块计算量很大,而且不易用 GPU 加速。针对这个问题, Shaoqin Ren 等人在 Faster RCNN 基础上提出 FasterR-CNN ,在主干网络中增加了 RPN (Region Proposal Network)网络,通过一定规则设置不同尺度的锚点(Anchor)在 RPN 的卷积特征层提取候选框来代替 Selective Search 等传统的候选框生成方法,实现了网络的端到端训练。候选区域生成、候选区域特征提取、框回归和分类全过程一气呵成,在训练过程中模型各部分不仅学习如何完成自己的任务,还自主学习如何相互配合。这也是第一个真正意义上的深度学习目标检测算法。

Faster RCNN其实可以分为4个主要内容:

  1. Conv layers:作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
  2. Region Proposal Networks:RPN网络用于生成region proposals。该层通过softmax判断anchors属于positive或者negative,再利用bounding box regression修正anchors获得精确的proposals。
  3. Roi Pooling:该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
  4. Classification:利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。

目标检测中你认为的关键问题有哪些 目标检测的主要任务_目标检测_09

                                                            Fast RCNN(左) 和 Faster RCNN(右)框架结构对比

目标检测中你认为的关键问题有哪些 目标检测的主要任务_卷积_10

RPN网络产生Region Proposal的方式是在feature map中采用滑动窗口的方式在每个滑动位置上产生大小及长宽比不同的9个锚点框(其实就是在原始输入图像上)。

3×3的滑动窗口对应的每个特征区域同时预测输入图像3种尺度3种长宽比的Region Proposal,这种映射机制称为anchor。

目标检测中你认为的关键问题有哪些 目标检测的主要任务_全连接_11

                                                                                     Faster R-CNN网络示意图

目标检测中你认为的关键问题有哪些 目标检测的主要任务_卷积_12

                                                                                         Anchor 生成原理示意图

其实RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的foreground anchor,哪些是没目标的backgroud。所以,仅仅是个二分类而已。

用 softmax 判定 foreground 与 background

目标检测中你认为的关键问题有哪些 目标检测的主要任务_目标检测_13

bounding box regression原理

目标检测中你认为的关键问题有哪些 目标检测的主要任务_目标检测_14

  • 先做平移
  • 再做缩放

Faster R-CNN训练

Faster R-CNN的训练,是在已经训练好的model(如VGG_CNN_M_1024,VGG,ZF)的基础上继续进行训练。实际中训练过程分为6个步骤:

  1. 在已经训练好的model上,训练RPN网络,对应stage1_rpn_train.pt
  2. 利用步骤1中训练好的RPN网络,收集proposals,对应rpn_test.pt
  3. 第一次训练Fast RCNN网络,对应stage1_fast_rcnn_train.pt
  4. 第二训练RPN网络,对应stage2_rpn_train.pt
  5. 再次利用步骤4中训练好的RPN网络,收集proposals,对应rpn_test.pt
  6. 第二次训练Fast RCNN网络,对应stage2_fast_rcnn_train.pt

目标检测中你认为的关键问题有哪些 目标检测的主要任务_深度学习_15

2.5、R-FCN

由于现在的主流网络层数越来越多,基于 Faster RCNN 检测框架的方法的计算量受到了3 个因素的影响:

  1. 基础网络的复杂度
  2. 候选框数量的多少
  3. 分类和位置回归子网络的复杂度(每个候选框的 box 都会独立进行前向计算)。

一般来说直接优化前两点性价比不太高。如果直接优化 RoI-wise subnetwork 是否可行呢,将子网络的深度尽可能减少?分类是要增加物体的平移不变性(不同的位置都是同一个物体);目标检测时减少物体的平移变化(目标检测需要得到物体所在的位置)。通常我们所用的网络都是 ImageNet 的分类任务训练得到的,在目标检测的时候进行 Finetune。由于得到的初始模型基于分类任务,那么会偏向于平移不变性,这和目标检测就出现了矛盾。
          MSRA 的 Jifeng Dai 等人提出了 R-FCN,通过 position-positive score maps(位置敏感得分图)来解决这个矛盾。位置敏感得分图通过预测 RoI 中不同部位的类别投票表决产生该RoI 的类别预测。
 

目标检测中你认为的关键问题有哪些 目标检测的主要任务_目标检测_16

R-FCN 沿用了 Faster RCNN 的框架结构,不同的是在 Faster R-CNN 的基础上通过引入位置敏感得分图,将 RoI-wise subnetwork 消灭了,直接在位置敏感得分图上利用 ROI Pooling进行信息采样融合分类和位置信息。

目标检测中你认为的关键问题有哪些 目标检测的主要任务_卷积_17

2.6、Mask R-CNN

2017 年 Kaiming He 等提出了 Mask R-CNN ,并获得 ICCV2017 Best Paper Award。作者指出, Faster R-CNN 在做下采样和 RoI Pooling 时都对特征图大小做了取整操作,这种做法对于分类任务基本没有影响,但对检测任务会有一定影响,对语义分割这种像素级任务的精度影响则更为严重。为此,作者对网络中涉及特征图尺寸变化的环节都不使用取整操作,而是通过双线性差值填补非整数位置的像素。这使得下游特征图向上游映射时没有位置误差,不仅提升了目标检测效果,还使得算法能满足语义分割任务的精度要求。
 

目标检测中你认为的关键问题有哪些 目标检测的主要任务_目标检测_18

主要改进点在:

  1.  基础网络的增强,ResNeXt-101+FPN的组合可以说是现在特征学习的王牌了
  2. 分割 loss 的改进,由原来的 FCIS 的 基于单像素softmax的多项式交叉熵变为了基于单像素sigmod二值交叉熵,经 @Oh233同学指正 ,softmax会产生FCIS的 ROI inside map与ROI outside map的竞争。但文章作者确实写到了类间的竞争, 二值交叉熵会使得每一类的 mask 不相互竞争,而不是和其他类别的 mask 比较 。
  3. RoIAlign 层的加入,说白了就是对 feature map 的插值,直接的ROIPooling的那种量化操作会使得得到的mask与实际物体位置有一个微小偏移,个人感觉这个没什么 insight,就是工程上更好的实现方式。

3、参考

https://www.zhihu.com/question/57403701/answer/153012764

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

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

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

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

http://www.tensorinfinity.com/paper_25.html