【发布时间】:2021-10-25 23:58:31
【问题描述】:
使用 NumPy 或 OpenCV 应用掩码是一个相对简单的过程。但是,如果我需要在优化算法的损失计算中使用蒙版图像,我需要专门使用 PyTorch,否则会干扰梯度计算。
假设我有一个图像张量[1, 512, 512, 3](批次、高度、宽度、通道)和一个掩码张量[1, 20, 512, 512](批次、通道、高度、宽度),其中每个通道对应于 20 个分割类之一,我想得到用黑色 (0, 0, 0) 填充每个像素的蒙版图像张量,但属于一个或多个指定分割类别的除外。
这里是如何使用 numpy 完成的:
import numpy as np
import torch
# Create dummy image and mask
image_tensor = torch.randn([1, 512, 512, 3])
mask_tensor = torch.randn([1, 20, 512, 512])
# Apply argmax to mask
mask_tensor = torch.max(mask_tensor, 1)[1] # -> 1, 512, 512
# Define mask function
def selective_mask(image_src, mask, dims=[]):
h, w = mask.shape
background = np.zeros([h, w, 3], dtype=np.uint8)
for j_, j in enumerate(mask[:, :]):
for k_, k in enumerate(j):
if k in dims:
background[j_, k_] = image_src[j_, k_]
output = background
return output
# Convert tensors to numpy:
image = image_tensor.squeeze(0).cpu().numpy()
mask = mask_tensor.squeeze(0).cpu().nmpy()
# Apply mask function for several classes
image_masked = selective_mask(image, mask, dims=[5, 6, 8])
应如何更改我的代码以使其符合 PyTorch 要求?
【问题讨论】:
标签: python image numpy machine-learning pytorch