进一步正样本分配OTA-Optimal Transport Assignment for Object Detection


论文: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 分配 clsreg 目标,这个过程称为标签分配或者正采样。
一些经典的标签分配方法:

  • RetinaNetFaster-RCNN: 使用 pre-defined anchorsgroudtruth 的 IoU 阈值来区分正负样本;
  • YOLOV5: 为了增加正样本数量,使用 pre-defined anchorsgroudtruth 的 宽高比进行正采样;
  • FCOS:处于groundtruth的中心区域的anchors作为正样本。

2 为什么提出OTA?

使用人工规则的分配方法,无法考虑尺寸、形状或边界遮挡的差异性。

虽然有一些改进工作,如ATSS动态分配方法,可以为每个目标动态的选择正样本。

但是上述方法都一个缺陷:没有全局性的考虑,比如当处理模糊标签时 (一个anchor可能对应多个目标),对其分配任何一个标签都可能对网络学习产生负面影响。

OTA就是解决上述问题,以获得全局最优的分配策略。

3 OTA方法

3.1 OTA 思路

为了得到全局最优的分配策略,OTA方法提出将标签分配问题当作 Optimal Transport (OT) 问题。

具体来讲:

将每个gt当作可以提供一定数量labelssupplier,而每个anchor可以看作是需要唯一label demander,如果某个anchorgt 那儿获得足够的 label,那么这个 anchor 就是此 gt 的一个正样本。

因为有很多anchor是负样本,所以还需引入另一个background供应商,专门为anchor提供 negative 标签,

问题目标是 supplier如何分配 labeldemander,可以让 cost 最低。其中 cost 的定义为:

  • 对于每个anchor-gt paircostpair-wise cls losspair-wise reg loss的加权和。

  • 对于每个anchor-background paircostpair-wise cls loss这一项。

进一步正样本分配OTA-Optimal Transport Assignment for Object Detection

 

3.2 Optimal Transport

假设第

i

i

i 个 supplier 拥有

s

i

s_i

si​ 个货物,第

j

j

j 个 demander 需要

d

j

d_j

dj​ 个货物。

货物从supplier

i

i

i运到demander

j

j

j 的成本为

c

i

j

c_{ij}

cij​。

目标是找到最佳运输方案

π

=

π

i

,

j

i

=

1

,

2

,

.

.

.

,

m

,

j

=

1

,

2

,

.

.

.

n

/pi^*={/pi_{i,j}|i=1,2,…,m,j=1,2,…n}

π∗=πi,j​∣i=1,2,…,m,j=1,2,…n ,可以让总的运输 cost 最低:

min

π

i

=

1

m

j

=

1

n

c

i

j

π

i

j

s

.

t

.

i

=

1

m

π

i

j

=

d

j

,

j

=

1

n

π

i

j

=

s

i

,

i

=

1

m

s

i

=

j

=

1

n

d

j

π

i

j

0

,

i

=

1

,

2

,

.

.

.

,

m

,

j

=

1

,

2

,

.

.

.

,

n

{/underset {/pi}{/operatorname {min} }}/sum _{i=1}^m/sum _{j=1}^n c_{ij}/pi_{ij}// s.t. /sum_{i=1}^m/pi_{ij}=d_j, /sum_{j=1}^n/pi_{ij}=s_i, /sum_{i=1}^ms_{i}=/sum_{j=1}^nd_{j}// /pi_{ij} /geq 0, i=1,2,…,m,j=1,2,…,n

πmin​i=1∑m​j=1∑n​cij​πij​s.t.i=1∑m​πij​=dj​,j=1∑n​πij​=si​,i=1∑m​si​=j=1∑n​dj​πij​≥0,i=1,2,…,m,j=1,2,…,n

上述问题可以使用 Sinkhorn-Knopp算法来求解。

3.3 OT for Label Assignment

回到标签分配问题,对于一张图片,假设有

m

m

m 个 gt 目标和

n

n

n个 anchors

  • 每个gt 拥有

    k

    k

    k 个positive labels,即

    s

    i

    =

    k

    ;

    i

    =

    1

    ,

    2

    ,

    .

    .

    ,

    m

    s_i=k; i=1,2,..,m

    si​=k;i=1,2,..,m;

  • 每个anchor 需要一个 label,即

    d

    j

    =

    1

    ;

    j

    =

    1

    ,

    2

    ,

    .

    .

    .

    ,

    n

    d_j=1; j=1,2,…,n

    dj​=1;j=1,2,…,n

将一个positive label

g

t

i

gt_i

gti​ 运到 anchor

a

i

a_i

ai​ 的成本为

c

i

j

f

g

c^{fg}_{ij}

cijfg​, 其可以表示为:

c

i

j

f

g

=

L

c

l

s

(

P

j

c

l

s

(

θ

)

,

G

i

c

l

s

)

+

α

L

r

e

g

(

P

j

b

o

x

(

θ

)

,

G

i

b

o

x

)

c_{ij}^{fg}=L_{cls}(P^{cls}_j(/theta),G^{cls}_i)+/alpha L_{reg}(P^{box}_j(/theta),G^{box}_i)

cijfg​=Lcls​(Pjcls​(θ),Gicls​)+αLreg​(Pjbox​(θ),Gibox​)
式中:

P

j

c

l

s

P^{cls}_j

Pjcls​ 和

P

j

b

o

x

P^{box}_j

Pjbox​ 分别表示对 anchor

a

j

a_j

aj​ 预测的 cls scorebbox

G

i

c

l

s

G^{cls}_i

Gicls​ 和

G

i

b

o

x

G^{box}_i

Gibox​ 分别表示对 gt

j

j

