点击上方【凌云驭势 重塑未来】

一起共赴年度科技盛宴!

自动驾驶的视觉感知流程

在自动驾驶系统中,作为识别周边环境的“感官”角色,感知模块是整个系统安全、高效运行的基础,让汽车得以像人类一样看清周围的事物,并去分析和理解所处的世界,进而完成驾驶任务。现有的自动驾驶系统一般含有多种传感器来感受外界信息,其中包括:摄像头、激光雷达、毫米波雷达等。摄像头采集图像信息,经过后续的处理之后,可以得到富有语义信息的真实世界的信息。

Amazon DeepRacer 虚拟赛事和线下赛事已广受好评,但开发人员现在想要其汽车超越赛车联赛。Amazon DeepRacer 是一款基于 Ubuntu 的计算机轮式小车,该装置由我们可以对代码进行开源的机器人操作系统(ROS)提供支持,可以让拥有基本 Linux 编码技能的开发人员能够轻松对其汽车有意思的新用途进行原型开发。Amazon DeepRacer 设备软件现已公开可用,因此,任何拥有汽车和创意的人员均可让其设备的新用途成为现实。在本篇 blog 中,我们将介绍以摄像头为主要传感器的 DeepRacer 自动驾驶视觉感知系统。

Amazon DeepRacer open source

实现机制

Amazon DeepRacer 小车上有一个前置摄像头,可以得到小车前方道路上的信息。此外,小车的系统中也自带了摄像头的驱动,并内置 ROS 节点发出视频信息。在 ROS 系统中,订阅视频发布节点之后,就可以得到小车的摄像头信息,之后对其进行一定处理,就可以得到富含语义的信息。

图1 CV2 调用摄像头展示

DeepRacer 采用 ROS 系统,预装 deepracer-core, 对小车基本操作进行了完好的封装,我们可以使用这些节点或者服务完成对小车的控制。在 aws-deepracer-camera-pkg,原始图像信息会发布2个 topic: /camera_pkg/video_mjpeg 与 /camera_pkg/display_mjpeg。其中 /camera_pkg/video_mjpeg 用于本地的 fusion 与推理,/camera_pkg/display_mjpeg 用于 web console 显示实时图像。在 ROS1 (Ubuntu 16) 的环境中,topic name 是 /video_mjpeg。

图2 Camera node 的 topic, service 列表。

来源:https://github.com/aws-deepracer/aws-deepracer-camera-pkg

自定义车道线识别任务介绍

车道线识别任务是自动驾驶中非常重要的一个任务。小车完成对车道线的识别之后,就可以利用自身和车道线的相对位置信息完成各种任务,比如:车道偏离预警(LDW)、车道保持辅助(LKA)和自动变道辅助等。现实世界中的车道线识别是一个颇有挑战性的任务,需要解决各种环境影响的问题(比如车道线磨损、道路损坏、车辆遮挡等)。但在 Amazon DeepRacer 环境中,场地固定,光照环境也非常理想,所以极大降低了车道线识别的难度。

图3 Amazon 标准 DeepRacer 跑道示意图,黑色部分为跑道,绿色部分为周边环境。

本文中车道线识别的过程可以总结为以下流程图:

获取摄像头数据

和一般 CV2 的处理不同,这里使用 ROS 订阅服务来获取摄像头的信息。注意,在 ROS 传输中,视频帧是以 Image 格式发送的,但是 Opencv 不支持该格式的图片,所以我们需要用 Bridge 库将 Image 格式转换为 Opencv 支持的格式。

from cv_bridge import CvBridge
bridge = CvBridge()
image = bridge.imgmsg_to_cv2(ros_image, encoding="rgb")

左滑查看更多

为了缩减推理时间,还可以使用 Opencv 中 resize 函数,将图片压缩到160*120。

import cv2
image = cv2.resize(image, dsize=(160, 120))

左滑查看更多

透视变化

