【学习笔记】经典目标检测算法

定义

【学习笔记】经典目标检测算法_第1张图片
目标检测任务的目标是找到图像中的所有感兴趣区域,并确定这些区域的位置和类别。目标检测领域的深度学习方法主要分为两大类:两阶段式(Two-stage)目标检测算法和单阶段式(One-stage)目标检测算法。

  • 两步模型有独立地、显式地提取候选区域提取过程,即先在输入图像上筛选出一些可能存在物体的候选区域,然后针对每个候选区域,判断其是否存在物体。典型的模型有R-CNN、SPPNet、Fast R-CNN、Faster R-CNN、R-FCN、Mask R-CNN等。
  • 单步模型是指没有独立地、显式地提取候选区域,直接由输入图像得到其中存在的物体的类别和位置信息的模型。直接将目标边界定位问题转换成回归问题,图像会被缩放到同一尺寸,并以网格形式均等划分,模型仅需处理图像一次就能得到位置和分类结果。典型的模型有MultiBox、OverFeat、YOLO、SSD等。

一般来说,单步模型在计算效率上有优势,两步模型在检测精度上有优势。

  1. 多数单步模型是利用预设的锚框(anchor box)来捕捉可能存在于图像各个位置的物体,因此,单步模型会对数量庞大的锚框进行是否有物体及物体所属类别的密集分类。由于正负样本数极不均衡,会导致分类器训练效果不佳。而在两步模型中,由于含有独立的候选区域提取步骤,第一步就筛选掉大部分不含有待检测物体的区域(负样本),就不存在类似问题。
  2. 两步模型在候选区域提取的过程会对候选框的位置和大小进行修正,在进入第二步前,候选区域的特征已被对齐,有利于提供质量更高的特征。单步模型没有特征对齐步骤,各锚框的预测基于该层上每个特征点的感受野,定位和分类精度容易受到影响。
  3. 两步模型在第二步对候选区域进行分类和位置回归时,是针对每个候选区域独立进行的,因此该部分算法复杂度线性正比于预设的候选区域数目。

候选区域 Region Proposal

【学习笔记】经典目标检测算法_第2张图片
region在不同的论文中有不同的名字。传统滑窗检测算法中,它叫做windows;在RetinaNet等anchor-based的算法中,它的名字叫做anchor;而在FCOS等anchor-free的算法中,它又代表着anchor point。概括来说,region就是在图像上预设好不同大小、不同长宽比的参照框。region设置时需要其大小和长宽比与待检测物体尺度基本一致,才能让region与物体的IOU大于阈值,成为正样本;否则,正样本数会很少,导致漏检很多。
最直接的获得候选区域(Region Proposal)的方法是滑窗法,就是遍历图像的所有的区域,用不同大小的窗口在整个图像上滑动,那么就会产生所有的矩形区域,然后再后续排查,思路简单,但开销巨大。基于图像的颜色、纹理、面积、位置等合并相似的像素来得到得到一系列的候选矩阵区域的方法有Selective Search和EdgeBoxes,相比于滑窗法更高效。

Selective Search

假设现在图像上有 n n n个预分割的区域,计算每个区域与它相邻区域的相似度,得到一个 n × n n\times n n×n的相似度矩阵,从矩阵中找出最大相似度值对应的两个区域,将这两个区域合二为一;重复上面的过程直到最后只剩一个区域。

R-CNN

《Rich feature hierarchies for accurate object detection and semantic segmentation》 2014 CVPR
【学习笔记】经典目标检测算法_第3张图片
R-CNN先使用无监督的Selective Search算法将输入图像中具有相似颜色直方图特征的区域进行递归合并,得到2000个最有可能包含物体的候选区域。然后将这些不同大小的候选区域统一到相同的尺寸送入CNN中进行特征提取和分类。最后对检测结果进行NMS操作,得到最终的检测结果。多个候选区域对应的图像需要预先提取,占用较大的磁盘空间;Crop或者Warp操作会使得物体截断或拉伸,导致输入CNN的信息丢失;每一个候选区域都需要进入CNN网络计算,上千个Region存在大量的范围重叠,重复的特征提取带来巨大的计算浪费。

SPPNet

