如何对图像及其对应掩码执行相同的裁剪数据增强?
图像与掩码增强后无法匹配问题
我对图像和掩码使用了相同的随机裁剪处理逻辑,但增强后的结果却无法对应,效果如图所示:
处理代码如下:
randomScale = random.uniform(0.08, 1.0) CPtransform = transforms.RandomResizedCrop((self.height, self.width), scale=(randomScale, randomScale), ratio=(1,1), interpolation=2) toImage = T.ToPILImage() padImage= CPtransform(toImage(image).convert("L")) padMask = CPtransform(toImage(mask).convert("L")) return TF.to_tensor(padImage), TF.to_tensor(padMask)
求各位帮忙解决,感谢!
解决方法
问题根源:RandomResizedCrop每次调用都会重新生成随机裁剪区域的位置、尺寸参数,所以图像和掩码实际用了不同的裁剪规则,导致对应不上。
下面提供两种可行的解决方式:
方式一:复用变换的随机参数
手动获取变换的随机参数,再用同一组参数分别处理图像和掩码:
randomScale = random.uniform(0.08, 1.0) CPtransform = transforms.RandomResizedCrop((self.height, self.width), scale=(randomScale, randomScale), ratio=(1,1), interpolation=2) toImage = T.ToPILImage() # 转换为PIL图像 pil_img = toImage(image).convert("L") pil_mask = toImage(mask).convert("L") # 获取裁剪参数(仅生成一次) crop_params = CPtransform.get_params(pil_img, CPtransform.scale, CPtransform.ratio) # 用同一参数裁剪图像和掩码 padImage = TF.resized_crop(pil_img, *crop_params, size=CPtransform.size, interpolation=CPtransform.interpolation) padMask = TF.resized_crop(pil_mask, *crop_params, size=CPtransform.size, interpolation=CPtransform.interpolation) return TF.to_tensor(padImage), TF.to_tensor(padMask)
方式二:使用PyTorch v2版本的变换模块
如果你的PyTorch版本≥2.0,可以用torchvision.transforms.v2,它支持同时传入图像和掩码,自动保证变换参数一致:
from torchvision import transforms as T_v2 randomScale = random.uniform(0.08, 1.0) # 使用v2版本的RandomResizedCrop CPtransform = T_v2.RandomResizedCrop((self.height, self.width), scale=(randomScale, randomScale), ratio=(1,1), interpolation=2) toImage = T.ToPILImage() pil_img = toImage(image).convert("L") pil_mask = toImage(mask).convert("L") # 同时处理图像和掩码,参数自动同步 padImage, padMask = CPtransform(pil_img, pil_mask) return TF.to_tensor(padImage), TF.to_tensor(padMask)
内容的提问来源于stack exchange,提问作者Alan K
相关产品推荐
相关产品推荐

