[论文笔记] Line-CNN: End-to-End Traffic Line Detection With Line Proposal Unit

IEEE TITS 2019 YangJian

last update: 2023/07/17

简介

作者受Faster-RCNN启发, 提出Line-CNN, 提出了一种新颖的车道线Anchor的表示方法,解决了车道线检测中表征的难点, 实现了端到端的车道线检测.

车道线是一条曲线, 所以无法使用常规检测中矩形bbox作为Anchor, 为了用Anchor来表示车道线, 本文提出了候选线(line proposal, LP), 即Anchor不是矩形框, 而是从左,下,右边界发出的不同角度的射线, 通过这种Anchor将每条车道线划分正负样本(计算LP和GT的距离), 计算loss并更新模型参数.

名词解释:

  • line proposal (LP) 候选线(作用和检测任务中的Anchor一样) , 用于确定正负样本和车道线位置回归
  • line proposal unit (LPU), 用来生成LP的模块, 作用类似RPN

网络结构

网络结构分为特征提取检测头, 特征提取用ResNet, 检测头中实现了输出设定好的模型输出(包括是否为线的置信度, 长度, x轴方向上的偏移量)如下图右下的表格中的数据;

img

LPU

在车道线检测中使用线Anchor代替RPN中的Anchor box, 这里的线Anchor就称为LP.

先验知识和概述

先验知识: 车道线都是从图片的左侧,右侧或者底部出现, 失在灭点消失, 所以在特征图的三个边界(左,右,下)生成大量的LP就符合先验.

  • 假设特征图的大小高H,宽W, 将该特征图划分成HxW个网格, 在左, 右, 底边的列(或行)中的每个点(这里称为LP起点)生成一簇LP, 分别用 k l k_l kl, k r k_r kr, k d k_d kd 表示; 注: 一簇LP表示这个点生成的不同方向的LP.
  • 特征图共生成LP起点数为 H ∗ ( k l + k r ) + W ∗ k d H*(k_l + k_r ) + W*k_d H(kl+kr)+Wkd, 左,右两侧每个起点各6个角度, 底边为15个角度(见下图) , 总的Anchor数量很容易就算出来了, 但是不是所有的LP都会用到, 实际应用中会根据不同的数据集统计LP的频率, 然后将频率最高的1000个LP应用到实际训练中.

在这里插入图片描述

LP如何生成的?

使用LPU(可把它当成一个函数, 便于理解)从 H × W H \times W H×W的特征图按照下图红色箭头顺序, 对每个点生成6个或15个LP, 每个LP用一个长度为77的向量表示, 包括 [负样本概率, 正样本概率, 起始y坐标, 起始x坐标, 车道线长度, 72个偏移量]

在这里插入图片描述

代码实现如下:
这段代码最重要的是279~281行, 给设置好的Anchor填充初始值, 前5个值*[负样本概率, 正样本概率, 起始y坐标, 起始x坐标, 车道线长度]*很容易理解, 后面的值, 车道线相对于x轴的偏移量, 即281行, 这里需要理解本文中的车道线是如何进行参数化表示, 弄懂这点就很容易理解了.
在这里插入图片描述

车道线参数化表示

如果要你来想一种方法表示车道线, 或许你会想到多项式曲线, 贝塞尔曲线等等, 那么本文中为什么不用这些方法表示, 是因为使用该类抽象的数学表示方法不便Line-CNN计算loss等操作; 另一方面来说, Line-CNN由TuSimple数据集的表示方法, 才想到用线Anchor的方法来检测车道线;

TuSimple数据集图像在竖直方向上, 每隔10个像素对车道线采样一个点, 一条车道线可以用一个点集表示, 如下:

{
“lanes”: [
[-2, -2, -2, -2, 632, 625, 617, 609, 601, 594, 586, 578, 570, 563, 555, 547, 539, 532, 524, 516, 508, 501, 493, 485, 477, 469, 462, 454, 446, 438, 431, 423, 415, 407, 400, 392, 384, 376, 369, 361, 353, 345, 338, 330, 322, 314, 307, 299],
],
“h_samples”: [240, 250, 260, 270, 280, 290, 300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 410, 420, 430, 440, 450, 460, 470, 480, 490, 500, 510, 520, 530, 540, 550, 560, 570, 580, 590, 600, 610, 620, 630, 640, 650, 660, 670, 680, 690, 700, 710],
“raw_file”: “path_to_clip”
}
TuSimple

本文中的i表示方法

将原图用S条水平线均匀分割成S-1份, 水平分割线索引为1,2,3, … S, 顺序从图像底部->图像顶部, 车道线和水平线的交点构成的点集, 就可以用来参数化的表示车道线, 见下图

数学描述如下:

  • 车道线 l l l 表示如下, l = { x s l , x s l + 1 , ⋯   , x e l } l=\left\{x_{s^{l}}, x_{s^{l}+1}, \cdots, x_{e^{l}}\right\} l={xsl,xsl+1,,xel}, s l s^l sl 是车道线 l l l的起始索引, s e s^e se为结束索引
  • LP表示为 L = { X s L , X s L + 1 , ⋯   , X i n f } L=\left\{X_{s}^{L}, X_{s^{L}+1}, \cdots, X_{i n f}\right\} L={XsL,XsL+1,,Xinf}, X i n f = i n f X_{inf} = inf Xinf=inf, 因为LP为射线, 所以可以到无穷远, 但实际用时, 索引只会到图片的上边界;

