NanoDet代码逐行精读与修改(四)动态软标签分配:dynamic soft label assigner

本文探讨了Nanodet中采用的动态SoftLabelAssigner,一种针对小模型优化的标签分配方法,通过结合AGM和IOU成本调整,提升小模型初期预测精度。讲解了初始化参数、筛选匹配、损失计算和动态匹配过程,以及如何通过可视化插图辅助理解。

--neozng1@hnu.edu.cn

笔者已经为nanodet增加了非常详细的注释,代码请戳此仓库:nanodet_detail_notes: detail every detail about nanodet 。

此仓库会跟着文章推送的节奏持续更新!

目录

4. Dynamic Soft Label Assigner

4.1. 初始化和参数

4.2. 筛除不在ground truth中的priors

4.3. 计算损失

4.4. dynamic k matching

4.5. 获得标签分配结果

TODO:编写一个单次label assign的例子和可视化插图


4. Dynamic Soft Label Assigner

随着目标检测网络的发展,大家发现anchor-free和anchor-based、one-stage和two-stage的界限已经十分模糊,而ATSS的发布也指出是否使用anchor和回归效果的好坏并没有太大差别,最关键的是如何为每个prior(可以看作anchor,或者说参考点、回归起点)分配最合适的标签。关于ATSS更详细的内容请参考笔者的这篇博客:anchor-free 模型概览

ATSS就是一种动态的标签分配方法,它会根据当前预测的结果选出最优的prior对ground truth进行匹配,而不是像之前一样使用先验的固定规则如iou最大、最接近anchor中点、根据尺寸比例等方法进行匹配。由旷视提出的OTA就是将标签分配视作最优传输问题,将ground truth和background当作provider,anchor当作receiver,很好地解决了标签分配中cost计算的问题。再如DETR中的二分图一对一匹配问题,也是一种动态的标签分配方法,需要在训练过程中实时计算cost(关于DETR的介绍请戳:目标检测终章:Vision Transformer

作者在介绍nanodet-plus的文章中也指出:

既然标签匹配需要依赖预测输出,但预测输出又是依赖标签匹配去训练的,但我的模型一开始是随机初始化的,啥也没有呀?那这不就成了一个鸡生蛋,蛋生鸡的问题了吗?由于小模型的检测头非常轻量,在NanoDet中只使用两个深度可分离卷积模块去同时预测分类和回归,和大模型中对分类和回归分别使用4组256channel的3x3卷积来说简直是天壤之别!让这样的检测头从随机初始化的状态去计算Matching Cost做匹配,这是不是有点太难为它了 。

之前的nanodet使用FCOS的方法进行标签分配,但是显然小模型的检测头在训练初期对于位置特征的提取有些力不从心。因此,为了解决小模型初期无法获取较好的预测的问题,作者借鉴了KD(knowledge distillation,关于知识蒸馏的介绍可以看占位符,讲得非常好)的思想,增加了一个AGM模块(已经在第三部分介绍过)并利用AGM的输出进行动态标签分配

dsl_assigner.py这个模块位于nanodet/model/head/assigner下。

4.1. 初始化和参数

'''
    dynamic soft label assigner,根据pred和GT的IOU进行软标签分配
    某个pred与GT的IOU越大,最终分配给它的标签值会越接近一,反之会变小
'''
​
class DynamicSoftLabelAssigner(BaseAssigner):
    """Computes matching between predictions and ground truth with
    dynamic soft label assignment.
​
    Args:
        topk (int): Select top-k predictions to calculate dynamic k
            best matchs for each gt. Default 13.
        iou_factor (float): The scale factor of iou cost. Default 3.0.
    """
    def __init__(self, topk=13, iou_factor=3.0):
        self.topk = topk
        self.iou_factor = iou_factor
​
    def assign(
        self,
        pred_scores,
        priors,
        decoded_bboxes,
        gt_bboxes,
        gt_labels,
    ):
        """Assign gt to priors with dynamic soft label assignment.
        Args:
            pred_scores (Tensor): Classification scores of one image,
                a 2D-Tensor with shape [num_priors, num_classes]
            priors (Tensor): All priors of one image, a 2D-Tensor with shape
                [num_priors, 4] in [cx, cy, stride_w, stride_y] format.
            decoded_bboxes (Tensor): Predicted bboxes, a 
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值