进一步正样本分配OTA-Optimal Transport Assignment for Object Detection
*************************************2023年07月13日09:10:30***********************************
直接从(4 OTA实施细节)章节来阅读
********************************************************************************
论文:OTA: Optimal Transport Assignment for Object Detection
论文链接:https://arxiv.org/abs/2103.14259
代码链接:https://github.com/Megvii-BaseDetection/OTA
目标检测的一个底层问题是标签分配问题,比如网络预测10000个检测框,为了训练网络,首先需要知道这10000个检测框的标签是什么?这个问题看似简单,然而实做起来并不容易,比如如何处理模糊标签?正样本数多少为合适?不同的标签分配策略会对模型性能带来很大影响,本文介绍的这个OTA标签分配方法提供了一个很好的解决思路。
1 什么是标签分配?
目标CNN-based
的目标检测器是预测 pre-defined anchors
的类别 (cls
) 以及偏移量 (reg
) 。
为了训练目标检测器,需要为每个anchor
分配 cls
和 reg
目标,这个过程称为标签分配或者正采样。
一些经典的标签分配方法:
RetinaNet
、Faster-RCNN
: 使用pre-defined anchors
与groudtruth 的
IoU
阈值来区分正负样本;YOLOV5
: 为了增加正样本数量,使用pre-defined anchors
与groudtruth
的 宽高比进行正采样;FCOS
:处于groundtruth
的中心区域的anchors
作为正样本。
2 为什么提出OTA?
使用人工规则的分配方法,无法考虑尺寸、形状或边界遮挡的差异性。
虽然有一些改进工作,如ATSS
动态分配方法,可以为每个目标动态的选择正样本。
但是上述方法都一个缺陷:没有全局性的考虑,比如当处理模糊标签时 (一个anchor
可能对应多个目标),对其分配任何一个标签都可能对网络学习产生负面影响。
OTA
就是解决上述问题,以获得全局最优的分配策略。
3 OTA方法
3.1 OTA 思路
为了得到全局最优的分配策略,OTA
方法提出将标签分配问题当作 Optimal Transport
(OT
) 问题。
具体来讲:
将每个gt当作可以提供一定数量labels
的supplier
,而每个anchor
可以看作是需要唯一label
的 demander
,如果某个anchor
从 gt
那儿获得足够的 label
,那么这个 anchor
就是此 gt
的一个正样本。
因为有很多anchor
是负样本,所以还需引入另一个background
供应商,专门为anchor
提供 negative
标签,
问题目标是 supplier
如何分配 label
给demander
,可以让 cost
最低。其中 cost
的定义为:
-
对于每个
anchor-gt pair
,cost
为pair-wise cls loss
和pair-wise reg loss
的加权和。 -
对于每个
anchor-background pair
,cost
为pair-wise cls loss
这一项。
3.2 Optimal Transport
假设第
i个 supplier
拥有si 个货物,第
j
个 demander
需要
dj个货物。
货物从supplier
i
运到demander
j
的成本为
cij。
目标是找到最佳运输方案 可以让总的运输 cost 最低:
上述问题可以使用 Sinkhorn-Knopp
算法来求解。
3.3 OT for Label Assignment
回到标签分配问题,对于一张图片,假设有
m
个 gt 目标和
n
个 anchors
:
-
每个gt 拥有 k 个positive labels,即 s i = k ; i = 1 , 2 , . . , m
-
每个anchor 需要一个 label,即 d j = 1 ; j = 1 , 2 , . . . , n
将一个positive label
从
g
t
i
运到 anchor
a
i
的成本为 , 其可以表示为:
式中:
4 OTA实施细节
为了便于理解,我们假定图片上有3个目标框,即3个groundtruth,再假定项目有2个检测类别,网络输出1000个预测框,其中只有少部分是正样本,绝大多数是负样本。
bboxes_preds_per_image 是候选检测框的信息,维度是 [1000,4]。
obj_preds 是目标分数,维度是 [1000,1]。
cls_preds 是类别分数,维度是 [1000,2]。
训练网络需要知道这1000个预测框的标签,而如何分配标签呢?使用OTA方法,分为4步,具体做法如下:
step1:生成cost矩阵
OTA方法分配标签是基于cost的,因为有3个目标框和1000个预测框,所以需要生成 3 × 1000 的 cost matrix,对于目标检测任务,cost 组成为位置损失和类别损失,计算方法如下:
(1) 位置损失
计算3个目标框,和1000个候选框,得到每个框相互之间的 iou pair_wise_ious。
再通过-torch.log
计算得到位置损失,即pair_wise_iou_loss,向量维度为 [3,1000]。
pair_wise_ious=bboxes_iou(gt_bboxes_per_image,bboxes_perds_per_image,False)
pair_wise_ious_loss=-torch.log(pair_wise_ious+1e-8)
(2) 类别损失
通过第一行代码,将类别的条件概率和目标的先验概率做乘积,得到目标的类别分数。
再通过第二行代码,F.binary_cross_entroy
的处理,得到3个目标框和1000个候选框的综合loss值,得到类别损失,即pair_wise_cls_loss,向量维度为 [3,1000]。
cls_preds=(cls_preds_.float().unsqueeze(0).repeat(num_gt,1,1).sigmoid_()
*obj_preds_.unsqueeze(0).repeat(num_gt,1,1).sigmoid_())
pair_wise_cls_losss=F.binary_cross_entropy(cls_pres_.sqrt_(),gt_cls_per_image,reduction='none').sum(-1)
有了reg_loss和 cls_loss,将两个损失函数加权相加,就可以得到cost成本函数了。
cost 计算公式如下:
加权系数
λ
=
3,计算代码如下:
cost=pair_wise_cls_loss
+3.0*pair_wise_ious_loss
+100000.0*(~is_in_boxes_and_center)
step2:dynamic_k_estimation
每个 gt 提供多少正样本,可以理解为“这个 gt 需要多少个正样本才能让网络更好的训练收敛”。
直觉上,每个gt 的大小、尺度和遮挡条件不同,所以其提供的positive albel数量也应该是不同的,如何确定每个gt的正样本数 k 值呢,论文提供了一个简单的方案,该方法称之为:Dynamic k Estimation
,具体做法如下:
从前面的pair_wise_ious中,给每个目标框,挑选10个iou最大的候选框。因为前面假定有3个目标,因此这里topk_ious的维度为[3,10]。
topk_ious 计算代码如下:
ious_in_boxes_matrix = pair_wise_ious
n_candidate_k = min(10, ious_in_boxes_matrix.size(1))
topk_ious, _ = torch.topk(ious_in_boxes_matrix, n_candidate_k, dim=1)
下面通过topk_ious的信息,动态选择候选框。**dynamic_k_matching 代码如下:
dynamic_ks = torch.clamp(topk_ious.sum(1).int(), min=1)
针对每个目标框,计算所有anchor的 iou 值之和,再经过torch.clamp函数,得到最终右面的dynamic_ks值,给目标框1和3各分配3个候选框,给目标框2分配4个候选框。
step3:得到matching_matrix
for gt_idx in range(num_gt):
_, pos_idx = torch.topk(cost[gt_idx], k=dynamic_ks[gt_idx], largest=False)
matching_matrix[gt_idx][pos_idx] = 1
针对每个目标框挑选相应的 cost值最低的一些候选框。比如右面的matching_matrix
中,cost
值最低的一些位置,数值为1,其余位置都为0。
因为目标框1和3,dynamic_ks
值都为3,因此matching_matrix
的第一行和第三行,有3个1。而目标框2,dynamic_ks
值为4,因此matching_matrix
的第二行,有4个1。
step4:过滤共用的候选框
anchor_matching_gt = matching_matrix.sum(0)
if (anchor_matching_gt > 1).sum() > 0:
_, cost_argmin = torch.min(cost[:, anchor_matching_gt > 1], dim=0)
matching_matrix[:, anchor_matching_gt > 1] *= 0
matching_matrix[cost_argmin, anchor_matching_gt > 1] = 1
matching_matrix
种第5列有两个1,这说明第5列所对应的候选框,被目标检测框1和2都进行关联。
因此对这两个位置,还要使用cost
值进行对比,选择较小的值,再进一步筛选。假设第5列两个位置的值分别为0.4和0.3。
经过第三行代码,可以找到最小的值是0.3,即cost_min
为0.3,所对应的行数,cost_argmin
为2。
经过第四行代码,将matching_matrix
第5列都置0。
再利用第五行代码,将matching_matrix
第2行,第5列的位置变为1。
最终我们可以得到3个目标框,最合适的一些候选框,即matching_matrix
中,所有1所对应的位置。
5 OTA效果性能
(1)整体性能
OTA
方法可以使用于anchor-based
和anchor-free
检测器中,其中anchor-based
的模型使用 RetinaNet
,anchor-free
模型使用 FCOS
,当没有额外分支时,FCOS
的AP
值为38.3,使用了OTA
之后FCOS
的AP
值达到39.2,提升了0.9个百分点,如果加上 IoU
分支以及 dynamic k
策略,FCOS
的AP
值最终达到 40.7。
(2)r 的影响
OTA方法通常用于精筛选正样本,在精筛选正样本前,可以增加一步粗筛选,有2种方式:
- 筛选中心点落在
groundtruth bbox
范围内的anchor
作为正样本; - 筛选中心点落在以
groundtruth bbox
中心点为中心,r
为半径的区域内的anchor
作为正样本;
在粗筛选的结果基础上,再使用OTA
方法,可以减少运算量和提高精度。
将 r 设置成3, 5, 7后,得到粗筛选候选框数量分别为45,125 和 245。将OTA
和ATSS
、PAA
方法作比较,得到2个结论:
- 模糊样本
ambiguous anchors
(一个anchor可能对应多个gt)数量 N a m b N_{amb} Namb 越多,相应的AP会下降,说明模糊样本会对网络训练产生负面影响; - 分配到模糊样本的数量:
ATSS
>PAA
>OTA
; - 对 r 的敏感性:
ATSS
>PAA
>OTA
(3)k 的影响
在使用 Sinkhorn-Knopp
算法前,需要知道每个gt需要提供多少positive label
,posivtive label
的数量就是k,如下比较了将 k 设置成固定值和动态值的情形,论文提出的dynamic k
方法可有效提高 AP值。
6 总结
OTA
论文的主要贡献包括以下几点:
- 提出解决目标检测中的标签分配问题的新思路:当作
OT (Optimal Transport problem)
问题来处理; - 提出计算每个
gt
需要提供多少positive label
的方法,该方法简单有效; - 分析了模糊样本的影响,
ambiguous anchors
会对网络训练产生负面影响,OTA
方法可以有效的减少模糊样本的数量。
7 参考
深入浅出Yolo系列之Yolox核心基础完整讲解: https://zhuanlan.zhihu.com/p/397993315
from:https://blog.csdn.net/weixin_46142822/article/details/124074168
本文来自博客园,作者:海_纳百川,转载请注明原文链接:https://www.cnblogs.com/chentiao/p/16435078.html,如有侵权联系删除