上文也提到过,由于使用Transfomer进行BEV空间转化非常消耗算力,对车端有限算力提出了挑战。
目前主要有两个优化的方向:
2.1 模型轻量化
图像处理中,使用Transformer的计算复杂度与图像尺寸的平方成正比,这会导致,在图像很大的时候,计算量过于庞大。
如何在尽量不影响感知精度的前提下,降低Transformer的计算复杂度,节省车端算力,成了学术界和工业界普遍关注的问题。
为了解决这个问题,可以借鉴使用传统CNN中的模型压缩技巧来降低计算复杂度,比如:
剪枝:深度学习模型可以看作是一个复杂树状结构,如果能减去一些对结果没什么影响的旁枝,就可以实现模型的减小。
量化:深度学习模型由大量的浮点型(float)权重参数组成,如果能用低精度类型(如int 8)替代原有的高精度类型(如float 32)的权重参数,那么模型体积就会大大压缩,低位的浮点计算速度会远远高于高位浮点计算速度,这也是最容易实现的压缩方式。
此外,学术界也有一些最新的成果,可以供业界参考。
使用移动窗口操作(Shifted window scheme)、具有层级设计的(hierarchical architecture)的SwinTransformer,可以把计算复杂度大幅度降低到具有输入图像大小线性计算的复杂度,且在各种图像任务上也都有很好的性能,因而SwinTransformer可以被当做骨干网络来使用。
借鉴了DCN(Deformable Convolutional Networks,可变形卷积网络)的思想,Deformable DETR将DETR中的注意力机制替换成可变形注意力机制(与全局(global)&密集(dense)的注意力机制不同,可变形注意力机制能够聚焦于特征相关区域并捕获信息,从而实现局部(local)&稀疏(sparse)的高效注意力机制),使DETR范式的检测器更加高效,收敛速度也大大加快,并且给了业界启发,可以将可变形注意力泛化,形成了Deformable Transformer。
2.2 多任务模型
除了上述模型压缩技巧外,还有一个常用的技巧,就是共享权重,有点像提取公因数,假设模型的每一层都有公用的公因数,是否可以提取出来做一次运算,而不是每一层都算一次,如共享骨干网络等,这就是应用普遍的多任务模型(Multi-Task learning)。
其中最出名的多任务模型,莫过于特斯拉的HydraNet,在一个模型中同时实现了目标检测、红绿灯检测和车道线检测三个任务。

特斯拉HydraNets,图片来自知乎@MarkAi
使用多任务模型最明显的优势,就是因为共享特征提取的网络参数,避免了大量的重复计算,效率大大提升。
除此外,多任务模型还有个额外好处,就是有时可以加速网络的训练过程。因为共享网络的感知任务是强相关的,比如车道线检测和动态目标检测,在训练其中一个任务时,共享网络的特征提取能力也加强了,对于另外的任务的性能提升也是有帮助的。
那有没有可能在训练多任务模型的时候出现不同的任务“相互伤害”“此消彼长”的现象呢?