【学习笔记】经典目标检测算法_第4张图片
SPPNet中的SPP是指空间金字塔池化。由于RCNN中要对候选区域进行裁剪或缩放至固定尺寸,会破坏截取图像的长宽比,并损失一些信息。SPP被放置在CNN的末端,可以接受任意尺寸的特征图作为输入,输出固定尺寸的池化特征。此外,SPPNet只进行一次全图的特征提取,而后对每个候选区域对应的特征直接从全图特征中进行截取,然后送入到空间金字塔池化层进行尺寸的统一。

Fast R-CNN

《Fast R-CNN》 2015 ICCV
【学习笔记】经典目标检测算法_第5张图片
Fast R-CNN还是通过Selective Search得到候选框,但是将输入图像直接通过CNN模型得到特征图,将候选区域映射到特征图中得到映射Patch,然后不同大小的区域通过RoI Pooling层得到相同大小的特征向量,最后通过两个全连接层得到类别和边界框的预测。Fast R-CNN使用全连接层代替之前的SVM分类器和线性回归器来进行物体分类和检测框修正,大大增强了检测任务的一体性,提高了计算效率。
【学习笔记】经典目标检测算法_第6张图片
ROI Pooling 在映射Patch上划分成固定数目的网格,数目根据下一层希望的输入大小决定,最后在每个小的网格区域内进行Max Pooling,以得到固定大小的特征。

Faster R-CNN

《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks》 2015 NIPS
【学习笔记】经典目标检测算法_第7张图片
Faster R-CNN提出了RPN网络用于在特征图上提取候选区域,将候选框提取合并到深度网络中,提高速度并保证了精度。RPN在最后一个卷积层输出的特征图上,先用3x3的卷积得到channel为 d d d的特征图,这样特征图上每个位置能构成一个 d d d维的特征向量,然后基于这个特征向量去回归9个不同大小和长宽比的窗口,把这些窗口按照置信度进行排序,然后取前 n n n个作为候选窗口。

Mask R-CNN

《Mask RCNN》【学习笔记】经典目标检测算法_第8张图片
Mask-RCNN 大体框架还是 Faster-RCNN 的框架,分为两个阶段:
(1)backbone生成图像特征,RPN生成 proposal regions;
(2)预测类别和bbox回归。Mask R-CNN添加了一个全卷积网络的分支,对每个RoI预测了对应的二值掩膜(binary mask),以说明给定像素是否是目标的一部分。
Mask-RCNN 将 RoI Pooling 层替换成了 RoI Align。
ROI Pooling 的作用是根据预选框的位置坐标在特征图中将相应区域池化为固定尺寸的特征图,以便进行后续的分类和包围框回归操作。由于预选框的位置通常是由模型回归得到的,一般来讲是浮点数,而池化后的特征图要求尺寸固定,所以ROI Pooling这一操作存在两次量化的过程,此时的候选框已经和最开始回归出来的位置有一定的偏差,这个偏差会影响检测或者分割的准确度。
【学习笔记】经典目标检测算法_第9张图片
ROI Align取消量化操作,使用双线性插值的方法获得坐标为浮点数的像素点上的图像数值,从而将整个特征聚集过程转化为一个连续的操作。整个过程中没有用到量化操作,没有引入误差,即原图中的像素和feature map中的像素是完全对齐的,没有偏差,这不仅会提高检测的精度,同时也会有利于实例分割。

SSD

《SSD: Single Shot MultiBox Detector》2016 ECCV
【学习笔记】经典目标检测算法_第10张图片
SSD能直接预测目标类别和Bounding Box。与Faster R-CNN相比,该算法不需要生成候选区域,这极大提高了检测速度。SSD对不同卷积层的特征图分别用两个不同的 3×3 的卷积核进行卷积,分别预测类别与边界框。对于宽高大的特征图,感受野小,锚框多,适合检测小的物体;而对于宽高小的特征图,感受野大,锚框少,则适合检测大的物体,这样能实现多尺度的目标检测。

YOLO

《YOLOv4: Optimal Speed and Accuracy of Object Detection》CVPR 2020
【学习笔记】经典目标检测算法_第11张图片

YOLOv1

YOLOv1把图像看成一个 7 × 7 7\times7 7×7的栅格,每个栅格预测2个边界框(包括位置、尺寸和置信度),总共输出98个边界框,通过非极大值抑制算法得到最后可靠的结果。

