草庐IT

深度学习三维图像数据增强——Monai实现

Nyree芯秋月 2024-07-09 原文

深度学习三维图像数据增强——Monai实现

一、前言

笔者接触深度学习不久,跑过一些二维图像的深度学习代码,对于二维图像,深度学习数据增强可借助skimage、opencv、imgaug、Albumentations、Augmentor等多数主流的库实现,在这里放一个大神的链接,可供参考。但对于三维数据,能够借助的库便少了起来,常用的有TorchIO和Monai,而针对于医学领域,Monai是一个不错的选择。笔者通过自学,将Monia库总结以下要点。

详细可参考Monai官方文档:https://docs.monai.io/en/1.1.0/transforms.html

二、数据类型

对于Monai的调用数据类型,官方支持以下格式:

  1. 字符串 :需是数据文件的路径,通过LoadImage可加载数据;
  2. 数据 :数据类型为Numpy ndarray或PyTorch Tensor,数据的大小通常为(num_channels,spatial_dim_1[,spatial_dim_2,…])。在深度学习中,Dataset返回的数据类型通常是[C,D,H,W],C即代表通道数,D,H,W分别是三维数据的深度、高度、宽度;同样,在Monai中,即使通道是1,通道数也不可被省略官方推荐包含通道数,但在实际使用过程中,我发现并未有严格的限制,不包含也可正常运行

需要注意的是,无论输入是numpy.ndarray还是torch.tensor类型,多数转换输出为torch.tensor,

三、Compose

通常,在做数据增强时,我们需要用到批量操作,Monai也提供了相应的Compose批量转换操作。官方的解释是:Compose提供了以顺序方式将一系列可调用项链接在一起的能力。序列中的每个转换都必须接受一个参数并返回一个值。
Compose的调用有两种方式,如下:
1.通过一系列转换,接受并返回单个ndarray/tensor/类张量参数。
2.通过一系列转换,接受并返回包含一个或多个参数的字典。此类转换必须具有传递语义,即字典中未使用的值必须复制到返回字典。需要在每个变换的输入和输出之间复制字典。

对于监督学习,我们通常希望将图像数据和标签数据做同类型的转换,因此,Monai的第二种Compose调用方式极大地方便了我们使用。下面,以一串代码为例介绍该使用方式:

import torch
from monai.transforms import Compose, RandHistogramShiftD, Flipd, Rotate90d

#批量转换
KEYS = ("image", "label")
class aug():
    def __init__(self):
        self.random_rotated = Compose([
            Rotate90d(KEYS, k=1, spatial_axes=(2,3),allow_missing_keys=True),
            Flipd(KEYS, spatial_axis=(1,2,3),allow_missing_keys=True),
            RandHistogramShiftD(KEYS,  prob=1, num_control_points=30, allow_missing_keys=True),
            # ToTensorD(KEYS),
        ])
    def forward(self,x):
        x = self.random_rotated(x)
        return x

上述代码忽略了Compose的其余参数,Compose的完整调用是:

Compose([transformA, transformB, transformC], map_items=True, unpack_items=False, log_stats=False)

mapitems(bool)–如果数据是列表或元组,是否对输入数据中的每个项应用转换。默认为True。
unpackitems(bool)–是否使用*作为转换的可调用函数的参数来解压缩输入数据。默认为False。
log_stats(bool)–发生错误时是否记录数据和应用的转换的详细信息,对于NumPy数组和PyTorch Tensor,记录数据形状和值范围,对于其他元数据,直接记录值。默认为False。
在这里做一个提示:并非所有的转换都需要标签和图像一起转换,如图像的标准化,标签并不需要,标签仅需与图像一起进行旋转、平移、翻转或变形,因此,Compose需和其他一系列转换结合使用。

四、OneOf

有时我们需要进行多种转换中的一种即可,便可采用OneOf进行编写,以下是OneOf的各参数:

monai.transforms.OneOf(transforms=None, weights=None, map_items=True, unpack_items=False, log_stats=False)

transform即为可调用函数的序列;weights为对应于变换中每个函数的调用概率,概率归一化为1;其余参数不再详细介绍。

五、常见转换类型

Monai的转换分为Vanilla TransformsDictionary Transforms,顾名思义,Dictionary Transforms适用于指定数据中的字典进行转换,两种转换函数之间只差一个字母d,下面介绍常见的转换类型及两种转换函数。

5.1裁减和填充

Vanilla TransformsDictionary Transforms
指定值填充(可指定每个维度的值) padpadd
空间对称填充SpatialPadSpatialPadd
边缘填充(指定边框)BorderPadBorderPadd
指定区域裁减SpatialCropSpatialCropd

5.2强度增强

Vanilla TransformsDictionary Transforms
随机Guass噪声RandGaussianNoiseRandGaussianNoised
随机强度偏移RandShiftIntensityRandShiftIntensityd
MR图像的随机偏置场增强RandBiasFieldRandBiasFieldd
随机对比度调整RandAdjustContrastRandAdjustContrastd
图像锐化RandGaussianSharpenRandGaussianSharpend
强度归一化(标准化)NormalizeIntensityNormalizeIntensityd
Guass平滑GaussianSmoothGaussianSmoothd
直方图正态化HistogramNormalizeHistogramNormalized

5.3空间增强

Vanilla TransformsDictionary Transforms
随机旋转RandRotateRandRotated
随机指定轴翻转RandFlipRandFlipd
随机任意轴翻转RandAxisFlipRandAxisFlipd
随机仿射变换RandAffineRandAffined
随机3D弹性变形Rand3DElasticRand3DElasticd
随机旋转90度RandRotate90RandRotate90d

此外还有平滑处理和针对于MRI的处理,详见官方文档。

六、注意(记录坑)

6.1 RandRotate90

RandRotate90(prob=0.5, spatial_axes=(1, 2)),这里的spatial_axes=(1, 2)是针对数据格式为(z,y,x)设置的,如果你的数据格式为(x,y,z)那么就是spatial_axes=(0,1)

持续记载并更新中…

这里再放一些大神的文章及相关参考资料:
1.使用MONAI深度学习框架进行3D图像空间变换
2.医学图像深度学习3D数据增强之MONAI框架方法利用
3.Monai官方文档Transforms部分

有关深度学习三维图像数据增强——Monai实现的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  3. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  4. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

  5. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  6. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  7. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  8. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  9. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  10. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

随机推荐