1.目标检测问题

1.1分类和回归

目标检测,即是分类问题,也是回归问题。
分类Classification:对打框的部分进行分类,是目标物体?还是背景?解决识别与分类(classification)
回归Regression:cat(x,y,w,h),逼近这四个数值(例如:欧式距离作为损失函数);可以用来校正目标框。解决定位(localization)
目标检测问题,可以大体分为级联的两步/两个模型:

  • 识别。是不是目标?
  • 分类。如果是目标的话,是什么目标?

image.png image.png

1.2概念

Ground Truth、Region Proposal

对训练数据上的目标物体进行打框,需要手动去做;有公司专业做这部分工作。目标的真实标记区,也叫Ground Truth。目标框也叫 Region Proposal(Proposal:建议。可以理解为目标框是一种选区的建议,即选定的区域并不一定真的是目标)。

正/负样本

正样本:如果某个region proposal和当前图像上的所有ground truth中重叠面积最大的那个的IOU大于等于0.5(阈值),则该region proposal作为这个ground truth类别的正样本,否则作为负样本。另外正样本还包括了Ground Truth。
负样本:区域A与GT的重合度在20~50%之间,且A和其他任何一个已生成的负样本之间的重合度<=70%,则A为负样本。

IOU、NMS

IOU(Intersection Over Union)是测量在特定数据集中检测相应物体准确度的一个标准。一般IOU>0.5时,就可以认为目标检测的比较准确。
image.png
NMS(Non-Maximum Suppression)非极大值抑制:
每个边界框有一个置信度得分(confidence score),即分类器的类别分类概率,根据概率排序。
将置信度最高的边框A放入最终输出列表,计算剩下边框与A的IOU。设定阈值,用来删除重叠度较大的边界框。重复上述过程,直到边界框列表为空。
非极大值抑制,在计算机视觉任务中得到了广泛的应用,例如边缘检测、人脸检测、目标检测(DPM,YOLO,SSD,Faster R-CNN)等。
image.png

1.3技术演进

two stage

two stage:Proposals+Detection(class-agnostic proposals,class-specific detection)
算法:古典的目标识别、R-CNN、SppNet、Fast R-CNN、Faster R-CNN、(FCN,unet语义分割)、R-FCN等。

one stage

one stage:Detection(class-specific detection)
算法:YOLO、SSD、Retinanet等。

2.古典目标识别

2.1Selective Search选择搜索

CPU运行环境下,Selective Search可以在几秒内给出1000个Region Proposal。因为效率较低,一般不再使用Selective Search,它只是作为古典目标识别的一部分。
SS是一种图像bounding box算法,2011年由KoenE.A提出。
选择搜索的主要思路:我们想要框选的区域应该是有相似性或连续性的(颜色、纹理、大小等相似),对输入图像用分割算法得到很多子区域,根据相似性再对子区域进行合并提取bounding boxes候选边界框,不断进行区域迭代合并。在迭代过程中,对合并的子区域打上bounding boxes,这些boxes就是候选框
选定候选框的其他算法还有很多,例如:
image.png
Selective Search的策略就是将层次聚类的思想用到了区域合并上。
image.png

2.2古典目标识别的步骤

  • 构造训练集。使用SS进行区域融合,采纳正负样本,负样本会远多于正样本。
  • 提取正负样本的特征。将正负样本转为特征向量:SIFT算法、HOG算法。
  • SVM训练,分类超平面依赖于支持向量,正负样本的数量比例不影响分类效果。
  • 反馈False Positive(预测为正,实际为负)。收集FP,结合第三步得到的SVM权值作为初始权值,进行SVM二次训练。False Negative不如FP那么关键,所以不用收集FN。
  • 测试。使用SS得到图像的候选区域,对每个区域提取特征向量,用SVM对区域进行软分类,并按分类概率值进行排序,保留概率值>0.5的区域A并计算它们与概率值更高区域之间的重叠程度IOU,如果IOU>30%,则把A也去除,最后剩下的就是目标区域(NMS)。

    2.3古典目标识别的不足

    用SS提取候选框,效率低下;SVM用于二分类,古典目标识别更多是用于目标的定位,或者区分开目标与背景。

    4.R-CNN

    R-CNN(Region-based Convolutional Neural Network)即通过CNN来代替古典目标识别中的SIFT/HOG算法来将图像区域(regions)转变为向量。

    4.1 R-CNN网络结构

    image.png

    R-CNN对比古典目标识别

    R-CNN与古典目标识别的相同:
    使用Selective Search提取候选框(RoI:Regions of Interest);
    使用SVM进行分类。
    R-CNN与古典目标识别的不同:

  • Warped:对图像区域变形(resize)成统一的大小,是为了网络最后样本能以同样维度输入SVM,而不得不采取的做法。区域变形之后其实会影响分类结果。

  • ConvNet:是指CNN网络中的卷积层和池化层,作用是将resize后的图像区域转成vector。ConvNet使用已有的预训练的网络结构(VGG16/AlexNet等),迁移学习,只需要结合softmax进行微调Fine-tune(log loss交叉熵);ConvNet训练好了之后,接入SVM,使用hinge loss训练SVM;接入线性回归,使用MSE训练Bbox reg。

    针对每个类别训练一个SVM的二分类器:输出的是是否属于该类别,训练结果是得到SVM的权重矩阵W;这里选定负样本时将IOU的阈值从0.5改成0.3(和fine-tuning时的阈值不一样),即IOU<0.3的是负样本,正样本是Ground Truth。因为前面fine-tuning需要大量的样本,所以设置成0.5会比较宽松。而在SVM阶段是由于SVM适用于小样本,所以设置0.3会更严格一点。
    回归:只对那些跟ground truth的IOU超过某个阈值且IOU最大的proposal回归,其余的region proposal不参与。对于某个region proposal:R,以及其对应的Ground truth:G,预测结果是:P,我们希望P尽可能接近G。损失函数可以表达为:R和G的差距减去P和G的差距要尽可能小。回归的作用包括对x,y的平移以及对w,h的缩放。

  • Bbox reg:SS提取的候选框并不一定是最好的,添加Bbox reg(线性回归)进行候选框的校正,通过Loss设计,只对正样本做校正。R-CNN中有两个终端,一个进行分类,一个进行回归,total loss=分类loss+回归loss。