非极大值抑制算法大致分两步,(1)根据阈值去除那些置信度低的边界框,(2)挑选出最大置信度的边界框作为预测输出,去除与这个边界框的IoU超过0.5的其他候选框,如此确定了一个对象的边界框。重复此步直到没有剩余的边界框。

YOLOv1对相互靠的很近的物体,还有很小的群体检测效果不好,这是因为一个网格中只预测了两个框,并且只属于一类。同一类物体出现的新的不常见的长宽比和其他情况时,泛化能力偏弱。
【学习笔记】经典目标检测算法_第12张图片
YOLOv1对VGG最后几层进行了修改,最后的输出是 7 × 7 × 30 7\times7\times30 7×7×30的特征图。 7 × 7 7\times7 7×7代码49个栅格,30个channels中的前10个代表2个边界框的坐标(x, y, w, h)以及对象的置信度confidence,后20个代表VOC数据集的20个类别。
【学习笔记】经典目标检测算法_第13张图片

YOLOv2

YOLOv2借鉴了RPN网络,利用k-means聚类出 k k k种候选框的宽和高,在卷积特征图上进行滑窗操作,每一个中心可以预测 k k k种不同大小的候选框。在每一个卷积层后添加BN。添加了一个转移层,把浅层特征图连接到深层特征图,使特征图拥有更好的细粒度特征。YOLOv2使用了新的特征提取模型DarkNet19。使用不同尺寸的图像同时训练网络,增强模型的鲁棒性。

YOLOv3

YOLOv3对v2的改进主要有三点:(1)将置信度和坐标分开预测,坐标预测还是通过网络进行预测,而置信度则是单独通过逻辑回归进行预测。(2)使用新的特征提取模型DarkNet53。(3)借由FPN的思想,引用中间层的输出与后层输出进行融合,进行三个尺度预测,每个尺度预测3个Bounding Boxes,候选框大小的选择仍然使用聚类得到9种尺寸,将其按照大小均分给3个尺度。

YOLOv4

YOLOv4运用了非常多现有的实用技巧,例如:加权残差连接(WRC)、跨阶段部分连接(CSP)、跨小批量标准化(CmBN)、自对抗训练(SAT)、Mish激活、马赛克数据增强、CIoU Loss等,让精度也上了一个台阶。YOLOv4 = CSPDarknet53 + SPP + PANet + YOLOv3

YOLOv5

YOLOv5的模型架构是与v4非常相近,只是修改了部分参数。YOLOv4在性能上优于YOLOv5,但是在灵活性与速度上弱于YOLOv5。

FPN

《Feature Pyramid Networks for Object Detection》
【学习笔记】经典目标检测算法_第14张图片
FPN(特征金字塔)结构是自上而下的路径和横向连接去结合低层高分辨率的特征,把高层的特征传下来,补充低层的语义,可以获得高分辨率、强语义的特征,有利于小目标的检测。SSD只用网络中的最高层构建金字塔,放弃了低级特征,但这对于小目标分辨来说是非常重要的。FPN实现了从单尺度的单张输入图像,快速构建在所有尺度上都具有强语义信息的特征金字塔,同时损失不大。

CornerNet

《CornerNet: Detecting Objects as Paired Keypoints》2018 ECCV
【学习笔记】经典目标检测算法_第15张图片
CornerNet 是根据一对关键点来进行物体的检测的,即左上角坐标和右下角坐标,这种anchor-free的方法可以省去计算anchors花费的时间,提高了检测的速度和精度。CornerNet 为每个点分配一个embedding vector,属于同一物体的点的vector的距离较小,以匹配同一物体bounding box的左上角和右下角。
【学习笔记】经典目标检测算法_第16张图片
CornerNet使用了Corner Pooling,以建立点corner和目标的位置关系。当求解某一个点的 Top-left Corner Pooling时 ,就是以该点为起点,水平向右看遇到的最大值以及竖直向下看最大的值之和。
【学习笔记】经典目标检测算法_第17张图片
网络有两个分支,分别用于左上角和右下角。每个分支有三个输出(heatmaps、embeddings、offsets),共6个输出。heatmaps表示了不同类别的左上角和右下角的位置信息以及位置的置信度信息。embeddings用来衡量左上角和右下角的距离的,从而判断某一对角点是否属于同一个物体的两个角点。offsets用于调整预测角点和真实值的偏差,缓解heatmaps被降采样后,再升采样回去造成的精度损失。网络的backbone是Hourglass Network,是一种呈沙漏状的downsampling 和 upsampling组合,常被用在姿态估计任务中。

