【Python-torch】torchio & torchvision:transforms API 对比与解析
文章目录
- 【Python-torch】torchio & torchvision:transforms API 对比与解析
- 0. 前言与对比
- 1. 预处理部分
- 2. 数据增强部分
- 3. 代码示例
- 参考
0. 前言与对比
当处理3d图像数据时,通常我们用的torchvison库里的transforms函数,不能满足我们的需求。
- torchvison:主要处理2d图像
- torchio:主要处理3d图像,经常用来处理图像数据
本文着重来介绍 torchio transforms相关的函数。如果对torchvision不熟悉的可以参考这个:
- torchvison__transforms 函数解析
而关于torchio 更详细的API可以参考这个:https://torchio.readthedocs.io/transforms/transforms.html#invertibility
- TorchIO是一个开源Python库,用于深度学习中3D医学图像的高效加载,预处理,增强和基于补丁的采样,遵循PyTorch的设计。它包括用于数据增强和预处理的多重强度和空间变换。这些变换包括典型的计算机视觉操作,如随机仿射变换,也包括特定领域的操作,如由于MRI磁场不均匀性(偏置)或k空间运动伪影的强度伪影模拟。
1. 预处理部分
- 强度(intensity)变化:
- RescaleIntensity: 简单来说是基于单张图像的直方图均衡化操作,允许设置原直方图数值区间(如:(-1000, 1000))或者在不清楚数值情况下的百分比区间(如:(0.5,99.5)),并指定输出强度区间(如:(0.0,1.0))
- ZNormalization:同样是基于单张图像的归一化操作,即计算标准差和均值,将像素值强度的分布转化成高斯分布
- HistogramStandardization:基于一系列(多张)图像的直方图均衡化操作,针对不同来源(如不同医院,不同设备)采集到的图像可能强度区间不统一的问题,需要先执行train函数,从序列图像中得到直方图关键点,再执行均衡化操作。需要注意该操作应在强度变化的最开头执行。
- NormalizationTransform:归一化操作的基类,用于扩展定制化变换函数
- 空间(Spatial)变换:
- CropOrPad:给定目标维度,如果原图大则裁剪,若小则填充,需要注意这一操作在拆分batch之前进行以同一维度,允许指定pad方法。允许通过mask指定裁剪的中心位置(若不指定,则crop操作从各维度中心向外计算,若指定mask,则crop操作会从mask的各维度非0中心向外计算)
- EnsureShapeMultiple:对各维度指定一个数值,自动将输入图像crop或pad到最近的可以整除指定数值的大小,需要指定pad或crop(只能执行一种)
- Crop:裁剪,需要指定各维度裁剪的起始位置和结束位置
- Pad:填充,需要指定各个维度的填充的长度
- Resample:重采样,改变图像像素的物理尺度,需要指定各个维度的像素长度。允许在重采样之前load一个仿射变换矩阵(作为预先的仿射处理),允许指定差值的方法,允许只对图像本身操作(如分类任务),也可以同时对图像和mask操作(分割任务)
- ToCanonical:对原图重排列使之转变为RAS方向轴排布(x轴-左右, y轴-前后,z轴-上下),若需要,通常在变换操作的第一位使用
标签(label或者mask)的变换: - RemapLabels:将label图像重新排序与原图匹配,需要给定重排序的label id的的新顺序(dict形式),如({2:1, 4:3})就是将label 2原本的内容分配给1,4原本的内容分配给3, 并做相反操作,若需要只单向赋值,则需要声明masking_method选项(“right”或“left”)
- RemoveLabels:清除label标签,全部重置为背景标签。需要指定将要被移除的标签序列(int sequence),以及将要变更为的背景标签(int)。(可以应用在诸如voc数据集目标边缘的255标签移除)
- SequentialLabels:将离散分布的标签序号重置为从1开始的顺序排列标签序号,需要注意,新标签是从1开始的。
- OneHot:将标签转为onehot编码,需要序列化标签值
- Contour:将label中的边缘,要求输入必须是二值图像,输出为二值图像
- KeepLargestComponent:只保留最大的非0连通区域,其余非0区域将被置成背景(注意当前tio版本只支持二值图像的操作
2. 数据增强部分
-
transform的组合:
- Compose:将多种增强变换组合,同torchvision.transform.compose
- OneOf:从给定增强变换序列中随机选择一项执行,允许设置每一项执行的概率{tio.RandomAffine():0.75, tio.RandomNoise():0.25}
-
空间(spatial)增强:
- RandomFlip:给定中心轴(可以多个)翻转图像,可以使用数字(0,1,2)指定反转轴,也可以用字母(Left,Right,Height,Width)。允许设置翻转的概率,需要对每个反转轴单独指定。
- RandomAffine:随机仿射变换,包括尺度(scale,需要指定缩放的比例,可以设置缩放时的差值策略),旋转(degrees,需要指定每个轴旋转的角度范围,可以设置旋转时pad的数值),平移(translation),还支持各向同性和设置以中心为基准进行变换。
- RandomElasticDeformation:随机弹性形变,通过三次B样条插值实现位移,需要指定控制点的数量和最大位移距离,允许控制边缘是否形变(弹性形变的数值计算相对复杂,详细理解需要先学习三次B样条插值)
- RandomAnistropy:随机各向异性,即先降采样再升采样到原分辨率,模拟从各向异性空间尺度获取的图像被缩放到指定尺度的情况,允许指定降采样的比例,允许只对原图变换
-
强度(Intensity)增强:
- RandomMotion:添加动态模糊,mri图像的噪声来源一部分是由于被测试者在采集时的动作导致的,通过当前增强来模拟该场景
- RandomGhosting:添加随机鬼影,mri成像时的成像结构规则变化导致在相位编码方向出现鬼影,如心跳,呼吸,脉搏或者脊髓液的流动都是鬼影出现的主要原因
- RandomSpike:尖峰缺陷,由图像空间中K空间的多个尖峰导致的不同方向的条纹,属于高频噪声。
- RandomBiasField:添加随机偏置场伪影,通常由于mri成像设备的磁场不均匀导致的低频强度变化(可以理解为一侧亮度偏低)
- RandomBlur:使用随机大小的高斯滤波器模糊图像。(高斯模糊,低频滤波)
- RandomNoise:添加随机高斯噪声。
- RandomSwap:随机交换图像中的patch的位置。
- RandomLabelsToImage:从标签模拟生成伪图像。
- RandomGama:随机gamma校正。
3. 代码示例
import torchio as tio
ct = tio.ScalarImage('ct_scan.nii.gz')
ct_air, ct_bone = -1000, 1000
rescale = tio.RescaleIntensity(
out_min_max=(-1, 1), in_min_max=(ct_air, ct_bone))
ct_normalized = rescale(ct)
import torch
import torchio as tio
landmarks = {
't1': 't1_landmarks.npy',
't2': 't2_landmarks.npy',
}
transform = tio.HistogramStandardization(landmarks)
torch.save(landmarks, 'path_to_landmarks.pth')
transform = tio.HistogramStandardization('path_to_landmarks.pth')
import torchio as tio
image = tio.datasets.Colin27().t1
transform = tio.RandomAffine(
scales=(0.9, 1.2),
degrees=15,
)
transformed = transform(image)
import torchio as tio
colin = tio.datasets.Colin27()
transforms_dict = {
tio.RandomAffine(): 0.75,
tio.RandomElasticDeformation(): 0.25,
} # Using 3 and 1 as probabilities would have the same effect
transform = tio.OneOf(transforms_dict)
transformed = transform(colin)
import torchio as tio
subject = tio.datasets.FPG()
transform = tio.RandomGamma(log_gamma=(-0.3, 0.3)) # gamma between 0.74 and 1.34
transformed = transform(subject)
参考
【1】https://zhuanlan.zhihu.com/p/391313749