关于目标检测

时间:2022-08-18 11:20:20

目标检测

Region based network

RCNN

  • 一张图像生成1K~2K个候选区域
  • 对每个候选区域,使用深度网络提取特征
  • 特征送入每一类的SVM 分类器,判别是否属于该类
  • 使用回归器精细修正候选框位置

Selective Search 候选框生成

传统的生成方法,就是检测就是不同大小的滑动窗进行穷举,然后使用分类器判断哪个滑动窗是目标。而SS根据颜色,纹理之类的信息去把图片划分成不同区域可以相对于穷举搜索大量减少计算量,是简单的搜索剪枝思路。通过简单的区域划分算法,将图片划分成很多小区域,再通过相似度和区域大小(小的区域先聚合,这样是防止大的区域不断的聚合小区域,导致层次关系不完全)不断的聚合相邻小区域。

步骤
  • step0:生成区域集R
  • step1:计算区域集R里每个相邻区域的相似度S={s1,s2,…}
  • step2:找出相似度最高的两个区域,将其合并为新集,添加进R
  • step3:从S中移除所有与step2中有关的子集
  • step4:计算新集与所有子集的相似度
  • step5:跳至step2,直至S为空
相似度计算
  • 颜色相似度(color similarity)
  • 纹理相似度(texture similarity)
  • 尺寸相似度(size similarity)
  • 交叠相似度(shape compatibility measure)

Edge Boxes 候选框生成

利用边缘信息(Edge),确定框框内的轮廓个数和与框框边缘重叠的轮廓个数。

特征提取

对于每一个区域:修正区域大小以适合CNN的输入,做一次前向运算,将网络输出(就是对候选框提取到的特征)存到硬盘。

分类与回归

SVM分类器来判断这个候选框里物体的类别,最后使用回归器精细修正候选框位置:对于每一个类,训练一个线性回归模型去判定这个框是否框得完美

RCNN缺点

  • 每一个候选区域都要过一次卷积网络,并且还要储存大量中间结果,速度慢,占空间
  • 训练步骤繁琐(微调网络+训练SVM+训练bbox)

SPP Net

贡献

  • 一般CNN后接全连接层或者分类器,他们都需要固定的输入尺寸,因此不得不对输入数据进行crop或者warp,这些预处理会造成数据的丢失或几何的失真。通过在在卷积层和全连接层之间加入了SPP layer。此时网络的输入可以是任意尺度的,在SPP layer中每一个pooling的filter会根据输入调整大小,而SPP的输出尺度始终是固定的。
  • 在R-CNN中,每个候选框先resize到统一大小,然后分别作为CNN的输入,这样是很低效的。 所以SPP Net根据这个缺点做了优化:只对原图进行一次卷积得到整张图的feature map,然后找到每个候选框在feature map上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层。节省了大量的计算时间。

Fast R-CNN

贡献

  • 提出了ROI Pooling,这个网络层可以把不同大小的输入映射到一个固定尺度的特征向量。将按比例得到的特征图上的roi区域用一个如7X7大小的bin进行分割,每个bin中进行一次max_pooling,最后得到了一个NX7X7的固定特征向量。
  • RCNN由于每一个候选框都要独自经过CNN,这使得花费的时间非常多。 而改进后的网络共享卷积层,现在不是每一个候选框都当做输入进入CNN了,而是输入一张完整的图片,在第五个卷积层再得到每个候选框的特征。
  • 原来的方法:许多候选框(比如两千个)-->CNN-->得到每个候选框的特征-->分类+回归; 现在的方法:一张完整图片-->CNN-->得到每张候选框的特征-->分类+回归

Faster R-CNN

贡献

Fast R-CNN存在的问题:在提供候选框的时候依旧使用了选择性搜索,找出所有的候选框,非常耗时。Faster R-CNN加入一个提取边缘的神经网络RPN,也就说找到候选框的工作也交给神经网络来做了。

RPN网络

在网络最后一个特征图上,使用滑动窗口和每个中心点的KxK个不同尺寸anchor预测前后背景概率以及框的平移缩放参数。

  • 在feature map上滑动窗口
  • 新建一个神经网络用于物体分类+框位置的回归
  • 滑动窗口的位置提供了物体的大体位置信息
  • 框的回归提供了框更精确的位置

正负样本框的选取

为了训练RPN,需要给每个anchor分配的类标签{目标、非目标}。对于positive label(正标签),论文中给了如下规定(满足以下条件之一即可判为正标签):

  • 正例:与GT的IOU大于0.7的anchor;与GT的IOU重叠最高的anchor(也许不到0.7)
  • 负例:与所有GT包围盒的IoU都小于0.3的anchor
  • 对于既不是正标签也不是负标签的anchor,以及跨越图像边界的anchor我们给予舍弃,因为其对训练目标是没有任何作用的。

loss 关于目标检测 关于目标检测

一幅600*1000的图像经过VGG16后大约为40*60,则此时的anchor数为40*60*9,约为20k个anchor boxes,再去除与边界相交的anchor boxes后,剩下约为6k个anchor boxes,这么多数量的anchorboxes之间肯定是有很多重叠区域,因此需要使用非极大值抑制法(NMS,non-maximum suppression)将IoU>0.7的区域全部合并,最后就剩下约2k个anchor boxes

