
sparse-drive 中3d-boxes检测时候的匹配算法cls_cost是怎么计算的box_cost是怎么计算的cls_cost使用的是FocalLossCost 将gt_labels的地方取正样本减去取负样本的距离box_cost直接计算ABS值;再做匈牙利匹配后输出gt;//FocalLossCost cls_predcls_pred.sigmoid()neg_cost-(1-cls_predself.eps).log()*(1-self.alpha)*cls_pred.pow(self.gamma)pos_cost-(cls_predself.eps).log()*self.alpha*(1-cls_pred).pow(self.gamma)cls_costpos_cost[:,gt_labels]-neg_cost[:,gt_labels]returncls_cost*self.cls_weight//boxes-abs乘以类别权重和总权重 torch.sum(torch.abs(box_pred[i,:,None]-box_target[i][None])*instance_reg_weights[i][None]*self.reg_weightsA:对于不区分正反方向的类别比如栅栏、隔离栏,处理对称物体航向角二义性的核心逻辑使用的方法是什么Q:当且仅当物体属于“允许反转”的类别且预测方向与 GT 相反时自动将 GT 的航向翻转 180°使其与预测对齐从而避免产生错误的巨大回归 Loss;ifself.cls_allow_reverse is not None and cls_target is not None:if_reverse(torch.nn.functional.cosine_similarity(box_target[...,[SIN_YAW,COS_YAW]],box[...,[SIN_YAW,COS_YAW]],dim-1,)0)if_reverse(torch.isin(cls_target,cls_target.new_tensor(self.cls_allow_reverse))if_reverse)box_target[...,[SIN_YAW,COS_YAW]]torch.where(if_reverse[...,None],-box_target[...,[SIN_YAW,COS_YAW]],box_target[...,[SIN_YAW,COS_YAW]],)A:该模块包含两个独立的质量quality指标CNS (Center-ness) 和 YNS (Yaw-ness), 是怎么计算的Q:训练一个**自评估模块**让模型学会判断自己预测结果的“置信度”。 该模块包含两个独立的质量指标**CNS (Center-ness)** 和 **YNS (Yaw-ness)**。 1. CNS中心度 / 位置质量 衡量预测框的中心点与 GT 中心点的接近程度。 cns quality[..., CNS] # 模型预测的 CNS 值未激活 cns_target torch.norm( box_target[..., [X, Y, Z]] - box[..., [X, Y, Z]], p2, dim-1 # L2 欧氏距离 ) cns_target torch.exp(-cns_target) # 指数衰减映射到 (0, 1] cns_loss self.loss_cns(cns, cns_target, avg_factoravg_factor) - **Target 构造**预测中心与 GT 中心的 L2 距离越小exp(-dist) 越接近 1距离越大target 趋近于 0。这是一种**软标签**设计比硬性的 0/1 分类更能反映位置的连续质量。 - **物理含义**CNS 高 → 预测框定位精准CNS 低 → 框偏移严重。 - **用途**推理时作为 NMS 的加权因子抑制定位不准的冗余框。 2. YNS航向度 / 角度质量 衡量预测航向与 GT 航向的一致性。 python yns quality[..., YNS].sigmoid() # sigmoid 激活到 (0,1) yns_target ( torch.nn.functional.cosine_similarity( box_target[..., [SIN_YAW, COS_YAW]], box[..., [SIN_YAW, COS_YAW]], dim-1, ) 0 # 相似度0 → 同向为1反向为0 ).float() yns_loss self.loss_yns(yns, yns_target, avg_factoravg_factor)Target 构造利用(sin, cos)余弦相似度判断方向一致性。注意这里是硬二分类标签0 为 1否则为 0与 CNS 的软标签形成对比。为什么用硬标签航向具有明确的对/错语义尤其结合前文的cls_allow_reverse处理后反向已被修正不需要像位置那样表达连续梯度。.sigmoid()的位置差异CNS 没有在此处做 sigmoid可能在 loss 内部处理或 target 本身已归一化而 YNS 显式做了 sigmoid说明loss_yns期望输入已在 (0,1) 区间如 BCE Loss。