Ultra-Fast-Lane 车道线检测算法复现

0 . 前景

车道线检测算法可分为基于segment , heatmap , point.本文由于设备影响,要求速度较快,采用的是基于点回归的方式,最终输出的是点, 使用方程拟合车道线后计算轮胎和车道线的距离.
Ultra-Fast-Lane : github地址 , 论文地址

1.数据准备

复现本文一个采用了三个公开数据集, 分别是tusimple, CULane, CurveLanes. 由于三个数据集并不是同等大小,所以进行一定处理.
查看网络会发现,最终输入的尺寸高度要为32的整数倍,所以最终把图像尺寸修改为352*640.

图像尺寸设定
  • tusimple : 原始尺寸:720*1280 所以将图像进行上方裁剪16个像素点,然后再等比例缩放2倍.
  • CULane : 原始尺寸为590 * 1640 所以将图像左右裁剪284个像素点.
  • CurveLanes: 原始图像为1440 *2560 所以将图像上方裁剪32个像素点,然后等比例缩放4倍.

注意: 就是将所有的数据进行缩放至352*640 ,并且尽量保证图像不失真. 如果不考虑图像失真问题,可以直接resize.

图像整理

处理后的图像为:
在这里插入图片描述

  • gt_image : 为mask标签,需要注意的是,这个没根车道线的mask值不相同,第一条为1,第二条为2,依次类推,网络设置的是4条线,所以针对多的线,可以通过计算进行取舍,代码可以参考 ./scripts/convert_tusimple.py 代码,分别保留左右2条线.
    如果你需要检测更多的线,也可以修改对应线的数量,然后mask进行修改就行,分别设置1,2,3,4,5,6就行.

  • images : 为原始图像.

最后整理成一个txt文档:
在这里插入图片描述
后面的1和0 代表的是线是否存在,这里可以省掉.

2.代码修改

数据读取

在这里插入图片描述
代码部分target_transformer 在后续的读取数据并未使用,这里可以不用设置,

  • segmen_transformer: 用于mask图像进行resize, 为输入图像的1/8 , 352-> 44 ,640->80
  • img_transformer: images图片的处理,由于我提前做了resize,所以我去掉了resize的过程.
  • simu_transformer: 为images和gt_image 共同的操作,这里是首先旋转,然后左右和上下平移.

图像操作的顺序是先进行simu_transformer,然后segmen_transformer,最后img_transformer.
其中 segmen_transformer 和 img_transformer分开的,没有必然联系.

修改读取mask部分内容

在这里插入图片描述
这里我采用了不规则点读取,中间密集,下面稀疏,上面没有的原则, 如果你的mask缩放至352*640大小,则需要添加我标记的部分,不然程序无法读取到对应标签内容.
通过阅读这部分代码也会发现,并没有使用txt中后面的1和0 的标签值,所以不写没有影响.

检测头修改

文章主要是使用了resnet作为检测头,语义表达能力有所欠缺,这里我修改了一下,换成了yolo系列的检测头,
主要结构如下:


class yolo(nn.Module):
    def __init__(self, inference=False):
        super(yolo, self).__init__()

        self.conv_0 = RepVGGBlock(3, 16, 3, 2)

        self.conv_1 = RepVGGBlock(16, 32, 3, 2)
        self.c3_1 = C3(32, 64, n=1, shortcut=True, g=1, e=0.5)

        self.conv_2 = RepVGGBlock(64, 128, 3, 2)
        self.c3_2 = C3(128, 128, n=3, shortcut=True, g=1, e=0.5)
        
        self.conv_3 = RepVGGBlock(128, 256, 3, 2)
        self.c3_3 = C3(256, 256, n=3, shortcut=True, g=1, e=0.5)
        
        self.conv_4 = RepVGGBlock(256, 512, 3, 2)
        self.spp = SPPF(512, 512)
        self.c3_4 = C3(512, 512, n=1, shortcut=False, g=1, e=0.5)                 #7*7
        
        # self.c3_5 = C3(512, 512, n=1, shortcut=False, g=1, e=0.5)                 #7*7
        # self.neck = Neck(inference)

    def forward(self, x):
        x = self.conv_0(x)
        x = self.conv_1(x)
        x1 = self.c3_1(x)
        
        x = self.conv_2(x1)
        x2 = self.c3_2(x)
        
        x = self.conv_3(x2)
        x3 = self.c3_3(x)
        
        x = self.conv_4(x3)
        x = self.spp(x)
        x4 = self.c3_4(x)

        # P1, P2, P3 = self.neck(x4, x3, x2)

        return x2,x3,x4


输出尺寸:
"""

x2 torch.Size([8, 128, 44, 80])
x3 torch.Size([8, 256, 22, 40])
x4 torch.Size([8, 512, 11, 20])

原始 resnet18 输出尺寸
x2.shape -> (4,128,36,100)
x3.shape -> (4,256,18,50)
fea.shape -> (4,512,9,25)   #64

"""
 

没有添加neck的原因是由于网络本身自带上采样(辅助验证部分).

3. 训练结果

训练日志

在这里插入图片描述
在这里插入图片描述

检测效果

在这里插入图片描述

### 实现 GANET 车道线检测模型 为了成功复现 GANET 车道线检测模型,需遵循特定的步骤来设置环境、准备数据以及编写必要的代码。 #### 设置开发环境 确保安装了 PythonPyTorch 环境。推荐使用 Anaconda 创建独立的工作空间: ```bash conda create -n ganet python=3.8 conda activate ganet pip install torch torchvision torchaudio ``` 还需安装其他依赖库,如 OpenCV、NumPy 等常用工具包。 #### 获取源码与预训练权重 访问官方 GitHub 仓库获取最新版本的 GANET 源代码[^4]: ```bash git clone https://github.com/Wolfwjs/GANet.git cd GANet ``` 通常情况下,作者会提供预训练好的模型参数文件用于加速实验进程或作为迁移学习的基础。 #### 数据集准备 对于车道线检测任务而言,高质量的数据集至关重要。可以考虑使用公开可用的数据集,比如 TuSimple 或 CULane,并按照项目文档中的说明进行处理和转换以适应输入格式的要求[^3]。 #### 训练配置调整 打开 `config.py` 文件修改超参数设定,包括但不限于批量大小(batch size)、初始学习率(initial learning rate)等重要选项。针对不同硬件条件和个人需求做出适当优化。 #### 开始训练流程 执行以下命令启动训练脚本,在此之前确认 GPU 设备已正确连接并可供调用: ```bash python train.py --lr 0.01 ``` 上述指令仅作示范用途,请参照实际路径及个人偏好定制化参数列表。 #### 测试与评估性能 完成一轮或多轮迭代之后,利用测试集合验证最终成果的有效性和准确性。这一步骤有助于发现潜在缺陷并对算法进一步改进。 ```python from models import build_model import torch from datasets import LaneTestDataset, transform_val from utils.eval_functions import eval_lane_iou device = 'cuda' if torch.cuda.is_available() else 'cpu' model = build_model().to(device) test_dataset = LaneTestDataset(root='./datasets/CULane', split='test', transforms=transform_val()) loader_test = DataLoader(test_dataset, batch_size=1, shuffle=False) eval_lane_iou(model=model, dataloader=loader_test) ```
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值