MONAI 0.9 版本技术解读:Bundle 模型打包、医学图像目标检测、Swin Transformer 与 MetaTensor 预览
MONAI 0.9 版本技术解读Bundle 模型打包、医学图像目标检测、Swin Transformer 与 MetaTensor 预览【免费下载链接】MONAIAI Toolkit for Healthcare Imaging项目地址: https://gitcode.com/GitHub_Trending/mo/MONAI本指南基于 MONAI 0.9 版本发布说明docs/source/whatsnew_0_9.md系统梳理该版本引入的五大核心能力MONAI Bundle 标准化模型打包格式、医学图像中的目标检测组件RetinaNet 2D/3D、用于三维医学图像分析的 Swin UNETR、DeepEdit/NuClick 交互式分割组件以及作为数据表示重构第一步的 MetaTensor/MetaObj API 预览。读完本文你将掌握 0.9 版本的关键 API 用法、各模块在仓库中的代码位置与调用方式并能直接基于这些组件搭建可复用的深度学习工作流。版本总览0.9 的五个关键主题MONAI 0.9 是一次面向可复用性与新范式的里程碑式发布发布说明开篇即列出五个主题MONAI Bundle定义可移植的深度学习模型描述格式贯穿模型开发生命周期Object detection in medical images面向医学图像的定位与分类工作流包含 RetinaNet 网络与 2D/3D 边界框处理Swin Transformers for 3D medical image analysis将 Swin UNETR 引入 MONAI支持三维多器官分割New interactive segmentation components集成 DeepEdit 与 NuClick 等交互式分割工作流组件MetaTensor API preview数据表示层面的重大重构新增MetaTensor与MetaObj核心数据结构。下文按这五个主题逐一展开每个部分都会给出仓库内的源码佐证与实操入口。MONAI Bundle标准化的模型打包与配置驱动工作流设计目标与核心收益MONAI Bundle 定义了一种可移植的深度学习模型描述格式一个 bundle 中包含模型开发生命周期中的关键信息让用户和程序都能理解模型的用途与用法。发布说明总结的monai.bundleAPI 收益包括标准化打包格式统一的模型存储与分享方式结构化配置文件用于深度学习工作流的快速原型设计易用的编程 API将超参数设置与 Python 代码分离灵活的配置组件允许接入不同的底层 Python 实现解耦组件细节让联邦学习federated learning与 AutoML 等高层学习范式不再关心组件内部实现。从仓库结构看monai/bundle/目录monai/bundle是 0.9 引入的独立子包包含config_item.pyConfigItem/ConfigComponent/ConfigExpression三类配置项的定位与实例化、config_parser.pyConfigParser主解析器、reference_resolver.py$ref引用解析器、properties.py、scripts.py、workflows.py与__main__.py提供命令行入口。ConfigParser配置即代码的解析核心ConfigParser是 Bundle 体系中最核心的入口类位于 monai/bundle/config_parser.py。它遍历结构化的配置源嵌套 dict 或 list为每个配置项创建带唯一 ID 的ConfigItem并支持通过 ID 便捷访问。其典型工作流为用配置源初始化ConfigParser调用get_parsed_content()按 ID 获取目标组件可选实例化。配置语法由三类符号驱动$前缀表示表达式ConfigExpression如$my_dims 1可使用globals中预置的模块默认注入monai、torch、np/numpy作为全局变量前缀表示引用ReferenceResolver如my_net指向同配置中的另一个节点支持::或#层级分隔与相对 ID#同级、##上一级%前缀表示宏macro可从其他配置文件引入片段如%/data/config.json#net_target_键声明组件目标ConfigComponentComponentLocator会依据该字符串从monai命名空间或用户传入模块中定位类并实例化。官方 docstring 中的最小示例展示了完整用法config_parser.pyfrom monai.bundle import ConfigParser config { my_dims: 2, dims_1: $my_dims 1, my_xform: {_target_: LoadImage}, my_net: {_target_: BasicUNet, spatial_dims: dims_1, in_channels: 1, out_channels: 4}, trainer: {_target_: SupervisedTrainer, network: my_net, preprocessing: my_xform} } parser ConfigParser(config) # 实例化前可读写配置set 需发生在 parse 之前 parser[my_net][in_channels] 4 # 解析并实例化网络组件 parser.parse(True) net parser.get_parsed_content(my_net, instantiateTrue)从当前仓库源码可以看到ConfigParser已支持点号链式访问parser.training.trainer.max_epochs等价于parser.get_parsed_content(training::trainer::max_epochs)、JSON/YAML 配置文件的加载合并load_config_files、以及配置导出export_config_file。真实 Bundle 配置示例仓库测试数据 tests/testing_data/config_fl_train.json 提供了可直接阅读的完整 Bundle 配置骨架它演示了如何用 JSON 描述一套完整的监督训练工作流{ bundle_root: tests/testing_data, dataset_dir: bundle_root, val_interval: 1, imports: [$import os], device: $torch.device(cuda:0 if torch.cuda.is_available() else cpu), network_def: { _target_: DenseNet121, spatial_dims: 2, in_channels: 1, out_channels: 6 }, network: $network_def.to(device), loss: {_target_: torch.nn.CrossEntropyLoss}, optimizer: { _target_: torch.optim.Adam, params: $network.parameters(), lr: 0.0001 } }该配置体现了 Bundle 的几个关键设计点dataset_dir: bundle_root是引用bundle_root引用了同配置中的根路径device: $torch.device(...)是表达式利用预置全局变量torch动态计算设备network_def是组件定义_target_为DenseNet121而network: $network_def.to(device)又通过表达式对组件实例做.to(device)调用train/validate两节分别组织 transformsLoadImaged、EnsureChannelFirstD、ScaleIntensityd、RandRotated、RandFlipd、RandZoomd等、Dataset/DataLoader、inferer、handlers、trainer/evaluator 与 metric顶层还有initialize/run/finalize三个表达式列表如$monai.utils.set_determinism(seed123)与$train#trainer.run()分别对应生命周期的初始化、执行与收尾动作。这种配置驱动模式正是 Bundle 解耦超参数与 Python 代码的核心体现训练逻辑SupervisedTrainer、DataLoader完全由配置描述修改网络结构、学习率、数据增强策略都无需改动代码。相关测试可参考 tests/bundle/test_config_parser.py 与 tests/bundle/test_reference_resolver.py。更多教程式内容在仓库文档 docs/source/bundle_intro.rst 中有系统介绍。医学图像中的目标检测RetinaNet 2D/3D 组件模块组成0.9 发布说明指出该版本提供了目标定位与分类工作流的基础组件2D/3D 边界框处理、RetinaNet 网络块与架构、以及基于坐标的预处理、难负样本采样等通用工具。这些应用级模块位于 monai/apps/detection按功能划分为子目录职责关键文件networks/RetinaNet 检测器与骨干网络retinanet_detector.py、retinanet_network.pytransforms/坐标/边界框相关预处理与后处理array.py、dictionary.py、box_ops.pyutils/锚框、匹配、编码、采样等工具anchor_utils.py、ATSS_matcher.py、box_coder.py、box_selector.py、hard_negative_sampler.py、predict_utils.py、detector_utils.pymetrics/COCO 指标与匹配coco.py、matching.pyRetinaNetDetector 的输入输出契约RetinaNetDetectormonai/apps/detection/networks/retinanet_detector.py是一个单阶段、基于锚框anchor的目标检测器支持 2DC,H,W与 3DC,H,W,D输入。其接口契约如下输入一个 tensor 列表每个元素(C,H,W)或(C,H,W,D)像素值在 0-1 范围各图尺寸可不同或一个(B,C,H,W[,D])的批量 tensor训练模式额外接收 targetsdict 列表包含boxesFloatTensor[N,4]或FloatTensor[N,6]StandardMode即[xmin,ymin,xmax,ymax]或[xmin,ymin,zmin,xmax,ymax,zmax]格式与labels返回包含分类损失与回归损失的Dict[str, Tensor]推理模式仅需输入返回后处理后的List[Dict[Tensor]]每个元素含boxes与对应分数等字段。从源码 import 关系可以看出完整的检测流水线AnchorGenerator生成多尺度锚框ATSSMatcherAdaptive Training Sample Selection完成正负样本匹配BoxCoder负责边界框编解码HardNegativeSampler处理难负样本挖掘BoxSelector做预测框筛选NMS 等resnet_fpn_feature_extractor提供 ResNetFPN 骨干。这与 torchvision 的 RetinaNet 有渊源源码注释标注其改编自 pytorch/vision 的 retinanet.py 并保留 BSD-3-Clause 许可但针对医学图像扩展了 3D 支持。围绕该模块仓库还配套了完整的单元测试tests/apps/detection共 14 个测试文件与边界框工具库 monai/data/box_utils.py提供box_iou、模式转换等函数可直接用于评估检测结果的 IoU 计算。Swin Transformers 用于三维医学图像分析Swin UNETR 在 MONAI 中的实现0.9 版本在核心库中实现了Swin UNETR模型其论文出处为 Hatamizadeh et al., Swin UNETR: Swin Transformers for Semantic Segmentation of Brain Tumors in MRI Imagesmonai/networks/nets/swin_unetr.py 的类注释。该模型将 3D Swin Transformer 作为编码器与 U 形解码器结构结合支持多器官分割等任务发布说明提到其编码器权重可来自在公开数据集 5050 例 CT 扫描上进行的自监督预训练。Swin UNETR 的关键构造参数swin_unetr.py包括in_channels/out_channels输入与输出通道数patch_size默认 2patch token 尺寸输入各空间维度必须能被patch_size ** 5整除默认即被 32 整除这一约束源于 patch embedding 之后接 4 个 PatchMerging 下采样阶段、每阶段空间分辨率减半的结构合法输入例如(32,32,32)、(96,96,96)、(128,128,128)、(64,32,192)否则forward()会抛出ValueErrordepths默认(2,2,2,2)与num_heads默认(3,6,12,24)每个 stage 的 Transformer 层数与注意力头数window_size默认 7局部窗口大小feature_size默认 24网络特征维度mlp_ratio默认 4.0MLP 隐藏维度与嵌入维度之比norm_name默认instance特征归一化类型drop_rate/attn_drop_rate/dropout_path_ratedropout 与 drop path 比率use_checkpoint默认 False启用梯度检查点以降低显存占用spatial_dims默认 3支持 2D/3Ddownsample下采样模块可选mergingv2、merging0.9.0 原始版本默认或自定义nn.Moduleuse_v2使用 swinunetr_v2 变体每个 Swin stage 起始处增加残差卷积块。典型用法示例来自源码 docstring# 3D 单通道输入 (96,96,96)4 类输出feature_size48 net SwinUNETR(in_channels1, out_channels4, feature_size48) # 3D 4 通道输入 (128,128,128)3 类输出各 stage 层数 (2,4,2,2) net SwinUNETR(in_channels4, out_channels3, depths(2, 4, 2, 2)) # 2D 输入 (96,96)启用梯度检查点 net SwinUNETR(in_channels3, out_channels2, use_checkpointTrue, spatial_dims2)从源码结构看Swin UNETR 由PatchEmbed、SwinTransformerBlock基于window_partition/window_reverse与WindowAttention、PatchMerging、UnetrBasicBlock、UnetrUpBlock、UnetOutBlock等 monai/networks/blocks 中的基础块组装而成其中MLPBlock、PatchEmbed等在 blocks 子包中均有独立实现。仓库还提供了配套测试 tests/networks/nets/test_swin_unetr.py可用于验证前向传播与形状约束。由于 Swin Transformer 为视觉任务通用结构该实现也可在 2D 设置下使用spatial_dims2。新的交互式分割组件DeepEdit 与 NuClick0.9 将深度学习交互式分割工作流中的新组件整合进核心代码库作为 MONAILabel 最新功能的构建基础主要包括DeepEdit与NuClick两条工作流分别位于monai/apps/deepedit核心为Interaction类interaction.py与一整套变换transforms.pymonai/apps/deepgrow核心为Interaction类interaction.py与对应变换transforms.py。DeepEdit 的 transforms 模块monai/apps/deepedit/transforms.py包含一整套交互信号 → 训练样本的变换链例如AddInitialSeedPointDeepEditd随机初始化首个种子点模拟用户首次点击AddGuidanceSignalDeepEditd将点击/涂鸦scribble编码为高斯引导信号叠加到输入上AddRandomGuidanceDeepEditd在训练中随机追加新引导点模拟迭代式交互AddGuidanceFromPointsDeepEditd/ResizeGuidanceMultipleLabelDeepEditd从点生成引导并处理多标签缩放FindDiscrepancyRegionsDeepEditd找到预测与标签不一致区域用于主动式交互采样DiscardAddGuidanced、SplitPredsLabeld、RemapLabelsToSequentiald标签重映射为连续整数NormalizeLabelsInDatasetd为其向后兼容别名等辅助变换。DeepGrow 的 transforms 模块monai/apps/deepgrow/transforms.py提供AddInitialSeedPointd、AddGuidanceSignald、AddRandomGuidanced、FindDiscrepancyRegionsd、SpatialCropForegroundd、SpatialCropGuidanced、ResizeGuidanced、RestoreLabeld、Fetch2DSliced等其中RestoreLabeld用于在推理后将裁剪区域的分割结果恢复到原始空间。这些组件与Interaction类共同构成点击驱动的训练/推理闭环模型根据初始种子点或迭代新增的引导信号产出分割再通过 discrepancy 区域发现来挑选下一次交互位置。配套测试位于 tests/apps/deepedit 与 tests/apps/deepgrow。MetaTensor API 预览数据表示重构的第一步背景为什么需要元数据感知的张量发布说明指出主要医学影像模态CT/MRI 等关联的元数据在许多生物医学应用中至关重要尤其是 MONAI 一直聚焦的数据驱动方法。因此 0.9 开始了数据表示层面的重大重构第一步即实现核心数据结构MetaTensor与MetaObj作为feature preview功能预览后续里程碑版本将在此基础上继续演进。源码实现与核心特性MetaObjmonai/data/meta_obj.py是抽象基类通过多重继承让子类如torch.Tensor与np.ndarray附加元数据存储能力。其内部状态包括_metadict元数据字典默认{}其中嵌套存放 affine 矩阵等_applied_operationslist已应用的变换操作记录_pending_operationslist待应用的变换操作服务于懒执行_is_batchbool是否为批量数据_spatial_ndimint空间维度数默认 3。MetaTensormonai/data/meta_tensor.py同时继承MetaObj与torch.Tensor行为与torch.Tensor一致但扩展了元数据功能。其构造签名支持affine、meta、applied_operations、spatial_ndim等参数官方示例import torch from monai.data import MetaTensor t torch.tensor([1, 2, 3]) affine torch.as_tensor([[2, 0, 0, 0], [0, 2, 0, 0], [0, 0, 2, 0], [0, 0, 0, 1]], dtypetorch.float64) m MetaTensor(t, affineaffine, meta{some: info}) m2 m m assert isinstance(m2, MetaTensor) assert m2.meta[some] info assert torch.all(m2.affine affine)使用要点与限制来自源码注释运算结果自动保留元数据c a b时若a.is_batch为 False则从第一个MetaObj实例复制辅助数据批量数据为效率考虑做浅拷贝构建批量数据时应使用monai.data.DataLoader而非torch.utils.data.DataLoader以便正确 collate 元数据批量语义batch[0]返回第 0 张图及其元数据batch[:, 0]、batch[..., -1]、batch[1:3]等非单元素切片会返回部分元数据并将is_batch置为 True需要 PyTorch 1.9 或更新版本以获得完整兼容性更早版本在torch.jit.trace、跨进程共享等方面有已知限制可用as_tensor()规避 trace 问题若构造函数中affine非 None 且meta已含affine键会触发警告。applied_operations/pending_operations的存在为后续变换可逆性invertible transforms与懒加载采样lazy resampling等高级特性预留了数据基础这也是 0.9 之后 MONAI 数据管线演进的基石。相关测试位于 tests/data/meta_tensor。总结与升级建议MONAI 0.9 通过五大主题确立了后续版本的技术方向Bundle提供了配置即代码的模型打包与复用范式ConfigParser以$//%/_target_四种语法统一了表达式、引用、宏与组件实例化使模型可以在不同项目与联邦学习、AutoML 等上层框架间流转检测组件补齐了医学图像目标定位能力RetinaNetDetector同时支持 2D/3D 边界框配套的锚框生成、ATSS 匹配、BoxCoder、难负样本采样与 COCO 指标形成完整闭环Swin UNETR将 Transformer 架构带入 3D 医学图像分割需注意输入尺寸须能被patch_size ** 5整除的约束DeepEdit/NuClick交互式组件让标注与分割形成人机协同工作流也是 MONAILabel 的底层构建块MetaTensor/MetaObj预览标志着数据表示从纯张量 外部元数据向元数据感知张量的迁移开始是后续可逆变换与懒执行特性的地基。升级到 0.9 及以后版本时建议优先体验 Bundle 的配置驱动开发流程可参考 tests/testing_data/config_fl_train.json 等仓库内置配置并关注 MetaTensor 相关 API 的演进——它虽为预览特性但会影响后续所有数据管线代码的写法。【免费下载链接】MONAIAI Toolkit for Healthcare Imaging项目地址: https://gitcode.com/GitHub_Trending/mo/MONAI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →