特斯拉AI日(2021)

目标:设计一个神经网络,可以处理原始的信息(车上部署的8颗摄像头),转变为3维向量空间信息(该空间可用于自动驾驶),该3维空间包括lines, edges, curbs, traffic signs, traffic lights, car 位置,朝向, 距离, 速度。
效果展示,下图1就是图像输入转为向量空间(汽车仪表盘)
图1

1 视觉感知
网络整体方案如下图,主要分为3个关键模块:主干网,跨摄像头信息融合模块和video神经网络模块,下面章节从实际问题引出这3个模块

1.1 多任务学习网络-HydraNets
1.1.1 Neural network backbone-RegNet
1、 下图3的左边部分可以看出是残差网络,多个残差网络block的串联
2、 残差网络使用的是Regnet网络(某类resnet类),原因是RegNet为神经网络提供了一个非常好的设计空间,很好地权衡延迟和准确度
regnets offer a very nice design space for neural networks because they allow you to very nicely trade off latency and uh accuracy
3、 Regnet针对不同尺度输出不同的特征,如图2,底层特征是高分辨率低channel,顶层就是低分辨率;因此在底层的神经元仔细检查图像的细节,顶层的神经元看到大部分的图像和场景背景
a number of features at different resolutions in different scales
really scrutinizing the detail of the image
see most of the image and a lot of that context have a lot of that scene context

                      图2

                            图3

1.1.2 feature pyramid network 特征金字塔网络-BiFPN
BiFPN可以在多个尺度的特征上进行有效关联,并共享大量信息(例如图4底层的神经元看到一小块不能确定是否是车,但是顶层神经元知道是这条公路的消失点,这样就有助于你识别这可能是车---小目标检测??)
Multi-Scale Feature pyramid fusion
they get to multiple scales to talk to each other effectively and share a lot of information

                        图 4

1.1.3 Detect Head
获取多尺度的特征融合后,然后进入不同任务的Head(如图6),比如图5目标检测这里就是yolo目标检测算法(one stage),该算法的步骤是初始化一个光栅,每个光栅点的特征来表示该位置是否有车以及该目标的其他属性,比如车的类型

                              图5

                                图6

1.1.4 总结
优势:
1、feature sharing,测试时效率高,因为只有一个backbones
2、decouples tasks任务解耦,可以单独fine-tune微调任务,比如更新某一个任务的数据集或者任务的head的网络结构,不影响其他任务,所以不用重新验证其他任务Head
3、representation bottleneck,bottleneck指muti-scale features的保存在Cache, 不用每次都End-2-End训练,从而加速微调(所以图7网络下部分是灰色,fine-tuning不用End-2-End跑整个网络)

                              图7

1.2 跨摄像头的信息缝合
跨摄像头的信息缝合 stitching up individual per-=Camera road edge predictions across cameras & time
1.2.1 引出该模块的现实问题
章节1.1处理流程是:每次输入单个图片,网络对该图片进行各种预测任务,存在以下不足
自动召唤业务
smart summon自动召唤业务中,如下图8是每个摄像机识别的路边界,自动召唤业务车会绕着停车场找是谁在召唤车to find the person who is summoning the car,问题是图8有7张图,每张图都有路边界信息,路边界分布在多张图片上,没有全局的路面信息,不知道车要怎么开you cannot just directly drive on image space predictions,需要将所有的摄像头中的路边界投放到一个向量空间中cast them out and form some kind of a vector space around,这个工作也就是我们使用C++开发的环境建模追踪器Occupancy Tracker

                           图8

使用Occupancy Tracker,图8跨摄像头的场景和边界结果被缝合,结果如下图9;

                        图9

Occupancy Tracker有2个主要问题,图10
图10

  1. 用c语言实现跨摄像头融合和跟踪很难实现,原因是超参数非常复杂
    the across-camera fusion and the tracker are very difficult to write explicitly

  2. 图像空间和真实空间不一致,效果不太好,图11,根本原因是必须对每个像素都需要精确的深度have an extremely accurate depth per pixel in order to actually do this projection

                        图11
    

大物体
如果利用每个摄像机单独进行预测,那对于图12这种1个大卡车占据5/8个摄像头,如果每个摄像头单独进行预测,没有一个摄像头可以看到完整的大卡车,所以就不能对大卡车做准确的预测,进而很难融合这些测量数据incredibly difficult to fuse these measurement

                     图12

1.2.2 Multi-Cam Vector Space Predictions
Occupancy Tracker存在以上2个问题,我们目标是需要找到一个神经网络图,输入各摄像头图像通过RegNet和BiFPN生成的特征,输出车的向量空间(图13红色模块);即该神经网络的作用是融合摄像头的图像特征,从图像空间特征映射到向量空间特征

                              图13

该神经网络有2个需要解决的问题:
1、 图像空间特征怎么转化为向量空间特征
2、 向量空间的预测需要向量空间的数据集(在视频数据标签和仿真中有解释)

针对第一个问题,首先想到的是基于摄像机标定的近似投影(自上而下的物体投影,鸟瞰图), 如图14。对每一个像素,比如对图14黄色像素,需要根据图像空间特征(包含位置信息,内在信息和外在信息)确定该像素是否是一个路边界。 这种投影方式依赖于路面地理表面,如果感兴趣的物体被遮挡,你可能需要看看其他地方,所以这不是一个固定位置到固定位置的转换。
3、 为解决这个问题,使用transformer来进行图像空间特征转化为向量空间特征

                              图14

