0 概述
自动驾驶引起了学术界和工业界研究人员的极大关注。为了确保汽车在行驶过程中的安全,自动驾驶系统需要保持汽车沿着道路上的车道线行驶,需要准确感知车道线。因此,车道检测在自动驾驶系统中发挥着重要作用,尤其是在高级驾驶辅助系统中。本文为车道线检测算法GANet的介绍和使用说明。
该示例为参考算法,仅作为在J5上模型部署的设计参考,非量产算法
1 性能精度指标
GANet模型配置:
数据集 Input shape Backbone Neck Head CULane 1x3x320x800 MixVarGENet GaNetNeck GaNetHead 性能精度表现:
latenct/ms 双核FPS CulaneF1Score infer:1.099
post-process: 0.96 2431 浮点:0.7949
量化:0.7916 注:CULane数据集官方介绍:CULane
2 模型介绍
车道线检测是一项具有挑战性的任务,需要预测车道线的复杂拓扑形状并同时区分不同类型的车道。早期的工作将预定义的锚回归到各种形状的车道线中,由于锚的形状固定,因此缺乏足够的灵活性来适应复杂形状的车道。全局关联网络(Global Association Network,GANet)通过直接回归车道线关键点到车道线起始点的偏移,来完成对车道线关键点的并行聚合,从而实现高效且准确的车道线检测。
2.1 模型优化点
相对于官方实现,地平线对GANet做了如下优化:
将模型的backbone替换为与地平线软硬件极为友好的MixVarGENet,提升了在板端运行的性能;
去除了公版的LFA模块,因为使用了J5暂不支持的deformconv1d算子;
将attention里面的hidden_dim从64降低到16,模块个数从2个减少到1个,有利于提升模型性能;
将attention结构优化为全4维计算,有利于提升模型性能。
2.2 模型结构

GANet的总体架构如上图所示。给定前视图像作为输入,采用CNN backbone和FPN neck来提取输入图像的多层视觉特征。为了更好地进行特征学习,在backbone和neck之间进一步插入了自注意层,以获得丰富的上下文信息。在解码器中,利用关键点头部和偏移头部分别生成置信度图(Confidence map:1x1x40x100)和偏移图(Offsets map:1x2x40x100),两个头都是由卷积层组成,置信度图后的X map和Y map为置信度对应的点的坐标。对于每个车道实例,首先通过在偏移图上选择值小于1的点来获得其起点作为聚类中心。然后,使用置信图和偏移图的组合,将属于同一车道的关键点聚集在采样的起点周围,以构建完整的车道线。
GANet由以下部分组成:
- Backbone+SA+FPN:采用CNN主干和FPN来提取输入图像的多级视觉表示。为了更好地进行特征学习,在backbone和neck之间进一步插入了自注意力层(Self-Attention, SA ),以获得丰富的上下文信息 ;
- Keypoint head:预测关键点的置信度图;
- Offset head:预测关键点到车道线起始点的偏移量图。
2.3 源码说明
2.3.1 Config文件
注: 如果需要复现精度,config中的训练策略最好不要修改,否则可能会有意外的训练情况出现。
2.3.2 Backbone
GANet的backbone采用地平线自研的MixVarGENet,对J5的软硬件较为友好,该结构的基本单元为MixVarGEBlock。如下为MixVarGEBlock的结构图:

MixVarGEBlock由 head op, stack ops,downsample layers,fusion layers四个基本模块组成。head_op 和stack_op都是由BasicMixVarGEBlock(如config文件中的mixvarge_f2,mixvarge_f4,mixvarge_f2_gb16)这样的基本单元构成,GANet中的配置见config文件的model定义字段。
2.3.3 GaNetNeck
为了获取丰富的上下文特征,ganet在backbone和neck间插入了Self-Attention(SA)层。
SA模块
SA模块是对backbone提取的图像特征进行“加权融合”,输出新的特征:
Attention(Q,K,V)=softmax(QKT)VAttention(Q,K,V)=softmax({QK^T}{})V
Attention(Q,K,V)=softmax(QKT)V
将位置编码加入到特征中,通过卷积计算生成Query(Q)、Key(K)、Value(V)向量,然后再进行如下的attention计算:

相关代码如下所示:
Neck
GANet的neck网络采用fpn,它采用自顶向下的层次结构来提取多尺度的高层语义特征。fpn网络结构如图所示:

相关代码:
2.3.4 GaNetHead
GANet利用一个关键点头(keypoint head)和一个偏移量头(offset head)来分别预测关键点的置信度图(confidence map)和关键点到车道线起始点的偏移量图(offset map),在推理过程中通过对这二者进行采样和组合,可以将关键点分配到所属的车道线,得到最终的车道线预测结果。
另外,GaNetHead中还有一个补偿误差分支,该分支的任务是减小输入下采样取整带来的量化误差。相关代码如下所示:
这里需要提到的是,我们将GANet的keypoint head、offset head和quantization error head中的linear都改写成了conv,对性能会有一些增益。
forward代码如下所示:
2.3.5 Decoder
Decoder的作用是基于置信度图、关键点图和误差图构建车道线。对于每个车道线实例,首先通过关键点置信图选择有效的关键点;然后,在offset head生成的偏移图上选择值小于1的点来获得其起始点,并作为聚类中心;最后,使用置信图和偏移图的组合,将属于同一车道的关键点聚集在采样的起点周围,以构建完整的车道线。下图为构建车道线的三个步骤:

