这有可能是更的最长的文章系列了,先说为什么,一方面是看到分割大模型对小模型的提升效果需要时间,另一方面是之前对自动驾驶的BEV算法做了很长时间的预研,自己也应该好好梳理一下了。
(很多事情都是环环相扣,都需要去决断。比如分割大模型对小模型性能有没有提升,效果提升的投入和输出是否合适,提升不大还有有没有必要继续做,是换个方向还是继续探索,继续探索还有多少资源支撑,太多太多了。bev预研到什么时候才有可能落地,看过的paper有没有转化为产出的机会,产出能不能给自己带来收益,这些也都是问题。虽然看起来问题很复杂,但不过也就是个马尔可夫链,一切都还在变化之中,静待靴子落地吧)
其实自动驾驶bev算法是个很宽泛的说法,bev也就是bird’s-eye-view,是指从鸟瞰视角来做task的范式;从数据来说有纯视觉的bev,纯雷达的bev,也有视觉雷达or其他多传感器融合的bev。
这也是有很多说法的,对于一个公司项目来说,走什么样的技术路线,用什么样的传感器,运行在什么平台上,都对相应的算法有着要求,在现实的种种妥协之下最sota的算法也不一定就是最好的,指标高的算法也不见得就一定是能用的。
就先简单说一下,也给大家share一下自己的一些paper list:
点评:
纯视觉bev的开山鼻祖,在后续的文章里面但凡有用到将二维图像feature提升到三维空间然后拍扁到bev空间都有用到其提出的lift-splat的操作,代码也很干脆易读。(shoot部分是做规划的,代码没开出来)核心是将每个图像单独提升为一个特征的视锥,然后将所有视锥拍平到栅格化的BEV网格上,如下图所示。
当然由于是初代版本也就不可避免的存在一些问题,最主要的两个点,一是splat的过程中运算耗时,二是在深度估计部分由于给予每个点可能的深度时并没有用深度真值监督,导致不够准确,越远效果越差性能和现在的新一些算法比起来差很多。但这仍旧不妨碍其在bev算法中的份量。
题外话:我也有过对lss进行优化,说来话长,可以给大家推一些我之前相关的博文。简单说就是之前有想着打一打nuscenes的榜单,对公司对自己也都有好处,于是就打算从Lss入手来搞,当时主要考虑他是plug and play 的,基于lss的bev算法很多,如果能在这样基础算法上做出改进那就可以对所有使用了lss模块的算法都带来提升,这是一件有意义的事情。至于后面就不说了,都是汗与累啊!
一个是对代码的解读
一个是对LSS做改进的nuscenes sota
一个是我之前搞得nuscenes 深度图
题外话(+1):鉴智机器人还是可以的创始人都是清华背景,当初大概21年后半年的时候有面过,那时候他们刚开始创业也就几十个人,说过去做感知后处理,非常可惜当时自己也还年轻,互相也都没看上。后面再来看他们确实做了不少有意义的工作,点赞!不过现在自动驾驶环境也一般,大家也都过的不容易。
这里给大家放一下bevdet系列的发展历程:
bevdet做出来以后,后面还有bevdet4d (BEVDet4D: Exploit Temporal Cues in Multi-camera 3D Object Detection)主要就是增加了时序,将过去帧与当前帧特征融合来提高精度,比较有趣的。主要原因有:在做特征融合的时候,BEVDet4D在BEVDet的基础上,通过保留过去帧的中间BEV特征,并通过与当前帧对齐和拼接来融合特征。这样,BEVDet4D可以通过查询两个候选特征来获取时间线索,而仅需要可忽略的计算增加。对任务进行了简化,BEVDet4D通过移除自我运动和时间因素来简化速度预测任务。这使得BEVDet4D能够减少速度误差,使得基于视觉的方法在这方面首次与依赖LiDAR或雷达的方法相媲美。BEVDet4D的性能提升主要来源于速度估计更准确1。此外,小模型上的mAP有一定的增长,主要是小分辨率无法覆盖50米的范围,历史帧提供了一定的线索。
在往后就是bevpoolv2主要做对于lift-splat的提速,用预处理来优化计算流程做到了4.6 - 15.1倍速度的提升,同时也降低了内存的占用。这个处理确实很高级,点赞!对于工程化落地来说真是太重要了。
截止到2023年12月22日,bevdet系列的最新发展是DAL(Detecting As Labeling:Rethinking LiDAR-camera Fusion in 3D Object Detection),是做视觉和lidar融合的,效果和速度都有提升。如果直接点说,和bevfusion(mit版本)的流程大同小异,只是在视觉雷达的分支上更加相信雷达,然后包了一个“模仿数据注释过程”的故事,比较粗浅的来说就是这样。当然这并不妨碍人家效果好,也还是做了很多细节上的工作的。也比较期待他们接下来的工作。
以下是DAL paper中的框架图:
后续还有一些改进的版本,比如BEVFormer++,bevformerv2当然这个工作不是原班人马,所以就简单说一下bevformerv2。这篇主要就是没开源,paper说要开但是还没,所以也就只能看看idea;bevformer++
则是一篇技术报告,原班人马拿了Waymo Open Dataset Challenge 2022的第一名,可以看一看吧。
7. GKT:Efficient and Robust 2D-to-BEV Representation Learning via Geometry-guided Kernel Transformer
对于雷达来说,bev其实就没有那么必须,雷达bev和detection关系比较密切。一般用雷达做检测有几个范式?不知道咋说,要么就是基于点来做,像pointnet,pointnet++;基于视角来做的话就可以是顶视这就是bev,也可以是前视图,这两种视角变化做雷达图像融合也会看到的;也可以基于体素来做。当然这么说并不准确,不管什么范式总有互相借鉴的地方。
此外,从paper实验对比部分我们也能看出bevfusion的强大,对于许多想学习bev的工程师来说bevfusion真是一个很优秀的框架了,正如团队所说希望BEVFusion可以作为一个简单但强大的基线,启发未来多任务多传感器融合的研究。但遗憾的是,尽管团队针对速度做了很多工作但仍不能达到实时。(8.4 FPS)
在实际的工程项目中,如果想要使用bevfusion最大的问题其实还是优化问题,因为作者的优化都是基于cuda是做的,一旦离开nvidia的平台很多地方会受到影响,这部分就需要针对不同平台来编写定制化的算子。
当然算法永远是在进步更新的,新算法往往会更快更强,就比如CMT也是在nuscenes 榜上有名的。既然都说到这里了,那就简单说一下cmt精髓,属实是把位置编码玩明白了。
对于图像,先把pixel左乘内参的逆然后乘外参转到雷达坐标系下,然后用mlp输出其位置编码
对于雷达则是用voxelnet或者pointpillar编码为点云token后在bev feature gird上沿着高度简单采样,然后也是用Mlp输出其位置编码。
Position-guided Query 则是先随机选点A,A:(ax,i ,ay,i ,az,i)是[0,1]之间随机生成的,然后乘以范围加上最小值转到the region of interest (RoI) of 3D world space.
然后把这个坐标投影到图像和雷达模态中获取相应的位置编码,相加得到Q查询
代码如下:这个参考点是可以学习的
最主要的操作就是这个了。在paper里面也写的很清楚,bevfusion是两个模态转到bev空间后拼接,transfusion先在lidar特征中生成Q取top-k再查图像特征。而CMT则是对象查询直接与多模态特征同时交互,使用位置编码来对齐两个模态。当然也取得了不错的效果。
(不过毕竟是fusion的bev跑实时确实不容易,更不用说之后的占用网格)
从上面对比的一系列表格也可以看出,bev相关的paper还是很多的,大家感兴趣可以随便找一篇相关文章,然后从对比表格中找到一连串同类型文章。此外,这篇博客也只是粗浅的写一些与我相关的见过的部分paper,也只是个开篇,等有空的时候会陆续再更新吧。
写到这里了就再分享个自己觉得有趣的事情,那就是有一件看似很反直觉的事情,单从fusion bev的三个算法来看cmt明显性能不错,速度也可以,其次是bevfusion,最后是transfusion。但如果去看这三者的github就会发现,最好的cmt其实是受关注最少的,transfusion是fork最多的,bevfusion是star最多的。以下数据截止到2023年12月27日.
至于为什么会出现这样的情况,大家可以各抒己见,正所谓三个臭皮匠,赛过诸葛亮。让我想起来当初学社会心理学的时候,也是很有趣了。撤了这么久终于有上万字了,这也算是万字长文章了,哈哈哈。大家有什么想交流的想聊的都欢迎!我其实也有在想要不要也搞一下nlp,后面搞Embodied AI,还在犹豫,不过我觉得都能搞,没什么不能搞得!