j 的 clsbbox;

L

c

l

s

L_{cls}

Lcls​ 和

L

b

o

x

L_{box}

Lbox​ 分别表示cross entorpy loss IoU Loss ;

α

/alpha

α 是 2 个loss的平衡系数

此外很多anchor是负样本,所以还有一个background supplier,将一个negative label 从background supplier 运到 anchor

a

j

a_j

aj​ 的成本为

c

j

b

g

c^{bg}_j

cjbg​, 其可以表示为:

c

j

b

g

=

L

c

l

s

(

P

j

c

l

s

(

θ

)

,

ϕ

)

c_{j}^{bg}=L_{cls}(P^{cls}_j(/theta),/phi)

cjbg​=Lcls​(Pjcls​(θ),ϕ)
可以计算出negative lables的总数为:

n

m

×

k

n-m/times k

n−m×k ,所以

s

i

s_i

si​ 更新为:

s

i

=

{

k

i

m

n

m

×

k

o

t

h

e

r

w

i

s

e

s_i=

<span style=”display: inline-block; position: relative; width: 100%; height: 0px; font-size: 102%;”><span style=”position: absolute; clip: rect(2.483em, 1010.18em, 5.014em, -999.997em); top: -3.997em; left: 0em; width: 100%;”><span id=”MathJax-Span-2″ class=”mrow”><span style=”display: inline-block; position: relative; width: 100%; height: 0px;”><span style=”position: absolute; clip: rect(2.483em, 1010.18em, 5.014em, -999.997em); top: -3.997em; left: 50%; margin-left: -5.11em;”><span id=”MathJax-Span-3″ class=”mrow”><span id=”MathJax-Span-4″ class=”mo” style=”vertical-align: -0.453em;”><span><span style=”font-size: 111%; font-family: STIXSizeTwoSym;”>{kn−m×ki≤motherwise{ki≤mn−m×kotherwise

si​={kn−m×k​i≤motherwise​

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

3/times 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 计算公式如下:

c

i

j

=

L

i

j

c

l

s

+

λ

L

i

j

r

e

g

c_{ij}=L^{cls}_{ij}+/lambda L^{reg}_{ij}

cij​=Lijcls​+λLijreg​
加权系数

λ

=

3

/lambda=3

λ=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 k k 值呢,论文提供了一个简单的方案,该方法称之为:Dynamic k Estimation,具体做法如下:

从前面的pair_wise_ious中,给每个目标框,挑选10个iou最大的候选框。因为前面假定有3个目标,因此这里topk_ious的维度为[3,10]。

进一步正样本分配OTA-Optimal Transport Assignment for Object Detection

 

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个候选框。
进一步正样本分配OTA-Optimal Transport Assignment for Object Detection

 

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。

进一步正样本分配OTA-Optimal Transport Assignment for Object Detection

 

 

 

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都进行关联。

进一步正样本分配OTA-Optimal Transport Assignment for Object Detection

 

因此对这两个位置,还要使用cost值进行对比,选择较小的值,再进一步筛选。假设第5列两个位置的值分别为0.4和0.3。
进一步正样本分配OTA-Optimal Transport Assignment for Object Detection

 

经过第三行代码,可以找到最小的值是0.3,即cost_min为0.3,所对应的行数,cost_argmin为2。

经过第四行代码,将matching_matrix第5列都置0。

再利用第五行代码,将matching_matrix第2行,第5列的位置变为1。

最终我们可以得到3个目标框,最合适的一些候选框,即matching_matrix中,所有1所对应的位置。

进一步正样本分配OTA-Optimal Transport Assignment for Object Detection

 

5 OTA效果性能

(1)整体性能

OTA 方法可以使用于anchor-basedanchor-free 检测器中,其中anchor-based的模型使用 RetinaNetanchor-free模型使用 FCOS,当没有额外分支时,FCOSAP值为38.3,使用了OTA之后FCOS AP值达到39.2,提升了0.9个百分点,如果加上 IoU分支以及 dynamic k 策略,FCOSAP值最终达到 40.7。

进一步正样本分配OTA-Optimal Transport Assignment for Object Detection

 

(2)r 的影响

OTA方法通常用于精筛选正样本,在精筛选正样本前,可以增加一步粗筛选,有2种方式:

  • 筛选中心点落在groundtruth bbox范围内的anchor作为正样本;
  • 筛选中心点落在以groundtruth bbox中心点为中心,r为半径的区域内的anchor作为正样本;

在粗筛选的结果基础上,再使用OTA方法,可以减少运算量和提高精度。

将 r 设置成3, 5, 7后,得到粗筛选候选框数量分别为45,125 和 245。将OTAATSSPAA方法作比较,得到2个结论:

  • 模糊样本ambiguous anchors(一个anchor可能对应多个gt)数量

    N

    a

    m

    b

    N_{amb}

    Namb​ 越多,相应的AP会下降,说明模糊样本会对网络训练产生负面影响;

  • 分配到模糊样本的数量:ATSS > PAA > OTA
  • 对 r 的敏感性:ATSS > PAA > OTA

进一步正样本分配OTA-Optimal Transport Assignment for Object Detection

 

(3)k 的影响

在使用 Sinkhorn-Knopp 算法前,需要知道每个gt需要提供多少positive labelposivtive label的数量就是k,如下比较了将 k 设置成固定值和动态值的情形,论文提出的dynamic k 方法可有效提高 AP值。

进一步正样本分配OTA-Optimal Transport Assignment for Object Detection

 

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

原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/270927.html

(0)
上一篇 2022年7月1日 17:44
下一篇 2022年7月1日 17:54

相关推荐

发表回复

登录后才能评论