【车道线检测项目实战】代码视频笔记
1-车道数据与标签解读
1.1 数据集链接
原项目共使用两个数据集

这里出于学习便捷考虑,只使用CULane的部分数据集进行训练
数据集目录

1.2 list目录
其中list目录下都是文件的路径


1.3 frame目录
frame目录下都是视频的节帧


1.4 lable目录
lable目录下都是车道线的信息,肉眼看不出来,但是代码中可以读出车道线信息数据;

2-项目环境配置演示
2.1 项目配置
由于本项目只使用CULAne数据集,因此只需配置culane.py的内容即可

2.2 项目路径配置
这里使用相对路径

2.3 超参数
神经网络网格数量

日志目录

2.4 指定命令行参数
下方配置命令复制到运行参数中即可


3-制作数据集dataloader
3.1 目标文件

3.2 读取数据列表


3.3 代码解读

4-车道线标签数据处理
4.1 标签数据预处理

把图像剪成18行

4.2 构建矩阵
构建4*18*2的矩阵
- 4是车道线的数量



PS:注意索引r是先验给定的,根据数据集提前设定好可能存在车道的位置;
5-四条车道线标签位置矩阵
5.1 矩阵解析
- 4表示共有4组矩阵
- 每组矩阵中有18个元素
- 每个元素中有2个值

5.2 标签取值
- -1表示当前行没有找到车道线
- 其他有效值表示找到车道线位置
- 遍历每一行,找当前行是否存在车道线

最后遍历一轮的结果如下

6-grid设置方法
6.1 数据增强
在判断该标签存在车道线后,进行数据增强——车道线延申

即判断完成后,对有效线做延申
类似线性回归的拟合操作,点之间可能有细微误差,可能不是笔直的一条线;


6.2 grid设置
由论文可知,分类的效果远好于回归,因此进行分类操作

而想要得到如下网格值,以此来进行模型预测


需要在已有标签中选择200个格子

7-完成数据与标签制作
7.1 标签制作
把实际坐标点映射到200个格子当中;
判断200个格子中哪个是车道线的真实位置;
矩阵中,数值为200代表不是车道线,其它有效值代表车道线位置;

即代表每行在当前车道线的所处位置

该函数的作用是:把原始(实际)位置的标签,映射到200个格子中,看200个格子中哪些是目标车道线位置;

7.2 分割模块
分割任务主要作为辅助,在训练阶段额外加分支进行分割训练,优化训练结果

8-算法网络结构解读
8.1 目录解读
backbone.py文件主要用于构建一个18层的resnet网络作为主干网络;

model.py主要定义网络结构

8.2 分割模块
输入数据

把不同的特征图拼到一起,做卷积和分割

分割模块作为辅助,主要用于更好的提取特征,不会影响最终结果;


分割模块的输出结果如下

8.3 分类预测模块
输出结果分析
- 201——200个位置+1个不存在车道线
- 18——18行
- 4——4条车道线

主干是分类任务,而非回归,因此输出结果需要多加一个201的概率输出,表示占201个可能的哪一个;
分类预测的输出结果如下

9-损失函数计算模块分析
9.1 SoftmaxFocalLoss损失函数
损失函数目录


把预测值做归一化,使其取值在0-1之间
9.2 代码解读

10-车道线规则损失函数限制
10.1 限制车道线概率的损失函数
相邻行之间的车道线应该是比较接近的;

第i行和第i+1行进行比较
其中smoothloss是L1Loss和L2Loss结合的一种计算方法;

10.2 限制车道线位置的损失函数
由于本网络反向传播难以实现,因此论文中通过k*概率p,即间接求期望来求实际预测的位置

然后用L1Loss计算损失

10.3 计算总损失
根据损失的权重,累加在一起计算总损失;


其他操作

11-DEMO制作与配置
11.1 参数配置

11.2 选择测试数据


测试数据为视频中每30帧截取的一张图片

运行demo.py文件,运行结果会生成一个视频文件



浙公网安备 33010602011771号