使用回归修正候选框的位置:
image.png

4.2 R-CNN的不足

  • 图像区域变形,影响模型效果:R-CNN中,在提取RoI之后需要变形,这是不得已的做法,实际会影响网络模型的效果。
  • 训练分多步,步骤繁琐:R-CNN的训练先要fine tuning一个预训练的网络,然后针对每个类别都训练一个SVM分类器,最后还要用regressors对bounding-box进行回归。
  • 训练阶段太慢,占用大量磁盘空间:经验来看,训练阶段需要84小时,在训练SVM和回归的时候需要用网络训练的特征作为输入,特征保存在磁盘上再读入的时间消耗还是比较大的,也占用磁盘空间。
  • 测试阶段太慢:在使用VGG16训练ConvNet的情况下,每张图片完成正向传播(Inference)需要47秒。每张图片的每个region proposal都要做卷积,重复操作太多。

【问题】为什么测试阶段每张图片需要47秒那么久?
首先selective search提取候选框(大约2k个)时,耗时需要几秒钟;
其次,2000多个候选框输入ConvNet并转变成vector(即先提取RoI,再输入CNN转换为向量,需要转换2000多次),耗时最久。

5.SPP-net

5.1网络拓扑图

image.png

对R-CNN的改善

SPP-Net对R-CNN的改善,是针对R-CNN的缺点进行的改善:

  • SPP-Net先将原图输入CNN得到特征图FM,再将从原图中提取的RoI(也是使用Selective Search方法)映射到FM,和R-CNN刚好相反。SPP-Net中只需要将原图输入ConvNet一次,但R-CNN中需要将2000多个RoIs输入ConvNet2000多次。
  • 相对于R-CNN中对RoI进行变形,SPP-Net对每个RoI进行了金字塔池化,虽然会损失部分图像信息,但效果好于对图像区域进行变形。SPP是词袋(Bag-of-Words)模型的一种扩展。

    5.2特征图上的RoI

    经过ConvNet(VGG16)的多次卷积池化后,得到的Feature map有多个通道(512个),在FM上是在多个通道上都寻找/映射候选框。(在原图中的proposal经过多次卷积后,位置是相对于原图不变的)
    从输入尺寸224x224到conv5之后的14x14,原图被缩小了16倍,所以用SS在FM上提取RoI,如果原图的候选框上某点的坐标为(n,n),则在FM上映射的RoI上点的坐标目标检测1 - 图10

假设目标检测1 - 图11表示原输入图片上的点,目标检测1 - 图12表示特征图上的点,则目标检测1 - 图13
目标检测1 - 图14是CNN中所有卷积、池化的stride的乘积,例如:(ZF-5中)S=222*2=16
目标检测1 - 图15
image.png

image.png

5.3空间金字塔池化层(SPP)