每一个mini-batch包含从一张图像中随机提取的256个anchor(注意,不是所有的anchor都用来训练),前景样本和背景样本均取128个,达到正负比例为1:1。如果一个图像中的正样本数小于128,则多用一些负样本以满足有256个Proposal可以用于训练。

anchor选取

  • why

Detection任务有两个特点:物体尺度变化,正负样本的不平衡。这两个原因会导致直接用检测框来做,模型难以收敛或者得到精确的结果,YOLOv1的缺点就是定位精度差。而anchor机制相当于提供了一个强先验知识,对于不同的物体用不同的anchor来回归,并且通过一定方法控制正负样本的数量,对于样本不平衡会有一定作用。可以看到YOLO在随后的版本里也借鉴了anchor机制。

以faster RCNN系列为例,通过设计不同scale和ratio的anchors,可以尽量覆盖较好的物体尺度,通过RPN来生成proposals,一方面保证正样本的recall,另一方面修正anchors得到比较好的proposals,同时将正负样本控制在了比较合理的范围内,再通过RCNN细分类和回归,往往要比单阶的能够得到更好的结果。小物体和拥挤等复杂case上,faster RCNN系列的方法还是起主导地位。

  • how

如何设计anchor,可以用两个思路:一是做anchor实验,以与training set的所有label的recall与平局IOU,最大IOU等多个指标为准;二是直接用k-means来聚类,参考yolo v3的方法。

  • faster rcnn 中实现

三个面积尺寸(1282 ,2562 ,5122),然后在每个面积尺寸下,取三种不同的长宽比例(1:1,1:2,2:1).这样一来,我们得到了一共9种面积尺寸各异的anchor

关于目标检测 对于每个3x3窗口,作者假定它来自9种不同原始区域的池化,但是这些池化在原始图片中的中心点,都完全一样。这个中心点,就是刚才提到的,3x3窗口中心点所对应的原始图片中的中心点。如此一来,在每个窗口位置,我们都可以根据9个不同长宽比例、不同面积的anchor,逆向推导出它所对应的原始图片中的一个区域,这个区域的尺寸以及坐标,都是已知的。而这个区域,就是我们想要的 proposal。

Fatser rcnn中,如何处理背景候选框和含有目标的候选框不平衡问题

  • 背景框和目标框进行sample
  • OHEM
  • FOCAL LOSS

为什么不直接回归坐标

只有当Proposal和Ground Truth比较接近时(线性问题),我们才能将其作为训练样本训练我们的线性回归模型,否则会导致训练的回归模型不work(当Proposal跟GT离得较远,就是复杂的非线性问题了,此时用线性回归建模显然不合理)。回归平移和变换尺度更准确。

R-FCN

贡献

  • 分类需要特征具有平移不变性,检测则要求对目标的平移做出准确响应。现在的大部分CNN在分类上可以做的很好,但用在检测上效果不佳。SPP,Faster R-CNN类的方法在ROI pooling前都是卷积,是具备平移不变性的,但一旦插入ROI pooling之后,后面的网络结构就不再具备平移不变性了。因此,本文想提出来的position sensitive score map这个概念是能把目标的位置信息融合进ROI pooling。
  • 与faster-rcnn不同的是,rfcn将基础卷积都共享了,用来预测的roi放到了最后一层。 以3x3位置信息为例,roi取出对应最后一层特征图后生成(3x3)(C+1)个channel的特征图,最后9个位置每个类分别求和计算得分。

SSD

SSD不同与之前的region based方法,通过使用全卷积网络的不同尺度feature map进行目标检测。

贡献

  • 提出了SSD目标检测方法,在速度上,比之前最快的YOLO还要快,在检测精度上,可以和Faster RCNN相媲美
  • SSD的核心是在特征图上采用卷积核来预测一系列default bounding boxes的类别分数、偏移量
  • 为了提高检测准确率,在不同尺度的特征图上进行预测,此外,还得到具有不同aspect ratio的结果
  • 这些改进设计,实现了end-to-end训练,并且,即使图像的分辨率比较低,也能保证检测的精度

在特征图的每个位置预测K个box。对于每个box,预测C个类别得分,以及相对于default bounding box的4个偏移值,这样需要(C+4)Xk个预测器,在mxn的特征图上将产生(C+4)XkXmXn个预测值。在SSD结构中,default box不需要和每一层的感受野相对应,特定的特征图负责处理图像中特定尺度的物体。

YOLO

YOLO V1

YOLO将输入图像分成SxS个格子,若某个物体 Ground truth 的中心位置的坐标落入到某个格子,那么这个格子就负责检测出这个物体。

关于目标检测

YOLOv1网络在最后使用全连接层进行类别输出,因此全连接层的输出维度是 S×S×(B×5+C)。每个格子预测B个bounding box及其置信度(confidence score),以及C个类别概率。