摄像头获取到的图像信息是将三维世界图像压缩到二维的图片中,这样得到的图像信息与实际世界的信息差距较大,最显著的变化就是两条平行的车道线在图片中会相交。若是用这样的信息直接做处理,必然会影响后续自动驾驶的判断。所以这里我们使用透视变换,来保留这样的信息。Opencv 中提供了 warpPerspective 函数,可以方便我们进行透视变换。这中间涉及的参数(M)在不同设备上会有一定的差异,需要自行调试。

M = cv2.getPerspectiveTransform(src_pt, dst_pt)
img_t = cv2.warpPerspective(img, M, (160, 120), cv2.INTER_LINEAR)

左滑查看更多

HSV 掩码

掩码处理一般需要将原始的 BGR 转换到 HSV 色域,Opencv 中也提供了对应函数方便我们完成这一操作。

img_hsv = cv2.cvtColor(img_t, cv2.COLOR_BGR2HSV)

完成色域转化之后,调试找到合适的阈值即可把视频帧中黄色的中线全部找到,并删去其余无用的信息。

lower_yellow = np.array([0, 76, 163])
upper_yellow = np.array([57, 255, 255])img_mask = cv2.inRange(img_hsv, lower_yellow, upper_yellow)

左滑查看更多

图形学处理

图片中总是有噪声的,经过上述处理后,在图片上还会残留有部分噪点,虽然说这个只占很小一部分,但对后续处理还是不利,所以这里还进行了一些图形学处理,极大程度地抑制了无关的噪点。

kernel_erode = np.ones((3, 3), dtype=np.uint8)
img_erode = cv2.erode(img_mask, kernel_erode)

左滑查看更多

计算方向,偏移量,

进行速度与转角速度下发

cx = int(M['m10']/M['m00']) # 计算质心
self.err = -cx+self.IMG_WIDTH/2 – 15 计算偏移量
self.ang = 0.026*self.err + 0.02 * (self.err-self.last_err) #根据现有偏移量与历史偏移量计算转角
self.ang = np.clip(self.ang, -0.9, 0.9) #裁剪
self.speed = 0.45-abs(self.ang)*0.06 #计算速度
self.speed = np.clip(self.speed, 0.385, 0.41) #裁剪
self.control.throttle = self.speed #线下运行调整
self.control.angle = self.ang + 0.25 #线下运行调整
self.pub.publish(self.control) #指令下发

左滑查看更多

结果与反思

经过上述处理之后,就可以检测到车道线,并实现小车自动巡线。在下一篇 blog 中,我们将讨论如何在 Amazon DeepRacer 自动巡线的过程中实现二维码识别与变道。

本篇作者

赵安蓓

亚马逊云科技解决方案架构师,负责基于亚马逊云科技云平台的解决方案咨询和设计,尤其在大数据分析与建模领域有着丰富的实践经验。

王熙杰

上海大学电子信息工程系在读学生,2022上海市大学生电子设计竞赛 Amazon DeepRacer 开源创新赛题第一名组长。

2022亚马逊云科技 re:Invent 全球大会

精彩视频现已上线!

