Line IoU Loss 完整实现原理
Line IoU Loss 是CLRNet 专为行采样式车道检测设计的回归损失核心思想把每一行采样点左右扩展成一条水平短线段逐行计算预测线段与真值线段的交并比全局求和得到整条车道的 IoU损失 1 - LIoU。一、前置车道数据表示行采样范式主流车道数据集TuSimple/CULane统一格式图像沿高度固定取N 行采样点论文常用 N72/36每行 y 坐标固定每条车道存储真值横坐标 \(x_i^g\)、预测横坐标 \(x_i^p\)超参 e线段左右扩展半径论文固定 \(e15\) 像素模拟车道线宽度。对任意一行 i真值线段\(G_i [x_i^g - e,\ x_i^g e]\)预测线段\(P_i [x_i^p - e,\ x_i^p e]\)二、单一行线段 IoU 计算\(IoU_i\)1. 交集长度 \(d_i^{inter}\)两条线段重叠区间左右边界\(\begin{align} start_{inter} \max(x_i^g-e,\ x_i^p-e) \\ end_{inter} \min(x_i^ge,\ x_i^pe) \\ d_i^{inter} \max(0,\ end_{inter} - start_{inter}) \end{align}\)无重叠时 \(d_i^{inter}0\)。2. 并集长度 \(d_i^{union}\)并集 两线段总长度 − 交集长度单条线段固定长度2e\(d_i^{union} 2e 2e - d_i^{inter} 4e - d_i^{inter}\)3. 单行 IoU\(IoU_i \frac{d_i^{inter}}{d_i^{union}}\)三、整条车道 Line IoULIoU对所有有效车道采样行求和交集、求和并集再做比值\(LIoU \frac{\sum_{i1}^N d_i^{inter}}{\sum_{i1}^N d_i^{union}}\)只对正样本车道计算Focal Loss 筛选出存在车道的行背景行不参与回归值域\(0 \le LIoU \le 1\)完全重合时 LIoU1完全错开 LIoU0四、损失函数定义\(\mathcal{L}_{LIoU} 1 - LIoU\)完美匹配Loss0完全不重合Loss1梯度直接优化整条车道整体重合度而非孤立单点坐标解决 SmoothL1 逐点独立、车道断裂的问题。五、完整实现步骤筛选正样本先用 Focal Loss 分类分支过滤掉无车道的背景行仅保留有真值车道的行参与 LIoU 计算。扩展线段端点对每个有效行的预测 x、真值 x分别 ±e 生成左右边界。逐行求交、并长度批量向量化计算所有行的交集、并集长度避免循环。全局求和累加所有行交集总和、并集总和计算整条车道 LIoU。计算损失并反向传播\(Loss1-LIoU\)只在正样本上回传梯度。六、PyTorch 可运行源码import torch import torch.nn as nn class LineIoULoss(nn.Module): def __init__(self, e15.0): super().__init__() self.e e # 线段扩展半径论文默认15 def forward(self, pred_x, gt_x, pos_mask): pred_x: [B, num_lane, num_sample] 预测每行x坐标 gt_x: [B, num_lane, num_sample] 真值每行x坐标 pos_mask: [B, num_lane, num_sample] bool掩码True该行存在车道正样本 return: line_iou_loss 标量损失 # 1. 扩展左右端点 g_left gt_x - self.e g_right gt_x self.e p_left pred_x - self.e p_right pred_x self.e # 2. 计算交集起止 inter_start torch.max(g_left, p_left) inter_end torch.min(g_right, p_right) inter_len torch.clamp(inter_end - inter_start, min0.0) # 3. 并集长度 union_len 4 * self.e - inter_len # 4. 仅正样本参与求和 inter_sum torch.sum(inter_len[pos_mask]) union_sum torch.sum(union_len[pos_mask]) # 防止除0无正样本时loss0 if union_sum 1e-6: return torch.tensor(0.0, devicepred_x.device) # 全局Line IoU liou inter_sum / union_sum loss 1.0 - liou return loss七、关键实现细节与调参要点e 取值论文固定 \(e15\)对应图像像素车道宽度输入分辨率变化时同步缩放 e。掩码 pos_mask必须配合 Focal Loss 输出的正样本掩码背景行不参与回归否则引入大量无效梯度。梯度特性SmoothL1只约束单点距离各行独立容易出现车道局部偏移、虚线断裂LIoU梯度关联整条车道所有采样点强制线条整体对齐贴合评测 IoU 指标。多损失搭配CLRNet 总损失\(\mathcal{L}_{total} \lambda_1 \mathcal{L}_{Focal} \lambda_2 \mathcal{L}_{LIoU}\) \(\lambda_2\) 回归权重一般设为 1~2。八、与 Focal Loss 实现层面核心区分Focal Loss输入是分类置信 logits处理有无车道的二分类解决样本不平衡Line IoU Loss输入是坐标 x处理车道位置回归优化线条整体重合度计算链路完全分离分类头输出进 Focal回归头坐标进 LIoU互不干扰。