作者:PRATEEK JOSHI

翻译:张若楠

校对:吴金笛

本文长度为2600字,建议阅读10分钟

本文为一个从图像预处理角度入手的无人驾驶车道识别实战项目。

作者序

大约十年前,我瞥见了第一辆自动驾驶汽车,当时Google仍在对初代无人车进行测试,而我立刻被这个想法吸引了。诚然,在将这些概念开源给社区之前,我必须等待一段时间,但是这些等待是值得的。

我最近尝试了一些与计算机视觉有关的自动驾驶理念,其中包括车道检测。设想一下,在设计任何自动驾驶汽车时,车道检测都是一个非常核心的技术。我们将基于这段视频搭建车道检测系统:https://youtu.be/sYhZbhT-Smw。很酷对吧?我将使用OpenCV库,通过计算机视觉,引导你进入车道检测和自动驾驶这一领域。当然,在本教程中我们还将讲解Python代码。

对于任何深度学习或计算机视觉新手,请注意--如果你要入门,请查看以下课程及产品。这些资源可以很好的助力你开始计算机视觉之旅:

  • 深度学习基础

https://courses.analyticsvidhya.com/courses/fundamentals-of-deep-learning

  • 使用深度学习的计算机视觉

https://courses.analyticsvidhya.com/courses/computer-vision-using-deep-learning-version2

目录

1. 了解车道检测的概念

2. 问题陈述

3. 什么是帧蒙版(Frame Mask)?

4. 用于车道检测的图像预处理

5. 在Python中使用OpenCV进行车道检测实战

车道检测的概念

那么什么是车道检测?维基百科是这样定义车道的:“车道是道路(行车道)的一部分,专门用于单行车辆,以控制和引导驾驶员并减少交通冲突。”

Figure 1:https://en.wikipedia.org/wiki/Lane

对此进行正式定义很重要,因为它使我们能够在项目中使用固定的车道定义,这样在构建系统时我们不会产生任何歧义。

如我之前提到的,车道检测是自动驾驶的重要组成部分。它是推动场景理解的最重要的研究主题之一。一旦获得车道位置,车辆将知道要去哪里,并避免驶入其他车道或离开道路的风险。这可以防止驾驶员/驾驶系统偏离行车轨道。

以下是一些随机道路图像(第一行)及其检测到的车道(第二行):

Figure 2 https://github.com/qinnzou/Robust-Lane-Detection

问题陈述

我们希望执行的任务是视频中的实时车道检测。我们可以通过多种方式做车道检测。可以使用样本训练的方法,例如在带有标注的视频数据集上训练深度学习模型,或者使用预先训练好的模型。

但是,也有更简单的方法来执行车道检测。在本文中,我将向你展示如何在不使用任何深度学习模型的情况下做到这一点。我们将在Python中用到广受欢迎的OpenCV库。

以下是我们将要处理的视频中的一帧:

如图片中所示,我们有四条用白色车道标记隔开的车道。因此要检测一条车道,我们必须检测到该车道两侧的白色标记。这就引出了关键问题 -- 我们如何检测车道标记线?

除了车道线外,场景中还有很多其他对象。道路上有车辆,路旁的障碍物,路灯等。在视频中,每一帧的场景都在变化。这很好地反映了现实生活中的驾驶情况。因此,在解决车道检测问题之前,我们必须找到一种方法来忽略驾驶场景中的无关物体。我们可以直接上手的一件事就是缩小关注范围。相较于使用整个帧,我们只使用画面中的一部分。在下图中,除车道标记外,其他所有内容都隐藏在该帧中。随着车辆的移动,车道标记只会在该区域出现得更多或更少。

在下一节,我将向你展示如何编辑视频的边框以选择特定区域。此外你还将了解一些必要的图像预处理操作。

什么是蒙版(Frame Mask)?

在这里,蒙版不过是一个NumPy数组。当我们想对图像应用遮罩时,我们只需将图像中所需区域的像素值更改为0或255,或任何其他数字。下面给出的是图像遮罩的示例。图像中某个区域的像素值已设置为0:

这是一种非常简单但有效的方法,可以从图像中删除不需要的区域和对象。