缺点

  • 输入尺寸固定:由于输出层为全连接层,因此在检测时,YOLO训练模型只支持与训练图像相同的输入分辨率。其它分辨率需要缩放成改分辨率.
  • 占比较小的目标检测效果不好.虽然每个格子可以预测B个bounding box,但是最终只选择只选择IOU最高的bounding box作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。

YOLO V2

相比v1提高了训练图像的分辨率;引入了faster rcnn中anchor box的思想,对网络结构的设计进行了改进,输出层使用卷积层替代YOLO的全连接层,联合使用coco物体检测标注数据和imagenet物体分类标注数据训练物体检测模型。相比YOLO,YOLO9000在识别种类、精度、速度、和定位准确性等方面都有大大提升。

改进

  • 引入BN,取消了dropout
  • 高分辨率分类器:v1中使用224 × 224训练分类器网络,扩大到448用于检测网络。v2将ImageNet以448×448 的分辨率微调最初的分类网络,迭代10 epochs。调整了网络的输入(448->416)以使得位置坐标是奇数只有一个中心点
  • Anchor Boxes:采样k-means在训练集bbox上进行聚类产生合适的先验框.由于使用欧氏距离会使较大的bbox比小的bbox产生更大的误差,而IOU与bbox尺寸无关,因此使用IOU参与距离计算,使得通过这些anchor boxes获得好的IOU分值。过程是:将每个bbox的宽和高相对整张图片的比例(wr,hr)进行聚类
  • 细粒度特征:添加一个 pass through layer,把浅层特征图(26x26)连接到深层特征图。这个方法把26x26x512的特征图叠加成13x13x2048的特征图,与原生的深层特征图相连接,使模型有了细粒度特征。
  • Multi-Scale Training:和YOLOv1训练时网络输入的图像尺寸固定不变不同,YOLOv2(在cfg文件中random=1时)每隔几次迭代后就会微调网络的输入尺寸。训练时每迭代10次,就会随机选择新的输入图像尺寸。因为YOLOv2的网络使用的downsamples倍率为32,所以使用32的倍数调整输入图像尺寸{320,352,…,608}。训练使用的最小的图像尺寸为320 x 320,最大的图像尺寸为608 x 608。 这使得网络可以适应多种不同尺度的输入.
  • Hierarchical classification:整合ImageNet和COCO的标签构件wordtree,模型预测了一个包含1369个元素的向量,而且基于所有“同义词集”计算softmax,其中“同义词集”是同一概念的下位词。

关于目标检测

  • 联合训练分类和检测:oversampling COCO数据集来保持平衡, 采用这种联合训练,YOLO9000从COCO检测数据集中学习如何在图片中寻找物体,从ImageNet数据集中学习更广泛的物体分类。

YOLO V3

改进

  • 多尺度预测(类似FPN):每种尺度预测3个box, anchor的设计方式仍然使用聚类,得到9个聚类中心,将其按照大小均分给3个尺度。尺度1: 在基础网络之后添加一些卷积层再输出box信息. 尺度2: 从尺度1中的倒数第二层的卷积层上采样(x2)再与最后一个16x16大小的特征图相加,再次通过多个卷积后输出box信息.相比尺度1变大两倍. 尺度3: 与尺度2类似,使用了32x32大小的特征图.

关于目标检测

  • 更好的基础分类网络(类ResNet)和分类器:YOLOv3不使用Softmax对每个框进行分类,主要考虑因素有两个:1. Softmax使得每个框分配一个类别(score最大的一个),目标可能有重叠的类别标签,因此Softmax不适用于多标签分。2.Softmax可被独立的多个logistic分类器替代,且准确率不会下降。

优点

  • 通用性强。YOLO对于艺术类作品中的物体检测同样适用。它对非自然图像物体的检测率远远高于DPM和RCNN系列检测方法。
  • 背景误检率低,速度快。

缺点

  • 识别物体位置精准性差。
  • 召回率低。在每个网格中预测固定数量的bbox这种约束方式减少了候选框的数量。

YOLO VS RCNN方法

统一网络:YOLO没有显示求取region proposal的过程。Faster R-CNN中尽管RPN与fast rcnn共享卷积层,但是在模型训练过程中,需要反复训练RPN网络和fast rcnn网络.相对于R-CNN系列的"看两眼"(候选框提取与分类,图示如下),YOLO只需要Look Once.

Q&A

NMS

关于目标检测

ROI align

ROI Pooling 的作用是根据预选框的位置坐标在特征图中将相应区域池化为固定尺寸的特征图,以便进行后续的分类和包围框回归操作。由于预选框的位置通常是由模型回归得到的,一般来讲是浮点数,而池化后的特征图要求尺寸固定。故ROI Pooling这一操作存在两次量化的过程。

  • 将候选框边界量化为整数点坐标值。
  • 将量化后的边界区域平均分割成 k x k 个单元(bin),对每一个单元的边界进行量化

经过上述两次量化,此时的候选框已经和最开始回归出来的位置有一定的偏差,这个偏差会影响检测或者分割的准确度。

关于目标检测

ROI Align的思路很简单:取消量化操作,使用双线性内插的方法获得坐标为浮点数的像素点上的图像数值,从而将整个特征聚集过程转化为一个连续的操作。