news 2026/6/26 6:30:29

Line IoU Loss 完整实现原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Line IoU Loss 完整实现原理

Line IoU Loss 是CLRNet 专为行采样式车道检测设计的回归损失,核心思想:把每一行采样点左右扩展成一条水平短线段,逐行计算预测线段与真值线段的交并比,全局求和得到整条车道的 IoU,损失 = 1 - LIoU

一、前置:车道数据表示(行采样范式)

主流车道数据集(TuSimple/CULane)统一格式:

  1. 图像沿高度固定取N 行采样点(论文常用 N=72/36),每行 y 坐标固定;
  2. 每条车道存储:真值横坐标 \(x_i^g\)、预测横坐标 \(x_i^p\);
  3. 超参 e:线段左右扩展半径(论文固定 \(e=15\) 像素,模拟车道线宽度)。

对任意一行 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^g+e,\ x_i^p+e) \\ 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 IoU(LIoU)

所有有效车道采样行求和交集、求和并集,再做比值:

\(LIoU = \frac{\sum_{i=1}^N d_i^{inter}}{\sum_{i=1}^N d_i^{union}}\)

  • 只对正样本车道计算(Focal Loss 筛选出存在车道的行,背景行不参与回归)
  • 值域:\(0 \le LIoU \le 1\);完全重合时 LIoU=1,完全错开 LIoU=0

四、损失函数定义

\(\mathcal{L}_{LIoU} = 1 - LIoU\)

  • 完美匹配:Loss=0
  • 完全不重合:Loss=1
  • 梯度直接优化整条车道整体重合度,而非孤立单点坐标,解决 SmoothL1 逐点独立、车道断裂的问题。

五、完整实现步骤

  1. 筛选正样本先用 Focal Loss 分类分支,过滤掉无车道的背景行;仅保留有真值车道的行参与 LIoU 计算。
  2. 扩展线段端点对每个有效行的预测 x、真值 x,分别 ±e 生成左右边界。
  3. 逐行求交、并长度批量向量化计算所有行的交集、并集长度,避免循环。
  4. 全局求和累加所有行交集总和、并集总和,计算整条车道 LIoU。
  5. 计算损失并反向传播\(Loss=1-LIoU\),只在正样本上回传梯度。

六、PyTorch 可运行源码

import torch import torch.nn as nn class LineIoULoss(nn.Module): def __init__(self, e=15.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, min=0.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(无正样本时loss=0) if union_sum < 1e-6: return torch.tensor(0.0, device=pred_x.device) # 全局Line IoU liou = inter_sum / union_sum loss = 1.0 - liou return loss

七、关键实现细节与调参要点

  1. e 取值论文固定 \(e=15\),对应图像像素车道宽度;输入分辨率变化时同步缩放 e。
  2. 掩码 pos_mask必须配合 Focal Loss 输出的正样本掩码,背景行不参与回归,否则引入大量无效梯度。
  3. 梯度特性
    • SmoothL1:只约束单点距离,各行独立,容易出现车道局部偏移、虚线断裂;
    • LIoU:梯度关联整条车道所有采样点,强制线条整体对齐,贴合评测 IoU 指标。
  4. 多损失搭配(CLRNet 总损失)\(\mathcal{L}_{total} = \lambda_1 \mathcal{L}_{Focal} + \lambda_2 \mathcal{L}_{LIoU}\) \(\lambda_2\) 回归权重一般设为 1~2。

八、与 Focal Loss 实现层面核心区分

  1. Focal Loss:输入是分类置信 logits,处理有无车道的二分类,解决样本不平衡;
  2. Line IoU Loss:输入是坐标 x,处理车道位置回归,优化线条整体重合度;
  3. 计算链路完全分离:分类头输出进 Focal,回归头坐标进 LIoU,互不干扰。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/26 6:28:59

人工排班不均引发员工投诉,智能排班平衡班次分配降低离职风险

每月月底&#xff0c;HR 最头疼的就是排班表——零售门店 200 个店员&#xff0c;制造车间 3 班倒轮岗&#xff0c;客服中心弹性工时……手工排班需要 3 天&#xff0c;改一次班又要重新来过。员工抱怨排班不公平&#xff0c;管理层觉得人力成本失控&#xff0c;HR 累得要命还背…

作者头像 李华
网站建设 2026/6/26 6:27:48

AdMob账号申请失败后,别急着重开:先查这5件事

者在申请AdMob变现账号时&#xff0c;经常会遇到申请失败&#xff0c;如下图&#xff1a;这种提示很典型&#xff1a;AdMob 申请已经进入审核&#xff0c;但系统认为账号或相关信息不符合计划条件&#xff0c;所以暂时无法加入。最容易犯的错&#xff0c;是马上换邮箱、换设备、…

作者头像 李华
网站建设 2026/6/26 6:27:21

移动应用接口安全分析:从抓包到算法复现的逆向工程实践

1. 项目概述&#xff1a;从“航班管家”的sid参数说起最近在分析一些移动应用的数据交互时&#xff0c;我又遇到了一个老朋友——“航班管家”App。这个应用在查询航班动态、预订机票时&#xff0c;其网络请求中总会携带一个名为sid的参数。对于从事数据抓取、接口分析或者安全…

作者头像 李华
网站建设 2026/6/26 6:26:07

如何通过开源固件升级解锁戴森吸尘器电池的隐藏平衡功能

如何通过开源固件升级解锁戴森吸尘器电池的隐藏平衡功能 【免费下载链接】FU-Dyson-BMS (Unofficial) Firmware Upgrade for Dyson V6/V7 Vacuum Battery Management System 项目地址: https://gitcode.com/gh_mirrors/fu/FU-Dyson-BMS 戴森V6/V7吸尘器电池开源固件升级…

作者头像 李华
网站建设 2026/6/26 6:25:57

赛博朋克2077存档编辑器:5分钟学会修改你的夜之城冒险

赛博朋克2077存档编辑器&#xff1a;5分钟学会修改你的夜之城冒险 【免费下载链接】CyberpunkSaveEditor A tool to edit Cyberpunk 2077 sav.dat files 项目地址: https://gitcode.com/gh_mirrors/cy/CyberpunkSaveEditor 厌倦了在夜之城中为了欧元而奔波&#xff1f;想…

作者头像 李华
网站建设 2026/6/26 6:24:15

ClaudeAPI 知识库落地指南:从资料整理到上线使用

一、为什么要做 Claude API 知识库 不少人一开始都觉得&#xff0c;知识库嘛&#xff0c;不就是把资料都存进去。可真做起来&#xff0c;很容易变成“收藏夹 2.0”——东西越堆越多&#xff0c;临到要用的时候&#xff0c;还是只能靠记忆或者搜索引擎碰运气。Claude API 知识库…

作者头像 李华