动手学无人驾驶(7):车道线检测

article/2025/10/2 22:01:37

在这里插入图片描述
最近在研究视觉语义地图,需要进行车道线检测,发现这篇车道线检测论文效果蛮好的 (Ultra Fast Structure-aware Deep Lane Detection)。论文作者在知乎上已经介绍过了:https://zhuanlan.zhihu.com/p/157530787,本文中我简单介绍下论文原理,重点介绍如何使用原作者开源的模型检测自己采集的数据。


1.Method介绍

目前大多数车道线检测算法中都是将车道线检测看作是像素分割问题。但是这会存在两个问题,一是计算速度慢,二是在一些有挑战的场景中(遮挡、夜晚、极端光照条件)由于没有视觉线索很难进行检测。因此在本文中,作者提出了一个按行检测车道线的方法

作者首先将原始图像按照一定像素间隔划分成 h h h 个anchors,同时又将每一个anchor划分为 w w w 个网格。若图像全局特征用 X X X 表示,车道线数量用 C C C 表示,车道线分类器为 f i j f^{ij} fij,则车道线预测概率为:
P i , j , : = f i j ( X ) , s.t.  i ∈ [ 1 , C ] , j ∈ [ 1 , h ] P_{i, j,:}=f^{i j}(X), \text { s.t. } i \in[1, C], j \in[1, h] Pi,j,:=fij(X), s.t. i[1,C],j[1,h]

概率 P i , j , : P_{i, j,:} Pi,j,: ( w + 1 ) (w+1) (w+1) 维的向量。

为什么本文提出的方法可以快速检测车道线呢?如下图所示,基于像素分割的车道线检测要进行 H × W × ( C + 1 ) H \times W \times (C+1) H×W×(C+1) 次分类,而本文提出的方法只需要进行 C × h × ( w + 1 ) C \times h \times (w+1) C×h×(w+1) 次分类,由于 h < < H , w < < W h<<H,w<<W h<<Hw<<W,因此整体计算量大幅减小。
在这里插入图片描述
同时在本文中作者又提出了两个新的结构损失函数。

  • 由于车道线一般是连续的,所有同一车道线在相邻anchor的预测概率应该是接近的,作者提出了车道线相似损失函数
    L s i m = ∑ i = 1 C ∑ j = 1 h − 1 ∥ P i , j , : − P i , j + 1 , : ∥ 1 L_{s i m}=\sum_{i=1}^{C} \sum_{j=1}^{h-1}\left\|P_{i, j,:}-P_{i, j+1,:}\right\|_{1} Lsim=i=1Cj=1h1Pi,j,:Pi,j+1,:1
  • 另一个是车道线形状损失函数,作者使用softmax函数得到车道线的概率: Prob ⁡ i , j , : = softmax ⁡ ( P i , j , 1 : w ) \operatorname{Prob}_{i, j,:}=\operatorname{softmax}\left(P_{i, j, 1: w}\right) Probi,j,:=softmax(Pi,j,1:w),同时使用期望来表示车道线所处位置 L o c i , j = ∑ k = 1 w k ⋅ Prob ⁡ i , j , k L o c_{i, j}=\sum_{k=1}^{w} k \cdot \operatorname{Prob}_{i, j, k} Loci,j=k=1wkProbi,j,k。最后作者使用二阶微分方程来约束车道线位置:
    L s h p = ∑ i = 1 C ∑ j = 1 h − 2 ∥ ( L o c i , j − L o c i , j + 1 ) − ( L o c i , j + 1 − L o c i , j + 2 ) ∥ 1 \begin{aligned} L_{s h p}=\sum_{i=1}^{C} \sum_{j=1}^{h-2} \| &\left(L o c_{i, j}-L o c_{i, j+1}\right) -\left(L o c_{i, j+1}-L o c_{i, j+2}\right) \|_{1} \end{aligned} Lshp=i=1Cj=1h2(Loci,jLoci,j+1)(Loci,j+1Loci,j+2)1

2.自采数据集车道线检测

下面使用作者训练好的模型来检测车道线,代码链接为:https://github.com/cfzd/Ultra-Fast-Lane-Detection。

下载完源码后,创建一个lane_detection.py,首先导入需要的库:

import torch
import scipy.special
import os, cv2
from PIL import Image
from model.model import parsingNet
import numpy as np
import torchvision.transforms as transforms
from data.constant import tusimple_row_anchor

然后加载预训练模型,作者在两个车道线数据集上进行了训练,我这里选择是的在TuSimple数据集训练的模型,代码如下:

 net = parsingNet(pretrained = False, backbone='18',cls_dim = (101,56,4),use_aux=False) # we dont need auxiliary segmentation in testingtest_model = 'tusimple_18.pth'
