华中科技大学人工智能与自动化学院 黎瑞
在2020年第二届华为云人工智能大赛•无人车挑战杯中,“华中科技大学无人车一队”借助华为云一站式AI开发与管理平台ModelArts及HiLens端云协同AI开发应用平台,进行无人车模型开发与部署,最终夺冠,获得20万奖励(10万现金+10万代金券)。战队撰文分享其参赛体验,包括无人车比赛的整体方案,多维数据处理及行驶控制的能力等。
1.比赛背景
第二届华为云无人车挑战杯大赛,相比第一届大赛,难度更大,赛道环境更加接近真实的道路。在比赛中,无人车需要从发车区出发,通过车道线循迹沿“8”字形赛道在不能压线和触碰挡板的条件下行走一周半后,准确地停入到停车区。在无人车行驶期间,需要完成交通信号灯识别、斑马线识别、机器人动态避障、挡板区循迹、限速/解限速标志识别、精准停车等任务。无人车不仅需要完美无误地完成所有的任务,在速度上也有要求,在总决赛中,无人车需要在70s内完成所有任务,时间加分项才能为满分。
在比赛中,华为云ModelArts一站式AI开发与管理平台,给参赛选手提供全流程的AI模型开发环境,助力参赛选手高效地完成检测任务中模型的训练,HiLens端云协同AI开发应用平台帮助参赛选手快速地完成模型在端侧设备上的部署和加速。华为云无人车挑战杯在由上海交大学生创新中心智能制造实验室自主研发的无人车的基础上,结合华为云人工智能平台,全面锻炼和提高赛队的AI解决方案能力及无人驾驶编程技巧。
图1-1 华中科技大学无人车一队的后浪
图1-2 华为云无人车挑战赛总决赛现场
2.整体方案
无人车比赛整体解决方案如图21所示,比赛主要分为三个部分,ModelArts做模型的在线训练,HiLens Kit做模型的部署,无人车上工控机通过ROS将各个节点整合到一起,做无人车底盘的决策和控制。通过华为云ModelArts一站式AI开发与管理平台完成数据标注、模型训练、模型转换等工作,得到可供HiLens Kit前向推理的卷积神经网络的模型。HiLens Kit通过自带的相机采集图像,通过技能部署进行模型的前向推理和加速,HiLens Kit搭载着高性能的华为人工智能芯片昇腾310,针对卷积神经网络进行了优化,在模型的前向推理过程中可发挥出强大的算力。HiLens Kit完成交通灯、限速/解限速标志识别、斑马线的目标检测识别,通过Socket通信,将检测结果传给无人车上的工控机。无人车上工控机处理激光雷达的点云数据,做Slam建图和运行中的实时定位,工控机处理USB摄像头的采集的车道线数据,做车道线的识别,再通过ROS将所有节点信息做整合,做底盘电机和舵机的决策控制。
图2-1 无人车比赛整体解决方案示意图
3.ModelArts模型训练
ModelArts是面向AI开发者的一站式开发平台,包含数据处理、模型训练、模型管理、模型部署等操作,并且提供AI市场功能,能够在市场内与其他开发者分享模型,其功能总览如图31所示。在比赛中,我们通过ModelArts平台完成了数据标注、模型训练和模型在线转换等工作,并且通过ModelArts做模型的线上部署,检验模型的精度效果。
图3-1 ModelArts一站式AI开发平台功能总览
3.1.任务分析
本次大赛涉及6类目标的检测识别:红灯、绿灯、黄灯、限速标识牌、解限速标识牌、斑马线,如图32所示。无人车在运行过程中,对目标采集的图像涉及不同的视角和距离,而且比赛场地光强未知,所以对于目标检测任务,要充分考虑到目标不同视角的刚体形变、不同距离的尺度变化、不同环境光强的变化以及无人车运行中的运动模糊。无人车根据检测的结果做出相应决策和控制,对目标检测的精度要求很高,一但误检或漏检,小车的控制就会出错,而且小车在赛道上快速运行,所以对目标检测的速度也要求较高,一旦小车看见目标,需要快速输出检测结果。
图3-2检测识别的6类目标
3.2.数据标注
数据标注采用ModelArts中的数据管理功能,进入ModelArts平台的数据标注模块,创建数据集,选择物体检测,添加标签集。既可以选择手动标注,也可以在手动标注一部分后选择智能标注,最终再修改确认智能标注。当数据集较大的时候,智能标注可以有效降低数据集标注的工作量。通过创建标注团队,将数据集分配给团队队员,团队合作加快数据集标注速度。
图3-3 ModelArts数据标注界面
3.3.数据增强
我们模型训练的数据集大部分来自HiLens Kit拍摄的不同环境下的视频序列,数据集中图像的重复比例较大,有必要将重复的图像做一些删除,对数据集做数据增强实现数据扩增,解决由于图像数据量较少带来的模型过拟合的问题。在比赛中,我们参考2018年的论文《Albumentations: fast and flexible image augmentations》开源的代码做数据集的扩充,开源代码网址:https://github.com/albumentations-team/albumentations。该项目对于数据的扩充采用颜色空间变换、模糊、亮度调整、黑白、压缩、随机噪声等30余种数据扩充办法。由于我们比赛中要识别的对象,颜色是很重要的一个特征,例如:红灯、黄灯、绿灯三种灯的颜色,限速标识的红色和解限速标识的黑色,颜色变化相关的数据扩充,会造成数据颜色特征的丢失。红灯、黄灯、绿灯三种灯分别在左、中、右三个位置,交通灯亮的位置,也是区分三种灯的很重要的特征。所以对数据集的扩充,去掉了色彩变换和水平翻转的数据扩充办法。数据扩充采用扩充方法级联的方式,如图34所示,更大程度上,减小数据之间的相似性,增加图像数据的多样性,数据增强的效果如图35所示。
图3-4 数据扩充方法级联方式
图3-5 图像数据增强效果展示
3.4.模型训练
通过数据增强,减小了数据之间的相似性,增加了数据多样性,最终选用了6031张图像数据做模型训练。模型训练我们选用的是华为云AI市场里面基于TensorFlow框架的YOLOv3_Darknet53的网络。在训练时,采用COCO数据集上的预训练模型,训练完后,通过模型转换功能将TensorFlow的PB模型转换成Ascend类型,以支持在HiLens Kit的Ascend 310 AI芯片上做模型推理。
YOLOv3是典型的一阶段的目标检测网络,图像输入为416*416条件下,COCO数据集上测试的mAP的分数为31.0,模型转换后在Ascend-310推理速度:17.8ms/pic,是目前速度和精度最为均衡的目标检测网络之一,其网络结构如图36所示。
图3-6 YOLOv3_Darknet53网络结构图(摘自网络)
YOLOv3采用Darknet53作为backbone,Darknet53大量使用类似于ResNet的残差跳层连接,从而可以加深网络的深度,特征提取可以提取出更高层的语义特征,并且为了降低池化带来的梯度负面效果,作者直接摒弃了pooling,用conv的stride来实现降采样,在这个网络结构中,使用的是步长为2的卷积来进行降采样。YOLO v3中采用类似FPN的上采样和特征融合的做法,在多尺度的特征图上做检测,大大加强了对小目标检测的精确度。YOLOv3采用固定anchor对目标的位置做预测,图36中输出的y1、y2、y3分别对应着32倍、16倍和8倍图像采样结果,32倍降采样的感受野最大,适合检测大的目标,所以在输入为416×416时,每个cell的三个anchor box为(116 , 90)、 (156 , 198)、 (373 , 326)。16倍适合一般大小的物体,anchor box为(30 , 61)、(62 , 45)、 (59 , 119)。8倍的感受野最小,适合检测小目标,因此anchor box为(10 , 13)、(16 , 30)、(33 , 23)。
y1、y2、y3中每个cell回归边界框预测4个坐标,tx , ty , tw ,th。如果目标cell距离图像左上角的距离是(cx ,cy),且它对应边界框的宽和高为pw , ph ,如图37所示,那么网络的预测值为:
图3-7 Bounding boxes回归方式
在ModelArts中做模型训练和调优参数相关设置如图38所示,使用ModelArts中可视化工具做训练过程可视化结果如图39所示。模型训练完成后,通过在线的模型转换工具,转换为.om的模型,以供在HiLens Kit上做推理。
图3-8 ModelArts模型训练调优参数设置
图3-9 训练过程可视化结果
4.HiLens技能开发和模型部署
华为HiLens为端云协同多模态AI开发应用平台,提供简单易用的开发框架、开箱即用的开发环境、丰富的AI技能市场和云上管理平台。HiLens Framework封装了丰富的视频分析算法基础组件,如图像预处理、模型推理等,开发者只需少量代码即可开发自己的技能。HiLens Studio提供在线的开发环境,可以方便的在线编写和调试技能代码。管理控制台提供模型管理、技能开发等功能,供用户在云侧管理模型和技能,一键安装技能到端侧设备。在比赛中,我们使用HiLens Kit端侧设备做模型推理,线上开发好的技能可以一键部署到HiLens Kit上。
图4-1 华为HiLens端云协同AI开发应用平台
4.1.检测任务的Skill开发
如图42所示在本次无人车比赛中,我们团队开发了3个Skill,get_pic是用HiLens Kit采集图像数据并通过socket通信传给主机,做数据集采集使用;yolo-v3-v1-test是用来在测试模型的精度效果,不加与工控机通信代码;uac-yolov3-v1是在无人车实际行驶时的技能,在比赛中采集图像进行模型推理并与工控机通信。
图4-2 华为云HiLens技能列表
在做检测任务的技能开发,我们首先利用HiLens Studio的开发环境和HiLens Framework,在线做模型前向推理的测试,HiLens Studio开发环境如图44所示,代码流程如图43所示,先初始化HiLens、摄像头和加载模型,接着进入循环,读取摄像头采集的图像,做数据预处理,HiLens读取摄像头的图像为YUV格式,需要转为RGB格式,以及将图像resize为(416,416),以便做模型推理。模型推理通过调用HiLens Framework封装好的API,做模型前向推理的计算。由于Ascend310不支持模型后处理的计算,所以这一部分需要通过软件来做,后处理主要包括,从模型输出的特征矩阵中解码出检测框的位置、类别、置信度等信息、NMS筛选检测框等,最后输出结果。在结果后处理阶段,我们也加入了一些小技巧,以提高检测任务的准确率:
·对于6类目标我们分别采用不同的置信度阈值做筛选,交通灯和斑马线需要在较远的距离就识别到,置信度阈值我们设置为0.5,而限速/解限速,为确保检测正确性,置信度设置为0.9。
·对于红绿灯和限速/解限速,通过计算目标框中图像的红色分量值,来纠正检测的错误,例如,当检测到红灯,必须红色分量值大于0.15,才认为正确,否则视为错误。对于检测到绿灯或黄灯,必须红色分量小于0.1,才认为正确。
·同理,对于斑马线的检测,将目标框图像二值化,白色像素占比大于0.3,才认为检测正确。
最终,我们在HiLens Studio对决赛现场的图像做测试,测试了700张图像,只有23张图像检测错误,目标漏检的也很少,而且都是在角度很偏的时候,漏检率在5%以内。
在HiLens Studio技能代码做完了测试之后,在“技能管理”里面,创建一个新的技能,导入在HiLens Studio里面的代码,加入与工控机通信的部分,就完成了检测任务加上通信的技能开发,然后将技能在线安装到端侧设备HiLens Kit上。下一次HiLens Kit启动后,就会自动启动技能。
图4-3 检测任务技能运行流程
图4-4 HiLens studio界面展示
4.2.HiLens的通信
在无人车比赛中,HiLens Kit通过网口采用Socket通信与工控机或PC机进行通信,Socket网络通信框架如图45所示,Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。Socket通信分为基于TCP和基于UDP两种。TCP协议是基于连接的协议,需要先建立可靠的连接,而UDP不需要事先建立可靠的连接,而是直接把数据包发送出去,是不稳定的连接。在图像数据集采集时,通过Socket通信传输视频数据,数据量大且不必要求每一个数据包都准确接收,我们采用Socket UDP通信,传输视频数据。在HiLens Kit做目标检测任务时,客户端数据少又需要稳定可靠的传输,所以我们采用基于TCP协议的Socket通信,基于TCP协议的Socket通信如图46所示。
图4-5 Socket网络通信框架
图4-6 Socket通信TCP通信过程
5.ROS无人车决策控制
无人车上由车上的工控机完成各项数据的处理和融合,进行无人车的决策控制。通过处理激光雷达的点云数据,做Slam建图和运行中的实时定位以及挡板区的循迹,处理USB摄像头的采集的车道线数据,做车道线的识别,通过Socket通信接收来自HiLens kit的目标检测的结果。如图51所示,无人车的控制方案主要包括:车道线循迹、挡板区循迹、斑马线停车及避障、限速和解限速、发车和停车、建图和定位,通过ROS整合各个节点的消息,将多种数据进行多模态融合,进行无人车控制状态机的切换,给驱动控制发送不同的速度和方向指令,驱动控制将速度和方向信息转为无人车底盘的电机速度和舵机打角指令,通过串口发送给无人车驱动,最终实现无人车完美高效地完成整个比赛任务。
图5-1 无人车控制方案
5.1.车道线识别
在本次比赛中,车道线的识别也是本次比赛的一个难点,无人车上USB camera的位置低、视角窄导致大部分时间只能看到单线,再加上工控机的性能较弱,对图像相关处理速度较慢。对于车道线识别,我们没有采用比赛方提供的例程,而是从实际驾车思路出发,想办法得到道路的中线,通过中线推算偏差。
车道线识别的流程如图52所示,首先将图像二值化,通过膨胀与腐蚀,将车道线线条的断裂给补上,小车在运行中,车道线总是会交于图像的左、右、下三条边,所以在这三条边上搜索车道线基本点,根据搜索到的基本点搜索线。由于摄像头固定,采用提前标定好的透视变换矩阵将图像变换到俯视图。由于在搜索车道线基本点可能会搜索到多个,例如图53搜索到3个基本点,从而会搜到多条边线,所以需要对边线进行筛选,提取车道线。将车道线做一次拟合,由于道路宽度固定,可以通过拟合的车道线计算出中线。根据中线的计算结果,即可求解偏差。在图像计算中,通过采用python的numpy矩阵操作代替大量python低速循环进行计算加速,精简计算流程,(640,480)的图像在工控机计算帧率平均可达到46fps。
图5-2 车道线识别基本流程
图5-3 车道线识别结果展示
5.2.激光雷达挡板区循迹与无人车定位
无人车上的激光雷达传感器可扫描到无人车周围360度的障碍物的信息,可以用来做挡板区的循迹和无人车的实时定位。雷达数据的可视化展示如图54(a)所示,雷达的点云数据组成了无人车行驶的车道,可采用和车道线相似的处理办法,搜索雷达右半部分0-75度的范围,拟合右边线,从而计算中线,求取偏差。具体处理过程可参考车道线处理方案,此处不再赘述。
图5-4 雷达数据可视化和搜线扫描方式
无人车Slam建图和定位的方案,现已经很成熟, GitHub、GitLab等开源平台也有很多非常棒的基于ROS的激光雷达Slam项目和定位方案,我们采用开源的rf2o将激光雷达数据转为里程计信息,通过AMCL做定位,采用Gmapping建图,ROS开源社区(http://wiki.ros.org)都有详细的介绍,此处不再赘述。
图5-5 无人车Slam建图和定位方案
5.3.多模态融合的无人车决策控制
在HiLen Kit部署的技能,尽管采用一些技巧提升了图像的识别准确率,但也并非百分百准确。无人车在行驶过程中,存在运动模糊、未知光源干扰、反光等问题,尽管制作数据集考虑了此类情况,但是还是会有影响。我们采用了数字滤波中常用的的窗口滤波来做图像信息的后端处理。
·采用长度为k的定长队列做为观察窗口
·选取k个元素中出现最多类别作为当前阶段预测类别
在小车行驶过程中,将ROS节点的各个信息,做多模态融合,实现无人车不同状态下切换,如图56所示,无人车完成起步、斑马线停车避障、挡板区循迹、限速/解限速、精准停车等任务。
图5-6 无人车不同状态下状态机的切换
6.联合使用ModelArts和HiLens体验
在此次华为云无人车大赛中,联合使用ModelArts和 HiLens,这全流程的解决方案对项目的完成提供了高质量的服务。ModelArts提供全流程的AI开发平台,数据管理、模型训练、在线部署,都方便高效;HiLens提供了端云协同的AI开发平台,大大降低了嵌入式平台开发门槛,实现模型高效快捷地端侧部署。我们在使用华为云的全栈式解决方案之前,也接触过一些其他的AI解决方案,但是无论是云还是端都没有华为云ModelArts和HiLens的联合使用便捷高效。其便捷高效主要体现在以下几个方面:
(1)数据管理平台支持数据上传、存储、标注、处理一体化服务;
(2)ModelArts提供了各种配置好的开发环境,支持各种深度学习框架的开发;
(3)ModelArts的AI市场提供了丰富的网络模型,提高开发者开发效率;
(4)ModelArts支持模型在线部署和测试,可提供网络接口供物联网设备实现云端协同;
(5)HiLens的HiLens Framework,丰富的API解决了驱动和图像接入问题,自带媒体数据处理库,支持各种自定义操作;
(6)HiLens Studio开发环境可在不需要硬件的条件下,做模型的测试和代码的调试;
(7)HiLens技能管理平台可对技能直接做在线的部署和切换,方便、快捷。
(8)HiLens的技能市场,提供了丰富的开发好的技能,开发者可以站在巨人的肩膀上做开发,提高开发效率。