Torchvision v2联合变换仅作用于首个参数?求问题排查
问题原因及解决方案
你的问题出在Torchvision Transforms v2对输入类型的识别逻辑上:默认情况下,只有被判定为「图像」的输入(比如3通道张量)会触发随机变换的参数生成与应用,未标记类型的普通张量会被直接原样返回,不会同步执行变换。
要实现多输入的联合变换,你需要明确告诉Transforms v2哪些输入是需要同步变换的目标(比如分割掩码、标签图这类和图像空间对齐的数据),具体做法是用transforms_v2.wrap将目标张量包装为对应类型(比如Mask)。
修改后的测试代码
import torch import torchvision.transforms.v2 as transforms_v2 from torchvision.transforms.v2 import Mask joint_transform = transforms_v2.Compose([ transforms_v2.ToTensor(), transforms_v2.RandomHorizontalFlip(p=0.5), transforms_v2.RandomVerticalFlip(p=0.5), transforms_v2.RandomRotation(degrees=45), ]) X_pre, y_pre = torch.rand(3, 512, 512), torch.rand(1, 512, 512) # 将掩码张量包装为Mask类型,告知Transforms同步变换 X_post, y_post = joint_transform(X_pre, Mask(y_pre)) print((X_pre == X_post).all()) print((y_pre == y_post).all()) # 输出应为两个False(除非随机变换未触发,概率极低) # 反向测试 y_post, X_post = joint_transform(Mask(y_pre), X_pre) print((X_pre == X_post).all()) print((y_pre == y_post).all()) # 同样会得到两个False
补充说明
除了Mask,Transforms v2还支持BoundingBoxes、Keypoints等目标类型,你可以根据自己的任务场景选择对应的包装类型,确保所有需要空间同步变换的输入都被正确标记,这样就能实现官方宣称的联合变换效果。
内容的提问来源于stack exchange,提问作者iggy
相关产品推荐
相关产品推荐