state_dict = torch.load(test_model, map_location='cpu')['model']compatible_state_dict = {}
for k, v in state_dict.items():if 'module.' in k:compatible_state_dict[k[7:]] = velse:compatible_state_dict[k] = vnet.load_state_dict(compatible_state_dict, strict=False)
net.eval()

然后是一些参数设置,如图片大小尺寸(我这里图片大小为 1280 × 560 1280\times560 1280×560),row anchor 尺寸(这里使用的是作者设置的anchor尺寸),图片预处理等(将图片大小resize为 800 × 288 800\times288 800×288):

img_w, img_h = 1280, 560
size = (img_w,img_h)
cls_num_per_lane = 56
row_anchor = tusimple_row_anchorimg_transforms = transforms.Compose([transforms.Resize((288, 800)),transforms.ToTensor(),transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)),
])

下一步就是车道线检测与可视化:

 with torch.no_grad():out = net(img)col_sample = np.linspace(0, 800-1, 100)
col_sample_w = col_sample[1] - col_sample[0]out_j = out[0].data.cpu().numpy()
out_j = out_j[:, ::-1, :]                               
prob = scipy.special.softmax(out_j[:-1, :, :], axis=0)  
idx = np.arange(100) + 1
idx = idx.reshape(-1, 1, 1)
loc = np.sum(prob * idx, axis=0)
out_j = np.argmax(out_j, axis=0)
loc[out_j == 100] = 0
out_j = loc                                             for i in range(out_j.shape[1]):if np.sum(out_j[:, i] != 0) > 2:for k in range(out_j.shape[0]):if out_j[k, i] > 0:ppp = (int(out_j[k,i] * col_sample_w * img_w / 800) - 1, int(img_h *   (row_anchor[cls_num_per_lane-1-k]/288))-1)cv2.circle(vis,ppp,4,(0,0,255),-1)
Image.fromarray(vis).show()

最后检测结果如下:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/ISoY0cWW.shtml

相关文章

高级车道线检测

基于图像处理相关技术的高级车道线检测&#xff08;可适用于弯道&#xff0c;车道线颜色不固定&#xff0c;路面阴影&#xff0c;亮光&#xff09; pipeline&#xff1a; 1.校准摄像头的畸变&#xff0c;使拍摄照片能够较完整的反映3D世界的情况 2.对每一帧图片做透视转换(pers…

传统方法车道线标注及相关知识

目录 一、图像二值化处理 1.Sobel算子绝对值 2.Sobel算子 3.倾斜角度 4.HLS颜色空间 5.二值图结合 二、车道线分割 1.仿射变换 2.车道线直方图 3.滑动窗口寻找车道线 4.车道线拟合 5.车道线区域标注 一、图像二值化处理 主要目的是通过二值化图像&#xff0c;使得车…

学习笔记之车道线相关记录

一. 车道线相关的知识 &&1.标线的分类 以下分类来自于百科&#xff1a; 按照道路交通标线的功能划分为&#xff1a;指示标线、警告标线和禁止标线。 按标划方法可分为&#xff1a;白色虚线、白色实线、黄色虚线、黄色实线、双白虚线、双白实线、双黄虚线和双黄实线…

关于python 最简单封装实例

一、 #定义一个类 class Person: #init是定义类实例初始化函数 ,没有返回return def __init__(self,name,area): self.name name self.area area #类里面定义方法 def run(self): print(self.name) …

Python软件封装打包

作者&#xff1a;Naples 链接&#xff1a;https://www.zhihu.com/question/32703639/answer/165326590 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 Python Tkinter打包封装的方法有&#xff1a;PyInstaller, py…

Python封装、继承和多态

Python 语言在设计之初&#xff0c;就定位为一门面向对象的编程语言&#xff0c;“Python 中一切皆对象”。同时&#xff0c;Python 也支持面向对象的三大特征&#xff1a;封装、继承和多态。 一、封装 封装&#xff08;Encapsulation&#xff09;&#xff0c;即在设计类时&am…

python程序封装

python程序封装1 报错请执行pip install --upgrade setuptools 和 pip install --upgrade wheel 步骤如下&#xff1a; &#xff08;1&#xff09;安装pyinstaller&#xff0c;可以直接在cmd命令行中&#xff0c;输入命令“pip install pyinstaller”&#xff0c;安装pyinsta…

python封装程序

#终端/cmd命令下&#xff1a; 1.安装python Welcome to Python.org 2.安装pip pip PyPI 下载get-pip.py 在cmd窗口下执行&#xff0c;python */*/get-pip.py&#xff08;*为文件所在位置&#xff09; *如果安装好后出现 不是内部命令的情况 需要在环境中添加&#xff…

