基本情况
- 题目:In Defense of Classical Image Processing: Fast Depth Completion on the CPU
- 出处:Ku, J., Harakeh, A., & Waslander, S. L. (2018, May). In defense of classical image processing: Fast depth completion on the cpu. In 2018 15th Conference on Computer and Robot Vision (CRV) (pp. 16-22). IEEE.
介绍
论文《In Defense of Classical Image Processing: Fast Depth Completion on the CPU》提出了一种用经典的图像处理算法进行深度补全的算法,不依赖于任何训练数据,没有使用深度学习模型。
主要贡献:
- 1.提出了一种快速的深度补全的算法,能从稀疏的激光扫描的深度图中恢复完整的深度图,并且在CPU上可达到90Hz的频率。该算法的效果在KITTI depth completion benchmark中排名第一(公布时);
- 2.该算法的表现超越了其他现有的CNN算法。
本文提出的算法一种包含8个步骤:
(1)Depth Inversion:对于稀疏图像的处理机制是应用OpenCV的形态学操作,用较大的像素值覆盖较小的像素值。数据集KITTI raw depth map,深度值范围在0~80米之间,没有有效深度值的位置用0填充。在这种情况下,如果直接应用膨胀操作会使大距离覆盖掉小距离,从而导致较近对象的边缘信息丢失。为了解决这个问题,将有效深度做一个invert,即D(inverted) = 100.0-D(input),这样在有效深度和空值之间有一个20m的buffer。
(2)Custom Kernel Dilation(用自定义的核进行膨胀操作):先填充最接近有效像素值的空值,关键在于kernel形状的设计,要使得最可能具有相同深度值的像素被填补。因此在这一步采用的是5*5的菱形kernel,形状如下图:
(3)Small Hole Closure(对小的空洞进行闭运算):经过第一步的膨胀操作后,仍任有一些小孔,由于这些区域没有有效深度值,考虑到物体的结构,发现膨胀后相邻的深度可以连接起来形成物体的边缘。因此在这一步用一个5*5的full kernel进行闭运算,连接相邻的深度值,填补小孔。
(4)Small Hole Fill(小孔填充):经过前面的步骤,深度图中仍然有一些小到中等size的洞没有被前填充。为了填补这些洞,首先计算一个空像素的mask,然后再进行7×7全内核膨胀操作。这个操作只会填补空像素,同时保持先前计算过的有效像素不变。
(5)Extension to Top of frame(延伸到顶部):考虑一些比较高的物体,如树木建筑物等,都到达了LiDAR点云的顶端。为了补齐这些物体的深度,将每一列的顶端的像素值向上延伸。
(6)Large Hole Fill(大洞填充):这一步来填充一些比较大的洞。用一个31*31的full kernel来进行膨胀操作,将所有仍然为空值的深度值填充起来,而其他位置的有效深度值不变。
(7)Median and Gassian Blur(中值/高斯模糊):前面步骤中的膨胀操作会引入一些噪声,为了去除这些噪声,先使用5*5 kernel的中值模糊,去除局部边缘的离群点。然后,再用5*5的kernel进行高斯模糊,对局部平面进行平滑,平滑尖锐的物体边缘。
(8)Depth Inversion:算法的最后一步是将前几步所使用的倒置深度值恢复到原来的深度编码,即D(inverted) = 100.0-D(input)。
综上,这个算法的设计思想采用了一种贪婪的策略,有效深度周围的空值可能具有相似的值,所以采用了先填充小hole在填充大hole的顺序,最后减少输出噪声和平滑局部平面。膨胀操作的关键在于kernel形状和大小的设计。size太大,填充的深度值大于实际其作用区域;太小,膨胀不足以使边缘通过后期的闭运算连接起来。
试验效果
最后,来欣赏一下实验效果(KITTI depth completion数据集):
将深度图投影到3D,分别为原始的velodyne扫描的深度图和经过算法补全后的深度:
效果还是棒棒哒~
存在问题
However,个人认为还是存在一些问题:
(1)LiDAR扫描的深度数据虽然是稀疏的,但是是比较均匀的稀疏分布(见实验效果图的第一张),所以用这种“先补小洞再补大洞”的策略是可以取得比较好的效果的,但对于其他稀疏分布不均匀的数据,效果并没有这么好(个人用DSO跑出来的深度图做了depth completion,不如人意)。
(2)LiDAR扫描的深度数据只在图像的底部大约2/3的区域有有效深度,所以诸如天空这种存在于图像顶部的物体可能基本没有有效深度。算法将稀疏输入中每一列顶端的有效深度向上延伸,尽管这种策略并不十分合理,但从3D投影的结果来看,效果还是很不错的。尽管在实际应用中我们可能只关注车道上的车辆,并不关心天空,但这种策略给填补较远处的深度提供了一个好的思路。
参考
【论文详解】In Defense of Classical Image Processing: Fast Depth Completion on the CPU