您当前的位置:首页 > 电脑百科 > 人工智能

无人驾驶项目实战:使用OpenCV进行实时车道检测

时间:2020-07-08 10:31:19  来源:  作者:

作者: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进行车道检测实战

车道检测的概念

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

无人驾驶项目实战:使用OpenCV进行实时车道检测

 

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

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

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

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

无人驾驶项目实战:使用OpenCV进行实时车道检测

 

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

问题陈述

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

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

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

无人驾驶项目实战:使用OpenCV进行实时车道检测

 

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

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

无人驾驶项目实战:使用OpenCV进行实时车道检测

 

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

什么是蒙版(Frame Mask)?

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

无人驾驶项目实战:使用OpenCV进行实时车道检测

 

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

车道检测的图像预处理

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

图像阈值处理

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

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

霍夫线变换

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

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

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

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

无人驾驶项目实战:使用OpenCV进行实时车道检测

 

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

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

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

首先,导入所需的库:

import osimport reimport cv2import numpy as npfrom tqdm import tqdm_notebookimport matplotlib.pyplot as plt

读取视频帧

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

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

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

让我们绘制其中一帧:

 # specify frame indexidx = 457# plot frameplt.figure(figsize=(10,10))plt.imshow(col_images[idx][:,:,0], cmap= "gray")
无人驾驶项目实战:使用OpenCV进行实时车道检测

 

创建帧蒙版

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

# create a zero arraystencil = np.zeros_like(col_images[idx][:,:,0])# specify coordinates of the polygonpolygon = np.array([[50,270], [220,160], [360,160], [480,270]])# fill polygon with onescv2.fillConvexPoly(stencil, polygon, 1)# plot polygonplt.figure(figsize=(10,10))plt.imshow(stencil, cmap= "gray")plt.show()
无人驾驶项目实战:使用OpenCV进行实时车道检测

 

# Apply polygon as a mask on the frameimg = cv2.bitwise_and(col_images[idx][:,:,0], col_images[idx][:,:,0], mask=stencil)# plot masked frameplt.figure(figsize=(10,10))plt.imshow(img, cmap= "gray")plt.show()
无人驾驶项目实战:使用OpenCV进行实时车道检测

 

图像预处理

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

1. 图像阈值处理

2. 霍夫线变换

1.图像阈值处理

# get file names of framescol_frames = os.listdir('frames/')col_frames.sort(key=lambda f: int(re.sub('D', '', f)))# load framescol_images=[]
无人驾驶项目实战:使用OpenCV进行实时车道检测

 

2. 霍夫线变换

lines = cv2.HoughLinesP(thresh, 1, np.pi/180, 30, maxLineGap=200)# create a copy of the original framedmy = col_images[idx][:,:,0].copy()# draw Hough linesfor line in lines:  x1, y1, x2, y2 = line[0]  cv2.line(dmy, (x1, y1), (x2, y2), (255, 0, 0), 3)# plot frameplt.figure(figsize=(10,10))plt.imshow(dmy, cmap= "gray")plt.show()
无人驾驶项目实战:使用OpenCV进行实时车道检测

 

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

cnt = 0for img in tqdm_notebook(col_images):  # apply frame mask  masked = cv2.bitwise_and(img[:,:,0], img[:,:,0], mask=stencil)  # apply image thresholding  ret, thresh = cv2.threshold(masked, 130, 145, cv2.THRESH_BINARY)  # apply Hough Line Transformation  lines = cv2.HoughLinesP(thresh, 1, np.pi/180, 30, maxLineGap=200)  dmy = img.copy()  # Plot detected lines  try:    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 pathpathIn= 'detected/'# output path to save the videopathOut = 'roads_v2.mp4'# specify frames per secondfps = 30.0from os.path import isfile, join# get file names of the framesfiles = [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 files    img = cv2.imread(filename)    height, width, layers = img.shape    size = (width,height)    #inserting the frames into an image array    frame_list.append(img)

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

# write the videoout = cv2.VideoWriter(pathOut,cv2.VideoWriter_fourcc(*'DIVX'), fps, size)for i in range(len(frame_array)):    # writing to a image array    out.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/

编辑:于腾凯

校对:吕艳芹

译者简介

无人驾驶项目实战:使用OpenCV进行实时车道检测

 

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

 



