在 pytorch 中从附近的像素创建新通道
Creating new channels from nearby pixels in pytorch
给定一个批量图像张量,如 B x C x W x H (batchSize,channels,width,height),
我想创建一个新的张量,其中新通道是来自附近像素的通道(用 0 填充)。
例如,如果我选择附近的像素大小为 3 x 3(如 3 x 3 过滤器),那么附近总共有 9 个像素,最终的张量大小将为 B x ( 9 * C ) x宽 x 高。
关于这样做的任何建议,还是我只需要通过迭代采用蛮力方法?
如果你想把边缘剪短(img
是你的图像张量):
from skimage.util import view_as_windows
B,C,W,H = img.shape
img_ = view_as_windows(img,(1,1,3,3)).reshape(B,C,W-2,H-2,-1).transpose(0,1,4,2,3).reshape(B,C*9,W-2,H-2)
如果您想用 0 填充它们:
from skimage.util import view_as_windows
img = np.pad(img,((0,0),(0,0),(1,1),(1,1)))
B,C,W,H = img.shape
img_ = view_as_windows(img,(1,1,3,3)).reshape(B,C,W-2,H-2,-1).transpose(0,1,4,2,3).reshape(B,C*9,W-2,H-2)
对于未来的读者,如果您不想破坏计算图(使用 skimage)或希望通过不移动数据来使用更高效的实现 from/to GPU,您可能需要原生 PyTorch 解决方案相反。
这个问题非常接近逆PixelShuffle, and has a currently active feature request。区别在于发帖人想要保持图像分辨率,而这个解决方案没有。
我在这里复制了请求者的初始代码(效率很高):
out_channel = c*(r**2)
out_h = h//r
out_w = w//r
fm_view = fm.contiguous().view(b, c, out_h, r, out_w, r)
fm_prime = fm_view.permute(0,1,3,5,2,4).contiguous().view(b,out_channel, out_h, out_w)
给定一个批量图像张量,如 B x C x W x H (batchSize,channels,width,height),
我想创建一个新的张量,其中新通道是来自附近像素的通道(用 0 填充)。
例如,如果我选择附近的像素大小为 3 x 3(如 3 x 3 过滤器),那么附近总共有 9 个像素,最终的张量大小将为 B x ( 9 * C ) x宽 x 高。
关于这样做的任何建议,还是我只需要通过迭代采用蛮力方法?
如果你想把边缘剪短(img
是你的图像张量):
from skimage.util import view_as_windows
B,C,W,H = img.shape
img_ = view_as_windows(img,(1,1,3,3)).reshape(B,C,W-2,H-2,-1).transpose(0,1,4,2,3).reshape(B,C*9,W-2,H-2)
如果您想用 0 填充它们:
from skimage.util import view_as_windows
img = np.pad(img,((0,0),(0,0),(1,1),(1,1)))
B,C,W,H = img.shape
img_ = view_as_windows(img,(1,1,3,3)).reshape(B,C,W-2,H-2,-1).transpose(0,1,4,2,3).reshape(B,C*9,W-2,H-2)
对于未来的读者,如果您不想破坏计算图(使用 skimage)或希望通过不移动数据来使用更高效的实现 from/to GPU,您可能需要原生 PyTorch 解决方案相反。
这个问题非常接近逆PixelShuffle, and has a currently active feature request。区别在于发帖人想要保持图像分辨率,而这个解决方案没有。
我在这里复制了请求者的初始代码(效率很高):
out_channel = c*(r**2)
out_h = h//r
out_w = w//r
fm_view = fm.contiguous().view(b, c, out_h, r, out_w, r)
fm_prime = fm_view.permute(0,1,3,5,2,4).contiguous().view(b,out_channel, out_h, out_w)