基于 Amazon DeepRacer Opensource 实现自定义车道线识别任务相关推荐

  1. 基于视觉的车道线识别技术在智能车导航中的应用研究

    密级:公开 摘  要 摘  要 室外移动机器人的研究是机器人研究领域的重要分支,同时也是备受关注的热点领域.面向高速公路等结构化道路的室外移动机器人研究已成为现阶段民用交通运输领域移动机器人研究的主流 ...

  2. 基于边缘检测与Hough变换的车道线检测

    基于边缘检测与Hough变换的车道线检测 第一章:绪论 1.1 研究意义及背景 高速公路的通行里程是一个国家发展水平的重要标志之一.高速公路具有车辆通行能力大.交通事故少.经济效益高的特点,它的不断发 ...

  3. plotly基于dataframe数据绘制股票自定义K线图

    plotly基于dataframe数据绘制股票自定义K线图 #  绘制蜡烛图并自定义可视化形式: import plotly as py import plotly.graph_objs as go ...

  4. 【自动驾驶】杜明芳:基于多尺度IPM图的车道线检测实现

    摘要:针对无人车自然道路图像检测时遇到的实时性和精度相互制约矛盾,借鉴自校正自适应控制系统理论的思想,提出一种自校正闭环道路视觉检测器架构,并提出一种新型检测器实现算法--基于多尺度IPM图((Inv ...

  5. matlab点云中值滤波,基于车载激光雷达的车道线识别方法与流程

    本发明属于自动驾驶的模式识别领域,涉及激光雷达点云数据处理及识别方法. 背景技术: 车道线检测在智能车辆辅助安全系统中起着关键的作用,车道偏离警示系统在车道保持辅助系统以及车道换道辅助系统中有着广泛的 ...

  6. 自动驾驶入门(十二):基于Opencv的车道线识别

    车道线识别有两种方法: 基于Opencv的传统视觉车道线识别方案 基于深度学习的车道线识别方案 本文将介绍基于Opencv的传统视觉车道线识别方案. 传统的车道线识别解决方案流程图如下: 代码实现如下 ...

  7. 基于opencv的车道线识别(python)(极易实现)

    简易车道线识别方法 文章目录 简易车道线识别方法 1.先上效果图 1.1原图: 1.2结果图 2.源代码 3.阈值脚本 4.谈谈优缺点 优点: 缺点: 1.先上效果图 1.1原图: 1.2结果图 2. ...

  8. 总奖金64万!含吸烟打电话检测、车道线识别等,2020中国华录杯·数据湖算法大赛火热进行中!...

    ●赛题背景● 以"数据驱动创新,赋能智慧城市"为主题的2020中国华录杯·数据湖算法大赛,围绕"华录数据湖+智慧城市"的核心理念,着力于智慧城市业务中的真实应用 ...

  9. 吸烟打电话检测、车道线识别等,2020中国华录杯·数据湖算法大赛火热进行中!...

    ●赛题背景● 随着互联网的高速发展,"万物数据化"浪潮奔腾而来.数据湖围绕数据的全生命周期管理打造新一代数字基础设施,在硬件层面构筑了高性能.低成本.智能化.高安全的数字经济底座, ...

最新文章

  1. CMPB 2021|U-Net:又一魔改U-Net应用于腹部肝脏分割任务!
  2. Docker+geoserver发布shp地图服务
  3. java soap封装_Java SOAPMessage.writeTo方法代码示例
  4. opencv图像处理9-图像金字塔
  5. Nginx多种负载均衡策略搭建
  6. 被AI人机疯狂单杀?王者荣耀AI“绝悟”亲测体验
  7. Python实现普通二叉树
  8. Flutter Provider 异步通信、Provider状态管理
  9. Hadoop如何迎击大数据分析的挑战
  10. 时速云Kubernetes进阶培训 第三期
  11. 驴子圈资讯:携程移动端酒店预订首超PC端
  12. 红色警戒2rules.ini数值修改
  13. Java 1072 开学寄语
  14. 计算机科学与实践,【计算机科学与技术学院|实践实况】(一)
  15. livp后缀文件图片怎么打开,在电脑怎么打开live照片批量转换?
  16. 【Java开发】中国的公历转农历-工具类
  17. 产品DAU下降如何分析
  18. 基于PaddleHub的QQ聊天机器人
  19. zmq java 消息阻塞_ZMQ的三种消息模式
  20. 多个exe打包成一个exe安装程序,安装后可一键启动多个服务

热门文章

  1. 2021年权益基金投资策略报告(20210105).PDF
  2. Eggjs笔记:egg-mongo-native对mongodb的操作
  3. css实现右上角角标
  4. 概念---数学分析2:常用概念汇总(完备性,柯西序列等...)
  5. 求100以内的全部素数
  6. tensorflow添加自定义OP(GPU版本)
  7. macbook 上怎样截图,以及对截图进行编辑
  8. webRTC 实现人脸识别
  9. 计算机专业英语第六单元,计算机专业英语 (六)(示例代码)
  10. Java简单项目实例---统计部门员工的平均工资