近年来,自动驾驶一直是人工智能领域最热门的场景之一,可以落地到物流、共享出行、公共交通、环卫、港口码头、矿山开采、零售等众多领域。
在2019年华为云人工智能大赛·无人车挑战杯赛道中,来自上海交通大学的“SRC”战队,借助华为云一站式AI开发与管理平台ModelArts及HiLens端云协同AI开发应用平台,进行无人车模型开发与部署,最终夺冠。
2020年2月11日-12日,华为开发者大会2020(Cloud)将在深圳举办。会上,除了Keynote、技术论坛、展区、热门开源项目、创新大赛、Startup对接会等一系列丰富的活动,开发者还可以亲自参与Codelabs环节,动手体验 “零代码完成自动驾驶AI模型开发”、“自动驾驶场景海量数据的AI模型训练和部署”、“交互式开发调试自动驾驶AI模型代码”等内容,轻松get更多自动驾驶场景AI开发技能。
“SRC”战队撰文分享其参赛体验,包括无人车的图像识别,多维数据处理及行驶控制的能力等。
一、背景介绍
华为云人工智能大赛·无人车挑战杯总决赛主要赛点包括:实现交通灯识别、环岛行驶、U形弯道行驶、静态/动态障碍物避障,并准确识别停车位标示进行泊车。在总决赛中,小车不仅仅要完成所有的赛点,还要跑得快。在比赛规则中,还要一个时间加分项,若40s内跑完全程,则可以获得此项得分。
无人车挑战杯是在智能小车的基础上,结合华为云人工智能平台(华为云ModelArts一站式AI开发与管理平台、HiLens端云协同AI开发应用平台),全面锻炼和提高赛队的AI解决方案能力及无人驾驶编程技巧的赛事,比赛用车由上海交大学生创新中心智能制造实验室自主研发。
二、整体解决方案
在无人车比赛中,有着两个非常重要的传感器:相机及激光雷达。相机主要用于交通标志牌和交通信号灯的识别,激光雷达则用于避障及路径规划。在无人驾驶领域,相机和激光雷达的复合解决方案也逐渐成为了技术主流。激光雷达的点云数据流可以由工控机处理,这一部分的技术也比较成熟,github、gitlab等开源平台也有一些非常棒的基于ROS的激光slam项目,此文就不再赘述;对于涉及到深度学习的图像数据流的处理,传统工控机显得有些力不从心。首先模型部署流程比较复杂,模型推理需要安装必要的依赖库,这些库的配置在传统工控机上并不容易,尤其是具有arm架构的工控机;最重要的是对于无人驾驶这样的高速实时系统,模型推理的速度是最为关键的,HiLens针对神经网络进行了优化,在模型的推理上有着得天独厚的优势。
三、华为云ModelArts平台的使用
3.1 识别任务
交通信号灯的识别主要分为红灯、左转灯和右转灯的识别;交通标志牌主要分为P1、P2两个停车位的识别。本文使用华为云平台ModelArts进行模型训练。
3.2 网络框架
在选择深度学习框架时,尽管tensorflow和pytorch是目前学术界的两大主流,但caffe在工业设备上进行部署要更加方便,因此选择了caffe。ModelArts是华为云智能计算平台。目前,ModelArts notebook中提供了官方1.0版本的Caffe引擎,我们基于Caffe使用SSD算法开发交通信号灯和标志牌检测模型,并使用了ModelArts notebook自带的terminal来编译安装caffe-ssd。
3.3 模型处理流程
(1)下载OBS Browser,配置OBS桶,将原始采集数据上传至OBS桶内。
对象存储服务(Object Storage Service)是一款稳定、安全、高效、易用的云存储服务,具备标准Restful API接口,可存储任意数量和形式的非结构化数据
对象存储服务OBS配置说明文档:https://support.huaweicloud.com/obs/index.html
OBS控制台说明文档:https://support.huaweicloud.com/usermanual-obs/obs-usermanual-zh.pdf、
(2)在ModelArts中打开已经编译好caffe-ssd的notebook,使用支持OBS文件系统的华为自研的分布式训练加速架构MoXing文件操作来访问上传至OBS桶内的原始数据,并在notebook中做数据清洗及数据增强,并将处理好的数据返回至OBS桶。
如移动一个文件:mox.file.copy('s3://bucket_name/obs_file.txt','s3://bucket_name/obs_file_2.txt')
MoXing文件操作:
https://github.com/huaweicloud/ModelArts-Lab/blob/master/docs/moxing_api_doc/MoXing_API_File.md
(3)进入ModelArts平台的数据标注模块,创建数据集,选择物体检测,添加标签集。既可以选择手动标注,也可以在手动标注一部分后选择智能标注,最终再修改确认智能标注。当数据集较大的时候,智能标注可以有效降低数据集标注的工作量。最终发布数据集。目前已经支持标注团队进行合作标注。
(4)利用moxing文件系统访问OBS获取带有标签的数据集文件,划分训练集和测试集,修改标签文件labelmap_voc.prototxt,注意0默认是留给背景的,将数据集转换为caffe所需要的LMDB格式的数据集,并打包配置文件上传至OBS
(5)准备训练脚本,创建训练作业,在训练的过程中查看训练日志,观察是否存在异常。
(6)利用caffe-ssd下自带的模型推理文件进行模型推理,计算模型的准确率。
利用ModelArts的模型转换功能将.caffemodel转换至.om模型,需要注意的是需要将deploy.prototxt的输出type转化为HiLens上的昇腾支持的算子SSDDectectionOutput,即可部署至HiLens的设备上。
3.4 训练过程及初步结果
在使用ModelArts进行模型训练时,为探究数据集的合适大小,训练过程是否发生过拟合。团队试探性地采取了2929张图像利用SSD进行了训练,得到了初步的损失值变化和准确率变化。在ModelArts自带的jupyter notebook中进行模型推理,将训练日志log中推理的结果可视化。
下面是我们团队训练SSD的超参数。
从损失值变化和准确变化可以看出,准确率比较低,同时损失值的变化较小,证明模型质量较低;对于光照、背景与训练集差异较大的测试图片效果比较差,证明数据集采样不够多样化;迭代批次在5万次左右发生了过拟合现象,证明数据集中图片数量不够。为解决这些问题,在数据采样时尽量使背景多样性和光照多样性;同时对数据集进行了数据增强,将数据集扩充至10381张。对数据集的标注,我们将数据集分为多个数据集,利用ModelArts的数据集标注功能按照统一的规则生成统一xml格式的标注文件。ModelArts提供了在线手动标注和智能标注两种模式。
3.5 基于自动搜索的数据增强方案
传统的数据集扩增是随机图像变换的,以其为代表的是keras中数据集自动扩增的API,这样的数据增强是没有目的性的,在图像重复比例较大的数据集中效果不够明显,并不能有效解决由于数据量较少带来的模型过拟合问题。本文采用了在cifar100上表现比较优秀的基于强化学习的数据增强算法。该论文提供了利用强化学习在数据增强中进行自动搜索改进的数据扩充方法。
论文中每个操作都是图像处理功能(图2),如平移旋转和剪切,以及应用该操作的概率和变换幅度,将两个不同操作组合为一个子策略、5个子策略组成一个策略、若干个策略共同形成一个搜索空间。针对经典的数据集(如CIFAR-10, CIFAR-100, SVHN, and ImageNet)使用智能搜索算法在搜索空间中找到更好的增强策略,当默认数据集的分布符合高斯分布的情况下,得到的较好的增强策略在一般的数据集有更好的算法鲁棒性。
笔者还曾经尝试过用对抗神经网络GAN生成图像来做数据增强,若感兴趣的开发者也可以尝试。如有兴趣的同学,也可以进行尝试。本文中提到的数据增强算法来源于参考文献:
*AutoAugment: Learning Augmentation Strategies from Data :https://arxiv.org/pdf/1805.09501.pdf
基于智能搜索算法的自动数据增强大大提升了单个图像的增强效果,小样本条件下有利于模型的快速收敛。
对扩增后的数据集进行训练。
新的数据集2在相同的迭代批次上表现效果要明显好于原数据集1;使模型准确率显著提高至92.45%,得到了不同的模型。使用了集成学习,将五个模型进行融合得到了95.01%的识别效果
四、端云协同AI开发应用平台HiLens的使用
4.1 HiLens的通信
HiLens的使用需要经历网络连接、设备注册、模型导入、技能创建、技能部署、技能查看和结果演示等七个步骤。其中在网页端进行模型导入是HiLens和ModelArts平台交汇的接入口;技能创建是使用华为HiLens平台最为关键的步骤之一,可以有很灵活地方式来利用媒体数据处理函数和神经网络模型来实现目标功能。
在使用HiLens Kit之前,需要开通HiLens服务。首先注册华为云账号,并完成实名认证,接着进入控制台选择登录HiLens管理控制台,完成HiLens的权限申请。
(1)连接PC与HiLens,并注册新设备。
通过PC 与 HiLens Kit 组网后,通过web可以界面化地登录到HiLens Kit 管理平台,进行一键式操作链接无线网络。Windows平台SSH联通HiLens后,若能够ping通网络,则表明HiLens能够正常访问外网。。需要注意的是HiLens节点必须在北京4,设备状态为在线状态时表明该设备在此账号上完成了设备注册。同时需要实现工控机同HiLens Kit的连接
(2) HiLens Kit同工控机联通
将HiLens Kit的消息通过Python Flask后端框架发送至工控机上面,在工控机上面运行接收程序,可接收HiLens Kit发送的检查消息。如下图所示,分别是Windows和Ubuntu系统的页面。
无人车项目中我们并未采取http通信协议进行传输,而是socket通信。Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。Socket通信分为基于TCP和基于UDP两种。TCP协议是基于连接的协议,需要先建立可靠的连接,而UDP不需要事先建立可靠的链接,而是直接把数据包发送出去,是不稳定的连接。对于无人车环境中,客户端比较少又需要稳定可靠的传输的情况,采取了稳定可靠的基于TCP协议的Socket双工通信。在无人车项目中,我们使用了不止一个训练好的神经网络模型。单向传输时(例程代码),若算法设计为依次运行多个模型,会带来不必要的时间、算力开销。双向传输时(socket),工控机可以请求HiLens Kit运行特定的模型,执行特定的功能,从而大大减少了复杂场景下HiLens Kit频繁运算导致的开销。Socket的使用让HiLens Kit与工控机的通信更加灵活准确。后续了解到通过post接口可以与HiLens Kit进行双向通信,更加方便于算法编排和优化。
4.2 多模型多任务的Skill开发
添加已经训练好的技能.在训练好的技能是识别跟踪目标的AI应用,此处要自身根据算法(交通转向灯、泊车标识等)。点击图上的新建技能创建自己的技能。
在新建技能页面,填写基本信息和技能内容,OS平台选择Linux,选择转换好的所需模型, 函数执行入口要与代码中名称相对应。将main.py的内容复制在代码编辑区内。将新建的技能部署至HiLens Kit设备,然后启动技能即可。
在无人车项目中,我们团队一共开发了3个skill。其中HiLens_final.py 是比赛中采集图像进行模型推理并通信的代码;test_camera.py 是用来测试HiLens Kit本身运行状况及图像质量的代码;test_socket.py 是用来测试HiLens Kit与工控机连接的代码。HiLens Kit也可以将采集到的图像传输至其他设备,用作保存或者进一步的处理,HiLens Kit目前能满足大众开发者的需要。
4.3信息流的后端处理
在HiLen Kit部署神经网络模型的过程中,尽管采用了集成学习提升了对单帧图像的识别准确率,但也并非百分百准确;由于车在运动过程中,也存在拖影、未知光源干扰、反光灯等问题,尽管制作数据集尽量考虑了此类情况,但是有不小影响,从而单帧图像的识别可能会出现偏差。我们采取了数字滤波中的窗口滤波处理来做图像信息的后端处理。
采用长度为k的定长队列做为观察窗口;
选取k个元素中出现最多类别作为当前阶段预测类别;
集成学习配合窗口滤波滤掉了信息流中的噪声,确保了阶段内信号的准确识别。我们也设计很多算法,对雷达信息做了后端处理,工控机上实现的功能在此不再赘述。
整体框架完成后,建立仿真环境;在仿真环境中反复调试,调整状态机跳转逻辑,减少对实车的依赖。
五、联合使用ModelArts和HiLens体验
在无人车项目中联合使用ModelArts和 HiLens,这全流程的解决方案对项目的进行提供非常高质量的服务。笔者在使用华为云的全栈式解决方案之前,也接触过很多AI解决方案,但是无论是云还是端都没有华为云ModelArts和HiLens的联合使用便捷高效。其便捷高效主要体现在以下几个方面:
(1)支持数据集上传、存储、标注、处理一体化;
(2)智能标注可以节省很多时间用以算法的开发;
(3)已配置各种开发环境供开发者直接使用,支持AI全流程的开发;
(4)可视化管理让开发配置更容易,可以节省写各环节接口的时间;
(5)云端协同,模型可以直接通过skill进行部署,不用担心开发环境不支持模型推理的问题;
(6)不用自行解决摄像头驱动等各种图像接入问题;自带媒体数据处理库,支持各种自定义操作;
(7)昇腾处理器使得模型推理更加迅速,使得时延更低,之前单一模型推理时间能推理,因此能部署多模型多任务,能适用动态实时的系统,使得应用场景更为丰富
(8)ModelArts市场上有丰富的模型;HiLens技能市场上预置了丰富的AI技能,可以站在前人的肩膀上解决问题,提升开发效率