如果乍一看,比较奇怪的就是 D2net的 interpolate_depth的代码了,这里就进行我的粗浅的理解分析。
首先是这部分代码:
如果我用一句话概括,就这这里进行了简单的坐标是否合法的筛选, 因为按照前面教程,咱们输入的 pos 是一个小数的坐标。 这里得到的 valid_corners 其实就是 判断 例如 (3.5 7.5 )这个坐标的左上,左下,右上,右下是不是合法的坐标。 3.5 7.5 的四个角那肯定是没问题的啊。 但是你说 0,0 这个位置,他的左上角就是不存在的,所以说需要筛选一下,就是这回事。
这里得到的 valid_corners 就是一个 True False 的Mask。 指示每个坐标是不是合法的。
紧接着呢, 是把所有合法的四个角,分成四份 取出来。 如下所示。
然后直接index 在深度图上,看看深度图的这些角处,是不是合法的深度。从而再次生成一个 depth_mask。 代表depth中每个点是不是合法的。
直接看最终的结果,你只用记住下面的东西:
假如输入的 pos 是60 x 80
的, 而 最原始的depth是 480x640
的。
理论上来说,很难得到 下采样 1/8 的特征图,每个点的真实深度值对吧。因为这里的特征图,是60x80的根本和原始的深度值 480x640对不上号啊对吧。 但是,我们就是要通过 480x640的深度图插值出, 特征图每个点对应的4800个深度!!!注意这4800个点,可不是每个点都有深度的,可能有深度的只有 4700个点
知道了上面的东西后, 接着看代码的三个返回结果。 分别是:
interpolated_depth: 这 (可能比4800少,假设4700个)个点中,每个点的深度值
pos: 这4700个点的坐标
ids: 这4700个点每个点 在原来 4800数组中的索引(一维索引)