该transformer使用多头自注意multi-headed self-attention. 有效的做法是
1、 初始化一个和输出空间形状一样的raster光栅,然后里面存位置编码(包含位置大小等信息),然后通过一个mlp编码,生成query vectors
2、 所有图像和图像的特征发出他们的keys和values;然后queries,keys,values输入到多头自注意模块,每个图片会广播他的key
Key的内容是我是那个位置,看到了某个东西
Query的内容是输出空间的位置,然后需要查这个位置的特征
Key和query相乘,然后value得到输出。
Query我是输出空间的某个像素位置,我在找这个类型的特征。然后这个keys和queries相互乘法,然后values根据相乘结果输出最终结果

图15
1.2.3 摄像机校准的差异variations in camera calibration
车上的各摄像机存在稍微不同的方式稍微歪了一下,如图16, 所以当进行图像空间到向量空间映射的时候需要知道摄像机怎么校准,然后需要把这些校准输入给神经网络mlp。因此需要连接所有图片的摄像机校准和输入给mlp.
但是有个更好的办法是将所有照片用一个特殊的纠正变换 转化到 合成虚拟摄像机如图17粉红色层,因此在raw层之上增加了图像纠正layer,作用是进行摄像机校准和将所有照片转成虚拟公共摄像机

图16

						图17

1.2.4 总结
单摄像头和摄像头融合的优势
1.在目标检测领域,对于大物体,单相机没有多相机融合检测效果好

							图18

1.3 Vedio 神经网络
1.3.1 引出该模块的现实问题
问题1:Lack of memory
HydraNets+跨摄像头的信息缝合 仍然在时间上的每一个单点时间独立地运行still operating at every single instant in time completely in dependently,针对很多场景如图19(车是否是停下来了,车的速度,车临时被遮挡,刚经过的路标),预测都需要视频上下文信息,因此我们需要在网络中实现这部分的能力;

图19
1.3.2 Vedio神经网络
如图20,在网络中加入video 模块
网络的前面部分已经获取了多尺度的feature,在video模块之前插入了feature队列模块来存储一段时间内的多尺度的feature;video模块就可以融合这些信息。之后再head中进行各任务的预测。
注意,特征队列模块输入还有Kinematics,他主要是速度和加速度;所以feature队列输入不仅有摄像机看到的特征还有车运动的信息
图20
1.3.3 Feature 队列模块
特征队列模块如图21,该模块主要是拼接一段时间多次度摄像头特征+车运动kinematics信息+位置编码,然后保存在一个特征队列中;然后输出给video模块使用

图21
feature队列的机制:基于时间的feature队列和基于距离的feature队列
基于时间的feature队列
如图22右半图,这是一个实际场景,当车到了十字路口,车辆交叉运行,前面一些车会被临时阻挡。我们将会停下来等红绿灯,这种临时遮挡场景什么时候push到feature队列,使用基于时间机制的push队列(比如每27ms写到队列)。
当车被临时遮挡,神经网络可以查询内存中的feature队列,从当前时间之前的特征进行预测

							图22

								图23

基于距离的feature队列
另外一个场景:已经经过的路标,如图24
比如需要预测当前车道是直行还是转向车道。但是这些车道转向信息在已经比较远的跑过路段,使用基于时间机制的push队列(27ms),包含转向信息的feature在队列很前面(比如等1分钟红绿灯),导致转向信息容易被网络遗忘/忽略。因此除了基于时间的队列,还需要基于距离的队列(比如每米push到队列)

							图24

1.3.4 Vedio模块
图25展示几种信息融合的方式:3D CONV、Transformer、RNN

								图25

主要讲述Spatial RNN Video mudule,如图26
思路是:因为自动驾驶在2维的路面,构造一个2维网格的隐藏状态;当车开起来,就更新车附近的可见范围内的对象。使用kinematics计算出车在隐藏特征网格的位置;

图27 展示车开动后,RNN不同channel隐藏状态的可视化图

						图27

1.4 下一步计划
1、 基于时间和空间的融合在神经网络的后面部分,是否可以在神经网络的前面部分进行时间和空间的融合(cost volumes or optical flow-like networks on the bottom)
2、 输出是稠密光栅rasters,而在车上后处理这些稠密的光栅是非常昂贵的;在非常严格的延迟要求下,这不是理想的。我们在寻找仅适用稀疏结构的预测道路的方式,类似逐点或者其他不需要昂贵的后处理
2 规划和控制
核心目标:安全、舒适、效率
规划关键问题:
1、 行动空间是非凸的(有多个好的解决方案,但是很难找到全局持续好的方案,所以会陷局部最优解)
2、 高维,车需要为后面10-15s做规划,来计算出正确的速度和加速度,此过程运行有很多参数
discreate search methods离散搜索方法
可以解决问题1,因为是离散的,不会stuck在局部最优解(连续函数优化容易stuck在局部最优解)
可以解决问题2,因为离散不适用大量信息
解决方案:

3 自动标签和仿真

posted @ 2021-08-27 10:08  哈哈哈喽喽喽  阅读(260)  评论(0编辑  收藏  举报