自动驾驶通用目标感知体系的构建
导读:
7月26日,商汤绝影联合智东西公开课策划推出的「商汤绝影自动驾驶技术公开课」顺利结束。商汤绝影总监王哲博士围绕《自动驾驶通用目标感知体系的构建》这一主题进行了直播讲解。
王哲博士首先分析了自动驾驶通用目标感知体系构建的三大挑战,之后从数据、算法和算力三个维度讲解了商汤绝影通用感知能力的构建,并以清障车为例分享了商汤绝影通用感知能力的实战应用。
本次公开课分为主讲和Q&A两个环节,点击阅读原文可观看完整直播回放。本文是王哲博士的主讲回顾:
感谢大家进入今天的直播间,非常荣幸代表我们团队做本次直播分享。这个项目在内部叫General Object Perception,简称GOP。
今天讲解的主题是《自动驾驶通用目标感知体系的构建》,主要从以下4个方面展开:
1、构建通用目标感知体系的挑战
2、解决问题的三个维度
3、实战与结果
4、我们还在做什么
1
构建通用目标感知体系的挑战
首先问一个问题:为什么需要通用目标感知?
从上图可以看到,近年来随着自动驾驶技术不断地落地,已经有一些量产车型开始交付。而在L2+、L3级智能驾驶汽车的辅助驾驶功能演进趋势上,从单一场景到多重场景,从高速到城区,场景的复杂性在不断增加。
随着场景覆盖度的提升,尤其是自动驾驶车辆进入到城区之后,所面临的挑战也越来越大。例如在城区可能会碰到各种各样执行任务的车辆,原来只要知道这些是车就可以,但进入城区之后,如果能知道它们各自的车型、在做什么任务,就能更好地做一些驾驶策略的调整。
除此之外,城区里经常会碰到的是施工场景,在各种各样的施工场景中,可能包含了各种形态的交通警示物,对这些长尾标识的感知需要做好覆盖。城区里还有各样形态的交通灯,包括各种遮挡、截断的交通灯,或者一些复杂场景里有多个交通灯需要跟地图匹配,或有些临时的红绿灯等。这些实例对感知算法提出了非常大的挑战,因此需要识别非常丰富的语义元素,同时要覆盖形态各异的目标物。
我们把通用目标感知的挑战分为三个方面:
首先是开集的目标,也就是自动驾驶车辆在道路上行驶时,交互的这些目标是一个开集,即无法穷举或提前预设到今天会遇到什么样的物体。
对这类目标的解决方法:其一是车端是否有一些在线算法能够应对它,至少能够识别出来这类物体,并配合多传感器的方案进行检测和避障;其二是自动驾驶汽车一定是一个不断动态升级迭代的过程,能否在碰到一个开集的物体后,通过很短的时间迭代出一个比较好的算法,解决这类问题带来的检测、跟踪问题。
第二是目标的语义层级会逐渐细化,从最开始只有交通参与者到越来越细粒度的语义标签。
第三是每一种类别的语义元素一定会是长尾分布的,即可能大部分目标长得类似,但是总有一些不太一样的,这些目标称为长尾分布,这些分布对感知算法带来比较大的挑战。
下面具体看下这三个挑战的一些例子。
首先目标类别为开集集合。如上图所示,是我们的自动驾驶车队在路测中遇到的一些真实场景,包括路上掉落的石块、三角旗线绳、地上的苫布、飞过的塑料袋、路上跑过去的狗,甚至是空中飞过的鸟。
通常而言,这些物体并不是自动驾驶或学术界会定义、检测的目标。它的难点主要有两个:第一个是这些类别是无法穷举的,并且非常杂,如果去做,会发现毫无头绪,并且无法梳理出一个自上而下的标签体系来管理、维护这些类别;第二是这些类别出现的频率比较低,所以需要非常大的数据底库,挖掘这样的类别。
第二点是语义层级需要不断地细化。我们知道最开始做辅助驾驶时,比如LKA、FCW等功能,可能只需要简单识别一些交通参与者,像知道前面是行人、车辆、非机动车,然后做一些避障或简单的车处理任务。但假如有更高级的语义层级,比如能进一步区分机动车里包含了大型运货车辆、特权车、小型车,对于每一种车型所采取的驾驶策略是不一样的,不同的车型可以采取不同的避让策略。
特权车还可以进一步细分,我国道路安全法规定了4种特权车辆,包括警车、救护车、消防车、道路抢险车,这4类车可以无视交通信号、不遵守交通规则,即使是在限速行驶的道路,它们也可以无视的规则,是一类对路权比较强的车。
另外,我们还增加了一些类别,比如校车,它一般是接送学生上下学。那么校车有什么特点呢?它的下车车门附近有一个警示牌,在校车行驶过程中是收着的,当学生下车过程中警示牌会展开,所以这个车本身的形态是会变化的。如果感知算法能够识别出它是一辆校车,就能对驾驶行为做更好的策略调整。
第三是目标形态呈现长尾分布。上图展示了同类型车不同形态的图片,包括拖拉机等农用的机械车、拖挂车、运输轿车,厢式货车、垃圾车、警车等,还有一些运载着突出目标的车,抢险车、救火车等,它们都属于车,但是它们的形态非常不一样。
那这三个挑战该如何解决呢?
2
解决问题的三个维度
下面从三个维度来解决以上提出的问题,分别是数据维度,算法维度和算力维度。
从数据维度,首先解决开集的问题。这是所有自动驾驶公司都避免不了的问题,如何认识和规划驾驶场景中遇到的所有目标?从目前掌握的领域知识来看,我们把自动驾驶里需要互动的目标分成了4大类。
这4个大类分别是交通参与者、交通设施、动物和路上其他障碍物。
为什么这样归纳呢?
交通参与者是在自动驾驶中最高级别的一些物体,需要尤其注意避免碰撞到它们,因为这些物体是有人的意志参与其中,通常是一些智能体,可以是人骑的车或者人开的车辆,这些物体一定要避免人员损伤。这些交通参与者是具有一定的理性,有自己的一些价值函数。我们通常会对它们做检测、跟踪,甚至在下游模块需要对每一个交通参与者做一定程度的预测,包括它们的行为预测和轨迹预测,所以这类物体的优先级非常高。
第二大类是路上出现的各种各样交通设施。我们理解交通设施是定义在交通场景中有一定功能属性的设施,比如车道线、交通灯、交通台、交通警物等。这些交通设施总体上规定了一个道路的结构,以及定义了可行驶区域,并且能告诉大家在这段可行性区域内,有怎样的交通规则,需要遵循怎样的交通信号。
交通警示物比较典型,它本身属于一个障碍物,比如一个水马或者一个雪糕桶,放在前面需要绕行它。同时,它又承担了一个交通警示物的作用,表示在这个区域附近肯定存在着一些需要注意的施工场景或事故现场,即它本身含有一些功能,所以这类统称为交通设施。
第三大类是动物。为什么动物单独分为一类呢?我们认为动物是一个天然会运动的物体,那在自动驾驶场景中,运动和非运动物体对于下游的决策规划是非常重要的。如果是一个会运动的物体,可能需要对它的速度、运动状态进行估计。所以把动物单独分为一类,并且动物会动,但又不懂交通规则,可能会乱闯马路,所以这类物体跟交通参与者又有区别。
最后一类是在路上出现的其他障碍物。这里需要强调的是一定是路上的其他障碍物,有“路上”的定语。例如一个轮胎,它在行驶路的前方,会成为一个障碍物,同样轮胎放在路边,它与我们的行驶没有形成交互,就不需要定义这个轮胎,甚至不需要管它。路上的其他障碍物包含了非常多的杂类,它是一个动态的类别标签,我们会在里面不断细分出新的类别,并把它定义成已知的类别。如果没有归纳到已知的类别里,它会被标记成其他类。
以上我们定义了最上层的4大类,结合商汤在2021年发布的“书生”标签体系,这4大类可以继续往下细拆。书生是结合了WordNet跟Wikidata里面的一些知识图谱,并把这些名词之间的关系梳理出来,然后把自动驾驶领域的知识跟书生的标签体系做了融合,整理出一个有6层、累计3000个以上标签的自动驾驶标签体系。
这个标签体系本身也是一个知识开集的体系,可以不断地增加新的标签。当有新标签时,我们会查找它所处的上一级和下一级,并把它添加到一个合适的位置上。通过这样的体系,自上而下规划出一套自动驾驶要感知哪些物体的定义。
有了这个标签体系之后,会看到一些物体出现的频率非常低,因为它是一个长尾的、很少见的物体。如果按照传统的做法,可能需要派车队去现场采集这样的目标,这是很难采集的过程。所以我们更倾向的是把已有存量的所有数据以及增量的一些数据,通过一定的方式把那些潜藏着的、以前没有意识到需要检测物体的数据挖掘出来。
因为商汤从2017年开始做自动驾驶,已经有非常深厚的数据积累,数据的来源也是多种多样。但这些数据里,一些早期的数据存在故障问题,比如相机故障,激光雷达故障等等,如果这些未经清洗的数据直接加到整个模型训练的pipeline中,一定会给模型带来一些confuse。所以在这个过程中,我们开发了一个数据筛选引擎的工具。
这个工具本身有两套过滤规则,其中一个就是通用规则。通用规则主要针对每一个传感器自身的质量问题做检查,包括点云的完整性检测、图像质量、标定质量以及数据传感器跟传感器之间是否有缺失,或者是否有一些标定参数的缺失等。通用规则主要是考虑数据本身的质量问题。
另一个是在业务迭代以及研发过程中,一定会有想要挖掘特定场景的数据。像某些特定的道路场景,比如我们希望解决收费站的横杆问题,则需要挖掘一些收费站的场景。还有特定的目标、天气、光照,特定的设备、多模态关联数据等等。这需要一些特定的筛选规则,这些规则本身也是由背后的模型驱动,能够自动地打标签,并从里面挖掘出特定的数据。
通过这个数据筛选引擎,我们把商汤从2017年到目前为止,所有存量的自动驾驶数据都做了一遍盘点和清洗。在整个过程中,前期是通过人力,后期通过自动算法,这样最终可以把整个原始数据到获取最终成品的高质量数据的人力成本,下降到一个比较低的、可控的水平。
上图展示了数据筛选引擎筛选出来的一些特定场景的特定目标,包括一些道路场景、天气场景、光照场景以及一些特定的目标。这些目标一般是业务的同学,在某个时间点迭代某一类型的模型,从数据库的大池子里面有效挖掘出的一些场景数据。
最终梳理下来,经过过滤和筛选之后,GOP数据池总共已经有3亿帧高质量数据,包含了100多个细分的数据集,覆盖了20多个不同的道路场景,10个以上的光照天气条件,以及3000多种不同类别的目标,并且这个数据是多模态数据,里面包含了6个以上不同视角的相机,多个激光雷达、毫米波和高精惯导。
讲完数据之后,再来介绍下算法。近年来人工智能已经迈入到一个新的阶段,即现在正在进入一个超大模型的时代,从去年1月份OpenAI发布了一个超大的模型DALL-E 和 CLIP,参数量已经达到了130亿的规模。最近各个科技公司都在发布自己的超大模型,商汤也在去年11月份发布了书生通用视觉技术体系,包括数据、模型训练,代码框架以及各个基准评测等内容。
目前学界主要通过无监督学习的方法来完成超大模型训练。因为这些数据是不需要标注的,只需要拿到原始数据做一些无监督的任务,就可以去对超大模型进行低成本的训练。商汤通过同样的方式,并且加入了各种业务端提供的业务侧数据,两种数据混合在一起训练超大的基模型,这些基模型在训练完成之后,能够比较轻松地泛化到下游的任务中。只要通过少量的数据反馈,就能在下游的任务中达到比较好的精度。因为这个模型本身参数量是非常大的,比较容易突破现有技术在业务上的一些精度瓶颈。
现在回看自动驾驶业内的主流玩家,像特斯拉和Waymo,它们公开的资料显示,都直接或间接的融入了一些超大模型的技术,比如特斯拉DataEngine数据闭环、Waymo的NAS模型工厂中主动学习的数据闭环等。
商汤在做超大模型方面开启的比较早,我们以书生(INTERN)为例。
书生是商汤去年发布的通用视觉技术体系性技术,里面包含了上图的几部分,一个是数据系统,即海量数据怎样获取、维护和管理;模型结构部分,怎么通过自动的网络结构搜索得到一个在端侧或在芯片侧的最优模型,适配各种大小的算力;然后是上游的模型训练,通过一些无监督的方法对模型进行预训练(pretrain);最后是到下游的迁移过程,在这个过程中还有一套评测基准,实时监控模型在通用性和泛化能力上的表现。这几个模块是协同组成的,一旦训练完之后,就产生了一定的技术壁垒,并且研发成本也比较高。
基于书生的模型来看,这个模型本身有100亿的参数量,这是一个非常庞大的训练工作。在训练过程中,大概有10个以上的监督信号帮助模型,适配各种不同的视觉或者NLP任务。
当大模型训练完之后,它会跟业务侧的数据和任务进行结合。比如在自动驾驶场景中,大模型跟自动驾驶场景的数据结合之后,可以实现自动标注。大模型会训练几个版本,一个是“通才”模型,通才模型会把所有的数据全混在一起做训练,它在通用性上是最好的。同时也训练一些“专才”模型,这些“专才”模型会针对不同的场景挑选一些数据,比如有远距离检测小目标的模型,或者一些黑夜看不清场景数据上的模型,最后将“通才”模型跟“专才”模型做一个结合,自动检查打出来的标签质量。
按照目前大模型的表现来看,确实非常给力:99.5%的数据可以直接通过自动标签到下游模型进行训练;0.5%以下的数据质量是不够的,可以通过这种方式校验出来,然后通过人工把它重新的修正,再加入到训练中。通过这样的一套流程,可以把标注的速度大大提升,标注成本大大地下降。
第二个应用是车端小模型,如何通过这套技术体系,在一个低算力的芯片上赋能小模型。通过模型搜索的体系NAS直接搜索一个端侧、可支持OP的模型,算力也匹配到芯片上所能够支撑的模型,通过超大模型跟小模型之间的知识蒸馏与迁移学习,让小模型的精度进一步的提升。上图举了一个例子,小模型的参数量只有大模型的1/400,但它的精度达到一个比较可观的水平。
刚才也提到商汤绝影建立了一个自动驾驶的标注体系,由于成本上、工程上等种种考虑,并不是所有的图片都标注了最精细的类别,这是一个非常庞大的工程,那如何把复杂的、不同层标注颗粒度的数据混在一起训练呢?
我们就采用了层级互斥图的方式,把自动驾驶里定义的3000多个类建立成了一个标签树,这个标签树上每一个节点就是一个标签。节点与节点之间会形成一些边,这些边有三种类别,一种是互斥的边,即非黑即白,要么是交通参与者,要么是交通设施,它只能是其中的一个;有一些边是层级别,交通参与者包含人、机动车辆,如果这张图上标注的是人,他便是一个交通参与者;最后一种是没有边,这意味着两种目标是可以共存的,比如这个目标既可以是人,也是一个非机动车的骑手,这两种标签是可以同时存在的。
通过这样的层级互斥图,可以让模型在所有标注层级的图片上联合训练,并且这个图模型是一个开集的数据集。如果这张图上只标注了交通参与者,但是不确定是机动车、还是人或者是其他类别,它可以预测父节点,但不会影响子节点的概率。通过这样的方式,好处是可以把所有的数据综合起来同时训练,不需要对每一张数据、每一张图或者点云做最精细的颗粒度标注。
最后一点是在算力上。因为一个超大模型的训练pipeline,需要非常大的算力支撑。截至2021年末,商汤在国内外已经建立了23个超算集群,总算力达到了1.17exaFLOPs。今年年初在上海临港正式落成启用的新一代人工智能计算中心,是目前亚洲最大的人工智能数据中心之一。其算力超过了之前所有算力的总和。
3
实战与结果
下面以清障车为例,清障车是一类在高速上清理出现事故或者抛锚车辆、并能够迅速运送车辆的一类车。清障车平时出现在高速上,但开得慢悠悠,而且平时比较少见。之前也发生过一些事故,一些开了辅助驾驶的车没有识别出清障车,最终导致自动驾驶汽车撞上了清障车。接下来以清障车作为做实战的样例,来看我们怎么做识别。
首先清障车类别不一定在原来的检测类别体系里面,相当于是一个新的类别。对于新的类别,目前手上没有任何的模型能够检测它,所以需要有一个冷启动的过程,冷启动过程如上图所示。
我们会开发一个基于书生体系的黑盒模型,这个模型本身由两个分支组成,一个是图像分支,一个是文本分支。图像分支会输入一个图像,得到一个图像特征,文本分支输入一句话或者一个单词,能得到一个文字的特征,这两个特征会做一个相似性的计算。如果相似很高,说明这两个特征可能指的是同一个物体。
上图是之前的一个开源的算法,但在书生体系里,通过自动驾驶的数据重新训练过。通过这样的方式,可以通过清障车图片、一些清障车样例图片,或清障车的单词在GOP数据池里查询这样类别的图片,得到一个看起来合理的结果,即能够把长得有点像清障车,或有可能检测错,但大概率疑似清障车的图片找出来。找到这些图片之后,可以做一些初步的标注和模型训练,得到一个模型。得到模型之后,就可以把它放到更大的池子里做数据闭环。
数据闭环如上图所示,首先会把模型在自己内部的数据池里面做进一步的挖掘,然后找到更多的现场式数据进行标注,进一步提升模型的精度。同时也会把模型部署到车端,通过大模型蒸馏小模型的方式,得到一个比较高精度的小模型,再通过影子模式放到我们量产的车队或者自动驾驶的车队里,让它们先去采集一些数据。通过这样的一套机制之后,再把这些数据导出来,并把这些数据进一步标注,通过大模型跟小模型的一些自动标注流程,再加上人工质检,得到一个不断增加的干净标签数据集。这个数据集再赋能给超大模型跟车端的小模型,进一步提升精度,通过这样环路的方式不断的迭代模型的精度。
利用这套流程去做清障车的检测,大概在三天时间内可以把存量的这些数据都挖掘一遍,同时在车端部署,总共找到了100多万个清障车数据,模型的精度也从一个比较低的水平提高到95.8%。
在实战过程中还有更多的例子,像碰到了狗、水马、锥形桶、隔离桶等类别,都可以通过这种数据闭环的方式,先冷启动,再训练模型之后,放到车上或放到数据库里面进行挖掘,通过这种方式做模型的迭代。
4
我们还在做什么
商汤绝影现在与诸多车企进行着广泛的合作,我们找到了一些业内头部的车企,做数据闭环,我们称作绝影赋能引擎数据闭环。它包含了感知的数据闭环和决策的数据闭环。目前各个车企包括一些自动驾驶公司都在提数据闭环,那商汤有什么优势?
刚才也介绍到,一方面商汤的超算中心有大量的算力支撑,能够更有效做数据挖掘。另一方面是有超大模型,能够非常快速生成高精度的伪标签,以及赋能业务端的模型。这样在超大模型跟超算中心的加持下,可以更好地解决这些数据闭环里特定场景的问题。截至去年中,商汤已建成世界上最大的计算器视觉模型,该模型拥有超过300亿个参数。
以算法立身,商汤绝影要做的事情是把数据的效率充分利用起来。我们有丰富的业务场景资源,包括各种各样的自动驾驶落地的场景。通过数据闭环、数据筛选引擎的模式,能够低成本、高效率的做自动数据筛选、自动标注,模型训练跟部署,能够从海量数据里挖掘出最有效、最高质量的数据。另外通过AIDC数据中心的算力和超大模型赋能,做数据的挖掘。
以上是今天的分享的内容,谢谢大家。
标签:数据 模型 一个