Tags:无人驾驶   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
随着科技的发展自动驾驶一定是未来的主流驾驶方式,现在自动驾驶在汽车上已经应用了,比如特斯拉自动驾驶功能,但是房车上目前还没研发自动驾驶。其实德国Erwin Hymer Group在前...【详细内容】
2020-09-21  Tags: 无人驾驶  点击:(90)  评论:(0)  加入收藏
作者:PRATEEK JOSHI翻译:张若楠校对:吴金笛本文长度为2600字,建议阅读10分钟本文为一个从图像预处理角度入手的无人驾驶车道识别实战项目。作者序大约十年前,我瞥见了第一辆自动...【详细内容】
2020-07-08  Tags: 无人驾驶  点击:(77)  评论:(0)  加入收藏
据路透社报道,6月15日,霍尼韦尔公司表示,将启动无人驾驶航空系统业务,专注于无人机、空中出租车和无人货运飞机。无人驾驶航空系统业务部门负责人StéphaneFymat表示,到20...【详细内容】
2020-06-17  Tags: 无人驾驶  点击:(130)  评论:(0)  加入收藏
随着科技水平不断提高,汽车产业发展速度越来越快,除了燃油车之外,现在很多新能源车企都在不断兴起。并且随着技术发展,很多车企也开始尝试生产无人驾驶汽车。只是现在无人驾驶汽...【详细内容】
2020-06-14  Tags: 无人驾驶  点击:(81)  评论:(0)  加入收藏
傍晚,5G无人驾驶清扫车亮相南京夫子庙景区,吸引众多游客市民目光。5G无人驾驶清扫车是一款由是江苏智慧汽车研究院有限公司研发的低速无人驾驶产品,集激光雷达、摄像头、 超声...【详细内容】
2020-05-12  Tags: 无人驾驶  点击:(55)  评论:(0)  加入收藏
5月8日,“5G+无人驾驶车”体验项目在海南一家景区正式投入运营。这是海南首个商业化运营的无人驾驶项目,运用了5G、边缘计算、车路协同、无人驾驶、AR等大量前沿科技技术,使无...【详细内容】
2020-05-10  Tags: 无人驾驶  点击:(58)  评论:(0)  加入收藏
01,今年可是无人驾驶“元”年如无意外,今年内,我应该能通过手机APP叫上一台无人驾驶的出租车,游走在大街小巷之中。因为,按照计划,特斯拉已经在2019年完成自动驾驶的技术研发,并在...【详细内容】
2020-03-16  Tags: 无人驾驶  点击:(191)  评论:(0)  加入收藏
▌简易百科推荐
作为数据科学家或机器学习从业者,将可解释性集成到机器学习模型中可以帮助决策者和其他利益相关者有更多的可见性并可以让他们理解模型输出决策的解释。在本文中,我将介绍两个...【详细内容】
2021-12-17  deephub    Tags:AI   点击:(16)  评论:(0)  加入收藏
基于算法的业务或者说AI的应用在这几年发展得很快。但是,在实际应用的场景中,我们经常会遇到一些非常奇怪的偏差现象。例如,Facebook将黑人标记为灵长类动物、城市图像识别系统...【详细内容】
2021-11-08  数据学习DataLearner    Tags:机器学习   点击:(32)  评论:(0)  加入收藏
11月2日召开的世界顶尖科学家数字未来论坛上,2013年诺贝尔化学奖得主迈克尔·莱维特、2014年诺贝尔生理学或医学奖得主爱德华·莫索尔、2007年图灵奖得主约瑟夫·斯发斯基、1986年图灵奖得主约翰·霍普克罗夫特、2002...【详细内容】
2021-11-03  张淑贤  证券时报  Tags:人工智能   点击:(39)  评论:(0)  加入收藏
鉴于物联网设备广泛部署、5G快速无线技术闪亮登场,把计算、存储和分析放在靠近数据生成的地方来处理,让边缘计算有了用武之地。 边缘计算正在改变全球数百万个设备处理和传输...【详细内容】
2021-10-26    计算机世界  Tags:边缘计算   点击:(45)  评论:(0)  加入收藏
这是几位机器学习权威专家汇总的725个机器学习术语表,非常全面了,值得收藏! 英文术语 中文翻译 0-1 Loss Function 0-1损失函数 Accept-Reject Samplin...【详细内容】
2021-10-21  Python部落    Tags:机器学习   点击:(43)  评论:(0)  加入收藏
要开始为开源项目做贡献,有一些先决条件:1. 学习一门编程语言:由于在开源贡献中你需要编写代码才能参与开发,你需要学习任意一门编程语言。根据项目的需要,在后期学习另一种语言...【详细内容】
2021-10-20  TSINGSEE青犀视频    Tags:机器学习   点击:(37)  评论:(0)  加入收藏
SimpleAI.人工智能、机器学习、深度学习还是遥不可及?来这里看看吧~ 从基本的概念、原理、公式,到用生动形象的例子去理解,到动手做实验去感知,到著名案例的学习,到用所学来实现...【详细内容】
2021-10-19  憨昊昊    Tags:神经网络   点击:(47)  评论:(0)  加入收藏
语言是人类思维的基础,当计算机具备了处理自然语言的能力,才具有真正智能的想象。自然语言处理(Natural Language Processing, NLP)作为人工智能(Artificial Intelligence, AI)的核心技术之一,是用计算机来处理、理解以及运...【详细内容】
2021-10-11    36氪  Tags:NLP   点击:(49)  评论:(0)  加入收藏
边缘计算是什么?近年来,物联网设备数量呈线性增长趋势。根据艾瑞测算, 2020年,中国物联网设备的数量达74亿,预计2025年突破150亿个。同时,设备本身也变得越来越智能化,AI与互联网在...【详细内容】
2021-09-22  汉智兴科技    Tags:   点击:(54)  评论:(0)  加入收藏
说起人工智能,大家总把它和科幻电影中的机器人联系起来,而实际上这些科幻场景与现如今的人工智能没什么太大关系。人工智能确实跟人类大脑很相似,但它们的显著差异在于人工智能...【详细内容】
2021-09-17  异步社区    Tags:人工智能   点击:(57)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条