制作python包,封装成可用模块

制作python包&#xff0c;封装成可用模块 首先编写py程序: printtest.py #coding: utf-8 def test():print(print test)if __name__ __main__:test() 将以上.py文件做成python模块&#xff0c;需要在相同目录下创建setup.py文件&#xff0c;setup.py中输入配置信息: #cod…

Python 程序封装-打包成exe程序

Python 程序封装-打包成exe程序 前言一、 Python 打包工具—Pyinstaller二、打包具体过程1. 打包成仅包含一个独立的exe程序2. 打包成包含文件夹的程序&#xff0c;内有相关的依赖库&#xff08;推荐&#xff09;3. 其他的打包命令 三、注意事项 欢迎学习交流&#xff01; 邮箱…

怎么python程序封装?此文详解

python程序封装1 步骤如下: (1)安装pyinstaller,可以直接在cmd命令行中,输入命令“pip install pyinstaller”,安装pyinstaller (2)进入py代码的保存目录,这里py代码放在“E:\python学习\python_work” (3)cmd,输入命令:e:,进入e盘 (4)继续输入:E:\pytho…

Python封装

在用新电脑做python的封装的时候&#xff0c;出现了一系列的问题。在这里简单写一下Python的封装的一些流程以及可能出现的问题和解决方法吧。 封装我选择的是pyinstaller 首先是安装pyinstaller&#xff1a;Python 默认并不包含 PyInstaller 模块&#xff0c;因此需要自行安…

python之类的封装

博主简介&#xff1a;原互联网大厂tencent员工&#xff0c;网安巨头Venustech员工&#xff0c;阿里云开发社区专家博主&#xff0c;微信公众号java基础笔记优质创作者&#xff0c;csdn优质创作博主&#xff0c;创业者&#xff0c;知识共享者,欢迎关注&#xff0c;点赞&#xff…

Python入门——函数封装

当工程量比较大时&#xff0c;我们可以采取“函数封装”的方法实现函数的重复使用&#xff0c;避免“重复造轮子”。 步骤 手动创建一个包&#xff0c;只需进行以下 2 步操作&#xff1a; 新建一个文件夹&#xff0c;文件夹的名称就是新建包的包名&#xff1b;在该文件夹中&…

Python学习基础笔记五十八——封装

封装&#xff1a;广义上的面向对象封装。代码的保护。面向对象的思想本身就是一种封装&#xff0c;只让自己的对象能调用自己类中的方法。 狭义的封装概念&#xff1a;面向对象的三大特性之一&#xff1a;让属性和方法都藏起来&#xff0c;不让你看见。 例1&#xff1a; clas…

Python必备封装基本代码~Python函数

大家好&#xff0c;我是辣条 最近不少粉丝通过文末找到辣条让我分享一些代码封装这一块的内容&#xff0c;今天他来了~ 一遍看不懂就收起来慢慢看&#xff0c;我写的还是很详细的&#xff0c;一定是能轻松拿捏住Python函数的&#xff0c;不过还请记得多多支持辣条&#xff0c;…

PMP学习笔记顺口溜

区分几种组织结构 老板项目为系统&#xff1b; 只有职能为职能&#xff1b; 多个部门多部门&#xff0c; 多个项目为项目 职能项目为矩阵&#xff0c;项强为强&#xff0c;项弱为弱&#xff1b; 项目职能一般大 &#xff1a;平衡 网络分散为虚拟

PMP学习笔记 零 启动

PMP 学习笔记 零 启动 我为什么要学习PMP 我是一个程序猿&#xff0c;别人让我做什么&#xff0c;我就去做什么&#xff0c;提出什么需求我就完成&#xff0c;但是渐渐的我不满足成为一个工具人&#xff0c;就开始也开始设计功能&#xff0c;和抛开产品经理独自完成一些需求&…

我的PMP学习考试心得

01看书学习是基础&#xff0c;但更需要深化理解 备考期间&#xff0c;我通读了PMBOK&#xff0c;认真观看了视频教程和小红书&#xff0c;按照班主任的要求循序渐进&#xff0c;慢慢掌握了基本的知识点。因为缺少基础&#xff0c;所以只能通过反复记忆&#xff0c;特别是利用每…

PMP学习群沙龙+抽奖活动

3月考试临近&#xff0c;学员们都在积极备考。 老师们当然也不会闲着。 这不&#xff0c;就给大家带来福利了。 针对我们的PMP学习群的福利活动即将上线。 进群填写信息即可获得抽奖机会一个&#xff0c;邀请进群一人再赠送一个抽奖机会。 百分百中奖 奖品&#xff1a; 超…