SPP中的池化跟CNN中的池化不太一样,经过SPP layer之后得到不同大小的FM,例如:3x3,是指将一个RoI区域划分成3x3,横向和纵向不必等长。
空间金字塔池化,使得任意大小的特征图都能够转换成固定大小的特征向量(多尺度特征提取出固定大小的特征向量)。
image.png
image.png
256是convNet最后一个卷积层中卷积核的数量,即feature map的通道数为256。
假设原图输入是224x224,经过conv5后的输出FM是13x13x256,即有256个大小为13x13的reponse map。将reponse map分成1x1(金字塔底座),2x2(金字塔中间),4x4(金字塔顶座)三张子图,分别做max pooling后,出来的特征就是(16+4+1)x256 维度。如果原图的输入不是224x224,出来的特征依然是(16+4+1)x256维度。这样就实现了不管图像尺寸如何,SPP 的输出永远是 (16+4+1)x256 维度。
image.png

6.Fast R-CNN

6.1网络拓扑图

image.png

对R-CNN和SPP-Net的改善

  • 分类器从SVM换成了Softmax。好处是不用再像R-CNN和SPP-Net那样分开训练ConvNet、SVM和线性回归,而是可以将ConvNet+Softmax一起训练;分类结果更适用于多分类的实际情况。

    因为是模型和分类器、线性回归一起训练,整体的损失函数是:log loss+L1 loss。
    线性回归校正候选框时只校正正样本。

  • 简化了对FM上的RoIs的池化。Fast-RCNN使用RoI Pooling,每个RoI只进行一次池化,其实是SPP layer的一个特例,实验证明,只进行一次池化也能有较好的效果。

    6.2RoI Pooling

    RoI Pooling就是将一个个大小不同的box矩形框,映射成大小固定的矩形框。
    roi_pool层将每个候选区域均匀分成M×N块,对每块进行max pooling。将特征图上大小不一的候选区域转变为大小统一的数据,送入下一层(FC)。
    image.png

    6.3分层采样:hierarchical sampling

    在梯度计算时,R-CNN和SPP-Net是从多张不同图片中随机区域性采样(region-wise sampling)一共128个RoIs,来构建mini-batch 进行SGD;
    Fast-RCNN是分层采样(hierarchical sampling),每次从两张图片中各采样64个RoIs,来构建mini-batch 进行SGD,这样进行梯度下降时更有效率。
    image.png

    6.4Fast R-CNN的不足

    Fast-RCNN提取候选框仍然使用Selective Search,SS本身就是需要耗时几秒的,这导致Fast-RCNN检测速度首先。
    image.png

    7.Faster R-CNN

    7.1网络拓扑图

    image.png

    对Fast R-CNN的改善

  • Faster R-CNN使用RPN在FM上提取并校正候选框。Fast R-CNN的不足在于仍然使用SS在原图上提取候选框并映射到FM,这个过程SS算法需要几秒钟,而Faster R-CNN用RPN卷积神经网络替换了SS,从根本上解决了问题。(可以简单的认为Faster R-CNN = Fast R-CNN + RPN

  • Faster R-CNN在将候选框映射到FM上之前,做了候选框的前景/背景分类和候选框坐标位置的校正。

    训练时,是RPN网络的分类Loss和回归Loss,加上最顶端的分类Loss和回归Loss,一共4个Loss一起训练。
    从R-CNN到Fast R-CNN,再到Faster R-CNN,目标检测的四个基本步骤—-生成候选区域、特征提取、分类、位置精修,最后被统一到一个深度网络框架中。
    image.png

    7.2RPN区域生成网络

    RPN(Region Proposal Network)是一种全卷积网络(FCN),可以同时预测每个位置的目标边界和目标分数,它代替了Selective Search用来提取候选框。

    RPN的结构

  • 生成候选区域。一张1000x600的图片经过特征提取后得到feature map尺寸为60x40,256通道,对于feature map上的每一个位置,给出9个候选框(即anchor boxes):三种面积目标检测1 - 图27 X 三种尺寸目标检测1 - 图28。当k=9时,候选框一共有约20000个(60409);去除越界的边框,还剩约6000个(模型测试阶段不会去除越界的边框,只会沿着边界裁剪);为了减少冗余,我们基于候选框的分类分数,经过NMS筛选,最后从每张图片上获得约2000个候选区域。(2-stage的检测)

  • 分类和位置精修。将2000个候选结果送入分类器和回归器。分类层(cls_score)输出每一个位置上,9个anchor属于前景和背景的概率(K个前景类+1个背景);窗口回归层(bbox_pred)输出每一个位置上,9个anchor对应窗口应该平移缩放的参数。分类层和回归层都是全连接网络,使用尺寸为1x1的卷积网络实现。

image.png
image.png
image.png

RPN的训练

  • 筛选anchor,划分前景样本、背景样本。考察训练集中的每张图像:与某个标定的真值(Ground Truth)边框IoU最大的anchors记为前景样本,与任意一个Ground Truth边框的IoU大于0.7,也记为前景样本;如果其与任意一个标定的重叠比例都小于0.3,记为背景样本。选定前景、背景之后,还有剩余的anchor,弃去不用;跨越图像边界的anchor弃去不用。(每个mini-batch包含从一张图像中提取的256个anchor,前景背景样本1:1。 )
  • 损失函数设计。同时最小化两种代价:分类误差,前景样本的窗口位置偏差。

分类代价:目标检测1 - 图32,其中,目标检测1 - 图33为真实分类u对应的概率。
窗口定位代价:目标检测1 - 图34,其中,目标检测1 - 图35是真实分类u对应的预测参数,目标检测1 - 图36是真实平移缩放参数。
总代价:目标检测1 - 图37

Faster R-CNN整体训练:交替训练

Faster R-CNN中交替训练(Alternating training)RPN和探测器(Detector)Fast R-CNN,有以下四步:

  • 【训练RPN】使用小批量数据(即每张图片提取256个anchor boxes),通过BP和SGD端到端的训练RPN,用于提取特征的ConvNet通过预训练的分类模型初始化,其他参数通过均值为0标准差为0.01的高斯分布初始化。
  • 【训练Fast R-CNN】根据第一步RPN生成的区域,训练一个单独的检测网络Fast R-CNN,检测网络也是通过预训练的分类模型进行初始化。(此时两个网络还不共享卷积层)
  • 【微调RPN】固定共享的卷积层,使用Fast R-CNN网络初始化RPN训练,对RPN的网络层进行微调。
  • 【微调Fast R-CNN】固定共享的卷积层,对Fast R-CNN的网络层进行微调。

image.png

7.3边框回归(bounding box reg)

在Faster R-CNN的总体损失中,根据论文表述,训练时,回归损失为:目标检测1 - 图39,其中,目标检测1 - 图40是一个向量,表示预测的边框的四个参数(分别是平移、缩放),目标检测1 - 图41是与正样本锚点相关的真实边框(GT)的参数向量。其中,目标检测1 - 图42表示边界框的中心坐标及其宽和高。变量目标检测1 - 图43分别表示预测边界框,锚点框(anchor box)和实际(ground-truth)边界框(目标检测1 - 图44也是一样的表示方法)。
预测边界框对应图中的目标检测1 - 图45,锚点框(anchor box)对应目标检测1 - 图46,实际真实边框对应目标检测1 - 图47
模型训练时,目标检测1 - 图48只是辅助作用,是已知的,我们期望锚点框到预测边框的偏移和锚点框到真实边框的偏移尽量一致,即目标检测1 - 图49,这样根据预测的偏移向量挪动锚点框,就得到和真实边框相近的位置。
模型目标检测1 - 图50用于预测时,目标检测1 - 图51的信息是隐藏在图中,并不能被提前知道,我们期望:
目标检测1 - 图52
(输入除了位置信息,还包括经过ConvNet提取特征后的feature map中的特征向量。)
image.png
【问题1】边框微调/偏移的公式是如何推导的?
训练阶段,我们期望锚点框区域目标检测1 - 图54要向预测边框目标检测1 - 图55的位置偏移,即
目标检测1 - 图56目标检测1 - 图57
区域目标检测1 - 图58的中心点和宽高的变化量可以表示为:目标检测1 - 图59
所以位置变换的一般形式表示为:目标检测1 - 图60目标检测1 - 图61
所以有目标检测1 - 图62,即目标检测1 - 图63
同样的,我们期望锚点边框目标检测1 - 图64也要向真实边框目标检测1 - 图65的位置偏移,即
目标检测1 - 图66目标检测1 - 图67
所以有目标检测1 - 图68,即目标检测1 - 图69
【问题2】为什么中心点的平移量要分别除以高和宽?高和宽的缩放量要取对数?
CNN中同样的模式,不论缩放大小,识别到的特征是不变的,输入回归模型,期望输出的平移量也是相近的,平移量除以anchor的高和宽是保证学习到的变换参数就具有尺度不变性;
高和宽的缩放量始终是大于0的,取对数可以保证这种变换。
【问题3】为什么只取正样本/前景样本做位置的精修?
正样本/前景样本是目标检测任务最终关心的;另外,只针对正样本/前景样本做边框回归,即和Ground Truth的IoU大于0.7,这是为了满足线性变换的条件,进行线性回归建模。
例如:目标检测1 - 图70,当目标检测1 - 图71时,是线性变换,即高和宽要比较接近,此时候选框和真实边框的IoU要尽可能的大,样本归类为前景样本。

来源: 1.CSDN:《Fast RCNN算法详解》《Faster RCNN算法详解》魏凯峰 https://blog.csdn.net/u014380165/article/details/72851319 2.https://blog.csdn.net/qq_38906523/article/details/79977437 3.边框回归:https://blog.csdn.net/v1_vivian/article/details/80292569 4.RPN:https://www.cnblogs.com/Terrypython/p/10584384.html