【问题标题】:Pixel operations in batches批量像素操作
【发布时间】:2021-03-16 06:46:44
【问题描述】:

我有一批深度图像,形状 -> [B, 1, H, W]。对于我需要执行的批次的每个图像中的每个像素:

X = d * Kinverse @ [u, v, 1] #therefore X is in R^3 其中 d 是浮点张量 [0;1],表示像素 u,v 处的深度; Kinverse 是一个常数 3X3 矩阵,u, v 分别代表像素的列和行。

是否有某种方法可以对操作进行矢量化以获得批处理中所有图像的 X(u+1,v)、X(u,v) 和 X(u,v+1)。 我最终需要采取这个交叉产品: {X(u+1,v) - X(u,v)} x {X(u, v+1) - X(u,v)}

感谢您的帮助!

【问题讨论】:

  • 所以d 的形状是[B, 1, H, W] ?
  • @Shai 是的!感谢您的帮助!

标签: python computer-vision pytorch vectorization


【解决方案1】:

您可以使用torch.meshgrid 生成uv 张量。拥有它们后,您可以使用torch.einsumKinverse 进行批量矩阵乘法。 最后,您可以使用torch.cross 计算叉积:

u, v = torch.meshgrid(*[torch.arange(s_, dtype=d.dtype, device=d.device) for s_ in d.shape[2:]])
# make a single 1x1xHxW for [u v 1] per pixel:
uv = torch.cat((u[None, None, ...], v[None, None, ...], torch.ones_like(u)[None, None, ...]), dim=1)
# compute X
X = d * torch.einsum('ij,bjhw->bihw',Kinverse,uv)
# the cross product
out = torch.cross(X[..., 1:, :-1] - X[..., :-1, :-1], X[..., :-1, 1:] - X[..., :-1, :-1], dim=1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-27
    • 2012-12-11
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 2016-03-14
    • 2015-02-09
    相关资源
    最近更新 更多