0
在车载感知技术和产品矩阵中,相较于激光雷达,摄像头传感器和视觉技术因其低成本和较好的适用性成为所有公司重视的领域。马斯克也希望特斯拉能够创造出比人类眼睛更敏锐的“摄像头眼睛”,以保证安全性和智能性。
雷锋网旗下会员组织「AI投研邦」「大咖Live」第50讲,纽劢科技计算机视觉研发总监成二康带来关于《自动驾驶系统研发:详解视觉感知模块》的主题分享,围绕自动驾驶的视觉感知、基于深度学习的目标检测和图像分割任务、纽劢科技如何以数据助力自动驾驶感知模块研发三方面进行了介绍。
据雷锋网了解,纽劢科技计算机视觉研发总监成二康,早前于美国Temple University获得计算机博士学位,师从凌海滨教授;期间曾在美国西门子任职,主要做计算机视觉和医学图像分析方面的工作;之后加入硅谷Broncus medical 公司,开发了超大规模通用机器学习库,用于图像分割、目标检测等;2017年10月加入纽劢科技,负责视觉相关的研发工作。
以下是成二康的分享内容,雷锋网新智驾在不改变原意的基础上进行了整理和精编:
首先简单介绍一下纽劢科技。纽劢科技于2016年底在美国硅谷成立,2017年初在上海设立总部公司,是一家专注于自动驾驶领域的科技公司。创始人CEO徐雷是前特斯拉 Autopolit vision 团队早期成员,COO Justin是前特斯拉高级供应链经理。
2016年9月,纽劢科技获得1000万美元的天使轮融资;2019年4月获得德赛西威的Pre-A轮战略投资。6月份,纽劢科技发布了自动驾驶解决方案MAX1.0,向市场公开了基于公司自研的MaxOS的高速代驾、拥堵跟车、自主泊车三大功能。
今天的分享包括四个部分:首先简单介绍纽劢科技视觉感知;第二部分是基于深度学习的目标检测;重点是后面两部分基于深度学习的车道线检测和数据驱动的模块迭代。
传感器配置层面,目前纽劢科技传感器配置以摄像头为主,并结合毫米波雷达和超声波雷达,包括覆盖车身360度的8个摄像头、4个主要为泊车服务的鱼眼摄像头。
现阶段,纽劢科技进行的视觉模块大概包含以下几个方面:一是目标检测;二是图像分割,图像分割目前主要用于车道线的分割或可行驶区域的分割;上述两方面均以深度学习为主;目标跟踪目前是基于多摄像头的多目标跟踪管理;世界模型是如何将目标检测或者图像分割出来的结果,比如车道线的结果映射到三维世界,为planning提供信息;另外一个是多传感器融合,纽劢科技现阶段采用的是视觉、毫米波和超声波雷达之间的融合;在线标定,因为摄像头每时每刻都可能发生变化,所以在线标定实时计算camera pose也是一个比较关键的模块;另外一个是视觉slam,该模块主要应用在地下停车场的建图、在线定位等;还有一些比较基础的模块,比如ISP,因现在的视觉摄像头要进图首先要经过ISP,以解决不同光照下的情况,提供更高质量的图片。
纽劢科技自研的深度学习平台包括数据标注、海量数据的收集、针对自动驾驶感知环境的模型设计、模型训练,和最后的模型嵌入式平台部署。
此为纽劢科技多目标跟踪管理的结果。这里要解决的问题是,对每一辆障碍物车辆赋一个连续的ID,以便于后面与毫米波传感器的融合。因为有了视觉和毫米波融合的信息,融合之后和真值更加接近。基于真值,可以通过其它传感器拿到更精确的障碍物车距信息。
首先分享一些在目标检测方面比较好的综述。第一篇是2018年的一篇综述,上面大概介绍了目标检测在计算机视觉上的一些发展,比如2001年比较经典的Viola & Jones 的adaboost的目标检测;一直发展到2008年的DPM,deformable part model的目标检测;在2012年,Hilton的学生 Alex 在ImageNet上把图像分类提升了很大,从而推动了基于深度学习的目标检测方法的发展;比如2013年的OverFeat方法;后续比较有影响的是基于RCNN系列的Fast和Faster RCNN,乃至后面各种以深度学习为基础的各种网络。
另外,今年最新的一篇综述由滴滴完成。上一篇综述大概覆盖300多篇文章,这篇综述则包含的更多,大概有410多篇文章。从1996/1998年到2018年,大概20年间目标检测相关的文章都包含在其中。这篇综述在后面进行了细分,将目标检测细分出one-stage和two-stage。其实后面还可以再细分,比如基于anchor-based和anchor-free的方法。从2001年Viola & Jones的目标检测,到2008年的DPM,到后面一些基于深度学习的经典的综述方法基本都涵盖其中。
从这里面看出,一些进行视觉工作的人会觉得三年前的文章就算老的文章,其实并不是的。可以从中看出,基于深度学习的目标检测bbox的计算都是基于回归的方法。Bounding box regression在2008年的DPM里面提出,后面延申到Deep learning里面,有很多概念都含在这篇文章中。比如multi-scale的概念,或者multiple reference都可以从以前的paper里找到一些相关的想法。这里的一个例子是bounding box regression的一些进展,最经典的是2008年DPM这篇文件,他提出了从bounding box到bounding box的回归,后面形成了从feature到bounding box的回归,目前主流的目标检测都是沿用这个方法。
如果想训练好一个模型,大家需要很多手工的、或者从样本层面做一些工作。比如最常用的是一些困难样本生成策略(hard sample mining),具体用到的有hard negative mining技术,这在最经典的机器学习时代已经大量运用。微软训练一个亿量级的人脸检测,也用到经典的bootstrap方法,都采用了困难样本挖掘工作。最近经典的一篇 focal loss 通过新的损失函数(loss function)的设计,能够完成困难样本生成策略的工作。从这两个例子中,我们可以看到,一些新的检测方法都是回溯到一些经典的方法。
有了一个模型/算法之后,如何在芯片上进行部署?这其实是一个难点。这里面我们总结了几种常用的方法:比如由于计算资源的限制,通常会选用一些小的模型,像light-weighted model,。其中又有几种选择:比如卷积在整个网络中占的计算量比较大,Group conv技术可以使卷积计算量下降;另外是在mobilenetV1、V2系列中使用的技术,比如Depth-wise的可分离卷积;除此之外,还有后面衍生而来的基于shuffle 的V1、V2,这些都可以对已有的模型进行加速。
另外我们可以选择一些Bottle-neck设计,比如可以从resnet系列选择18、34、50或者101。上述是人工设计的一些主干网络,现在一些新的研究热点则转向如何通过网络自动搜索一些小的网络。比如今年谷歌有一篇比较好的文章,研究如何搜索一个比较小的网络能够上线。
除了选择一些比较轻量级的网络,另外一个选择是进行模型的剪枝,比如模型压缩。2017年英伟达在LCLR上有一篇文章,讲述了关于模型剪枝方面的工作。比如可以抛弃某些层,剪掉参数比较小的一些层。另外可以做知识蒸馏,Hilton在2015年提出的一种概念,即如果我们从一个大的网络里面能够学习一些知识,如何把知识传到一些小的网络中。知识蒸馏最初在分类问题里面得到应用,后面也推广到分割任务上面。NIPS2017 NEC也有尝试把知识蒸馏的方式推广到目标检测中。如果在大的网络上面学习比较好,可以把这些知识蒸馏到比较小的网络里面,方便上线。
另外一个层面与计算平台相关,如果一个计算平台支持半浮点型或者INT8再或者binary的网络,其本身就可以降低复杂度。这方面目前主流的一些框架,比如tensorflow,MxNet,或者基于英伟达平台上面的tensorRT加速都支持半浮点,或者整形模型。当然上线可能有多方面的考虑,也有其他更好的方法,比如结合其中几个方法能够使一个模型上线。
上述文章主要讨论关于目标检测的内容。最新基于anchor-free的目标检测方法在最近几年比较流行。比如从最开始的Densebox,到最近一篇今年百度关于Dubox的文章,即为了解决Densebox在小尺度目标漏检的问题。
比如在一个feature map上面,一些小目标可能会被漏掉,那么可以在第二个feature map上面进行refine,这是一个很好的思路。
另外一篇是我们在视觉组在每周paper reading活动中分享的一篇结合anchor-based和anchor-free的CVPR19年的文章。该文章讲述通过结合anchor-based和anchor-free两种方法从而整体提升目标检测精度。
如果想做一个比较实用的基于车道线的检测算法,对鲁棒性或者复杂场景的支持要求很高。这里介绍主流的方法和一些比较新颖的方法。
深度学习方法逐渐在分割任务里面占主流,目前大多车道线算法,大都把车道线当作一个分割问题,然后加一个post-processing算法。后面有一些新的方法,或通过end-to-end的方式,将车道线步骤变得更简洁。类似于目标检测。现在经典的目标检测方法都不需要复杂的post-processing的方法。
左边是一个FCN。FCN是给一个输入图像,输出一个dense的map;可以和原图一样大,也可以和原图比缩小1/4或1/8,代表一个dense的prediction。比如这里可以预测一个像素点是车道线的概率。
右边简单介绍车道线分割和后处理结果,上面是实际输入到网络里面的图,下面是一张实际输入图经过网络之后的一个probability map。每个点代表了这个点属于车道线的概率。右面经过一些post processing,把车道线提取出来,这里面只是展示了把它当做一个binary的分割问题,我们可以对车道线做更复杂的一些分割。那么最重要的事如何做post-processing。这展示的是视野比较清晰的一张图,在实际过程中有可能遇到各种复杂的场景。比如说网络输出的概率图有可能质量不是太高,如何加上复杂的后处理,能够把车道线提取出来也是一个比较难的挑战。
这是商汤在AAAI 2018上面的一篇文章,个人觉得有两大创新。第一个是,因为车道线是有很强的局部先验知识,或者说它有很强的context信息,如何把这些context的信息结合起来有助于车道线的提升。比如说我们在遇到这些虚线的时候,虚线在视觉上是没有appearance,但是通过它前面和后面的实线,可以把这些context信息结合起来,即可把车道线的一些context信息囊括得更好。这篇文章里面用到得一个关键点是,可以通过分层,把每一行上面的信息传递到下一行,或者每一列的信息传递到左边或者右边,同时提升网络对context信息的抽象,提升预测结果。但是有个缺点就是计算量会增大。
另外一个创新点是开源了一个比较大的数据集。对一个车道线数据集进行了很好的分类,比如说有白天/晚上,有拥堵跟车或者没有车道线的情况,这些场景都做了细分。在实际过程中,数据集本身对算法的提升也有很大的作用。
障碍物检测的目标测距或者车道线如何从二维世界到三维世界,一个比较关键的部分是要对camera pose进行实时估计。实时估计有很多种方法,但是实际情况中对camera pose的估计要求比较高,比如鲁棒性要求比较高。使用一些视觉的特征,例如在高速场景下,可以用到一些车道线相关信息;在城市场景下,可以用到一些建筑的信息,或者交通信号灯的信息。或者运行一个视觉slam,slam就是要解连续两帧之间camera pose是怎么变化的。
另外的一些信息来源可以从其他传感器得到,比如从IMU或者车子的里程获得;如果有激光雷达,可以通过激光雷达拿到激光雷达的姿势,再从激光雷达转到camera pose,就可以知道摄像头每时每刻是如何运动的,这些大概都是非深度学习的一些方法。
随着深度学习在计算机视觉作用越来越大,大家也在尝试camera pose估计能不能用深度学习的方法来实现。第一个是supervised,如果我们有camera pose的groundtruth之后,就可以通过supervised的方式去解。另外一种方式是unsupervised,主要原理就是,一个camera发生变换之后,一个图像在T时刻经过wrap之后,可以和T+1时刻的图像做pixel wise的差,从而使camera pose算得更准。
对车道线来说,能不能从一张图片直接得到车道线,而不去做camera pose估计或者很重的post-processing?这里面推荐的一个方法,比如3D LaneNet上面提出的anchor-based的方法。这里的一个假设是,车道线如果从原图上面看的话,因为它是经过projection得来的,车道线在近端比较宽,在远端比较窄,每条车道线appearance是不像的。我们如果转成俯视图,大多数车道线都是平行的,appearance比较像。这里一个比较创新的地方是,我们可以把目标检测里面的anchor-based方法推到车道线提取中来。这里是supervised计算camera pose的方法,因其需要从原图转到俯视图,所以需要相机的外参,但这篇文章是通过supervised的方式去做这件事情的,因为它有groundtruth。
上一个网络是从image view正常的成像图方面来做,第二个网络是可以从俯视图里面最终输出三维的车道线信息,这个是anchor的方法,anchor方法是在俯视图里面进行的。俯视图可以假想为一个地面,每一个列都是一个anchor,每个anchor都可能会映射一个车道线;比如这个列对应一个车道线,那么就可以预测每一行的横坐标相对于这一列的横坐标,如果有这个信息的话,即可以把车道线通过anchor的方式预测出来。比如说这里面黄色的横向偏移是指每一条车道线相对于anchor所代表的列的横向偏移,所以有了每一列,其实我们只需要算每一个sample的点与这个sample点的横坐标的偏移就可以把车道线算出来,所以不需要经过一些很重的后处理,这是一种思路。
这是其在模拟数据上面取得的结果,但是这篇文章因为我们从实际中去获得每一帧的camera pose是很难的,所以这篇文章主要是给大家提供一些想法。通过anchor-based的方法就可以直接得到车道线。还有一个end-to-end里面更直接的一个方法,不需要anchor。
刚才介绍的这几种方式都是抛弃了post-processing的过程,从而使深度学习能够直接获得车道线,类似于目标检测中我们直接获得最终结果的一些方式。
首先介绍一些自动驾驶公开数据集,比如说最经典的从KITTI的数据到后面用于分割的CityScapes或者NuTonomy公司提出的NuScenes数据集,或者百度开源出来的阿波罗Scape,还有伯克利开源的BDD。今年CVPR 19上 waymo,、Argo和Lyft分别开放了一些自动驾驶相关的数据集。
截止2017年,Kitti是被引用最多的数据集。KITTI的一个传感器的配置、数据集的分类,比如说障碍物的分类,或者一张照片中有多少个种类的一些分布的统计,也有助于我们自己构建数据集的时候去统计我们自己的数据。
百度也开放了包括激光、数据和图像数据的自动驾驶公开数据集。NuScenes开源的一个比较大的公开数据集,同样包括了摄像头、激光雷达和毫米波雷达等信息。这些细分数据对自动驾驶公司自己收集数据提供很大的参考信息。
伯克利也推出100K数据,其中包含了目标检测和图像分割,主要覆盖纽约、伯克利、三藩和湾区四个城市的数据采集。
有了这么多数据之后,我们要了解的是大规模数据之后,一个模型它基本上是Garbage in Garbage out,如果扔进去的一些无用的信息,那么模型很难学到一些有用的信息。
这是交流的一个重点,就是视觉模型上线是一个闭环迭代过程,涵盖数据采集、数据清洗、数据标注、模型训练、模型测试,最终才可上线。
数据集中难免出现一些错误或丢失。李飞飞的学生 andrej Karpathy 在一个演讲上指出,一个phd学生可能95%的时间在学校设计算法,因为它可以使用一些公开的数据集;可能这5%的时间就是下载数据,做一些评测。那么他到了特斯拉领导自动驾驶小组,75%时间专注在数据。这说明数据是非常重要的一环。这一点我也非常认同。
我们知道在图像数据中通过视角、光照等变化都可以对自动驾驶算法造成影响。
在自动驾驶数据中,两个比较简单的场景,比如说视野开阔、车少、车道线有比较清楚的样例。但在实际场景中有很多更复杂场景,比如夜间虚线的车道线场景,夜间光线比较弱,那么识别这些车道线其实是很难的,即使去做标注也很难去准确地把车道线给标出来。另外是拥堵跟车时候拍到的物体、比较近距离的障碍物,这对车道线、障碍物标注或者算法设计都会有一些挑战。
另一个极端例子是“加塞”,如果一辆车从旁边车道“加塞”,那么它会挡住视野中的车道线,这对车道线标注、训练或者上线都会带来挑战。有时候一辆大车会完全挡住所有的视线,这对车道线的算法会带来很大的挑战。
从中可以看到,自动驾驶如何高效地收集这些有效数据其实是很难的。而且这些数据大量都是不均衡的。如果搜集这些数据场景,比如道路分叉,甚至是在高速上面或者环线上面道路分叉占整个数据量是其实很少的,覆盖更复杂的场景是数据方面的一个挑战。
当场景定义结束后, 有效数据的获得也很重要,最后是模型的迭代。英特尔CEO曾表示,自动驾驶数据量很大,如果要收集所有信息的话,大概4000 GB/天,但是我们并不需要每时每刻都把所有信息收集起来。
数据方面要考虑的四大因素:第一个是数据获取,即如何获取一些最有效、最关键信息;第二个数据存储;第三个是数据管理,即如何从中间拿到最有效信息、如何管理这些信息,使各个组都能够快速或者便捷的获取这些信息进行算法开发;还有一个最关键是数据标注。
那么如何从数据获取到数据标注?数据获取要平衡三个因素,第一个是包含场景,比如要包含各种天气、各种城市或者高速场景、各种车道线的细分类型直线/虚线等各种场景。第二个因素,要考虑推向市场的功能的紧急程度,比如模块迭代,因从算法开发第一天就支持所有各种复杂场景并不现实,所以需要根据推向市场功能的紧急程度来定义要获取什么数据。第三个是根据现有资源,比如现有的资源从算法设计或者人员都有可能影响数据的获取。
数据存储有几个方面需要考虑:第一个是需要本地存储还是云端存储,我们能如何更高效的利用云端或者本地这些架构。另一个是如何存储采集车上的数据,因为采集车运行一天或者连续跑很长时间,数据量是非常大的,很多时间花费在如何从产业车上面把数据拷走。另外一个是数据安全如何保证。再是数据管理,多与存储相关。比如原来数据存在什么地方,或者需要存储哪些数据,如何使每个人都能便捷地读取这些数据也有利于整个开发效率的提升。
关于数据标注,上面介绍了几大公开数据集,每一个都有自己标注的一些定义,所以我们需要根据自己算法设计或者功能实现定义合理的标准。第二是要考虑量产经济因素,比如说我们要和外面第三方合作,也要考虑如何使这些标定义的标准能够使第三方能够快速接受。最后是确保达到最佳标准,因为标注即使是通过人工筛选、人工验证,还是有很多噪声涵盖其中,所以如何提升标注的准确性,也是很重要的一个因素。
总结一下,视觉方案是一个闭环,从数据的采集到数据清洗,到拿到清洗有效数据之后的数据标注。从标注团队拿到标准数据之后,进行了模型训练或者内部评测,经过模型测试之后,如果达到要求模型即可上线。
有整个闭环的流程之后,即可支持模型的迭代。通过模型迭代不断解决上一个版本遇到问题,一个模块或者视觉模块迭代的快慢往往取决于这几个步骤,比如数据采集或者根据某个版本发现这些问题进行的数据清洗、更准确的数据标注、模型内部的测试和上线,如果能形成一个快速的闭环,那么开发节奏会高效很多。
雷峰网原创文章,未经授权禁止转载。详情见转载须知。