车道检测的图像预处理

我们将首先对输入视频中的所有帧应用蒙版。然后,我们将应用图像阈值处理,然后进行霍夫线变换来检测车道标记。

图像阈值处理

在该方法中,我们基于一个阈值,将灰度图像的像素值分配为黑色或者白色。如果像素的值大于阈值,则为其分配一个值(黑色或白色),否则为另一个颜色。

如你在上方所见,在对蒙版图像应用阈值设置后,我们在输出的图像中只留下了车道标记。现在,我们可以借助霍夫线变换轻松地检测到这些标记。

霍夫线变换

霍夫变换是一种检测可以数学表示的形状的技术。

例如,它可以检测矩形,圆形,三角形或直线等形状。而我们关注的对象是可以表示为线的车道标记。我非常建议你查阅霍夫变换的资料:

https://opencvpythontutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_houghlines/py_houghlines.html

在执行图像阈值处理后,在图像上应用霍夫线变换,我们将得到以下的输出图像:

我们需要针对所有帧执行此过程,然后将生成的帧拼接到新视频中。

在Python中使用OpenCV实现车道检测

现在该用Python实现这个车道检测项目了!我建议使用Google Colab,因为构建车道检测系统将需要很大计算力。

首先,导入所需的库:

import os
import re
import cv2
import numpy as np
from tqdm import tqdm_notebook
import matplotlib.pyplot as plt

读取视频帧

我已经从该YouTube视频中采样了一些视频帧。您可以从此链接下载。

https://drive.google.com/file/d/1e4cc4zFFna3Owyym6aq7ZXoquHA2l95O/view

# get file names of frames
col_frames = os.listdir('frames/')
col_frames.sort(key=lambda f: int(re.sub('\D', '', f)))# load frames
col_images=[]

让我们绘制其中一帧:

# specify frame index
idx = 457# plot frame
plt.figure(figsize=(10,10))
plt.imshow(col_images[idx][:,:,0], cmap= "gray")

创建帧蒙版

我们感兴趣的区域是多边形。我们要掩盖除此区域以外的所有内容。因此,我们首先必须指定多边形的坐标,然后使用它来准备蒙版:

# create a zero array
stencil = np.zeros_like(col_images[idx][:,:,0])# specify coordinates of the polygon
polygon = np.array([[50,270], [220,160], [360,160], [480,270]])# fill polygon with ones
cv2.fillConvexPoly(stencil, polygon, 1)# plot polygon
plt.figure(figsize=(10,10))
plt.imshow(stencil, cmap= "gray")
plt.show()

# apply polygon as a mask on the frame
img = cv2.bitwise_and(col_images[idx][:,:,0], col_images[idx][:,:,0], mask=stencil)# plot masked frame
plt.figure(figsize=(10,10))
plt.imshow(img, cmap= "gray")
plt.show()

图像预处理

我们必须对视频帧执行几个图像预处理操作,以检测所需的车道。预处理操作为:

1. 图像阈值处理

2. 霍夫线变换

1.图像阈值处理

# apply image thresholding
ret, thresh = cv2.threshold(img, 130, 145, cv2.THRESH_BINARY)# plot image
plt.figure(figsize=(10,10))
plt.imshow(thresh, cmap= "gray")
plt.show()

2. 霍夫线变换

lines = cv2.HoughLinesP(thresh, 1, np.pi/180, 30, maxLineGap=200)# create a copy of the original frame
dmy = col_images[idx][:,:,0].copy()# draw Hough lines
for line in lines:x1, y1, x2, y2 = line[0]cv2.line(dmy, (x1, y1), (x2, y2), (255, 0, 0), 3)# plot frame
plt.figure(figsize=(10,10))
plt.imshow(dmy, cmap= "gray")
plt.show()

现在,我们将所有这些操作应用于每个帧。我们还将结果帧保存在新目录中:

cnt = 0for img in tqdm_notebook(col_images):# apply frame maskmasked = cv2.bitwise_and(img[:,:,0], img[:,:,0], mask=stencil)# apply image thresholdingret, thresh = cv2.threshold(masked, 130, 145, cv2.THRESH_BINARY)# apply Hough Line Transformationlines = cv2.HoughLinesP(thresh, 1, np.pi/180, 30, maxLineGap=200)dmy = img.copy()# Plot detected linestry:for line in lines:x1, y1, x2, y2 = line[0]cv2.line(dmy, (x1, y1), (x2, y2), (255, 0, 0), 3)cv2.imwrite('detected/'+str(cnt)+'.png',dmy)except TypeError: cv2.imwrite('detected/'+str(cnt)+'.png',img)cnt+= 1

视频预处理

# input frames path
pathIn= 'detected/'# output path to save the video
pathOut = 'roads_v2.mp4'# specify frames per second
fps = 30.0from os.path import isfile, join# get file names of the frames
files = [f for f in os.listdir(pathIn) if isfile(join(pathIn, f))]
files.sort(key=lambda f: int(re.sub('\D', '', f)))

接下来,我们将所有包含检测到的车道的帧放入列表中:

frame_list = []for i in tqdm_notebook(range(len(files))):filename=pathIn + files[i]#reading each filesimg = cv2.imread(filename)height, width, layers = img.shapesize = (width,height)#inserting the frames into an image arrayframe_list.append(img)

最后,我们现在可以使用以下代码将帧组合成视频:

# write the video
out = cv2.VideoWriter(pathOut,cv2.VideoWriter_fourcc(*'DIVX'), fps, size)for i in range(len(frame_array)):# writing to a image arrayout.write(frame_array[i])out.release()

搞定!这就是你的Python车道检测系统。

总结

在本教程中,我们介绍了一种简单的车道检测技术。我们没有使用任何模型或复杂的图像功能。相反,我们的解决方案仅基于某些图像预处理操作。

但是,在许多情况下,此解决方案将不起作用。例如,当没有车道标记或道路上的交通过多时,该系统将发生故障。在车道检测中有更复杂的方法可以克服此类问题。如果你对自动驾驶汽车的概念感兴趣,我希望你继续探索这个话题。

原文标题:

Hands-On Tutorial on Real-Time Lane Detection using OpenCV (Self-Driving Car Project!)

原文链接:

https://www.analyticsvidhya.com/blog/2020/05/tutorial-real-time-lane-detection-opencv/

编辑:于腾凯

校对:吕艳芹

译者简介

张若楠,UIUC统计研究生毕业,南加州传媒行业data scientist。曾实习于国内外商业银行,互联网,零售行业以及食品公司,喜欢接触不同领域的数据分析与应用案例,对数据科学产品研发有很大热情。

翻译组招募信息

工作内容:需要一颗细致的心,将选取好的外文文章翻译成流畅的中文。如果你是数据科学/统计学/计算机类的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友欢迎加入翻译小组。

你能得到:定期的翻译培训提高志愿者的翻译水平,提高对于数据科学前沿的认知,海外的朋友可以和国内技术应用发展保持联系,THU数据派产学研的背景为志愿者带来好的发展机遇。

其他福利:来自于名企的数据科学工作者,北大清华以及海外等名校学生他们都将成为你在翻译小组的伙伴。

点击文末“阅读原文”加入数据派团队~

转载须知