Neck

Neck是目标检测框架中承上启下的关键环节。它对Backbone提取到的重要特征,进行再加工及合理利用,有利于下一步head的具体任务学习,如分类、回归、keypoint、instance mask等常见的任务。

上下采样

该方法的特点是不具有特征层聚合性的操作,直接在多级特征图后接head。如果backbone输出的特征图在尺寸上是相同的,如DenseNet,则需要构造出各种大小的特征图来检测不同大小的物体。中间尺寸特征图直接使用,大尺寸特征图以尺寸变换层上采样获得,小尺寸特征图以池化获得。
【学习笔记】经典目标检测算法_第18张图片

路径聚合

由于深层特征图尺寸小,经过层层卷积下采样使得小物体的信息严重丢失,所以深层不利于小物体检测,就将小物体检测交给浅层来做。由于深层特征图具有非常丰富的语义信息,那么最好把深层特征再往浅层传,以增加浅层语义信息。这也是FPN是工作原理。
这类方法的共性就是反复利用各种上下采样、拼接、点和或点积,来设计聚合策略。
【学习笔记】经典目标检测算法_第19张图片

NAS搜索

这类方法利用神经网络搜索方法来搜索合适的聚合路径,但是搜索的时间成本极高,且数学可解释性低。最新的研究已表明,人工设计的路径聚合在精度上亦可超过NAS搜索出来的结构 。
【学习笔记】经典目标检测算法_第20张图片

加权聚合

简单的聚合对所有参与的特征层都是一视同仁的,而实际上,这些来自不同层级的特征图对于单个物体而言,必然只有某一个是最适合检测它的,因此对聚合进行加权就显得尤为重要。ASFF就引入了可参与训练的加权因子来体现不同层级特征图的重要性。
【学习笔记】经典目标检测算法_第21张图片

非线性聚合

FPN以及其他的路径聚合法,都可视为是线性聚合。在《Deep Feature Pyramid Reconfiguration for Object Detection》一文中,作者建立了一种非线性聚合法。先把所有的层级特征图放在一起,然后学习多个非线性映射。非线性映射的学习模仿SENet的方法,带有注意力的味道。
【学习笔记】经典目标检测算法_第22张图片

增强小物体检测效果

  1. 采用特征金字塔、沙漏结构等网络子结构,来增强网络对多尺度尤其是小尺度特征的感知和处理能力;尽可能提升网络的感受野,使得网络能够更多地利用上下文信息来增强检测效果;减少网络总的下采样比例,使最后用于检测的特征分辨率更高。
  2. 提高小物体样本在总体样本中的比例;将图像缩小以生成小物体样本。
  3. 使用更大的输入图像尺寸。

常用损失函数

好的目标框回归损失应该考虑三个重要的几何因素:重叠面积,中心点距离,长宽比。

Smooth L1 Loss

  • L1 Loss 对 x 的导数为常数,在训练后期,x 很小时,若学习率不变,损失函数会在稳定值附近波动,很难收敛到更高的精度。
  • L2 Loss 对 x 的导数在 x 值很大时,其导数也很大,在训练初期不稳定。
  • Smooth L1 Loss 的公式为  smooth  L 1 ( x ) = { 0.5 x 2 i f ∣ x ∣ < 1 ∣ x ∣ − 0.5  otherswise  \text { smooth }_{L 1}(x)=\left\{\begin{array}{cc} 0.5 x^{2} & i f|x|<1 \\ |x|-0.5 & \text { otherswise } \end{array}\right.  smooth L1(x)={0.5x2x0.5ifx<1 otherswise  结合了L1 Loss 和 L2 Loss 的优点,避开其缺点。缺点是计算损失时要独立求出4个点的 loss,然后相加得到最终的 bbox loss。没有考虑 box 的四个坐标之间的相关性。

【学习笔记】经典目标检测算法_第23张图片

IOU Loss

 IoUloss  = − ln ⁡ ( IoU ⁡ ( b b o x g t , b b o x pred  ) ) \text { IoUloss }=-\ln \left(\operatorname{IoU}\left(b b o x_{g t}, b b o x_{\text {pred }}\right)\right)  IoUloss =ln(IoU(bboxgt,bboxpred ))
目标检测的常用评价方式是IoU,IOU Loss 可以反映预测框与目标框的相交情况。
缺点是:

  1. 当预测框与目标框不相交时,IOU 均为0,不能反映两个框距离的远近,此时损失函数不可导,IOU Loss 无法优化两个框不相交的情况。
  2. 当IoU值相同时,IoU值不能反映两个框是如何相交的。

GIOU Loss

G I o U = I o U − ∣ C − ∣ A ∪ B ∥ C , Loss ⁡ G I O U = 1 − G I o U G I o U=I o U-\frac{|C-| A \cup B \|}{C}, \operatorname{Loss}_{G I O U}=1-G I o U GIoU=IoUCCABLossGIOU=1GIoU
【学习笔记】经典目标检测算法_第24张图片
A 和 B 是预测框和目标框,C 是能够将 A 和 B 包围在内的最小封闭形状,计算 C 中没有覆盖 A 和 B 的面积占 C 总面积的比例。GIoU 的取值范围为[-1,1],在两框重合时取最大值,在两框无限远时取最小值-1。GIoU不仅关注重叠区域,也关注非重叠区域,能更好反映两者的重合度。
缺点是当目标框完全包裹预测框时,IoU和GIoU相同,无法区分其相对位置。

DIOU Loss

Loss ⁡ D I o U = 1 − I o U + ρ 2 ( b , b g t ) c 2 \operatorname{Loss}_{D I o U}=1-I o U+\frac{\rho^{2}\left(b, b^{g t}\right)}{c^{2}} LossDIoU=1IoU+c2ρ2(b,bgt)
其中 ρ ( ) \rho() ρ()表示预测框和目标框中心点的欧式距离, c c c表示预测框和目标框最小外接矩形的对角线距离。
【学习笔记】经典目标检测算法_第25张图片
DIoU Loss在和目标框不重叠时,仍然可以为边界框提供移动方向;可以直接最小化两个目标框的距离。缺点是没有考虑长宽比。

CIOU Loss

Loss ⁡ C I o U = 1 − I o U + ρ 2 ( b , b k ) c 2 + α v \operatorname{Loss}_{C I o U}=1-I o U+\frac{\rho^{2}\left(b, b^{k}\right)}{c^{2}}+\alpha v LossCIoU=1IoU+c2ρ2(b,bk)+αv
CIOU Loss 在 DIOU Loss 的基础上加了一个影响因子,其中 α = v ( 1 − I o U ) + v \alpha=\frac{v}{(1-I o U)+v} α=(1IoU)+vv v = 4 π 2 ( arctan ⁡ w g t h θ t − arctan ⁡ w h ) 2 v=\frac{4}{\pi^{2}}\left(\arctan \frac{w^{g t}}{h^{\theta t}}-\arctan \frac{w}{h}\right)^{2} v=π24(arctanhθtwgtarctanhw)2

EIoU Loss

Loss ⁡ E I O U = 1 − I o U + ρ 2 ( b , b g t ) c 2 + α 2 ( w , w g t ) C w 2 + ρ 2 ( h , h g t ) C h 2 \operatorname{Loss}_{E I O U}=1-I o U+\frac{\rho^{2}\left(b, b^{g t}\right)}{c^{2}}+\frac{\alpha^{2}\left(w, w^{g t}\right)}{C_{w}^{2}}+\frac{\rho^{2}\left(h, h^{g t}\right)}{C_{h}^{2}} LossEIOU=1IoU+c2ρ2(b,bgt)+Cw2α2(w,wgt)+Ch2ρ2(h,hgt)
EIoU Loss 将 CIoU Loss 中的 α v \alpha v αv替换成 α 2 ( w , w g t ) C w 2 + ρ 2 ( h , h g t ) C h 2 \frac{\alpha^{2}\left(w, w^{g t}\right)}{C_{w}^{2}}+\frac{\rho^{2}\left(h, h^{g t}\right)}{C_{h}^{2}} Cw2α2(w,wgt)+Ch2ρ2(h,hgt)

你可能感兴趣的:(学习记录,深度学习,深度学习,计算机视觉)