yolox的正负样本分配策略mmdet代码详解

本文解析了YOLOX中的SimOTTAssigner在mmdet中的作用,介绍了如何通过MlvlPointGenerator生成点式anchor,_bbox_decode整合预测信息,以及如何通过计算IoU和分类代价实现正负样本的有效分配,涉及动态k_matching和PseudoSampler在样本选择中的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以mmdet为例,正负样本分配的核心代码在YOLOXHead中的MlvlPointGenerator,SimOTTAssigner,PseudoSampler,_bbox_decode中,其中核心代码在SimOTTAssigner.

yolox是解耦头,输入fpn之后给出的是cls_score:(8,2,80,80),(8,2,40,40),(8,2,20,20),bbox_pred:(80,4,80,80),(80,4,40,40),(80,4,20,20),objectness:(80,1,80,80),(80,1,40,40),(80,1,20,20),3个特征图,每个特征图都有3个head,不再组装成一个长head。

1.MlvlPointGenerator.grid_prior

这里面不存在对每个网格生成anchor的操作,yolox是anchor-free的,这里面anchor的生成实际上是点的生成,一共生成了80*80+40*40+20*20=8400个网格点,或者叫大小为1的anchor,同fcos。

2._bbox_decode

对预测分支的预测值和前面生成的点做了组合。

3.YOLOXHead.SimOTTAssigner

yolox的核心,如何给8400个特征图上的点,原图上的框进行正负样本的分配

1.计算所有在gt bbox内部的anchor点的掩码is_in_gts_all;

2.利用center_radius阈值重新计算在gt bbox中心center_radius范围内的anchor点掩码is_in_centers_all;

3.两个掩码取并集得到在gt bbox内部或处于center_radius范围内的anchor点的掩码is_in_boxes_anchor,同时可以取交集得到每个gt bbox和哪些anchor点符合gt bbox内部和处于center_radius范围内的is_in_boxes_and_centers

若此时获取到is_in_gts_or_center:8400,is_In_boxes_and_center:1596,58

1.valid_mask是前面计算出的is_in_boxes_anchor,如果某个位置是True代表anchor点是前景即落在gt bbox内部或者在距离gt bbox中心center_radius半径范围内,这些True位置就是正样本候选点

2.利用valid_mask提取对应的预测信息,num_gt是58,一共提取了1596个候选预测位置,则每个gt bbox都会提取1596个候选位置

3.计算候选预测框和gt bbox的配对iou,然后加log和负数,变成iou的代价函数

4.计算候选框和gt bbox的配对分类代价,同时考虑了objectness预测分支,并且其分类cost在binary_cross_entropy前有开根号的训练trick,

5.is_in_boxes_and_center是(1596,58),如果某个位置是True表示anchor点落在gt bbox内部并且在距离gt bbox中心center radius半径范围内。在计算代价函数时,如果改预测点是False,表示不在交集内部,那么不太可能是候选点,所以给予一个非常大的权重100000,该操作可以保证每个gt bbox最终选择的候选点不会在交集外部

SimOTTAssigner.dynamic_k_matching

4.PseudoSampler.sample

5.loss

### 目标检测中的正负样本分配策略 #### IoU阈值法 基于IoU(交并比)的分配策略是一种广泛采用的方式。该方法通过设定一个或多个IoU阈值来决定候选区域是否作为正样本还是负样本。通常情况下,当候选框与真实框之间的IoU大于某个预设阈值时,则认为此候选框为正样本;反之则视为负样本[^1]。 #### 随机采样调整 随着项目的进展以及更多实际场景下的数据积累,简单的随机方式可能不再适用。例如,在某些特定背景下频繁出现误检的情况下,应考虑优化负样本的选择逻辑。这可以通过分析模型产生的假阳性(FP),识别出容易被错误分类的对象特征,并据此指导新的负样本采集工作[^2]。 #### RandomSampler机制 为了维持训练过程中正负样本数量间的合理关系,引入了`RandomSampler`类来进行控制。在这个框架下,定义了一个总的样本数目(`num`)及其内部正向实例所占的比例(`pos_fraction`)。此外还存在参数`neg_pos_ub`用来限定最大允许达到的负/正比率,从而避免因某一类别过多而导致其他类别代表性不足的问题发生。特别地,选项`add_gt_as_proposals`能够确保即使是在初期阶段也能有足够的优质正样本参与到学习当中去,有助于加速整个系统的收敛过程[^3]。 #### 自适应训练样本选择(ATSS) 不同于传统的固定规则判定方案,ATSS提供了一套动态计算最佳匹配原则的新思路。这种方法试图找到最接近真值预测框的那个尺度层面上的最佳锚点集合作为其对应的正样本集合成员之一。这样做不仅提高了定位准确性同时也简化了超参调节流程[^4]。 ```python def assign_labels(anchors, gt_boxes): ious = compute_iou_matrix(anchors, gt_boxes) # Apply ATSS logic here to select positive samples adaptively assigned_labels = [] for anchor_idx in range(len(anchors)): max_iou_with_any_gt = np.max(ious[anchor_idx]) if apply_atss_rule(max_iou_with_any_gt): # Placeholder function implementing ATSS rule label = 1 # Positive sample elif max_iou_with_any_gt < negative_threshold: label = 0 # Negative sample else: label = -1 # Ignore this sample during training assigned_labels.append(label) return assigned_labels ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值