[关闭]
@vivounicorn 2021-09-08T16:19:49.000000Z 字数 29990 阅读 5467

机器学习与人工智能技术分享-第十三章 ADAS与自动驾驶

机器学习 自动驾驶 ADAS 第十三章

回到目录


13. ADAS&自动驾驶

13.1 Openpilot

13.1.1 项目简介

Comma.ai是由天才黑客George Hotz(第一个破解iPhone、PS 3的人,相关介绍:https://www.bloomberg.com/features/2015-george-hotz-self-driving-car/)创立的专注自动驾驶的公司,目标是1000刀实现自动驾驶,但公司由于受到美国国家公路交通安全管理局的严格管制,于是“一怒之下”的把整个系统开源,取名openpilot,从功能上完全具备了目前特斯拉的autopilot具有的能力,主要表现在ACC和LKAS上。目前为止所有自动驾驶汽车都属于level 2,包括Waymo、Cruise、comma.ai、Ford、Tesla,特点是需要驾驶员坐在驾驶位且持续关注行车状态并随时接管汽车,实验室车辆在我看来也就Leve 2+,Level 3阶段,在特定路段驾驶员可以完全不用关注汽车行驶状态,目前没有厂商实现L3。openpilot目前主要能力是在6min内无需人的干预(但人需要盯着)控制本田和讴歌某几款车的加速、刹车、转向,从效果看,是我个人目前最看好的开源项目,且与我之前的构想一致:无需对汽车进行改造,无需昂贵的硬件设备,即插即用实现自动辅助驾驶。另外消费者不一定买同一品牌汽车,他们的数据也可以互相共享,从而降低自动驾驶造成的事故发生几率。

13.1.2 基本概念

1、CAN
CAN总线:(Controller Area Network, CAN)即控制器局域网络,是由以研发和生产汽车电子产品著称的德国BOSCH公司开发的,并最终成为国际标准(ISO 11898),是国际上应用最广泛的现场总线之一。不仅用于汽车,也广泛运用于工业,商业等领域。
在汽车领域,CAN是用于连接电子控制单元[ECU]的多主串行总线标准(通讯总线)。CAN网络需要两个或多个节点进行通信。节点的复杂性可以从简单的I / O设备到具有CAN接口和复杂软件的嵌入式计算机。节点还可以是允许标准计算机通过USB或以太网端口与CAN网络上的设备进行通信的网关。所有节点通过两线总线相互连接。电线为120Ω额定双绞线。


2、LIN
LIN总线:(Local Interconnect Network)本地互联网,是一种低成本的串行通讯网络,用于实现汽车中的分布式电子系统控制。LIN 的目标是为现有汽车网络(例如CAN 总线)提供辅助功能,因此LIN总线是一种辅助的总线网络。在不需要CAN 总线的带宽和多功能的场合,比如智能传感器和制动装置之间的通讯使用LIN 总线可大大节省成本。
在汽车电控系统中,数据交换主要经由CAN总线完成,LIN总线是其补充与完善,不仅仅是出于成本的考量,更是(当今通讯技术发展条件下)充分保证高速数据交互效率的完美结合。
3、NEO
一个开源机器人软件开发平台,目前和 Neo 适配的智能手机只有中国厂商一加生产的一加 3 手机,只有这部手机权限足够开放,而且相机和芯片 (高通骁龙820)都符合要求,且会利用该手机的GPS。硬件成本700刀。
4、panda
通用汽车接口软件,用来控制与CAN和LIN的通信。

13.1.3 系统架构


13.1.4 软件架构


代码层面,由c/c++和python完成。

13.1.5 汽车基础组建

1、Panda
一个独立的开源项目,与panda硬件配合,是汽车通信的硬件接口,支持手机/pc与汽车的CAN/LIN通信,整个硬件仅需要88刀。
2、Opendbc
封装标准的CAN通信消息,依据车型订制,消息结构为:
identifier +11-bit标准段+29-bit扩展段,整个消息长度可扩展到8 bytes。



  1. BO_ 228 STEERING_CONTROL: 5 ADAS
  2. SG_ STEER_TORQUE : 7|16@0- (1,0) [-3840|3840] "" EPS
  3. SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS
  4. SG_ CHECKSUM : 39|4@0+ (1,0) [0|15] "" EPS
  5. SG_ COUNTER : 33|2@0+ (1,0) [0|3] "" EPS

第一行表示该消息是转向控制,标识符为228.后面四行为与转向相关消息。每个车型的消息结构可能都不一样,所以需要各自封装:


Dbc文件抽象及其格式解析的通用代码分别在:
https://github.com/commaai/openpilot/blob/v0.3.2/common/dbc.py
https://github.com/commaai/openpilot/blob/v0.3.2/selfdrive/car/honda/can_parser.py

13.1.6 公共组件

这里封装公用库函数,例如:卡尔曼滤波器、dbc文件管理、异常管理、车系管理、计算加速、参数封装、实时时间读写封装等,全为python代码。

13.1.7 手机组件

智能手机是openpilot的最大硬件,所有通信、数据收集、计算、展现都是通过手机作为载体。整个openpilot采用cap’n proto做消息序列化封装,使用ZMQ做消息通信,很高效,整体架构提前做了ROS 2.0想做的事。
can’n proto(https://capnproto.org/)的效率更加适用于这种嵌入式场景:


ZMQ(ZeroMQ,http://zeromq.org/)是跨平台、高效的分布式消息队列,同样很适用于嵌入式场景。

13.1.8 自动驾驶组件

自适应巡航使用传统方法,这里不讲,主要讲车道辅助驾驶部分,整体结构如下:


  1. struct ModelData {
  2. frameId @0 :UInt32;
  3. path @1 :路径数据;
  4. leftLane @2 :左行车道;
  5. rightLane @3 :右行车道;
  6. lead @4 :前方引领车辆;
  7. ...

13.1.9 总结

总的来说,自动驾驶最终解决方案一定不是不计成本的硬件投入,而是基于普通摄像头和车载雷达的低成本高性能解决方案。
所以我认为自动驾驶的技术核心是:
1、工程架构能力:如何满足可扩展性、高性能等要求;
2、核心模块的算法能力:主要是基于深度学习,需要tradeoff性能与效果,在嵌入式环境哪怕1ms都需要争取;
3、数据能力:两方面,收集数据的能力和数据标注的能力;
4、仿真能力:决定模型效果迭代能走多快。
目前开源软件能让我们达到Level 2,但要实现更高级别必须解决上面4个问题。

百度的apollo工程架构上设计比较合理,各子系统松耦合,但是目前整个项目是个空壳子,没有相关算法支撑,仿真系统也很粗糙,另外需要车载电脑等硬件支持,在通信性能方面我也有疑虑。
Openpilot在工程架构上比较合理,在资源消耗上比较小,硬件需求不强,我认为思路是未来的发展方向之一,缺点是没有大公司支持,属于个人英雄主义,且很多东西未开源。

整体来说开源自动驾驶技术方面大家都不完善,而自动驾驶的场景很重要,只研究技术是不够的,在我看来未来围绕着它有三大角色:
1、平台
2、主机厂
3、运营商
虽然趋势是合作共赢,但未来大家在这方面人才上的竞争会愈发激烈。

13.2 基于视觉的车道检测

13.2.1 传统车道检测方法

车道检测(LD)是ADAS/自动驾驶领域中的一个基本问题,可以基于激光雷达、视觉或者多传感器融合去做。但总的来说车道检测是个比较难的问题,原因在于:车道线和道路的多样化,例如:高速路、城乡结合部、土路、不同地区、不同国家对车道线的标准不同等;道路干扰因素较多,比如:树荫、遮挡、强光反射等;恶劣的视觉环境,比如:雨、雪、雾天气等。
其中,基于视觉的方法分为传统方法和深度学习方法。
传统方法一般需要做以下工作:

  • 图像预处理
    图像去噪;删除图像中不相关部分,如车辆、行人、障碍物;对图像中过暗或过亮部分做归一化修正;去除图像中阴影(如:树荫);根据摄像头位置提取图像ROI;图像边缘检测;腐蚀膨胀等。

  • 特征提取
    通过人工方法直接在原图或通过原图生成的鸟瞰图提取亮度峰值、HOG、道路纹理、道路分割、车道曲率等特征。

  • 模型拟合
    模型需要做先验假设,可以采用参数学习(典型的像直线、曲线)、半参数学习、非参学习,然后采用合适的损失函数(如Square Loss)做优化求解。典型的传统算法如Hough变换,其本质是对图像进行坐标变换,让变换结果易于检测和识别;当车道线不清晰或存在其他干扰的情况下,传统方法会利用类似Gabor滤波做消失点预测(Vanishing Point:三维空间中的两条平行线在二维空间中的交叉点,简单说就是两个车道线的交点位置),然后利用消失点做车道线预测。也可以用卡尔曼滤波利用前几帧预测下一帧车道线位置。总的来说传统方法的天花板比较明显。

  • 上下文信息集成
    利用前几帧的信息提高下一帧的预测准确度以及复用前几帧的特征减少计算量。
  • 图像后处理
    对车道线之类的做其他处理使其能在真实世界中表示出来。

13.2.2 深度学习套路

基本上,深度学习的方法出来后大家套路日趋一致:
1、人工或半人工标注数据集(理论上越多样化、越多越好),改进对小物体的标注
2、数据预处理,例如做IPM;
3、选择一个基础网络做自动特征提取;
4、构建一个多任务网络分别做:BBox Regression、Classification、Object Mask、VP Prediction等;
5、使用现有数据集做模型Transfer Learning(fine tune);
6、使用FCN、FPN、Quantization之类的方法改进网络效果或做加速,裁剪模型降低模型大小;
7、使用scale权衡速度与精度;
8、使用类似RNN或LSTM融合上下文信息。
不管哪种方法,对于硬件和工程的要求越来越高,因为你要保证inference的时间是实时的。当硬件条件不佳时(车联网领域用的较多的MTK8665芯片,采用ARM架构、MALI GPU)就得在工程上做很多优化的事情,例如图片的预处理、矩阵乘法之类的需要在ARM架构下利用寄存器做优化。如果你很有钱,用高端的Nvidia芯片,那这方面麻烦会小些,但你的产品性价比可能下降。

13.2.3 Vanishing Point Guided Network

这是去年10月份提出的一个基于深度学习的方法,应该是目前为止实测效果最好的之一,亮点有:多种气候环境下的标注数据集;一个带VP预测的多任务网络。

References

如有遗漏请提醒我补充:
1、《Understanding the Bias-Variance Tradeoff》
http://scott.fortmann-roe.com/docs/BiasVariance.html
2、《Boosting Algorithms as Gradient Descent in Function Space》
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.51.6893&rep=rep1&type=pdf
3、《Optimal Action Extraction for Random Forests and
Boosted Trees》
http://www.cse.wustl.edu/~ychen/public/OAE.pdf
4、《Applying Neural Network Ensemble Concepts for Modelling Project Success》
http://www.iaarc.org/publications/fulltext/Applying_Neural_Network_Ensemble_Concepts_for_Modelling_Project_Success.pdf
5、《Introduction to Boosted Trees》
https://homes.cs.washington.edu/~tqchen/data/pdf/BoostedTree.pdf
6、《Machine Learning:Perceptrons》
http://ml.informatik.uni-freiburg.de/_media/documents/teaching/ss09/ml/perceptrons.pdf
7、《An overview of gradient descent optimization algorithms》
http://sebastianruder.com/optimizing-gradient-descent/
8、《Ad Click Prediction: a View from the Trenches》
https://www.eecs.tufts.edu/~dsculley/papers/ad-click-prediction.pdf
9、《ADADELTA: AN ADAPTIVE LEARNING RATE METHOD》
http://www.matthewzeiler.com/pubs/googleTR2012/googleTR2012.pdf
9、《Improving the Convergence of Back-Propagation Learning with Second Order Methods》
http://yann.lecun.com/exdb/publis/pdf/becker-lecun-89.pdf
10、《ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION》
https://arxiv.org/pdf/1412.6980v8.pdf
11、《Adaptive Subgradient Methods for Online Learning and Stochastic Optimization》
http://www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf
11、《Sparse Allreduce: Efficient Scalable Communication for Power-Law Data》
https://arxiv.org/pdf/1312.3020.pdf
12、《Asynchronous Parallel Stochastic Gradient Descent》
https://arxiv.org/pdf/1505.04956v5.pdf
13、《Large Scale Distributed Deep Networks》
https://papers.nips.cc/paper/4687-large-scale-distributed-deep-networks.pdf
14、《Introduction to Optimization —— Second Order Optimization Methods》
https://ipvs.informatik.uni-stuttgart.de/mlr/marc/teaching/13-Optimization/04-secondOrderOpt.pdf
15、《On the complexity of steepest descent, Newton’s and regularized Newton’s methods for nonconvex unconstrained optimization》
http://www.maths.ed.ac.uk/ERGO/pubs/ERGO-09-013.pdf
16、《On Discriminative vs. Generative classifiers: A comparison of logistic regression and naive Bayes 》
http://papers.nips.cc/paper/2020-on-discriminative-vs-generative-classifiers-a-comparison-of-logistic-regression-and-naive-bayes.pdf
17、《Parametric vs Nonparametric Models》
http://mlss.tuebingen.mpg.de/2015/slides/ghahramani/gp-neural-nets15.pdf
18、《XGBoost: A Scalable Tree Boosting System》
https://arxiv.org/abs/1603.02754
19、一个可视化CNN的网站
http://shixialiu.com/publications/cnnvis/demo/
20、《Computer vision: LeNet-5, AlexNet, VGG-19, GoogLeNet》
http://euler.stat.yale.edu/~tba3/stat665/lectures/lec18/notebook18.html
21、François Chollet在Quora上的专题问答:
https://www.quora.com/session/Fran%C3%A7ois-Chollet/1
22、《将Keras作为tensorflow的精简接口》
https://keras-cn.readthedocs.io/en/latest/blog/keras_and_tensorflow/
23、《Upsampling and Image Segmentation with Tensorflow and TF-Slim》
https://warmspringwinds.github.io/tensorflow/tf-slim/2016/11/22/upsampling-and-image-segmentation-with-tensorflow-and-tf-slim/
24、《Vision based autonomous driving》

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注