一、简介
目标检测有大量的算法,这篇文章对其中正负样本的选取方法进行了总结。对于正样本,是回归与分类都进行,而负样本由于没有回归的对象,不进行回归,只进行分类(分类为背景)。
二、正文
1.Fast R-CNN
构造如下:
步骤是
1.selective search -> ROIs -> 筛选 -> ROIs
2.ROIs + feature map -> ROI Pooling -> 分类 + 回归 -> NMS
正例:与GT的IOU>0.5的作为正样本
反例:与GT的IOU在[0.1, 0.5)之间的作为负样本。0.1是作为一种 hard example mining。
样本平衡:正:负 = 1:3
2..Faster R-CNN
Faster R-CNN的构造分为两个部分:RPN(Region Proposol Net)、fast-RCNN,如下图:
步骤是
1.特征提取 -> 输入到下面的2和3中
2. Anchor产生 -> 剔除出超出边界的Anchor -> 使用RPN对Anchor进行回归,物体判别(判断是否是物体)(这里使用的是卷积层) -> 筛选RPN回归后的Anchor -> NMS -> 再次筛选数量 -> 剔除超出边界的部分 -> 获得ROIs(reigon of interest)
3. 利用2中的ROIs和1中的特征做ROI Pooling -> 类别分类 + 进一步回归 -> NMS -> 得到b-box以及类别。
其中包含了2中的RPN的训练以及3中的训练。更详细的结构见:
https://github.com/chenyuntc/simple-faster-rcnn-pytorch
https://blog.csdn.net/qq_29462849/article/details/80510687
训练方式如下:
1. 单独训练前面的提取特征网络(共享部分)+ RPN部分,微调。
2.生成ROIs,单独训练Fast R-CNN(包括前面的共享部分)。
3. 使用2中获得的共享部分覆盖1中的共享部分,固定。训练RPN部分
4. 固定共享部分,使用3中提出的ROIs,训练Fast R-CNN
交替迭代上部分(应该就是3和4)。
还有另一种近似联合训练,在文中有说。这个文章详细叙述了训练过程:
https://blog.csdn.net/sunyiyou9/article/details/52207486
https://blog.csdn.net/qq_41576083/article/details/82966489
1.RPN的训练
首先去除超出边界的Anchro,之后选取正反例Anchor
正例:按照两个准则挑选Anchor:1.与GT有最大的IOU。 2.与GT的IOU>0.7。
两个有一个满足就是正例。
反例:与所有GT的IOU < 0.3
样本平衡:对于一个mini-batch,随机选取其中的正反例,比例为1:1,如果负样本太少,就扩展mini-batch,达到平衡。
2.fast r-cnn
这个部分应该与上面RPN的训练类似,要看代码才知道。
3.SSD
SSD也是使用Anchor(default Box)(先验框)。正反例的挑选与faster r-cnn的类似。
代码详解:https://blog.csdn.net/c20081052/article/details/80391627
正例:按照两个准则挑选default Box:1.与GT有最大的IOU。 2.与GT的IOU>0.5。
两个有一个满足就是正例。
反例:其余的均为反例。
样本平衡:采用hard negative mining,对负样本的default box的confidence进行排序,取大confidence的作为最终的负样本,最终的比例为正 : 负 = 1 : 3
据说还有另外一种方法,是根据回归后的b-box来进行正反例的选取。
4. SPP-NET(R-CNN之后的那一篇)
这里头有提到检测任务。使用的还是R-CNN的方法,使用SS生成候选窗,之后投影到feature map,使用spatial pyramid(1*1,2*2,3*3,6*6)来提取区域特征,结合起来,经过fc,判断。
正反样例的选取与fast r-cnn一样。
正例:与GT的IOU在[0.5, 1]
反例:与GT的IOU在[0.1, 0.5]
样本平衡:1:3
5.YOLO(v1)
YOLOv1比较粗糙,使用的是带有限制性的grid方法来构造b-box,每个grid有两个b-box,回归的中心限制在了grid中,但是对于大小没有限制,没有default Box一说,因此是直接根据输出的b-box来判断正反例。另外提一句,最后的输出是两个全连接层,没有共享。
YOLO由于有grid和产生的b-box两个概念,对于正负样本的判断也和之前使用Anchor的有所不同,b-box也少了很多,也就7*7*2共98个。
回归:
正例:对应的cell中有物体中心,与GT有最大IOU的b-box。 反例:其余b-box。
判断是否有物体(confidence,事实上如果有物体还要预测IOU)
正反例同上
具体标签分类:每一个cell(grid中的一个)上产生一个类别判断。
正例:物体的中心在cell中 反例:cell里头没有物体的中心
样本平衡:一个用来平衡confidence的参数,体现在损失函数上面,改变权值,反例的损失降为0.5。对于grid则不存在样本平衡,实际上也并不需要,因为如果没有出现物体的话就不需要估计类别概率了。
6.YOLO(v2)
相当于是有Anchor版本的YOLO,grid的概念依然存在。它对于Anchor的先验大小进行了研究,与SSD、Faster R-CNN不同,这里将Anchor回归后的中心限制在了cell中,使得回归过程有一定的约束。有一点与YOLOv1不同的是对于类别标签的判断不再是局限于一个cell,而是每个b-box都有一个类别判断。详细的可以见下面的代码解析:https://www.jianshu.com/p/032b1eecb335
正反例的判断相当于SSD与YOLOv1的结合,比较复杂:
对每个GT匹配一个最好的Anchor,作为预选正例,其余的为反例:
classification_loss_sum和coordinates_loss_sum依据上面判断正反例,反例没有损失,
在每个cell中,取与GT有最大IOU的b-box,其余作为反例:
对于以上的b-box,如果IOU<0.6,作为反例:
confidence_loss_sum依据上面判断正反例,反例有损失。