这里为什么只给出了x索引值?
因为y方向的坐标是固定的, 从图像底部到图像顶部均匀切分, y坐标可以容易计算出
在这里插入图片描述

车道线从标注中进行编码

可以参考下面代码, 主要逻辑是1. 把不符合要求的车道线删除 2. 对线Anchor(长度为77的向量, 见上面)的各个位置上的数值进行更新;
在这里插入图片描述

在这里插入图片描述

车道线距离计算

D ( L i , l j ) = { ∑ p = s c e c ∣ X p − x p ∣ e c − s c + 1 , e c ≥ s c i n f , e c < s c D\left(L_{i}, l_{j}\right)= \begin{cases}\frac{\sum_{p=s^{c}}^{e^{c}}\left|X_{p}-x_{p}\right|}{e^{c}-s^{c}+1}, & e^{c} \geq s^{c} \\ i n f, & e^{c}<s^{c}\end{cases} D(Li,lj)={ecsc+1p=scecXpxp,inf,ecscec<sc

车道线 l i l_i li 和 LP L i L_i Li之间的距离用上述公式计算;

  • 起始索引选车道线和LP最大的索引, s c = max ⁡ ( s L i , s l j ) s^{c}=\max \left(s^{L_{i}}, s^{l_{j}}\right) sc=max(sLi,slj) 注意: 由于索引是从下往上递增的, 所以两者中的大的值是离边缘较远的那个索引.

  • 结束索引选车道线和LP最小的, LP索引结束索引会是无穷大, 即为车道线结束索引 e c = min ⁡ ( e^{c}=\min \left(\right. ec=min( inf, e l j ) = e l j \left.e^{l_{j}}\right)=e^{l_{j}} elj)=elj

    该距离度量公式可以计算两个车道线的距离, 可以做线的聚类

Line-CNN损失函数

  • 首先将LP L i L_i Li 设置正负标签, 如果满足1. D ( L i , l j ) = d D\left(L_{i}, l_{j}\right)=d D(Li,lj)=d 是最小的, 2. d < t p o s d<t_{pos} d<tpos 即小于阈值 设置该 L i L_i Li为正标签
  • 由于一条车道线可能将多个LP设置为正标签, 所以将一个非正的LP设置为负标签如果该LP对于所有的车道线的距离都大于 t n e g t_{neg} tneg
  • 没有标签的LP不会参与模型训练

L ( p i , r i ) = λ ∑ i L c l s ( p i , p i ∗ ) + ∑ i p i ∗ L r e g ( r i , r i ∗ ) \mathcal{L}\left(p_{i}, \mathbf{r}_{i}\right)=\lambda \sum_{i} \mathcal{L}_{c l s}\left(p_{i}, p_{i}^{*}\right)+\sum_{i} p_{i}^{*} \mathcal{L}_{r e g}\left(\mathbf{r}_{i}, \mathbf{r}_{i}^{*}\right) L(pi,ri)=λiLcls(pi,pi)+ipiLreg(ri,ri)

  • i i i是LP的索引
  • p i p_i pi L i L_i Li (LP)预测为车道线的概率; p i ∗ p^*_i pi是车道线的GT, 取值为1或0
  • r i r_i ri 是预测的S+1个坐标向量; r i ∗ r^*_i ri 是与 L i L_i Li距离最小的 l i l_i li的坐标向量
  • 分类损失为log损失; 回归损失是smoothL1, 回归损失只有正标签才有响应

r i ∗ = { e l j − s l j + 1 , x s l j − X s L i , x s l j + 1 − X s L i + 1 , ⋯   } \mathbf{r}_{i}^{*}=\left\{e^{l_{j}}-s^{l_{j}}+1, x_{s}^{l_{j}}-X_{s} L_{i}, x_{s^{l_{j}}+1}-X_{s} L_{i}+1, \cdots\right\} ri={eljslj+1,xsljXsLi,xslj+1XsLi+1,}

  • 第一个位置为点的数量
  • 区域位置为车道线到LP的偏移量
  • 实际计算过程中将 s l j = s L i s^{l_{j}}=s^{L_{i}} slj=sLi, 将真实车道线的起点等于LP的起点, 为了正确计算回归损失

特征图上提取的LP如何映射回原图

网络输入原始图像尺寸为288x512, 假设特征图为原来的1/16, 特征图大小为18x32; 特征图上的每个像素生成的k( k l k_l kl,或 k r k_r kr,或 k d k_d kd)个LP会映射到原始图像中, 和RPN的Anchor映射会原图的原理是一样的, 这个是我猜的, 毕竟论文中也没写实怎么映射的, 需要看代码了FC.

存在问题

  1. 车道线不从图像边缘出发
  2. 水平车道线
  3. 曲率大的车道线检测不了

总结

为了解决车道线检测问题, 提出了LPU来提取LP用于车道线的位置回归和类别判断, 思路挺朴素但是效果挺好; 文章不足, 特征图提取的LP如何映射回原图没有写, 还是我自己猜的, 应该和RPN差不多; 数据集代码都没有, 简直太坑了, 数据集可以没有, 代码不开源都不知道细节怎么实现的, 好在LaneATT是开源的, 从这里应该能够知道这篇文章的实现细节.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值