从传统视觉到YOLOP车道线检测项目笔记
一、项目前言
作为刚入门深度学习的新手,我从经典的传统图像处理车道线检测入手,逐步升级到基于深度学习的自动驾驶车道线检测,完成了一次完整的项目实践。本文将完整记录项目流程、代码解析、遇到的问题及解决方法,方便后续复习回顾,也适合同阶段的新手参考。
项目核心分为两部分:
-
传统方法:基于OpenCV实现车道线检测(裁剪、掩码、高斯模糊、边缘检测、霍夫变换),项目链接:(视频在姓名链接里面)https://blog.csdn.net/2301_79760264/article/details/159461355?fromshare=blogdetail&sharetype=blogdetail&sharerId=159461355&sharerefer=PC&sharesource=2301_79760264&sharefrom=from_link
-
深度学习方法:基于YOLOP预训练模型,利用GPU加速实现更鲁棒的车道线识别
-

相比传统方法,深度学习无需手动调参、抗干扰性更强,对弯道、阴影等场景都能稳定识别,更贴近真实自动驾驶的应用场景。
二、YOLOP车道线检测(GPU加速)
2.1 项目优势
选用YOLOP轻量化模型,专为自动驾驶设计,无需自行训练,加载预训练权重即可使用,支持GPU加速,检测流畅,能适配直线、弯道、阴影等多种场景,全程无需手动调参。
2.2 环境依赖安装
项目运行需安装相关库,针对遇到的缺失库、版本冲突问题,统一安装命令:
pip install opencv-python numpy torch torchvision prefetch_generator yacs scipy==1.10.1
2.3 完整代码逐行详解
import cv2
import numpy as np
import torch
# 加载YOLOP预训练深度学习模型
print("⏳ 正在加载深度学习模型...")
model = torch.hub.load('hustvl/yolop', 'yolop', pretrained=True, trust_repo=True)
# 自动选择设备:有GPU则用cuda加速,无则用CPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)
# 切换为推理模式,提升检测效率
model.eval()
print(f"✅ 模型加载成功!使用设备:{device}")
# 打开待检测视频
cap = cv2.VideoCapture("testvideo2.mp4")
# 校验视频是否成功打开,避免闪退
if not cap.isOpened():
print("❌ 视频打开失败,请检查文件名或路径是否正确!")
exit()
print("✅ 视频已打开,开始检测...")
# 循环读取视频帧
while True:
ret, frame = cap.read()
# 视频播放完毕后自动循环,不退出程序
if not ret:
print("✅ 视频播放完毕,重新播放...")
cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
continue
# 获取原图尺寸,方便后续还原
h, w = frame.shape[:2]
# 图像缩放为模型适配尺寸
img = cv2.resize(frame, (640, 640))
# 像素值归一化,符合模型输入要求
img = img / 255.0
# 调整维度并送入GPU
img = torch.from_numpy(img).permute(2, 0, 1).float().unsqueeze(0).to(device)
# GPU推理,关闭梯度计算,提升速度
with torch.no_grad():
_, _, ll_seg_out = model(img)
# 展示检测结果
cv2.imshow("🚀 深度学习车道线检测(GPU)", frame_final)
# 按q键退出程序
if cv2.waitKey(10) & 0xFF == ord("q"):
break
# 释放视频资源,关闭窗口
cap.release()
cv2.destroyAllWindows()
2.4 核心模块解析
(1)模型加载
通过torch.hub.load直接加载开源的YOLOP预训练模型,pretrained=True表示加载训练好的权重,无需自己收集数据集、训练模型,新手可直接使用。
(2)GPU加速与模型推理
# GPU推理,关闭梯度计算,提升速度
with torch.no_grad():
_, _, ll_seg_out = model(img)
这是深度学习模型识别车道线的核心推理步骤,也是整个项目的关键语句,每一部分的含义拆解如下:
1. with torch.no_grad(): —— 关闭梯度计算
在深度学习中,梯度计算是训练模型时用来更新权重的操作,而我们只是用训练好的模型做检测(推理),不需要训练更新参数。
加上这行代码,既能节省GPU显存、加快推理速度,还能避免不必要的计算报错,让视频检测更流畅,不会出现卡顿、显存不足的问题。
2. model(img) —— 模型执行车道线识别
将预处理好的图像送入YOLOP模型,模型会自动对画面进行分析,自主识别出画面中的车道线、可行驶区域,全程无需手动设置角度、阈值、边缘规则,靠训练好的权重完成智能识别。
3. _, _, ll_seg_out —— 接收模型输出
YOLOP模型是专为自动驾驶设计的多任务模型,会同时输出三个结果:目标检测结果、可行驶区域分割结果、车道线分割结果。
-
下划线
_代表占位符,用来接收我们不需要的结果,直接忽略即可 -
ll_seg_out:全称 Lane Line Segmentation Output,专门存放车道线分割结果,这是我们提取车道线唯一需要用到的数据
这行代码执行完毕,模型就完成了对当前帧的车道线识别,后续只需要从 ll_seg_out 中提取结果、绘制可视化线条即可。
(3)车道线提取核心逻辑详解
# 提取车道线检测结果,还原为原图尺寸
lane_map = ll_seg_out[0][0].cpu().numpy()
lane_map = cv2.resize(lane_map, (w, h))
这两行代码是深度学习提取车道线的关键,全程不用手动找边缘、判角度,靠训练好的模型直接定位车道线,原理拆解如下:
第一步:lane_map = ll_seg_out[0][0].cpu().numpy()
模型经过GPU推理后,输出的 ll_seg_out 是车道线分割概率图,属于深度学习专属的张量数据,每个像素点都对应一个0-1之间的概率值,代表该位置是车道线的可信度。
-
ll_seg_out[0][0]:模型输出自带批次、通道维度,去掉多余维度后,拿到单帧画面的纯车道线概率数据,数值越接近1,越是车道线;数值接近0,就是普通路面。 -
.cpu():把数据从显卡(GPU)转移到电脑CPU,才能用OpenCV做后续处理。 -
.numpy():将深度学习的张量格式,转换成OpenCV能识别的numpy数组,此时得到一张灰度概率图,亮处为车道线,暗处为背景。
这一步相当于让模型把“哪里是车道线”的判断结果,转换成我们能处理的图像数据,完成了从AI推理到视觉处理的衔接。
第二步:lane_map = cv2.resize(lane_map, (w, h))
为了适配YOLOP模型,我们提前把原图缩放到了640×640的尺寸,此时得到的车道线概率图也是640×640,和原视频帧的宽高不一致。
这行代码的作用,就是把车道线概率图等比例还原为原图的尺寸,让车道线的位置和原图完全对齐,避免后续绘制时出现偏移、错位,保证检测结果贴合原画面。
经过这两步,模型识别出的车道线区域,就被完整提取出来,并且和原视频画面尺寸匹配,后续再通过二值化过滤低置信度区域,就能精准画出车道线,全程无需人工干预,靠模型自主完成识别提取。
3.5 关键参数调优指南
(1)车道线置信度阈值
_, lane_bin = cv2.threshold(lane_map, 0.6, 1, cv2.THRESH_BINARY)
-
参数位置:阈值
0.6(如果图像全绿,可以调高阈值,防止背景被误判为车道线) -
作用:过滤低置信度的伪车道线,区分路面和真实车道线
(2)半透明叠加权重
frame_final = cv2.addWeighted(overlay, 0.4, frame, 0.6, 0)
-
参数位置:
0.4(车道线图层透明度)、0.6(原图透明度) -
作用:控制绿色车道线的深浅、透明度
-
调参技巧: - 想让车道线更显眼、颜色更深:调大
0.4(最高不超过0.6) - 想让车道线更浅、更通透:调小0.4(最低不低于0.2) - 两个权重数值相加等于1即可,保证画面融合自然
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)