批量深度图像素3D点计算与邻域差叉积的向量化实现咨询
深度图邻域差叉积的全向量化实现路径
预计算无依赖常量
- 用框架内置网格生成工具,生成宽方向坐标
u、高方向坐标v的像素网格,对齐深度图空间分辨率,形状为[H, W];将坐标与常数1拼接为齐次向量形式,得到形状[H, W, 3]的齐次坐标张量。 - 用固定逆内参
Kinverse和上述齐次坐标做批量矩阵乘法,得到每个像素对应的相机空间归一化方向向量,形状为[H, W, 3]。该值和深度无关,可提前缓存,前向传播时直接调用,不用重复计算。
像素邻域的深度对齐
通过零开销切片操作完成三类位置的深度值匹配,全程无逐像素循环:
- 原深度图形状为[B, 1, H, W],取去掉最下行、最右列的核心区域作为X(u,v)的深度值,切片为
d[:, :, :-1, :-1],压掉冗余通道后形状为[B, H-1, W-1]。 - X(u+1, v)对应同一行下u偏移1的位置,切片深度为
d[:, :, :-1, 1:],形状和X(u,v)的深度值完全对齐。 - X(u, v+1)对应同一列下v偏移1的位置,切片深度为
d[:, :, 1:, :-1],形状和前两者完全对齐。
批量生成3D坐标与叉积运算
- 方向向量按对应邻域位置切片:
- X(u,v)的方向向量取原方向网格的
[:-1, :-1, :]切片 - X(u+1,v)的方向向量取原方向网格的
[:-1, 1:, :]切片 - X(u,v+1)的方向向量取原方向网格的
[1:, :-1, :]切片
- X(u,v)的方向向量取原方向网格的
- 深度值与对应位置的方向向量做广播乘法,直接得到三个位置的3D坐标,统一为[B, H-1, W-1, 3]的形状。
- 计算两个邻域差向量:
diff_u = X(u+1,v) - X(u,v)diff_v = X(u,v+1) - X(u,v)
- 调用框架内置的批量叉积算子(如PyTorch的
torch.linalg.cross,指定沿张量最后一维计算),直接输出最终叉积结果。全程无CPU侧循环,计算流程完全走GPU张量核心,可一次性处理整个批次的图像。
性能优化要点
- 提前压掉深度图的冗余通道维(从[B,1,H,W]转为[B,H,W]),减少广播运算的额外开销。
- 切片后的张量传入线性算子、叉积计算前,可调用
.contiguous()保证内存连续,避免框架隐式内存拷贝带来的性能损失。 - 如果需要为整幅图(含最右列、最下行)计算叉积,可对深度图、方向向量做1像素的边缘复制padding,直接复用上述逻辑,不需要单独编写边缘处理分支。
内容的提问来源于stack exchange,提问作者SouravBhunia
相关产品推荐
相关产品推荐

