盘它!基于CANN的辅助驾驶AI实战案例,轻松搞定车辆检测和车距计算!
摘要:基于昇腾AI异构计算架构CANN(Compute Architecture for Neural Networks)的简易版辅助驾驶AI应用,具备车辆检测、车距计算等基本功能,作为辅助驾驶入门级项目再合适不过。
本文分享自华为云社区《盘它!基于CANN的辅助驾驶AI实战案例,轻松搞定车辆检测和车距计算!》,作者:昇腾CANN。
引言
科幻片中光怪陆离的飞行器,寄托着人类对未来出行的无限遐想。随着科技的进步,能够自动驾驶的汽车,已经离我们越来越近。自动驾驶带给人类的惊喜不止是酷炫的自动超车变道,还有它在缓解交通阻塞、减少空气污染、提高道路安全性方面的种种可能性。因此也引得无数汽车企业、科技企业竞相加入这条行业赛道,力求不断突破。
然而,自动驾驶并不是一蹴而就的,由于技术瓶颈和相关法律法规的限制并未真正意义落地,当下的智能汽车正处于半自动驾驶(辅助驾驶)阶段。 什么是辅助驾驶?简而言之,就是借助汽车对周围环境的自动感知和分析,让驾驶员预先察觉可能发生的危险,有效增加汽车驾驶的舒适性和安全性。 当然,辅助驾驶系统也是非常复杂的,为实现汽车在多种复杂场景下的通用性,以及技术层面的多样性,离不开人工智能技术。我们开发了一套基于昇腾AI异构计算架构CANN(Compute Architecture for Neural Networks)的简易版辅助驾驶AI应用,具备车辆检测、车距计算等基本功能,作为辅助驾驶入门级项目再合适不过啦! 话不多说,开启项目传送门:https://www.hiascend.com/zh/developer/mindx-sdk/driveassist
CANN是华为专门针对AI场景推出的异构计算架构,以提升用户开发效率和释放昇腾AI处理器澎湃算力为目的,并且提供多层次的AscendCL编程接口,支持用户快速构建基于昇腾平台的AI应用和业务。
当然,真正意义上的辅助驾驶系统远比这个AI应用更复杂,下面主要介绍如何借助AscendCL编程接口对输入视频进行预测推理,从而实现对车辆及车道线的智能检测。
典型的目标检测算法
为模仿驾驶员对车辆的辨别和分析,需要建立起一个类似人脑的算法结构,找出目标物体,确定它们的类别和位置。同时也需要解决影响检测准确性的一系列问题,比如汽车的外观和姿态、光照和遮挡等因素带来的干扰。 以YOLO(You Only Look Once)为代表的目标检测算法为各类物体的检测提供了更多可能性。从人脸检测到车流控制,从人群计数到农作物监控,目标检测算法在各领域都发挥着不可或缺的作用。 YOLO算法目前已经迭代到v5版本,本项目使用的是YOLOv4,下面我们来看看它的结构。
图片来自https://blog.csdn.net/andyjkt/article/details/107590669
从算法结构方面看,YOLOv4由三部分组成:Backbone层提取特征,Neck层提取一些更复杂的特征,最后由Head层计算预测输出。
1. Backbone层:通过CSPDarknet53框架在不同图像细粒度上聚合并形成具备图像特征的卷积神经网络,主要用于图像特征提取。
2. Neck层:由SPP或PAN等一系列混合和组合图像特征的网络层组成,提取一些更复杂的特性,并将图像特征传递到预测层。
3. Head层:对图像特征进行预测,生成边界合并预测类别。 从流程方面看,YOLOv4主要分为三个处理阶段:
- 首先,将图像分割为若干个网格(grid cell),每个网格负责生成3个包围框(bounding box),以及对应置信度。
- 接着,YOLOv4会用非极大值抑制算法(NMS),将与标注数据(ground truth)重合度低的bounding box剔除。
- 经过回归处理后,最后剩下的bounding box所在的位置就是YOLOv4预测目标所在的位置。
图片源自YOLO原始论文,参见文章末尾
昇腾强大算力平台,让训练“快”到飞起。
和人类掌握某项技能一样,算法模型本身也需要经过不断地训练和试错才能满足特定业务场景需求,面对成千上万的数据量和参数量,训练时间可能需要几天甚至上月,这时,一个拥有强大算力的AI计算平台简直能救你于水火。
昇腾AI基础软硬件平台,依托昇腾AI处理器强大的算力,借助异构计算架构CANN的软硬件协同优化充分释放硬件算力,为高效训练奠定了坚实的基础。
我们知道,AI算法模型可以基于不同AI框架定义。无论是华为开源AI框架昇思MindSpore,还是TensorFlow、PyTorch、Caffe等其他常用AI框架,CANN都能轻松转换成标准化的Ascend IR(Intermediate Representation)表达的图格式,屏蔽AI框架差异,让你快速搞定算法迁移,即刻体验昇腾AI 处理器的澎湃算力。
此外,在全新一代CANN 5.0版本中,更是能通过图级和算子级的编译优化、自动调优等软硬件深度协同优化,全面释放硬件澎湃算力,达到AI模型训练性能的大幅提升。针对包括分类、检测、NLP、语义分割在内的常用模型训练场景,均可实现性能翻番,让整个训练过程快到“飞”起。
本项目使用的YOLOv4原始模型是基于Pytorch框架和昇腾AI处理器训练的,开发者们可以直接下载使用,也可根据实际精度需要重训:
https://www.hiascend.com/zh/software/modelzoo/detail/2/e2c648dc7ffb473fb41d687a1a490e28
AscendCL接口,助力开发者高效编程
有了训练好的AI算法模型之后,就能借助AscendCL编程接口实现对视频车辆及车道线的智能检测了。 AscendCL(Ascend Computing Language)是一套用于开发深度神经网络推理应用的C语言API库,兼具运行时资源管理、模型加载与执行、图像预处理等能力,能够让开发者轻松解锁图片分类、目标检测等各类AI应用。并且为开发者屏蔽底层处理器的差异,让开发者只需要掌握一套API,就可以全面应用于昇腾全系列AI处理器。 借助AscendCL编程接口,采用如下图所示的模块化设计,便能快速实现一个基于YOLOv4算法的目标检测应用。
首先介绍一下核心代码。 在预处理阶段,主要将opencv读到的图像转换成符合模型输入标准格式和尺寸的图像(源码如下图所示,完整版代码请查看文末链接)。
1. 首先将opencv每帧读到的BGR图像转换成RGB图像,并通过模型输入所需宽高与原图像宽高得到缩放系数scale、偏移量shift、偏移系数shift_ratio。
2. 将原图像resize到新的宽高得到image_,构建一个全0的新图像,宽高和模型输入宽高相同。将image_以np.array的形式填充到全0的图像中,不在偏移范围内的则都是0,将的图像的数据类型转换成np中32位浮点型。
3. 为了消除奇异样本数据的影像,进一步做归一化处理。
4. 最后将通道数换到图像的第一维度,返回新生成的图像和原始图像。
在推理阶段,调用acl_model中的execute函数执行模型(完整版代码请查看文末链接),预处理后的图像会被送至转成om的YOLOv4模型,返回推理结果。
在后处理阶段中,后处理包括根据推理结果获取检测框坐标和置信度,使用NMS消除多余的边框,使用透视变换矩阵计算车距,用opencv检测车道线,最终绘制带有车辆检测框、检测框类别、车距和车道线的新图像。
梳理一下整体开发流程:
1. 运行管理资源申请:用于初始化系统内部资源,此部分为固定的调用流程。
2. 加载模型文件并构建输出的内存:将训练好的模型转换成om离线模型并且从文件加载。此时需要由用户自行管理模型运行的内存,根据内存中加载的模型获取模型的基本信息包括模型输入、输出数据的buffer大小。由模型的基本信息构建模型输出内存,为接下来的模型推理做准备。
3. 数据预处理:对读入的图像数据进行预处理,然后构建模型的输入数据。首先会对输入视频中的图像画面按每帧进行处理;然后由BGR转成RGB格式;接着使用resize将图像大小变成416x416,最后除以255进行归一化处理以消除奇异数据的影响。
4. 模型推理:根据构建好的模型输入数据进行模型推理。
5. 解析推理结果:基于推理得到的检测边框和各边框的置信度,使用NMS消除多余的边框,将新的边框和类别绘制在输出图像上。 这样,一个基于CANN开发的简易版AI辅助驾驶小应用就开发完成了,小伙伴们点击如下链接就能直接体验效果啦!https://www.hiascend.com/zh/developer/mindx-sdk/driveassist
可能有人会问,车距是怎么算出来的?其实车距计算采用的是透视变换原理,使用opencv的getPerspectiveTransform方法通过将驾驶过程中拍摄的直视图转换成俯视图计算车距。此外,用来拍摄行驶画面的相机也影响车距的计算。需要查找相机的内外参矩阵,结合畸变系数用相机标定技术将图像中的距离信息映射为客观世界中的真实距离,从而计算出与其他车的距离。这几个参数如何查找可以参考文末的视频链接。
我们的项目代码全部开源,感兴趣的小伙伴可以下拉到文末直接访问源码。 当前开发的这个AI辅助驾驶小应用,针对分辨率1280x720、帧率29.97、时长16秒的视频,单帧图像在昇腾AI处理器上的纯推理时长为14.19毫秒,但由于图像的前处理和后处理是在CPU上进行的,因此影响整体性能,可通过以下方式改进:
1. 前处理和后处理根据CPU数量和处理时长使用多个线程并行处理,提高昇腾AI处理器使用率。
2. 使用多个昇腾AI处理器进行多路推理,进一步提升性能。
3. 优化代码算法,将后处理部分由CPU下沉到昇腾AI处理器减少后处理耗时,如何下沉可参考https://gitee.com/ascend/samples/tree/master/python/level2_simple_inference/2_object_detection/YOLOV3_coco_detection_picture_with_postprocess_op
4. 使用Auto Tune工具,对模型进行调优,减少模型单次推理时长
5. 使用Profiling工具,分析模型中耗时算子,对算子进行优化
欢迎小伙伴一起参与项目改进,如有疑问也欢迎在gitee互动留言!
总结
如今很多汽车、高铁和飞机上都搭载了辅助驾驶系统,不仅可以减轻驾驶员的负担,同时还降低了事故发生的概率。随着越来越多的行业汇入AI这条道路,昇腾CANN也将凭借技术优势大大降低企业和个人开发者的使用门槛,通过不断创新打造昇腾AI极致性能体验,加速AI应用行业落地步伐,助力合作伙伴在未来AI之路上越走越远!
相关链接
在线体验链接:https://www.hiascend.com/zh/developer/mindx-sdk/driveassist
Gitee源码链接:https://gitee.com/ascend/samples/tree/master/python/level2_simple_inference/2_object_detection/YOLOV4_coco_detection_car_video
YOLOv4原论文:https://arxiv.org/abs/2004.10934
YOLO原论文:https://arxiv.org/pdf/1506.02640.pdf
YOLOv4模型实现:https://github.com/AlexeyAB/darknet
相机参数查找方法:https://www.bilibili.com/video/BV1Fq4y1H7sx/
盘它!基于CANN的辅助驾驶AI实战案例,轻松搞定车辆检测和车距计算!的更多相关文章
- AI实战分享 | 基于CANN的辅助驾驶应用案例
摘要:什么是辅助驾驶?简而言之,就是借助汽车对周围环境的自动感知和分析,让驾驶员预先察觉可能发生的危险,有效增加汽车驾驶的舒适性和安全性. 导读:基于昇腾AI异构计算架构CANN的辅助驾驶AI应用实战 ...
- 基于 CODING 轻松搞定持续集成
点击观看视频教程 带你一步一步搞定 CODING 持续集成 持续集成加速软件交付 持续集成这个概念是由 Grady Booch 在 1991 年首次提出,随后成为了 DevOps 的核心实践之一.持续 ...
- 忘带U盘了??别急!一行python代码即可搞定文件传输
近日发现了python一个很有趣的功能,今天在这里给大伙儿做一下分享 需求前提 1.想要拷贝电脑的文件到另一台电脑但是又没有U盘2.手机上想获取到存储在电脑的文件3.忘带U盘- 您也太丢三落四了吧,但 ...
- 基于SpringCloud的微服务架构实战案例项目,以一个简单的购物流程为示例
QuickStart 基于SpringCloud体系实现,简单购物流程实现,满足基本功能:注册.登录.商品列表展示.商品详情展示.订单创建.详情查看.订单支付.库存更新等等. 每个业务服务采用独立的M ...
- 基于SpringCloud的微服务架构实战案例项目
QuickStart 基于SpringCloud体系实现,简单购物流程实现,满足基本功能:注册.登录.商品列表展示.商品详情展示.订单创建.详情查看.订单支付.库存更新等等. github源码地址:h ...
- Python基于VS2013 开发环境搭建 Hello World 10分钟搞定
1.先下载Python 安装 Next ->安装完成 2.以前安装过VS2013 打开VS2013 文件->新建项目 (此时如果没有Python Application,请点击里面的安装插 ...
- 基于vue+springboot+docker网站搭建【二】搞定服务器
搞定服务器 双11在阿里云用家人的身份证注册账号,买了两台打折的服务器.2核4G一台3年799块:1核2G一台3年229块.机器配置如下图. 1.买的时候注意相同地区的相同可用区.比如我两台机器都选择 ...
- 基于android平台的斗地主AI
本软件是基于android平台的斗地主AI,我们在源代码的基础之上,旨在改进AI的算法,使玩家具有更丰富的体验感,让NPC可以更为智能. (一)玩法解析: (1)发牌和叫牌:一副扑克54张,先为每个人 ...
- 在OpenShift平台上验证NVIDIA DGX系统的分布式多节点自动驾驶AI训练
在OpenShift平台上验证NVIDIA DGX系统的分布式多节点自动驾驶AI训练 自动驾驶汽车的深度神经网络(DNN)开发是一项艰巨的工作.本文验证了DGX多节点,多GPU,分布式训练在DXC机器 ...
随机推荐
- CSS(上)
css sprite是什么,有什么优缺点 概念:将多个小图片拼接到⼀个图⽚中.通过 background-position 和元素尺寸调节需要显示的背景图案. 优点: 减少 HTTP 请求数,极⼤地提 ...
- Taurus.MVC WebAPI 入门开发教程4:控制器方法及参数定义、获取及基础校验属性【Require】。
系列目录 1.Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...
- java学习第七天注解.day19
注解 可以使用注解来修饰类中的成员信息 "注解,可以看作是对 一个 类/方法 的一个扩展的模版 元注解 注解:用来贴在类/方法/变量等之上的一个标记,第三方程序可以通过这个标记赋予一定功能 ...
- Excel 笔记目录
前言 Excel 是微软(Microsoft)公司推出的 Office 办公系列软件的一个重要组成部分,主要用于电子表格处理,可以高效地完成各种表格和图表的设计,进行复杂的数据计算和分析. 一句科普 ...
- iommu系列之---概念解释篇
本文会对iommu中的一些容易引起疑惑的概念进行阐述,内核版本为4.19. 先上简写: DMAR - DMA remapping DRHD - DMA Remapping Hardware Unit ...
- 超实用在线工具!能将文字加密为Emoji表情
试想一下,如果你需要将一段比较敏感的内容发送给你的好友. 但如果这段内容不小心外泄,被别人看到了,可能会带来很多麻烦. 那么,有什么方法能够让传输的文本内容不那么容易被"看破"呢? ...
- 微软Azure配置中心 App Configuration (三):配置的动态更新
写在前面 我在前文: <微软Azure配置中心 App Configuration (一):轻松集成到Asp.Net Core>已经介绍了Asp.net Core怎么轻易的接入azure ...
- Shell第三章《for循环》
Shell循环:for 语法结构: for 变量名 [ in 取值列表 ] do 循环体 done 需求:自动创建10个用户 #!/bin/bash read -p "请输入你要创建的用户名 ...
- 【java】学习路径31-文件IO基本操作(未涉及到流)
一.初始化: File f1 = new File("//Users//Shared//JavaIOTest//Test01.txt"); File f2 = new File(& ...
- 一 策略模式 来自CBF4LIFE 的设计模式
刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,搞到后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的. 先说这个场景中 ...