亚马逊AWS官方博客

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

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

自动驾驶的视觉感知流程

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

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: AWS标准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 开源创新赛题第一名组长