如需转载,请在开篇显著位置注明作者和出处(转自:数据派ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。

点击“阅读原文”拥抱组织

独家 | 无人驾驶项目实战: 使用OpenCV进行实时车道检测相关推荐

  1. python获取数组中大于某一阈值的那些索引值_使用Python+OpenCV进行实时车道检测...

    大约十年前,当谷歌还在试验一辆原型车的时候,我想到了自己的第一辆自动驾驶汽车,当时我立刻被这个想法迷住了.不可否认的是,我必须等待一段时间,直到这些概念向社区开放,现在看来等待确实是值得的!我最近试验 ...

  2. 使用Python+OpenCV进行实时车道检测

    大约十年前,当谷歌还在试验一辆原型车的时候,我想到了自己的第一辆自动驾驶汽车,当时我立刻被这个想法迷住了.不可否认的是,我必须等待一段时间,直到这些概念向社区开放,现在看来等待确实是值得的! 我最近试 ...

  3. 使用OpenCV进行实时车道检测

    作者|ABHISHEK SHARMA 编译|VK 来源|Analytics Vidhya 大约十年前,当谷歌的人还在试验一辆原型车时,我预见了自己的第一辆自动驾驶汽车.当时我立刻被这个想法迷住了.不可 ...

  4. Python基于OpenCV的实时疲劳检测[源码&演示视频&部署教程]

    1.图片演示 2.视频演示 [项目分享]Python基于OpenCV的实时疲劳检测[源码&演示视频&部署教程]_哔哩哔哩_bilibili 3.检测方法 1)方法 与用于计算眨眼的传统 ...

  5. 基于OpenCV的实时车道线分割&车道保持系统(源码&教程)

    1.研究背景 汽车主动安全系统能够实现风险的主动预防和规避,其能有力缓解当前我国汽车交通事故频发的困境,故对其的相关研究得到了国家的大力支持. 车道保持辅助系统(LKAS,Lane Keeping A ...

  6. 【单目3D目标检测】项目实战-道路车辆/行人3D目标检测

    [单目3D目标检测]项目实战-道路车辆/行人3D目标检测 任务定义 传统激光雷达3D检测模型 VS 单目3D检测模型 单目3D目标检测优点 单目3D目标检测难点 数据集 KITTI数据集标注及网络输出 ...

  7. 自动驾驶中实时车道检测和警报

    作者 | 小白 来源 | 小白学视觉 未来十年,自动驾驶将彻底改变人们的出行方式. 目前,自动驾驶应用程序目前正在测试各种案例,包括客车.机器人出租车自.动商业运输卡车.智能叉车以及用于农业的自动拖拉 ...

  8. 实时车道检测--A Novel Vision-Based Framework for Real-Time Lane Detection and Tracking

    A Novel Vision-Based Framework for Real-Time Lane Detection and Tracking SAE Technical Paper 2019-01 ...

  9. 实战:使用 PyTorch 和 OpenCV 实现实时目标检测系统

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 一.引言 自动驾驶汽车可能仍然难以理解人类和垃圾桶之间的区别,但这 ...

最新文章

  1. 定义——设计思维之聚焦问题
  2. python怎么连接socket_python socket连接实现即时通讯
  3. Javascript闭包与作用域
  4. 清明梦超能力者黄YY、异或树(线段树合并)
  5. java中一个线程最小优先数_Java线程的优先级
  6. 产品经理如何培养气场
  7. CVPR 2021 | 超越卷积的自注意力模型,谷歌、UC伯克利提出HaloNet
  8. 全球链界科技发展大会_科技界女性占五席
  9. 利用课间10分钟,打造一个恶劣天气实时预警系统
  10. hdu 1003 Max Sum 简单动态规划
  11. 2020年开发者大会资料和武大定量遥感视频分享(部分)
  12. 基于MC1496乘法器的AM信号调制
  13. 中小型企业网络IP地址规划案例-1
  14. 通过串口控制LED的亮灭
  15. 黑马程序员——多态和抽象类的相关知识
  16. 全国大学生数学建模竞赛(赛题选择)
  17. 若x,y均定义为int型,z定义为double型,以下不合法的scanf函数调用语句是: A)scanf(“ %d%lx,%le“,x,y,z); B)scanf(“%2d * %d%lf“,
  18. 计算机应届毕业生怎么获得BATJ实习转正机会呢?
  19. 洛谷 P3460 [POI2007]TET-Tetris Attac
  20. EXTJS入门教程及其框架搭建

热门文章

  1. 如何php防止XSS攻击
  2. Keepalived双主模型中vrrp_script中权重改变故障排查
  3. nginx重点优化合集一
  4. Java NIO 之 ByteBuffer()
  5. SSL/TLS 协议详解
  6. HDU-1452 因子和 积性函数性质
  7. Google Map API 开发基础--01
  8. 著名IT公司名字来由
  9. mysql 是否有归档模式_查看oracle数据库是否归档和修改归档模式
  10. getcoo php_PHP简单实现DES加密解密的方法