一、项目前言

        作为刚入门深度学习的新手,我从经典的传统图像处理车道线检测入手,逐步升级到基于深度学习的自动驾驶车道线检测,完成了一次完整的项目实践。本文将完整记录项目流程、代码解析、遇到的问题及解决方法,方便后续复习回顾,也适合同阶段的新手参考。

项目核心分为两部分:

  1. 传统方法:基于OpenCV实现车道线检测(裁剪、掩码、高斯模糊、边缘检测、霍夫变换),项目链接:(视频在姓名链接里面)https://blog.csdn.net/2301_79760264/article/details/159461355?fromshare=blogdetail&sharetype=blogdetail&sharerId=159461355&sharerefer=PC&sharesource=2301_79760264&sharefrom=from_link

  2. 深度学习方法:基于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即可,保证画面融合自然

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