1.FSD Overview
通过8台相机(36HZ)采集数据(960*1280的RGB图像)
在自研的2颗*FSD chip(72TOPS(int8))上进行超过1000种不同任务的感知预测
包括但不限于下面的超过50种Main Task:
Moving Objects:
Statics Objects:
Enviroment Tags:
每个Main Task下面还有若干Sub tasks,例如车辆检测还包括车辆的静止,朝向,开门等
除了检测任务, FSD还有包括但不限于下面的48种功能子网络:
Depth Network: 用以进行稠密的深度估计
Birdeye View Network鸟瞰(图): 用以进行图像到Birdeye view 的坐标投影
Layout Network: 用以推测道路元素的布局情况
Pointer Network(指针网络):用以预测导入元素间的关联,例如红绿灯对应车道
另外FSD将基于sampling(确定)的输出变为基于rasters(不确定)的输出 更加的diffused(扩散)
2.Model Architecture(模型架构)
2.1 Single task network vs Multi tasks network
2.2 Loosely coupled heads vsTightly coupled heads
松耦合:每个相机单独感知,然后拼接, 但在不同相机和不同frame间track是一件困难的工作,
新版采用对不同的相机Feature层进行融合,然后输入Birdeye View Network, 再分支成不同的heads进行检测输出
最终采用 Multi-head network 主干网络类似ResNet-50的架构进行Feature的提取, 功能分支采用与FPN/Deeplab V3 (语义分割模型)/UNet 类似的结构以实现不同功能输出,功能结构间分为共享特征和noshare.
另外发现,训练时同时使用5个task的loss来获得更好的features ,但推理时只会用到3个的inference
3.Training
单次训练48个网络,1000多个感知输出的庞大Multi-task模型需要70000GPU小时
3.1. Loss Function
多任务的loss通过加权平均整合到一个loss里, 学术研究中通过自动化找到子任务权重的方法在任务量扩展的成百上千后变得不可使用
最终子任务权重的选择非常谨慎,一旦确定不能轻易更改,需要考虑很多因素如:
1.不同的任务有不同的scale,而且classfication和regression也需要不同的权重
2.不同的任务有不同的重要性
3.任务的难易度不一样
4.长尾任务(负样本)数据非常稀少
5.有些任务数据噪声多
3.2. Training Across Different Tasks
在对子任务进行训练时只会训练部分网络.为了避免对共享参数的影响,采取freeze部分参数的方法
3.3. Data Balance
通过oversampling来保证任务内和任务间的Data Balance, 为此设置有oversampling rate
3.4. Hyper Parameter
对于长尾和噪声较多的任务应该使用较小规模的head以避免overfitting
对于不同任务的early stopping, 应该采用正则化进行统一
3.5. Multi-task Training Scheduler(调度)
每一个任务都采取分布式训练
4.Workflow & Collaboration
4.1. Data Engine& Active Learning
如何主动学习新任务?
通过高recall低preecision的粗分类器来识别特定需要训练的场景从而完成对上传数据的筛选,以提取rare cases从而提高数据的获取率
通过trigger来平衡不同任务的训练效果,trigger本身就是一个模型, 同时data engine获取的数据已经大大精简+人工筛选来剔除false positive数据
4.2. Collaboration
--协作人员不可随意更改Hyperparameter以提升自己的工作任务性能,以面影响他人
--避免fine tune历史记录复杂化以方便后期的追踪调优
因为缺乏Best Practice(最佳实践)验证,所以采用Test Driven(测试驱动)的开发思路
单个模型的更改必须保证所有的模型性能不发生回退,必须通过所有的Units tests!