1. Ultra-Fast-Lane-Detection 项目简介Ultra-Fast-Lane-Detection 是一个基于深度学习的车道线检测开源项目由香港中文大学多媒体实验室开发。这个项目的最大特点是速度快、精度高能够在普通GPU上实现实时检测。相比传统车道线检测算法它采用了全新的思路将车道线检测问题转化为行分类问题通过预测车道线在预定义行上的位置来实现快速检测。我第一次接触这个项目是在开发智能驾驶辅助系统时当时测试了多个开源方案发现这个项目的推理速度确实名不虚传。在NVIDIA 1080Ti显卡上它能达到300FPS的惊人速度而且检测精度也不输给其他主流算法。这对于需要实时处理车载视频的应用场景来说简直是福音。项目基于PyTorch框架实现支持多种骨干网络如ResNet18、34、50等可以根据实际需求在速度和精度之间做权衡。官方提供了在Tusimple和CULane两个主流车道线数据集上预训练的模型开箱即用非常方便。2. 环境搭建与依赖安装2.1 创建Python虚拟环境我强烈建议使用conda创建独立的Python环境避免与系统环境冲突。以下是具体步骤conda create -n lane python3.7 conda activate lane选择Python 3.7是因为它在兼容性和稳定性方面表现最好。在实际项目中我尝试过Python 3.8和3.9偶尔会遇到一些依赖包版本冲突的问题。2.2 安装PyTorch和CUDAPyTorch的安装需要根据你的CUDA版本选择对应的命令。我使用的是CUDA 10.1安装命令如下conda install pytorch torchvision cudatoolkit10.1 -c pytorch如果你没有GPU或者CUDA版本不同可以去PyTorch官网查看对应的安装命令。记得一定要检查CUDA是否安装成功import torch print(torch.cuda.is_available()) # 应该返回True2.3 安装其他依赖包克隆项目代码后进入项目目录安装requirements.txt中列出的依赖git clone https://github.com/cfzd/Ultra-Fast-Lane-Detection cd Ultra-Fast-Lane-Detection pip install -r requirements.txt这里有个小坑要注意OpenCV的版本最好不要超过4.5我遇到过4.6版本导致的一些兼容性问题。如果已经安装了高版本可以降级pip install opencv-python4.5.5.643. 数据集准备与处理3.1 下载开源数据集Tusimple是项目默认支持的数据集可以从官网下载。下载后解压到项目根目录下的TUSIMPLEROOT文件夹结构如下TUSIMPLEROOT/ ├── clips/ ├── label_data_0313.json ├── label_data_0531.json ├── label_data_0601.json ├── test_label.json └── readme.md3.2 数据格式转换Tusimple数据集提供的标注是json格式需要转换为项目需要的格式python scripts/convert_tusimple.py --root ./TUSIMPLEROOT这个脚本会生成train_gt.txt和test.txt两个文件包含了训练集和测试集的图片路径及标注信息。3.3 自定义数据集准备如果你想用自己的数据训练模型需要按照以下步骤准备使用labelme等工具标注车道线生成json标注文件将图片和json文件分别放在两个文件夹中运行数据转换脚本生成实例分割图我写了一个简单的转换脚本可以将labelme格式的标注转换为项目需要的格式import json import cv2 import numpy as np def convert_labelme_to_mask(img_path, json_path, output_path): img cv2.imread(img_path) mask np.zeros(img.shape[:2], dtypenp.uint8) with open(json_path) as f: data json.load(f) for shape in data[shapes]: points np.array(shape[points], dtypenp.int32) cv2.fillPoly(mask, [points], color1) cv2.imwrite(output_path, mask*255)4. 模型测试与推理4.1 下载预训练模型官方提供了在Tusimple数据集上预训练的模型下载后放在项目根目录下。运行测试命令python test.py configs/tusimple.py --test_model tusimple_18.pth --test_work_dir ./tmp这个命令会在tmp文件夹下生成测试结果包括检测效果图和评估指标。4.2 视频推理演示项目提供了demo.py脚本可以对视频文件进行推理python demo.py configs/tusimple.py --test_model tusimple_18.pth --video input.mp4我修改了demo.py使其支持更多视频格式并添加了FPS显示功能# 在while循环中添加FPS计算 start_time time.time() # ...推理代码... fps 1.0 / (time.time() - start_time) cv2.putText(frame, fFPS: {fps:.2f}, (10,30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 2)4.3 自定义数据测试如果你想测试自己的图片可以修改demo.py# 替换视频读取部分为图片读取 img cv2.imread(your_image.jpg) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img Image.fromarray(img)记得调整configs/tusimple.py中的输入尺寸参数使其与你的图片尺寸匹配。5. 模型训练与调参5.1 准备训练配置修改configs/tusimple.py中的参数# 数据集路径 data_root your_dataset_path # 训练参数 epoch 100 batch_size 32 learning_rate 4e-45.2 启动训练运行训练命令python train.py configs/tusimple.py训练过程中常见的几个问题及解决方案CUDA out of memory减小batch_sizeLoss变为NaN减小learning_rate训练不收敛检查数据标注是否正确5.3 训练监控使用tensorboard监控训练过程tensorboard --logdiryour_log_directory重点关注以下几个指标训练损失(train_loss)验证准确率(val_acc)学习率(lr)5.4 模型调优技巧根据我的经验可以尝试以下调优方法数据增强添加随机旋转、颜色抖动等学习率调度使用cosine衰减或warmup模型架构尝试不同的backbone如ResNet34我在实际项目中发现适当增加griding_num默认100可以提高检测精度但会降低速度。6. 实际应用与部署6.1 模型导出训练完成后可以将模型导出为ONNX格式便于部署import torch model torch.load(your_model.pth) dummy_input torch.randn(1, 3, 288, 800) torch.onnx.export(model, dummy_input, model.onnx)6.2 性能优化使用TensorRT加速推理trtexec --onnxmodel.onnx --saveEnginemodel.trt --fp16在我的测试中TensorRT加速后推理速度可以提升2-3倍。6.3 嵌入式部署对于树莓派等嵌入式设备建议使用ResNet18作为backbone输入尺寸调整为144x400开启半精度推理我在Jetson Nano上部署时通过以上优化实现了25FPS的实时检测。7. 常见问题解决7.1 CUDA相关错误如果遇到CUDA error: device-side assert triggered通常是数据标签有问题。检查标签值是否超出范围是否有NaN或inf值数据加载是否正确7.2 检测效果不佳如果检测效果不理想可以尝试增加训练数据量调整损失函数权重修改行锚点(row_anchor)设置7.3 速度不达标如果推理速度达不到预期降低输入分辨率使用更轻量的backbone开启TensorRT加速我在实际项目中踩过不少坑最大的教训是数据质量决定模型上限。花时间清洗和标注高质量的数据比调参带来的提升更明显。另外这个项目对弯曲车道的检测效果特别好但在极端光照条件下表现会下降这时可以考虑融合其他传感器的数据。
【Lane】Ultra-Fast-Lane-Detection 实战:从环境搭建到自定义数据集训练全流程解析
1. Ultra-Fast-Lane-Detection 项目简介Ultra-Fast-Lane-Detection 是一个基于深度学习的车道线检测开源项目由香港中文大学多媒体实验室开发。这个项目的最大特点是速度快、精度高能够在普通GPU上实现实时检测。相比传统车道线检测算法它采用了全新的思路将车道线检测问题转化为行分类问题通过预测车道线在预定义行上的位置来实现快速检测。我第一次接触这个项目是在开发智能驾驶辅助系统时当时测试了多个开源方案发现这个项目的推理速度确实名不虚传。在NVIDIA 1080Ti显卡上它能达到300FPS的惊人速度而且检测精度也不输给其他主流算法。这对于需要实时处理车载视频的应用场景来说简直是福音。项目基于PyTorch框架实现支持多种骨干网络如ResNet18、34、50等可以根据实际需求在速度和精度之间做权衡。官方提供了在Tusimple和CULane两个主流车道线数据集上预训练的模型开箱即用非常方便。2. 环境搭建与依赖安装2.1 创建Python虚拟环境我强烈建议使用conda创建独立的Python环境避免与系统环境冲突。以下是具体步骤conda create -n lane python3.7 conda activate lane选择Python 3.7是因为它在兼容性和稳定性方面表现最好。在实际项目中我尝试过Python 3.8和3.9偶尔会遇到一些依赖包版本冲突的问题。2.2 安装PyTorch和CUDAPyTorch的安装需要根据你的CUDA版本选择对应的命令。我使用的是CUDA 10.1安装命令如下conda install pytorch torchvision cudatoolkit10.1 -c pytorch如果你没有GPU或者CUDA版本不同可以去PyTorch官网查看对应的安装命令。记得一定要检查CUDA是否安装成功import torch print(torch.cuda.is_available()) # 应该返回True2.3 安装其他依赖包克隆项目代码后进入项目目录安装requirements.txt中列出的依赖git clone https://github.com/cfzd/Ultra-Fast-Lane-Detection cd Ultra-Fast-Lane-Detection pip install -r requirements.txt这里有个小坑要注意OpenCV的版本最好不要超过4.5我遇到过4.6版本导致的一些兼容性问题。如果已经安装了高版本可以降级pip install opencv-python4.5.5.643. 数据集准备与处理3.1 下载开源数据集Tusimple是项目默认支持的数据集可以从官网下载。下载后解压到项目根目录下的TUSIMPLEROOT文件夹结构如下TUSIMPLEROOT/ ├── clips/ ├── label_data_0313.json ├── label_data_0531.json ├── label_data_0601.json ├── test_label.json └── readme.md3.2 数据格式转换Tusimple数据集提供的标注是json格式需要转换为项目需要的格式python scripts/convert_tusimple.py --root ./TUSIMPLEROOT这个脚本会生成train_gt.txt和test.txt两个文件包含了训练集和测试集的图片路径及标注信息。3.3 自定义数据集准备如果你想用自己的数据训练模型需要按照以下步骤准备使用labelme等工具标注车道线生成json标注文件将图片和json文件分别放在两个文件夹中运行数据转换脚本生成实例分割图我写了一个简单的转换脚本可以将labelme格式的标注转换为项目需要的格式import json import cv2 import numpy as np def convert_labelme_to_mask(img_path, json_path, output_path): img cv2.imread(img_path) mask np.zeros(img.shape[:2], dtypenp.uint8) with open(json_path) as f: data json.load(f) for shape in data[shapes]: points np.array(shape[points], dtypenp.int32) cv2.fillPoly(mask, [points], color1) cv2.imwrite(output_path, mask*255)4. 模型测试与推理4.1 下载预训练模型官方提供了在Tusimple数据集上预训练的模型下载后放在项目根目录下。运行测试命令python test.py configs/tusimple.py --test_model tusimple_18.pth --test_work_dir ./tmp这个命令会在tmp文件夹下生成测试结果包括检测效果图和评估指标。4.2 视频推理演示项目提供了demo.py脚本可以对视频文件进行推理python demo.py configs/tusimple.py --test_model tusimple_18.pth --video input.mp4我修改了demo.py使其支持更多视频格式并添加了FPS显示功能# 在while循环中添加FPS计算 start_time time.time() # ...推理代码... fps 1.0 / (time.time() - start_time) cv2.putText(frame, fFPS: {fps:.2f}, (10,30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 2)4.3 自定义数据测试如果你想测试自己的图片可以修改demo.py# 替换视频读取部分为图片读取 img cv2.imread(your_image.jpg) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img Image.fromarray(img)记得调整configs/tusimple.py中的输入尺寸参数使其与你的图片尺寸匹配。5. 模型训练与调参5.1 准备训练配置修改configs/tusimple.py中的参数# 数据集路径 data_root your_dataset_path # 训练参数 epoch 100 batch_size 32 learning_rate 4e-45.2 启动训练运行训练命令python train.py configs/tusimple.py训练过程中常见的几个问题及解决方案CUDA out of memory减小batch_sizeLoss变为NaN减小learning_rate训练不收敛检查数据标注是否正确5.3 训练监控使用tensorboard监控训练过程tensorboard --logdiryour_log_directory重点关注以下几个指标训练损失(train_loss)验证准确率(val_acc)学习率(lr)5.4 模型调优技巧根据我的经验可以尝试以下调优方法数据增强添加随机旋转、颜色抖动等学习率调度使用cosine衰减或warmup模型架构尝试不同的backbone如ResNet34我在实际项目中发现适当增加griding_num默认100可以提高检测精度但会降低速度。6. 实际应用与部署6.1 模型导出训练完成后可以将模型导出为ONNX格式便于部署import torch model torch.load(your_model.pth) dummy_input torch.randn(1, 3, 288, 800) torch.onnx.export(model, dummy_input, model.onnx)6.2 性能优化使用TensorRT加速推理trtexec --onnxmodel.onnx --saveEnginemodel.trt --fp16在我的测试中TensorRT加速后推理速度可以提升2-3倍。6.3 嵌入式部署对于树莓派等嵌入式设备建议使用ResNet18作为backbone输入尺寸调整为144x400开启半精度推理我在Jetson Nano上部署时通过以上优化实现了25FPS的实时检测。7. 常见问题解决7.1 CUDA相关错误如果遇到CUDA error: device-side assert triggered通常是数据标签有问题。检查标签值是否超出范围是否有NaN或inf值数据加载是否正确7.2 检测效果不佳如果检测效果不理想可以尝试增加训练数据量调整损失函数权重修改行锚点(row_anchor)设置7.3 速度不达标如果推理速度达不到预期降低输入分辨率使用更轻量的backbone开启TensorRT加速我在实际项目中踩过不少坑最大的教训是数据质量决定模型上限。花时间清洗和标注高质量的数据比调参带来的提升更明显。另外这个项目对弯曲车道的检测效果特别好但在极端光照条件下表现会下降这时可以考虑融合其他传感器的数据。