Chenfan Blog

Do cool things that matter.

0%

Tesla AI Day 2021 回顾

终于要开始往博客里面写点跟我现在去的新行业相关的东西了。

回顾一下今年特斯拉的 AI day。

Source

直播的原始视频发在了 YouTube 上,这里

发现 B 站刚好有人把完整的 3 小时都搬过来了,就拿过来贴在这里:

顺便 YouTube 评论区置顶的这条贴了视频的几个关键时间点目录:

Join us to build the future of AI → https://www.tesla.com/ai
0:00 - Pre-event
46:54 - AI Day Begins
48:44 - Tesla Vision
1:13:12 - Planning and Control
1:24:35 - Manual Labeling
1:28:11 - Auto Labeling
1:35:15 - Simulation
1:42:10 - Hardware Integration
1:45:40 - Dojo
2:05:14 - Tesla Bot
2:12:59 - Q&A

Let’s go

正片差不多 38 分钟左右开始,一开始上来就放了一段自动驾驶片段。应该是辆 Model 3 或者 Y,可以在中间的中控上看到实时的环境识别和规划路径的可视化效果。左边红色的线是道路边缘,白色和橙色的应该是识别出来的车道线,绿色的是规划出来的目标路径。不得不说视频里面的效果还是很流畅的,中间也经过了一些复杂的交汇车和等待行人的十字路口等等场景。

46 分钟马斯克上来招了一波人 …

Vision @ 48:44

之前演示的视频就是目前特斯拉在车上采用的纯视觉方案,8 个摄像头通过神经网络处理后构建出一个 3 维的向量空间,然后所有的识别和规划都在这个空间中完成。

他们用了 ResNet 作为 Backbone,输入是摄像头采集过来的 1280 * 960 的 12 位原始图像。这里用的直接是摄像头的 RAW 数据,可以减少一些视觉处理算法的预处理等等,理论上能最大限度地保留信息?

接下来过一个 BiFPN 去对 Backbone 中的多层数据做一个特征融合。融合后的特征最后再被拿过来做具体的识别和分类。视频里有一页给了 cls 和 reg 的输出尺寸分别是 640 * 480 * 1 和 640 * 480 * 4。

HydraNets

这里有个重要的点是前面到 BiFPN 为止的数据和特征都是被接下来不同的分类任务共享的,后面接上不同的检测头就可以从原始的图片数据里面分别检测出物体(可以是车、人、其他障碍物等等)、车道线、红绿灯等等。每个检测头都是独立的,比如这里给出的细节是 lane 只用了个简单的全连接,其他的目标识别则是用了更复杂一些的网络。这种 one model + multi task heads 的方式:

  1. 所有任务共享完整的同一组视觉 feature,实际 inference 的时候就很高效了;
  2. 后面用不同的检测头再去做具体类别对象的识别,可以针对每一个不同的对象独立做检测头的 fine tune;
  3. 训练做 fine tune 的时候也可以从下面 cache 住的 feature 开始。

后面出结果的时候也是一帧图片进去,跑完整个网络直接就能同时出来所有不同类型对象的检测结果。


单摄像头拍到的视频帧会少了个很重要的深度信息,因此每个摄像头得到的结果是没办法简单地直接放在一起用的,且单独一个摄像头检测出来的结果也很容易会产生偏差,也会有一个对象可能同时出现在多个摄像头的画面里面的情况。所以接下来是一个叫 occupancy tracker 的部分,需要把所有摄像头识别出来的车道线、物体等等根据它们的空间关系融合到一起去(就是前面视频里面提到的 3 维向量空间)。

“It’s very easily said much more difficult to actually achieve.” Emm … 这句话好像在哪里听过的样子,不过确实这个想想就很麻烦。

模型先放到后面说,首先第一个技术点是不同车上摄像头的位置会有偏差,每个摄像头拍到的画面也都会有一定的畸变,每个画面到最后提取完 feature 再去做调整就不太好操作了,效果可能也不好。所以他们直接采用的是前融合的方式,在摄像头的 raw 数据后面加了一个 Rectify 层,在获取到图片数据的时候就用上相机的标定数据等等信息,对图像做去畸变矫正以及变换到一个标准的 virtual common camera 的视角上去。

这样是不是不同车上的数据在最后训练和识别的时候都能够完全统一到一起去了?666

Multi-Camera Fusion

然后回到这个融合模型上,说实话细节部分我还没有完全理解(惭愧…),他们用了个 transformer 来做多目 image 到 BEV(Birds’s-Eye-View?) 空间的转换和 fusion。不同摄像头图片上提取到的 feature 通过 context summary 和 positional encoder 合到一个网络里面去,得到这个 transformer 里面的 Q。每一张图片和它们的 feature 分别变成了 K 和 V。如果 do all the engineering correctly(听起来确实挺麻烦),Transformer 的最终结果就可以拿来做融合后的最后识别了。输出的 multi-camera features 的尺寸是 20 * 80 * 256。

后面的演示结果里面 Multi-Cam 前融合得到的车道线和物体检测结果都确实要比做后融合的效果要清晰和稳定的多。


下一步是对所有视频帧的数据进行时序融合,只有这样才能进一步确定下来每个检测对象的速度、方向、被遮挡等等的信息。

Feature Queue

每一帧的 feature(20 * 80 * 256 * 60)加上 IMU 中得到的车本身的姿态信息(1 * 1 * 4 * 60)再加上位置编码(1 * 1 * 40 * 60)下采样后得到的 video feature(20 * 80 * 300 * 12)会存放到一个 feature 队列中。Feature 队列中数据的出入队需要同时基于时间和距离信息决定,时间很好理解,太久之前的信息就没有用了。距离信息这里举了个例子是如果在一个路口之前提前看到了车道上对这个路口的车道标识,那后面在路口等待红绿灯时之前的车道标识信息也是可以用上的。

Video Process

在视频信息融合上他们尝试过 3D Conv、transformer、RNN 等等,最后选了个空间 LSTM。车在每一个时间点上的感知能力是有限的,如果把整个感知空间定义成一个很大的二维平面,其实每一次只需要更新车周围的平面位置的数据就好了。(RNN 的详细细节也没完全看懂,后面再细看…)

最终输出的 video feature 也是 20 * 80 * 256。


To be continued…