【Python-torch】torchio torchvision:transforms API 对比与解析

news2024/11/28 6:28:55

【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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/940212.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HDLBits-Verilog学习记录 | Verilog Language-Modules(2)

文章目录 25.Adder 1 | Module add26.Adder 2 | Module fadd27.Carry-select adder28.Adder-subtractor 25.Adder 1 | Module add practice: You are given a module add16 that performs a 16-bit addition. Instantiate two of them to create a 32-bit adder. O…

振动国标2009GB/T 19873.2-2009/ISO 13373-2:2005笔记

国标原文 1.时域,要求,采样率大于最高频率10倍(最低频率?) 2.频域,要求采样率大于最高频率2倍。 3.3.2 积分和微分,二次积分。 3.3.3 均方根。 3.4 滤波 4.1 奈奎斯特图、极坐标图、坎贝尔…

代码随想录算法训练营第四十九天|LeetCode 647,516,动态规划总结篇

目录 LeetCode 647.回文子串 动态规划五步曲: 1.确定dp[i][j]的含义 2.找出递推公式 3.初始化dp数组 4.确定遍历方向 5.打印dp数组 LeetCode 516.最长回文子序列 动态规划五步曲: 1.确定dp[i][j]的含义 2.找出递推公式 3.初始化dp数组 4.确定遍历方向 …

openssh---Windows下git安装配置gitlab

安装openssh 1. 专业版Win10/11默认自带,可以查看是否开启 1. Get-WindowsCapability -Online | Where-Object Name -like OpenSSH* 2. Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0 3. Add-WindowsCapability -Online -Name OpenSSH.Serve…

智慧工地云平台源码:工地管理专家

智慧工地是目前建筑行业的热门话题之一,它代表了未来建筑施工的发展趋势。那么,智慧工地的未来,你看好吗? 从技术角度来看,智慧工地无疑是未来发展的趋势。随着人工智能、大数据、云计算等技术的飞速发展,智…

python+Appium自动化:python多线程多并发启动appium服务

Python启动Appium 服务 使用Dos命令或者bat批处理来手动启动appium服务,启动效率低下。如何将启动Appium服务也实现自动化呢? 这里需要使用subprocess模块,该模块可以创建新的进程,并且连接到进程的输入、输出、错误等管道信息&…

Ubuntu22.04安装使用Docker (参考:完成Dock中的企业微信安装)

Ubuntu22.04安装使用Docker 概述什么是Docker ?Docker 的优点 Docker的安装(1) 安装 Docker 依赖项(2) 启用 Docker 官方存储库(3) 使用 Apt 命令安装 Docker(4) 验证和测试 Docker 安装 Docker Compose1. 使用二进制文件安装 Docker Compose2. 使用 Pip 安装 Docker Compose …

2023年高教社杯 国赛数学建模思路 - 案例:ID3-决策树分类算法

文章目录 0 赛题思路1 算法介绍2 FP树表示法3 构建FP树4 实现代码 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法,就是频繁模…

LC34. 在排序数组中查找元素的第一个和最后一个位置(JAVA)

二分查找 在排序数组中查找元素的第一个和最后一个位置二分查找 上期经典算法 在排序数组中查找元素的第一个和最后一个位置 难度 - 中等 在排序数组中查找元素的第一个和最后一个位置 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定…

unity中Game视图绘制XYZ坐标轴

Game视图显示XYZ坐标轴 功能一:仅显示XYZ坐标轴前期准备设置箭头模型的材质1、在“Assets”中,新建一个名为“Materials”文件夹,专门用于放置材质。选中“Materials”文件夹,鼠标右键->“创建”->“材质”2、重命名为“Red…

# 【三维重建】【深度学习】NeRF代码Pytorch实现--数据加载(中)

【三维重建】【深度学习】NeRF代码Pytorch实现–数据加载(中) 论文提出了一种5D的神经辐射场来作为复杂场景的隐式表示,称为NeRF,其输⼊稀疏的多⻆度带pose的图像训练得到⼀个神经辐射场模型。简单来说就是通过输入同一场景不同视角下的二维图片和相机位…

GCNet论文总结和代码实现

GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond(当非局部网络遇到挤压激励网络) 论文:GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond 源码:https://gitcode.net/mirrors/xvji…

【LeetCode】227. 基本计算器 II

227. 基本计算器 II(中等) 方法:双栈解法 思路 我们可以使用两个栈 nums 和 ops 。 nums : 存放所有的数字ops :存放所有的数字以外的操作 然后从前往后做,对遍历到的字符做分情况讨论: 空格 …

爬虫逆向实战(二十三)--某准网数据

一、数据接口分析 主页地址:某准网 1、抓包 通过抓包可以发现数据接口是api_to/search/company_v2.json 2、判断是否有加密参数 请求参数是否加密? 通过查看“载荷”模块可以发现b参数和kiv参数是加密参数 请求头是否加密? 无响应是否加…

torch.mul()函数使用说明,含高维张量实例及运行结果

torch.mul函数使用说明,含实例及运行结果 torch.mul() 函数torch.mul() 函数定义参数及功能高维数据实例解释 参考博文及感谢 torch.mul() 函数 对输入的张量或数做点积运算,如果维度不统一会想进行维度统一(广播机制)&#xff0…

PConv : Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks

摘要 为了设计快速的神经网络,**许多研究都集中在减少浮点运算(FLOPs)**的数量。然而,我们观察到这种FLOPs的减少并不一定会导致相同程度的延迟减少。这主要是由于浮点运算每秒效率较低的问题所致。为了实现更快的网络,我们重新审视了流行的操作算子,并证明这种低FLOPS主…

docker高级(DockerFile解析)

1、构建三步骤 编写Dockerfile文件 docker build命令构建镜像 docker run依镜像运行容器实例 2、DockerFile构建过程解析 Dockerfile内容基础知识 1:每条保留字指令都必须为大写字母且后面要跟随至少一个参数 2:指令按照从上到下,顺序执行…

异地访问Oracle数据库的解决方案:利用内网穿透实现PL/SQL远程连接的建议与步骤

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle ​ 小月糖糖主页 在强者的眼中,没有最…

SolidWorks软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 SolidWorks是一款由达索系统(Dassault Systmes)开发的三维计算机辅助设计(CAD)软件,被广泛应用于机械、电子、建筑和航空航天等领域。它以易学易用、强大的功能和良好的…

Michael.W基于Foundry精读Openzeppelin第32期——SignatureChecker.sol

Michael.W基于Foundry精读Openzeppelin第32期——SignatureChecker.sol 0. 版本0.1 SignatureChecker.sol 1. 目标合约2. 代码精读2.1 isValidSignatureNow(address signer, bytes32 hash, bytes memory signature) 0. 版本 [openzeppelin]:v4.8.3,[for…