深度学习机器视觉车道线识别与检测 -自动驾驶 计算机竞赛
文章目录
- 1 引言
-
2 成果展示
-
3 车道标记
-
4 问题建模阶段(建立模型)
-
5 帧掩码生成过程(Frame Mask)
-
6 车道检测的图像预处理技术
-
7 图像二值化处理
-
8 Hough线变换算法
-
9 实现车道检测技术
-
- 9.1 帧掩码生成过程设计
- 9.2 图像预处理技术应用
-
- 9.2.1 图像二值化处理方法
- 9.2.2 Hough线变换算法优化
- 9.1 帧掩码生成过程设计
-
最后
-
1 前言
🔥 优质竞赛项目系列,今天要分享的是
🚩 机器视觉 深度学习 车道线检测 - opencv
该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:3分
- 工作量:3分
- 创新点:4分
🧿 更多资料, 项目分享:
https://gitee.com/dancheng-senior/postgraduate
2 先上成果

3 车道线
理解车道检测的概念
那么什么是车道检测?以下是百度百科对车道的定义:
称为行车线、车行道的一种道路分隔线。它用于划分供车辆行驶的道路区域,在普通公路与高速公路均有设置。其中高速公路对车道的使用规定有明确的法律规定,在具体应用中通常分为行车道与加宽车道两类

对它的明确至关重要,因为它使我们能够继续进行车道检测概念。不容忽视的是,在构建系统时我们必须确保所有细节都清晰明确。
如前所述,在自动驾驶技术的发展过程中
以下是一些随机道路图像(第一行)及其检测到的车道(第二行):
4 问题抽象(建立模型)
我们旨在实现在线识别车道线的技术方案。现有多种技术途径可用于实现这一目标。其中一种方法是采用机器学习算法框架,在标注丰富的视频数据集上进行参数优化与模型训练;另一种方案则可借鉴现有的开源模型架构作为参考框架进行改进和优化。
尽管如此,在实际操作中还存在更为简便的方式来进行车道检测的任务。在此处,请注意观察,在线课程中老师将为你演示一种无需依赖复杂的深度学习模型也能轻松完成这一目标的具体方法。
下面是将要处理的视频的一个帧:
从这张图片中可以看出,
我们有四条车道被白色的线条分隔开。
为了检测车道的位置和方向,
必须识别这些白色线条。
这就提出了一个关键问题:如何准确地解析这些标线信息?
在道路场景中除了车道标线外,在视频画面的每一帧都能观察到多样的元素。道路上设置了各类车辆、路侧护栏及路灯等设施,在视频中每帧画面都有所变化。这一景象准确地模拟了真实的驾驶环境。
为此,在处理车道检测问题之前,我们必须找到一种有效的策略来避免关注那些在驾驶情境中不相关的事物。
我们能够完成的一项主要任务就是缩小关注范围。为了避免使用完整帧 选择仅提取帧片段是一种更优的选择。在下图中 仅标注车道线 而其余元素被遮挡处理。随着车辆移动 车道标线可能会部分位于该区域中:

5 帧掩码(Frame Mask)
帧掩码只是一个NumPy数组。
当我们要在图像上应用遮罩时,则需将指定区域的像素值设置为0、255或其他任意数值。
下面给出了一个图像掩蔽的例子。图像中某个区域的像素值已设置为0:

这是一种非常简单但有效的从图像中去除不需要的区域和对象的方法。
6 车道检测的图像预处理
我们将首先对输入视频中的所有帧应用掩码。
然后,我们将应用图像阈值化和霍夫线变换来检测车道标线。
7 图像阈值化
在该方法中,灰度图像的像素值通过设定阈值被确定为表示黑白的两个数值之一。也就是说,在这种情况下,在一个像素的数值超过预设阈值时会被设定为一个特定的数值;否则,则会被设定为另一个数值。

正如所述,在对蒙版图像施加阈值处理之后,我们仅提取至输出图像中的车道标线信息。目前我们能够利用霍夫线变换轻松识别这些标记位置。
8 霍夫线变换
霍夫线变换是一种检测任何可以用数学方法表示的形状的方法。
例如,在能识别多种形状方面具有显著能力的前提下
在执行图像阈值化后对图像应用霍夫线变换将提供以下输出:

9 实现车道检测
现在需要用Python开发一个车道检测项目!我强烈建议采用Google Colab平台,由于构建车道检测系统需要较高的计算能力。
首先导入所需的库:
import os
import re
import cv2
import numpy as np
from tqdm import tqdm_notebook
import matplotlib.pyplot as plt
# 获取帧的文件名
col_frames = os.listdir('frames/')
col_frames.sort(key=lambda f: int(re.sub('\D', '', f)))
# 加载帧
col_images=[]
for i in tqdm_notebook(col_frames):
img = cv2.imread('frames/'+i)
col_images.append(img)
# 指定一个索引
idx = 457
# plot frame
plt.figure(figsize=(10,10))
plt.imshow(col_images[idx][:,:,0], cmap= "gray")
plt.show()

9.1 帧掩码创建
关注的区域是一个多边形。我们需要隐藏除该区域之外的所有内容。为此,我们必须先确定多边形的具体坐标,并应用该坐标来生成帧掩码:


9.2 图像预处理
为了识别所需的道路车道线,我们需要对视频帧进行一系列必要的图像增强步骤。
图像阈值化
霍夫线变换
9.2.1 图像阈值化

9.2.2 霍夫线变换
lines = cv2.HoughLinesP(thresh, 1, np.pi/180, 30, maxLineGap=200)
# 创建原始帧的副本
dmy = col_images[idx][:,:,0].copy()
# 霍夫线
for line in lines:
x1, y1, x2, y2 = line[0]
cv2.line(dmy, (x1, y1), (x2, y2), (255, 0, 0), 3)
# 画出帧
plt.figure(figsize=(10,10))
plt.imshow(dmy, cmap= "gray")
plt.show()

最后
🧿 更多资料, 项目分享:
