车道线检测算法通常分为两种类型:一种是基于基于视觉特征来做语义分割或者实例分割,例如 LaneNet 和 SCNN ;另一种是通过视觉特征来预测车道线所在位置的点,以此来解决 no-visual-clue 问题的模型,比如本文提到的 Ultra-Fast-Lane-Detection 。
offical github : https://github.com/cfzd/Ultra-Fast-Lane-Detection
paper : Ultra Fast Structure-aware Deep Lane Detection
下图展示了整个模型的结构,基本可以分为三个部分: Backbone 、 Auxiliary 部分和用于车道线候选点选择的 Group Classification 部分。可以看出,由于整个 pipeline 中参与最终 inference 的部分只进行了下采样而不像分割模型还进行了多轮的上采样,因此模型整体的计算唯拦量是相当低的,根据论文给出的结果可以达到 300FPS 。
Backbone 部分采用了较小的 ResNet18 或者 ResNet34 ,下采样到 4X 的部分作为最终的特征,这里其实是较为浅层的特征,一般分割模型要下采样到 16x 或者 32x 。论文里也提到了使用较大的感受野就可以达到不错的检测效果,这样就可以极大的提高橘衡模型的推理速度。
Auxiliary 部分对三层浅层特征进行了 concat 和上采样,用来进行实例分割。其目的是在训练过程中增强视觉特征,不参与推理。
Group Classification 部分如下所示,论文称之为 row-based selecting method based on global image features ,即在全局特征上进行行索引来计算候选点,这样的方法将先验假设融入到了车道线检测的任务中。
在分割任务上,最终的特征图的大小是 HxWxC 。分类是要沿着 C 方向的, C 方向的向量代表一个像素位置的特征向量属于哪一个类别;在本方法中,最终的特征图的大小是 hx(w+1)xC 。 h 是要在垂直方向上采样的行的数量( row anchor ), h<H ; w 是行方向上车道线候选点的位置( grid cell )的数量, w<W 。 C 是车道线的数量。分类是沿着 w 方向的,即对每个车道线,在其预设的垂直方向 h 上,计算其出现在水平位置上每个 grid cell 中的概率。
文章中使用的 Loss 函数分为三部分,分别是多分类损失 L_cls , 分割损失 L_seg 和车道结构化损失 L_str 。其中 L_cls 和 L_seg 是常用的分类、分割任务中常用的两种损失。
结构损失的目的是利用车道结构的先验知识来约束预测出来的车道线的形状。其中 L_sim 为相似度损失, L_shp 为形状损失。
相似度损失的出发点是同一个车道中,相指伍胡邻的两个点之间的距离应该尽可能的近,这里使用 L1 范式来进行距离的约束。
形状损失的出发点是基于大多的的车道线都是直线,即使是曲线其大部分也是近似的直线。对于同一条车道线,在相邻 row achor 上的车道线的候选点的位置的选择应该尽可能的相近。理想的状况下它的值应该为 0 。
Loc 函数的含义是第 i 条车道的第 j 个 row anchor 中车道点的期望。 Prob 代表的是第 i 条车道的第 j 个 row anchor 中,第 k 个位置是车道点的概率。因为背景不被计算在内,因此 k 的取值从 1 开始。
论文给出 metric 结果如下所示,其评估硬件应该为 NVIDIA GTX 1080TI 。该方法在保证精度接近的情况下,极大的提升了推理速度,很适合实时检测的任务。
为了测试其真实的推理性能,我在 NVIDIA RTX 3070+CUDA11+Pytorch1.7 的环境性进行了测试。模型的 backbone 为 resnet18 ,输入尺寸为 (288, 800, 3) 的情况下, Ultra-Fast-Lane-Detection 的推理性能如下所示,单 batch 推理速度约为 350FPS ,其性能与论文给出的结果基本一致。
本文将对论文 Towards End-to-End Lane Detection: an Instance Segmentation Approach 进行解读。这篇论文是于2018年2月挂在arxiv上的。
文中提出了一种端到端的车道线检测算法,包括LaneNet和H-Net两个网络模型。其中,LaneNet是一种将 语义分割 和 对像素进行向量表示 结合起来的多任务模型,负责对图片中的车道线进行 实例分割 ;H-Net是由卷积层和全连接层组成的网络模型,负责预测转换矩阵H,使用转换矩阵H对属于同一车道线的像素点进行回归(我的理解是对使用坐标y对坐标x进行修正)。
根据论文中的实验结果,该算法在图森的车道线数据集上的准确率为96.4%,在NVIDIA 1080 TI上的处理速度为52FPS。
如图1所示,对于同一张输入图片,LaneNet输出实例分割的结果,为每个车道线像素分配一个车道线ID,H-Net输出消没一个转换矩阵H,使用转换矩阵H对车道线像素进行修正,并对修正的结果拟合出一个三阶的多项式作为预测得到的车道线。
论文中将实例分割任务拆解为 语义分割 和 聚类 两部分,如图2所示,LaneNet中decoder分为两个分支,Embedding branch对像素进行嵌入式表示,训练得到的embedding向量用于聚类,Segmentation branch负责对输入图像进行语义分割(对像素进行二分类,判断像素属于车道线还是背景)。最后将两个分支的结果进行结合得到实例分割的结果。
在设计语义分割模型时,论文主要考虑了以下两个方面:
1.在构建label时,为了处理遮挡问题,论文对被车辆遮挡的车道线和虚线进行了还原;
2. Loss使用 交叉熵 ,为了解决样本分布不均衡的问题(属于车道线的像素远少于属于背景的像素),参考论文 ENet: A Deep Neural Network Architecture for Real-Time Semantic Segmentation ,使用了boundedinverse class weight对loss进行加权:
其中,p为对应类别在总体样本中出现的概率,c是超参数(ENet论文中是1.02,使得权重的取值区间为[1,50])。
为了区分车道线上的像素属于哪条车道,embedding_branch为每个像素初始化一个embedding向量,并且毁野在设计loss时, 使得属于同一条车道线的拿余纳像素向量距离很小,属于不同车道线的像素向量距离很大 。
这部分的loss函数是由两部分组成:方差loss(L_var)和距离loss(L_dist):
其中,x_i为像素向量,μ_c为车道线的均值向量,[x]+ = max(0,x)
为了方便在推理时对像素进行聚类,在图4中实例分割loss中设置δ_d >6*δ_v。
在进行聚类时,首先使用mean shift聚类,使得簇中心沿着密度上升的方向移动,防止将离群点选入相同的簇中;之后对像素向量进行划分:以簇中心为圆心,以2δ_v为半径,选取圆中所有的像素归为同一车道线。重复该步骤,直到将所有的车道线像素分配给对应的车道。
LaneNet是基于 ENet 的encoder-decoder模型,如图5所示,ENet由5个stage组成,其中stage2和stage3基本相同,stage1,2,3属于encoder,stage4,5属于decoder。
如图2所示,在LaneNet中,语义分割和实例分割两个任务 共享stage1和stage2 ,并将stage3和后面的decoder层作为各自的分支(branch)进行训练;其中, 语义分割分支(branch)的输出shape为W*H*2,实例分割分支(branch)的输出shape为W*H*N,W,H分别为原图宽和高,N为embedding vector的维度;两个分支的loss权重相同。
LaneNet的输出是每条车道线的像素集合,还需要根据这些像素点回归出一条车道线。传统的做法是将图片投影到鸟瞰图中,然后使用2阶或者3阶多项式进行拟合。在这种方法中,转换矩阵H只被计算一次,所有的图片使用的是相同的转换矩阵,这会导致地平面(山地,丘陵)变化下的误差。
为了解决这个问题,论文训练了一个可以预测转置矩阵H的神经网络H-Net, 网络的输入是图片 , 输出是转置矩阵H :
由图6可以看出,转置矩阵H只有6个参数,因此H-Net的输出是一个6维的向量。H-Net由6层普通卷积网络和一层全连接网络构成,其网络结构如图7所示:
Curve fitting的过程就是通过坐标y去重新预测坐标x的过程:
LaneNet和H-Net是分别进行训练的。在论文的实验部分,两个模型的参数配置如下所示:
• Dataset : Tusimple
• Embedding dimension = 4
• δ_v=0.5
• δ_d=3
• Image size = 512*256
• Adam optimizer
• Learning rate = 5e-4
• Batch size = 8
• Dataset : Tusimple
• 3rd-orderpolynomial
• Image size =128*64
• Adam optimizer
• Learning rate = 5e-5
• Batch size = 10
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)