目标检测,即是分类问题,也是回归问题。
分类Classification:对打框的部分进行分类,是目标物体?还是背景?解决识别与分类(classification)。
回归Regression:cat(x,y,w,h),逼近这四个数值(例如:欧式距离作为损失函数);可以用来校正目标框。解决定位(localization)。
目标检测问题,可以大体分为级联的两步/两个模型:
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时,就可以认为目标检测的比较准确。
NMS(Non-Maximum Suppression)非极大值抑制:
每个边界框有一个置信度得分(confidence score),即分类器的类别分类概率,根据概率排序。
将置信度最高的边框A放入最终输出列表,计算剩下边框与A的IOU。设定阈值,用来删除重叠度较大的边界框。重复上述过程,直到边界框列表为空。
非极大值抑制,在计算机视觉任务中得到了广泛的应用,例如边缘检测、人脸检测、目标检测(DPM,YOLO,SSD,Faster R-CNN)等。
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等。
CPU运行环境下,Selective Search可以在几秒内给出1000个Region Proposal。因为效率较低,一般不再使用Selective Search,它只是作为古典目标识别的一部分。
SS是一种图像bounding box算法,2011年由KoenE.A提出。
选择搜索的主要思路:我们想要框选的区域应该是有相似性或连续性的(颜色、纹理、大小等相似),对输入图像用分割算法得到很多子区域,根据相似性再对子区域进行合并提取bounding boxes候选边界框,不断进行区域迭代合并。在迭代过程中,对合并的子区域打上bounding boxes,这些boxes就是候选框。
选定候选框的其他算法还有很多,例如:
Selective Search的策略就是将层次聚类的思想用到了区域合并上。
用SS提取候选框,效率低下;SVM用于二分类,古典目标识别更多是用于目标的定位,或者区分开目标与背景。
R-CNN(Region-based Convolutional Neural Network)即通过CNN来代替古典目标识别中的SIFT/HOG算法来将图像区域(regions)转变为向量。
R-CNN对比古典目标识别
R-CNN与古典目标识别的相同:
使用Selective Search提取候选框(RoI:Regions of Interest);
使用SVM进行分类。
R-CNN与古典目标识别的不同:
针对每个类别训练一个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的缩放。
使用回归修正候选框的位置:
【问题】为什么测试阶段每张图片需要47秒那么久?
首先selective search提取候选框(大约2k个)时,耗时需要几秒钟;
其次,2000多个候选框输入ConvNet并转变成vector(即先提取RoI,再输入CNN转换为向量,需要转换2000多次),耗时最久。
对R-CNN的改善
SPP-Net对R-CNN的改善,是针对R-CNN的缺点进行的改善:
经过ConvNet(VGG16)的多次卷积池化后,得到的Feature map有多个通道(512个),在FM上是在多个通道上都寻找/映射候选框。(在原图中的proposal经过多次卷积后,位置是相对于原图不变的)
从输入尺寸224x224到conv5之后的14x14,原图被缩小了16倍,所以用SS在FM上提取RoI,如果原图的候选框上某点的坐标为(n,n),则在FM上映射的RoI上点的坐标。
假设表示原输入图片上的点,表示特征图上的点,则,
是CNN中所有卷积、池化的stride的乘积,例如:(ZF-5中)S=2*2*2*2=16
SPP中的池化跟CNN中的池化不太一样,经过SPP layer之后得到不同大小的FM,例如:3x3,是指将一个RoI区域划分成3x3,横向和纵向不必等长。
空间金字塔池化,使得任意大小的特征图都能够转换成固定大小的特征向量(多尺度特征提取出固定大小的特征向量)。
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 维度。
对R-CNN和SPP-Net的改善
因为是模型和分类器、线性回归一起训练,整体的损失函数是:log loss+L1 loss。
线性回归校正候选框时只校正正样本。
RoI Pooling就是将一个个大小不同的box矩形框,映射成大小固定的矩形框。
roi_pool层将每个候选区域均匀分成M×N块,对每块进行max pooling。将特征图上大小不一的候选区域转变为大小统一的数据,送入下一层(FC)。
在梯度计算时,R-CNN和SPP-Net是从多张不同图片中随机区域性采样(region-wise sampling)一共128个RoIs,来构建mini-batch 进行SGD;
Fast-RCNN是分层采样(hierarchical sampling),每次从两张图片中各采样64个RoIs,来构建mini-batch 进行SGD,这样进行梯度下降时更有效率。
Fast-RCNN提取候选框仍然使用Selective Search,SS本身就是需要耗时几秒的,这导致Fast-RCNN检测速度首先。
对Fast R-CNN的改善
训练时,是RPN网络的分类Loss和回归Loss,加上最顶端的分类Loss和回归Loss,一共4个Loss一起训练。
从R-CNN到Fast R-CNN,再到Faster R-CNN,目标检测的四个基本步骤---生成候选区域、特征提取、分类、位置精修,最后被统一到一个深度网络框架中。
RPN(Region Proposal Network)是一种全卷积网络(FCN),可以同时预测每个位置的目标边界和目标分数,它代替了Selective Search用来提取候选框。
RPN的结构
RPN的训练
分类代价:,其中,为真实分类u对应的概率。
窗口定位代价:,其中,是真实分类u对应的预测参数,是真实平移缩放参数。
总代价:
Faster R-CNN整体训练:交替训练
Faster R-CNN中交替训练(Alternating training)RPN和探测器(Detector)Fast R-CNN,有以下四步:
在Faster R-CNN的总体损失中,根据论文表述,训练时,回归损失为:,其中,是一个向量,表示预测的边框的四个参数(分别是平移、缩放),是与正样本锚点相关的真实边框(GT)的参数向量。其中,表示边界框的中心坐标及其宽和高。变量分别表示预测边界框,锚点框(anchor box)和实际(ground-truth)边界框(也是一样的表示方法)。
预测边界框对应图中的,锚点框(anchor box)对应,实际真实边框对应。
模型训练时,只是辅助作用,是已知的,我们期望锚点框到预测边框的偏移和锚点框到真实边框的偏移尽量一致,即,这样根据预测的偏移向量挪动锚点框,就得到和真实边框相近的位置。
模型用于预测时,的信息是隐藏在图中,并不能被提前知道,我们期望:
(输入除了位置信息,还包括经过ConvNet提取特征后的feature map中的特征向量。)
【问题1】边框微调/偏移的公式是如何推导的?
训练阶段,我们期望锚点框区域要向预测边框的位置偏移,即
,,
区域的中心点和宽高的变化量可以表示为:,
所以位置变换的一般形式表示为:,
所以有,即
同样的,我们期望锚点边框也要向真实边框的位置偏移,即
,
所以有,即
【问题2】为什么中心点的平移量要分别除以高和宽?高和宽的缩放量要取对数?
CNN中同样的模式,不论缩放大小,识别到的特征是不变的,输入回归模型,期望输出的平移量也是相近的,平移量除以anchor的高和宽是保证学习到的变换参数就具有尺度不变性;
高和宽的缩放量始终是大于0的,取对数可以保证这种变换。
【问题3】为什么只取正样本/前景样本做位置的精修?
正样本/前景样本是目标检测任务最终关心的;另外,只针对正样本/前景样本做边框回归,即和Ground Truth的IoU大于0.7,这是为了满足线性变换的条件,进行线性回归建模。
例如:,当时,是线性变换,即高和宽要比较接近,此时候选框和真实边框的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