TorchVision v2变换不生效,无法可视化CT图像分割预处理效果
TorchVision v2变换不生效,无法可视化CT图像分割预处理效果
看起来你遇到的问题大概率是几个细节没处理到位,我帮你梳理下可能的原因和解决办法:
首先,先排查变换是否真的被执行:
- 先确认你的
self.augment是不是设为True了?如果这个开关是False,那整个变换块根本不会运行,自然看不到效果。可以在if self.augment:下面加个打印语句验证下。 - 另外,TorchVision v2的变换对输入类型有要求,它只支持
torch.Tensor或者PIL.Image类型的输入。如果你的self.scan_slice是numpy数组,直接传入变换是不会生效的!你需要先把它转成张量:
转成张量之后再应用变换,应该就能看到像素值的变化了。# 假设scan_slice是[3,512,512]的numpy数组 self.scan_slice = torch.from_numpy(self.scan_slice).float()
然后,分割任务必须同步变换图像和标签:
你现在只单独变换了self.scan_slice,但可视化时用的是sample['structures'](多标签栈),这俩没同步变换的话,图像和分割标签的位置会对不上,看起来就像变换没生效。TorchVision v2支持联合变换图像和标签,你可以把它们打包成元组或者字典传入变换:
# 把图像和标签打包成元组 transformed_scan, transformed_structures = transform(self.scan_slice, self.structures) # 或者用字典格式(更清晰) transformed = transform({"image": self.scan_slice, "mask": self.structures}) transformed_scan = transformed["image"] transformed_structures = transformed["mask"]
这样翻转、旋转这些空间变换会同时作用于两者,保证可视化时图像和分割层是匹配的。
接下来,可视化代码的小问题:
你处理分割标签的代码里有个小错误:
sub_structures[j,:,:] = np.where(sub_structures[j,:,:] < 1.0, np.nan, i)
这里的i是样本的索引(循环里的i),所有结构都会被设成同一个数值,用rainbow colormap的话根本区分不开不同结构。应该改成j+1,让每个结构有唯一的数值:
for j in range(sub_structures.shape[0]): sub_structures[j,:,:] = np.where(sub_structures[j,:,:] < 1.0, np.nan, j+1) sub_structures = np.nansum(sub_structures, axis=0)
另外,CT图像的像素值范围通常很大(比如-1000到2000),直接转成int16后用imshow显示会因为超出0-255范围导致显示异常,最好先做归一化:
scan = np.moveaxis(scan, 0, -1).astype(np.int16) # 归一化到0-255范围 scan = (scan - scan.min()) / (scan.max() - scan.min()) * 255 scan = scan.astype(np.uint8)
最后,你可以在变换前后打印某个固定位置的像素值,比如:
print("变换前像素值:", self.scan_slice[0, 100, 100].item()) self.scan_slice = transform(self.scan_slice) print("变换后像素值:", self.scan_slice[0, 100, 100].item())
如果数值有变化,说明变换已经生效,问题就出在可视化环节;如果没变化,再回头检查输入类型和self.augment的开关。
备注:内容来源于stack exchange,提问作者Sumerechny
相关产品推荐
相关产品推荐