采样关键点
首先在关键点置信度图上应用1×3最大池化层,以选择水平局部区域内的最大响应点作为有效关键点,如上图(a)所示。然后,我们将它们分组,将每条车道描述为关键点的有序列表。
起始点采样
为了获得每条车道的起始点,在偏移图上选择值小于1的关键点作为候选起点。由于在同一局部区域内可能存在多个与上述标准匹配的关键点,因此选择该区域的几何中心点以确保唯一性,如上图(b)所示。通过这种方式,预先确定了所有车道的实例及其起始点。每个关键点估计车道线起始点的坐标如下所示:
(sx′,sy′)=(x,y)+(δx,δy)(sx',sy')=(x,y)+(\delta x,\delta{y})
(sx′,sy′)=(x,y)+(δx,δy)
其中(x,y)是观测关键点的坐标,(δx,δy)(\delta{x},\delta{y})(δx,δy)是获得的相应偏移。
具体过程如下图所示:

车道线构建
获取图中所有车道线对应的起始点坐标,如图(b)所示,以起始点为中心,划定一定范围,所有指向起始点落在这一范围内的关键点都属于同一条车道线,将这些关键点顺序连接,即可恢复完整的车道线形状。只有估计起始点(sx′,sy′)(sx',sy')(sx′,sy′)和起始点(sx,sy)(sx,s{y})(sx,sy)之间的距离小于预定义阈值θdis\theta_{dis}θdisu200b时,关键点(x,y)(x,y)(x,y)才与第i个车道相关联。如图(c)所示,对指向同一起始点附近的关键点进行分组,以生成整个车道线。
3 浮点模型训练
3.1 Before Start
3.1.1 环境部署
GANet示例在地平线提供的docker中就可以运行,可以使用以下命令拉取docker环境:
release_models获取路径见:horizon_model_train_sample/scripts/configs/lane_pred/ganet/README.md
3.1.2 数据集准备
GANet基于CuLane数据集训练和验证,数据集的准备包括CuLane数据集下载和打包。
step1: 数据集下载
建议使用官方提供的Google云盘链接下载数据集。
然后将压缩包进行解压,需要注意的是, annotations_new.tar.gz 这个文件必须要最后解压。解压缩之后数据目录结构如下所示:
step2: 数据集打包
使用以下命令将训练数据集和验证数据集打包,格式为lmdb:
执行后会在target-data-dir下生成train_lmdb和test_lmdb,train_lmdb和test_lmdb就是打包之后的训练数据集和测试数据集,也是网络最终读取的数据集。
3.1.3 config配置
在进行模型训练和验证之前,需要对configs文件中的部分参数进行配置,一般情况下,我们需要配置以下参数:
device_ids、batch_size_per_gpu:根据开发机实际硬件配置进行device_ids和每个gpu的batchsize的配置;
ckpt_dir: 权重路径配置,权重下载链接在config文件夹下的README中;
train_data_path和val_data_path: 配置为上节中打包的训练/验证数据集路径;
3.2 浮点模型训练
浮点训练后模型ckpt的保存路径为config配置的ckpt_callback中的save_dir的值,默认为ckpt_dir。
3.3 浮点模型精度验证
浮点模型训练完成以后,可以使用以下命令验证已经训练好的浮点模型精度:
4 量化训练和编译
4.1 Calibration
模型完成浮点训练后,便可进行 Calibration。calibration在forward过程中通过统计各处的数据分布情况,从而计算出合理的量化参数。 通过运行下面的脚本就可以开启模型的Calibration过程:
4.2 Calibration 模型精度验证
Calibration完成以后,可以使用以下命令验证经过calib后模型的精度:
对于GANet模型,仅做Calibration即可满足量化精度,无需做量化训练!
4.3 量化模型精度验证
Calibration完成后,通过运行以下命令进行量化模型的精度验证:
4.4 仿真上板精度验证
除了上述模型验证之外,我们还提供和上板完全一致的精度验证方法,可以通过下面的方式完成:
4.5 量化模型编译
opt为优化等级,取值范围为0~3,数字越大优化等级越高,编译时间也会越长;out_dir为编译后产出物的存放路径。
运行后,会在out-dir目录下产出以下文件:
5 其他工具
5.1 推理结果可视化
如果您想查看单张图片的车道线检测结果,tools文件夹下面同样提供了预测及可视化的脚本,只需要运行以下脚本即可:
1.--save-path:可视化结果保存路径; 2.可以通过修改config文件中infer_cfg字段的infer_inputs来配置输入数据路径。
可视化示例:

6 板端部署
6.1 上板性能实测
6.2 AIBenchmark 示例
可在板端使用以下命令执行做模型评测:


