YOLOX的动态匹配策略详解

锚框训练:

在YOLOV2-YOLOV5、YOLOV7中,都是采用了带锚框训练,具体方式都是通过归一化的target来找到其在特征图的具体位置和特征图的像素点偏移量xy,找到具体位置后使用该特征图点的先验框进行匹配,在YOLOV4以前都是使用IOU进行匹配,找到与之最大的那个IOU匹配的先验框,对这个先验框进行微调从而实现目标检测,到了5、7都是使用长宽比进行匹配的。损失主要分为坐标、置信度和分类,分类采用二元交叉熵函数主要是因为不希望表现出的类别与其他的类别是互斥的,坐标损失采用IOU计算,置信度就是对应锚点的先验框与真实框IOU的值。

无锚框训练:

以YOLOV6与YOLOX为代表,具体操作:YOLOX加入了解耦头这个操作,因为作者觉得如果把所有的维度会影响最终效果,所以作者在末端加入了多层的卷积层,将分类、回归、置信度单独进行预测。随后,形成关于原图的锚点,最后进行中心点根据这三个特征图的步长*0.5与其每个图生成的网格框相加或相减从而实现相对于原图在中间的每个锚点,之后用这个中心,对目标框进行变换,相当于把这个中心当做目标框中心进行偏移。当然是所有的锚框全偏移,最后筛选一下锚框,比如超过格子的这种的,源代码里我看好像是只有如下筛选方法

is_in_boxes = bbox_deltas.min(dim=-1).values > 0.0 #(targets,8400,4)

看着是只限制了左上角,随后又将步伐由0.5的 变为2.5再次进行偏移,又生成了上述的这些锚框,筛选方式一样,最后取二者交集,初筛了一部分锚框 在我这里是8400变成2100,根据锚框标签,选择与之对应的预测框,计算真实框与预测出来的2100个框进行IOU计算,生成(targets,2100),计算IOUloss就是-log(iou),然后计算分类LOSS,分类的概率乘以置信度的概率当成分类的,根据这两个loss和锚框标签生成代价矩阵

cost = (
    pair_wise_cls_loss  #分类loss
    + 3.0 * pair_wise_ious_loss #ious loss
    + 100000.0 * (~is_in_boxes_and_center) #计算代价矩阵 说白了 就是10000就是超出的 所以代价比较大
)

之后生成dynamic,将IOU的矩阵生成top10,然后将这10个IOU的值相加向下取整,就知道我们每个真实框需要匹配几个锚框了。然后用上述知道的信息,也就是每个框匹配几个先验框用cost的矩阵进行匹配。

for gt_idx in range(num_gt): #根据iou匹配最大的那个gt 毕竟框多肉少
    _, pos_idx = torch.topk(
        cost[gt_idx], k=dynamic_ks[gt_idx], largest=False
    )
    matching_matrix[gt_idx][pos_idx] = 1

如果发现一个先验框匹配了两个真实框,那就将最小的cost的那个先验框匹配上真实框

if (anchor_matching_gt > 1).sum() > 0: #如果一个先眼眶匹配了两个GT 那么就匹配那个最匹配的 根据cost算的
    _, 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

接下来就是生成与锚框相互匹配的坐标,计算一下有几个锚框被真实框匹配上了,得到每个锚框匹配上的GT框的索引,类别也进行变换。我这里是一共27GT 26个GT被匹配上了。

fg_mask_inboxes = matching_matrix.sum(0) > 0
num_fg = fg_mask_inboxes.sum().item()

fg_mask[fg_mask.clone()] = fg_mask_inboxes

matched_gt_inds = matching_matrix[:, fg_mask_inboxes].argmax(0)
gt_matched_classes = gt_classes[matched_gt_inds]
接下来求三种LOSS就可以了,无锚框的匹配机制,跟有锚框比少了提取先验框的过程,其实也是生成了锚框,不过是根据真实框进行偏移生成的,进行如上的匹配机制从而实现这个过程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值