首页 > 其他分享 >OTA 细节学习

OTA 细节学习

时间:2022-10-11 19:12:40浏览次数:48  
标签:wise OTA 学习 preds 细节 cost pair 1000 cls

定义

为了便于理解,我们假设:

  • 一张图片上有 3个目标框,即 3个ground truth
  • 项目有 2个检测类别,比如 cat/dog
  • 网络输出1000个预测框,其中只有少部分是正样本,绝大多数是负样本

bboxes_preds_per_image候选检测框的信息,维度是[1000,4]。预测框的四个坐标。

obj_preds 是目标分数(object score),维度是 [1000,1]。预测框是前景还是背景。

cls_preds 是类别分数,维度是 [1000,2]。预测框的2个检测类别的one-hot。

训练网络需要知道这 1000个预测框的标签,而如何分配标签呢?

使用OTA方法,分为4步,具体做法如下:

step1:生成cost矩阵

OTA方法分配标签是基于 cost 的,因为有 3个目标框和1000个预测框,所以需要生成 3 × 1000 的 cost matrix(也就是每个真实框都要和1000个预测框计算下 cost)。

那么 cost 怎么计算?

对于目标检测任务,cost 由定位损失和分类损失组成,计算方法如下:

(1) 定位损失

计算 3个目标框,和 1000个候选框,得到每个目标框和 1000 个预测框之间的 iou(pair_wise_ious)。

再通过 -torch.log 计算得到定位损失,即 pair_wise_iou_loss,向量维度为[3, 1000]。3 是 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) 分类损失

通过第一行代码,将类别的条件概率(cls_preds:表示分类的概率)和目标的先验概率(obj_preds:是前景的概率)做乘积,得到目标的类别分数(两个乘积得到的)。

再通过第二行代码,F.binary_cross_entroy 的处理,得到 3个目标框和1000个预测框 的综合loss值,得到类别损失,即 pair_wise_cls_loss,向量维度为 [3,1000]。3也是 3个真实框。其实这里就是算一个2分类交叉熵,cls_preds 和 真实框的 1 算下。每个真实框算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_{ij} = L_{ij}^{cls} + \lambda L_{ij}^{reg}\)

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

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

标签:wise,OTA,学习,preds,细节,cost,pair,1000,cls
From: https://www.cnblogs.com/odesey/p/16780211.html

相关文章