![08cfce8fb793e7debad77463e65885df.png](https://i-blog.csdnimg.cn/blog_migrate/4acba6fabd085941b423f500ff20b496.jpeg)
更多相关博客请猛戳:AutoVision
如需转载,请附上本文链接,谢谢!
这篇MMF(Multi-Task Multi-Sensor Fusion for 3D Object Detection[1])是Uber跟Toronto大学联合发布在CVPR2019的一篇关于利用多传感器(lidar+camera)融合进行物体识别的文章。
LiDAR跟Camera是自动驾驶车上非常常见的传感器,它们各自有自己的优缺点,例如:
- Camera 能够提供非常丰富的语义信息,而且能够看到很远的物体(例如200m),但是没有办法提供精确的3d位置信息(尤其是单目相机);
- LiDAR 能够得到非常精确的3d位置信息,但是点云随着距离的变大会变得越来越稀疏(Velodyne64 60m,Pandar64 100m点就开始变少);而且LiDAR的点云通常只包含 x,y,z,intensity,很难有像图像一样丰富的语义信息(一个经典问题就是行人跟树木的误识别);
在自动驾驶领域,现在越来越多的公司开始尝试将这两种传感器进行融合,从而提升物体检测的精度。
![1a855c91ab5956a76bc4891bb50595f9.png](https://i-blog.csdnimg.cn/blog_migrate/2a9f432094ad5cc731e91f95d91f8509.jpeg)
从上图可以很直观的看出,MMF同时利用了2个传感器(LiDAR+Camera),同时进行4个任务(2D detection, Ground estimation, Depth Completion, 3D detection)最终得到3D物体检测结果。文章认为,通过同时进行多个task联合学习,该算法能够得到更加好的特征表示,从而进一步提升算法精度。
![9a0832d030f983f9b66da360a45b55e7.png](https://i-blog.csdnimg.cn/blog_migrate/4de4882df53a290496bd3cc94250c19f.jpeg)
从上图可以看出这是一个能够同时输出2D跟3D检测结果的多任务、多传感器融合的检测框架。整体的架构还是比较复杂的,我们可以把它抽象成两个阶段:
- First stage:有一个single-shot detector能够提供少量的高质量的3D检测结果;
- Second stage:利用ROI-wise的特征融合得到更精细的2D跟3D box regression;
- 另外,还有两个辅助任务能够进一步提供一些额外有用的信息:
- Ground estimation:能够拟合道路的几何结构信息,为点云提供一些先验(地面高度);
- Depth completion:能够学到更好的多传感器特征并且实现dense point-wise的特征融合;
整个模型是可以通过end-to-end的学习得到的。接下来我就分成两个部分来介绍一下:
- 如何通过point-wise以及ROI-wise的特征融合去做2D跟3D的物体检测;
- 如何利用另外的两个辅助任务去进一步提升3D的检测精度;
LiDAR+Camera Fusion(Point-wise+ROI-wise fusion)
这个阶段的任务主要包括:
- 有两个backbone的分支,分别提取image跟LiDAR BEV的feature maps;
- 将不同scale下的image feature跟LiDAR BEV feature分别进行Point-wise的特征层融合;
- 融合后的BEV feature map通过2d conv能够对每个BEV voxel预测很多3D检测结果;
- 经过NMS跟分值过滤之后,能够得到少量(KITTI测试集上少于20个)的高质量的3D检测框以及相应的2D检测框;
- 再利用ROI-wise fusion,将image ROIs跟BEV oriented ROIs进行特征融合,得到更精确的2D跟3D检测框;
Input representation
点云:作者并不是直接处理点云,而是将点云转换成BEV来处理。由于点云的稀疏性,转换的时候需要将点云进行插值体素化(voxelization)。具体的做法是引用作者之前的一篇文章Deep continous fusion [2] ,这也是第一篇将RGB feature跟LiDAR BEV feature融合的工作。
图像:图像这边比较简单,就是直接利用RGB image作为输入进行特征提取;另外,由于后面还增加了一个Depth completion的任务,所以这边还需要增加一个Sparse depth image 作为输入,具体的做法也比较简单:就是把LiDAR投影到图像坐标系下。
Point-wise feature fusion
![97ec914db33dbd2094066478cc4bb027.png](https://i-blog.csdnimg.cn/blog_migrate/403593b8b4745dbffe4417963a645b70.jpeg)
这步就是将不同scale下的image feature跟LiDAR BEV feature分别进行Point-wise的特征层融合。这就需要我们能够得到LiDAR BEV跟Image之间pixel-wise的相关关系,这里的对应关系就是参考作者之前的一个工作[2],不同点在于本文只使用了最近点而不是用KNN去找多个点。大体的流程是这样的:
- 对于BEV feature map上的每一个pixel,找到跟它最近的LiDAR point;
- 将这个LiDAR point投影到图像坐标系下,得到相应的image feature;
- 计算BEV pixel 跟LiDAR point的距离,作为geometric feature;
- 将image feature+geometric feature输入到MLP中,得到output;
- 将output与BEV feature map进行element-wise的相加;
这里要注意:虽然这里是point-wise fusion,但是其实还是sparse的,这是因为LiDAR points本身就是sparse的。之后的篇幅会解释,如何使用pseudo LiDAR points,提供dense的point-wise fusion。
ROI-wise feature fusion
![c859ded6f3db417156426295fa5eed5a.png](https://i-blog.csdnimg.cn/blog_migrate/9668ae69b87279ae4d51fb1e086cd941.jpeg)
ROI-wise fusion 的目的就是要进一步优化box的regression,得到高质量的2d跟3d的detection结果。通过将3D detection分别投影到image跟BEV feature maps上,我们能够得到axis-aligned image ROI以及oriented BEV ROI。
关于image ROI特征提取:我们可以通过ROIAlign[3]来得到相应的image feature。
关于BEV ROI特征提取:这边会存在两个问题:
- 在边界容易导致ROI特征出现180度反转的问题。解决的方法就是给oriented ROI分配一个orientation anchor (0或者90度),每一种anchor都会有固定的特征提取顺序;
- 当ROI是有角度的时候,它的中心点其实也会有offset。解决的方法就是得到旋转之后的ROI,并且将它分成n*n的grid,grid中的每个点都采用双线性插值得到特征;
Multi-Tasks Learning
这篇文章跟ContFuse[2]相比,最大的特点就是加入了两个辅助的任务:Ground estimation跟Depth completion.
Ground estimation
Mapping 是自动驾驶非常重要的一个任务,hdmap的构建由于算法复杂度搞,通常来说都是offline的任务。这里之所以online mapping,主要是想减少对offline map的依赖(通常hdmap的数据量非常大),同时也是可以提高系统的鲁棒性。
hdmap涉及的任务非常多,这里只关注道路几何结构信息。作者把这个问题转换成一个回归问题去直接回归地面的高度。这会比plane based parametrization的精度要搞,因为实际的道路很多都是有起伏的,尤其是当我们看比较远的范围的时候。
作者采用的U-Net在LiDAR BEV上预测voxel-wise的地面高度值。得到voxel-wise高度之后,voxel内的point高度都能够确定,接下来就可以生成一个新的LiDAR BEV(z减去ground height)。
关于这部分,我个人认为如果你的hdmap包含了ground height,可能不太需要这一步。
Depth completion
LiDAR 能够提供精准的3D位置信息,但是随着距离扩大,点云会越来越稀疏。Depth completion的目的就是想让LiDAR变得更加dense,具体来讲就是让image上面的每个点都能够有对应的LiDAR point或者pseudo LiDAR point.
这个模块的输出除了RGB image之后,还有sparse depth map(将LiDAR投影到image坐标系,如果没有LiDAR point,值设为0)。RGB跟sparse depth map concate之后一起输入到网络中进行depth的预测。
具体的网络其实也比较简单:image feature map 接两层bilinear up-sampling layer,输出跟图像大小一致的depth map。
有了depth map之后,在point-wise fusion的过程中,能够保证image feature map中的每一个pixel都至少能够在pseudo LiDAR points中找到相应的point。实际中,当存在真实LiDAR point的时候,会跟pseudo LiDAR point特征一起进行融合;当没有真实LiDAR point的时候,则利用pseudo LiDAR point。
Joint Training
训练的过程中,需要有detection labels跟dense depth labels,注意ground estimation没有专门的labels,而是通过3D localization loss来隐式优化的。损失函数的设计也比较直观:
Experiments
贴一下在KITTI上的performance:
![2e0c98927499993bbbb6805f0f4e54d1.png](https://i-blog.csdnimg.cn/blog_migrate/889c166c9c58c5cc6ddf85d263d745f8.jpeg)
作者还通过一些对比试验,表明辅助任务的学习对于整体性能确实有较大的提升:
![f41599cb135910cf9ad2e0053f265f3c.png](https://i-blog.csdnimg.cn/blog_migrate/c922e06e76667de8ece625f2406f414a.jpeg)
最后再贴一些KITTI上的效果图:
![9c519a924c53d8a643cc04477bef7b16.png](https://i-blog.csdnimg.cn/blog_migrate/8e2ae3ac388d941664b545083fedce50.jpeg)
Conclusion
文章是在ContFuse[2]基础上的一个延展:加了两个额外的任务(ground estimation and depth completion)。个人感觉depth completion还是比较有用的模块,让point-wise fusion变得更加dense,但是实际中,可能比较难的是怎么获取dense depth map labels。另外,个人感觉ground estimation可能不是一个必须的任务,如果hdmap涵盖了这个信息,也许直接用会更简单也更准确。
总体来说,这篇文章不管是最终的结果还是多任务的网络结构设计,对我的启发还是非常大的,之后有机会的话可能会尝试复现这篇文章。
对ContFuse感兴趣的可以移步我的另一篇博客:
仙道菜:Deep Continuous Fusion (Uber'18)zhuanlan.zhihu.com![578c636799b5cefae51c2b162f11e8a8.png](https://i-blog.csdnimg.cn/blog_migrate/17073e4cd7915716277cfc5f8fb9e1e8.jpeg)
参考
- ^http://www.cs.toronto.edu/~byang/papers/mmf.pdf
- ^abcdMingLiang. Deep continuous fusion for multi-sensor 3d object detection. In ECCV,2018.
- ^Kaiming He, Georgia Gkioxari, Piotr Dolla ́r, and Ross Gir- shick. Mask r-cnn. In ICCV, 2017