deepmedic
DeepMedic 是一款专为生物医学领域设计的高效开源工具,旨在利用深度学习技术对三维医疗扫描图像(如 MRI)进行精准的病灶分割。它主要解决了传统方法在处理复杂、多尺度的三维医学影像时精度不足或效率低下的难题,能够帮助研究人员快速构建并训练三维卷积神经网络,自动识别并勾勒出感兴趣的结构区域。
这款工具特别适合医学影像领域的研究人员、算法工程师以及需要处理 NIFTI 格式数据的开发者使用。其核心亮点在于独特的“多尺度”网络架构,通过并行的卷积通路同时捕捉图像的局部细节与全局上下文信息,从而显著提升了对脑部病变等微小结构的分割准确率。此外,DeepMedic 支持数据增强、在线标准化以及与 TensorFlow 的无缝集成,并允许用户通过配置文件灵活调整模型参数。作为曾在多项权威研究中验证过的成熟框架,DeepMedic 降低了高性能三维分割网络的使用门槛,是探索医学图像分析的理想起点。
使用场景
某三甲医院放射科团队正致力于利用多模态 MRI 数据,自动化分割脑卒中患者的脑部病灶区域以辅助临床诊断。
没有 deepmedic 时
- 多尺度特征捕捉困难:传统 3D 卷积网络难以同时兼顾病灶的局部细节与全局上下文信息,导致微小病变漏检或大病灶边界模糊。
- 开发门槛高且周期长:研究人员需从零搭建复杂的深度学习架构并手动处理 NIFTI 格式数据,模型调试与复现前沿算法耗时数月。
- 训练效率低下:缺乏针对医学影像优化的采样策略,面对类别极度不平衡的数据(病灶远小于正常组织),模型收敛缓慢且容易过拟合。
- 人工标注负担重:由于自动分割精度不足,医生仍需花费大量时间对三维影像进行逐层手动修正,严重拖慢科研与诊疗流程。
使用 deepmedic 后
- 精准的多尺度分割:deepmedic 内置的双路径 3D CNN 架构能高效融合不同分辨率的特征,显著提升了复杂形状病灶的识别准确率与边界清晰度。
- 开箱即用的工作流:直接支持 NIFTI 图像输入与标准化配置,团队无需重写底层代码即可快速部署并训练符合最新研究标准的分割模型。
- 高效的样本采样机制:利用其特有的每类采样(per-class sampling)功能,有效解决了正负样本不平衡问题,大幅缩短了模型训练时间。
- 释放临床生产力:高精度的自动化分割结果将医生从繁琐的手动勾画中解放出来,使其能专注于病情分析与治疗方案的制定。
deepmedic 通过其高效的多尺度 3D 卷积架构,将脑病灶分割从耗时的手工探索转变为标准化、高精度的自动化流程,极大加速了医学影像分析的科研与临床应用落地。
运行环境要求
- Linux
- macOS
- Windows
- 非必需(小型网络可运行于 CPU),但大型 3D CNN 推荐 NVIDIA GPU
- 需安装与驱动兼容的 CUDA Toolkit 和 cuDNN
- 测试环境为 cudnn 8.2.1 (对应 TensorFlow 2.6.2)
- 显存大小未明确说明,但建议对大图像进行下采样以降低需求
未说明

快速开始
DeepMedic
新闻
2021年1月(v0.8.4):
- 后端现已支持通过CSV数据框接收输入文件(图像、标签、ROI掩膜),但目前尚未实际使用。
- 重构了前端模块,以提高代码可读性。
2020年5月29日(v0.8.3):
- 恢复使用旧算法(v0.8.2之前版本)来获取下采样上下文,以保持原有行为一致。
- 使用v0.8.3训练的模型现在应与v0.8.1及更早版本完全兼容。
2020年4月26日(v0.8.2):
- 对代码库进行了重大更改,以兼容TensorFlow 2.0.0(以及TF1.15.0)(尚未启用Eager模式)。
- 重新设计/重构了./deepmedic/neuralnet模块。
- 改进了采样方式(多分类时速度更快)和日志记录。
- 配置文件变更:ModelConfig中将kernelDimFor1stFcLayer改为kernelDimPerLayerFC,并新增padTypePerLayerFC。
2019年11月14日(v0.8.0):
- 将指标记录到TensorBoard。
- 具备实时归一化输入的功能(默认关闭)。目前仅支持z-score归一化。
- 对训练、测试和采样流程进行了重构和优化。
2019年6月11日(v0.7.4):
- 增加了基于仿射变换、旋转和缩放的数据增强功能,默认关闭(会降低训练速度)。
- 重新分配不存在类别的样本,并对采样代码进行了重构。
- 添加了更广泛的DM模型配置,在一些研究中表现更好。
2019年3月19日(v0.7.3):
- 训练时的默认采样方式改为按类别进行。这使得在处理任意任务时,DM的应用效果更好。
2019年3月16日(v0.7.2):
- 批量大小现位于trainConfig和testConfig中,而非model配置中。
- 改进了对卡死并行进程的处理。
- 数据增强模块化,便于后续扩展。
2019年2月11日(v0.7.1):
- 多进程从pp切换为Python内置模块。
- 默认推荐使用的Python版本改为Python3。
- 更新了默认配置,去除了未归一化的动量项。
- 对采样代码进行了部分清理。
2018年6月27日(v0.7.0):
- 后端切换至TensorFlow。
- API和命令行选项略有变化,文档相应更新。
- 更新了./examples/config/deepmedic中的默认配置,增加了三条路径。
- 对代码进行了重构和重新组织。
简介
本项目旨在为生物医学3D扫描中感兴趣结构的分割提供便捷的深度学习工具。它是一个允许用户轻松构建3D卷积神经网络的系统,只要提供相应的真值标签用于训练,该网络即可被训练用来检测和分割目标结构。系统能够处理NIFTI格式的图像,因此在许多生物医学任务中使用起来非常直观。
本文档将介绍如何安装和运行该软件,并附带示例数据,以便用户运行预设示例并验证系统是否能在其环境中正常工作。此外,本文档还描述了系统的主要功能,帮助用户理解整个处理流程。如需更多详细信息,请参阅[1]。我们希望该项目能有效提升医学影像领域中先进卷积网络的可及性。
引用文献
该系统最初是为MRI扫描中脑部病变的分割而开发的。它被应用于我们的研究[1]、[2]中,其中提出了一种具有两条卷积路径的3D网络架构,用于高效地处理多模态MRI数据的多尺度特征。如果您在工作中使用了本软件并取得了积极成果,请引用[1]。
[1] Konstantinos Kamnitsas, Christian Ledig, Virginia F.J. Newcombe, Joanna P. Simpson, Andrew D. Kane, David K. Menon, Daniel Rueckert, and Ben Glocker, “高效多尺度3D CNN结合全连接CRF实现精确的脑部病变分割”, Medical Image Analysis, 2016。
[2] Konstantinos Kamnitsas, Liang Chen, Christian Ledig, Daniel Rueckert, and Ben Glocker, “多尺度3D CNN用于多模态MRI中的脑部病变分割”, ISLES挑战赛论文集,MICCAI 2015。
目录
1. 安装与要求
1.1. 必需库
系统需要以下依赖:
- Python:默认使用 Python 3(虽然也支持 Python 2,但未来不再保证兼容性)。
- TensorFlow:用于后端的深度学习框架。
- NiBabel:用于加载 NIFTI 文件的库。
- numpy:通用数组处理工具包。
- scipy:科学计算库,用于图像操作,例如数据增强。
已测试的最新版本:
截至 2021 年 1 月,v0.8.4 已在 Python 3.6.5、TensorFlow 2.0.0 和 TensorFlow 1.15.0、nibabel 3.0.2、numpy 1.18.2 环境下进行了测试。
1.2. 安装
(以下步骤适用于 Unix 系统,Windows 用户也可参考类似流程。)
软件可通过以下命令克隆:
git clone https://github.com/Kamnitsask/deepmedic/
克隆完成后,可按照如下说明安装所有依赖项。
使用 Conda 环境安装
若您没有系统的 sudo/root 权限,建议使用 Conda 进行安装。在 bash shell 中,在您希望创建环境的文件夹下执行以下命令:
conda create -p FOLDER_FOR_ENVS/ve_dm_tf python=3.6.5 -y
source activate FOLDER_FOR_ENVS/ve_dm_tf
安装 TensorFlow 和 DeepMedic
安装 TensorFlow(TF):请按照 (https://www.tensorflow.org/install/) 上的说明进行操作。 参考上述链接,确保您的系统中安装的 CUDA 和 cuDNN 版本与您所安装的 TensorFlow 版本兼容。
$ pip install tensorflow-gpu==2.6.2
$ pip install cudnn==8.2.1
安装 DeepMedic 及其剩余依赖:
$ cd DEEPMEDIC_ROOT_FOLDER
$ pip install .
这将自动安装第 1 节中提到的所有依赖。
注意:最常见的安装问题在于用户未安装兼容的 Python、TF 和 cudnn 版本。这些版本必须相互匹配: 每个 Python 版本都有特定的预编译 TensorFlow 版本。我们需要 TensorFlow 2.0 及以上版本,而每个 TensorFlow 版本又与特定的 cuDNN 版本兼容(详见 TensorFlow 文档)。此外,cuDNN 还需与 TensorFlow 以及您系统的 Nvidia 驱动程序兼容。我们已在 Python=3.6.5、TF=2.6.2 和 cudnn=8.2.1 的环境下测试过 DeepMedic,这些配置应在 2024 年继续有效。
1.3. GPU 处理
安装 CUDA:(已弃用)
注意:此步骤可能已不再必要,因为通过上述 Conda 安装的最新 cuDNN 版本会自动安装其余所需库。只要您已安装 GPU 驱动程序,cuDNN 通常会一并完成其他组件的安装。但如果未成功,请参考以下内容。
小型网络可在 CPU 上运行。然而,较大规模的 3D CNN 则需要 GPU 处理。为此,需安装 Nvidia 的 CUDA。请确保获取与您的 GPU 驱动程序兼容的版本。TensorFlow 需要在环境的路径中找到 CUDA 的编译器 nvcc,并动态链接到 cublas.so 库,这些库也需要在环境变量中可见。
在使用 GPU 运行 DeepMedic 之前,您必须手动将包含这些文件的目录路径添加到环境变量中。以 bash shell 为例:
$ export CUDA_HOME=/path/to/cuda # 如果使用 cshell 而不是 bash:setenv CUDA_HOME /path/to/cuda
$ export LD_LIBRARY_PATH=/path/to/cuda/lib64
$ export PATH=/path/to/cuda/bin:$PATH
1.4. 数据预处理要求
DeepMedic 仅处理 NIFTI 文件。所有数据应为 .nii 格式。
每个受试者的输入模态、真值标签、ROI 掩码及其他图像需进行 配准(按受试者级别,无需跨受试者配准)。
每个受试者的图像应具有 相同的尺寸(按受试者级别,无需对整个数据库统一)。即,同一受试者的所有图像在每个维度上的体素数必须一致。
将数据库中的所有图像 重采样至相同的体素大小。这是必要的,因为 DeepMedic 的卷积核需要对应于相同的实际尺度模式(结构),以确保对所有受试者的一致性。
确保用于训练和评估的 真值标签 以零表示背景。系统还假设任务的类别索引按递增顺序排列(例如 0,1,2,而非 0,10,20)。
强烈建议将 ROI 内的数据强度归一化至均值为零、方差为 1 的空间。如果数据强度处于其他范围,我们的默认配置性能将显著下降。
大型图像注意事项:大型 3D CNN 计算开销较高。如遇到计算困难,可考虑对图像进行下采样或减小网络规模。DeepMedic 的默认配置是在约 200x200x200 大小的扫描上运行的。
2. 软件运行
DeepMedic 的源代码位于 deepmedic 文件夹中。用户通常无需直接修改该文件夹。软件提供了一个命令行界面 deepMedicRun,通过帮助选项运行:
./deepMedicRun -h
即可查看用于创建、训练和测试 CNN 模型的可用操作。所有操作都需要大量的配置参数,这些参数从配置文件中读取。
在 examples/configFiles 文件夹中,我们提供了两组配置文件。首先,examples/configFiles/tinyCnn/ 文件夹中包含一个非常小型网络的配置。该网络可在 CPU 上几分钟内完成训练,是一个简单的示例,用于验证系统是否正常工作。此外,我们还在 examples/configFiles/deepMedic/ 文件夹中提供了完整版 DeepMedic 模型的配置,该配置曾应用于 [1]。
上述配置文件已预先设置好指向配套的 .nii 文件,这些文件位于 examples/dataForExamples/ 文件夹中。这些 NIFTI 文件作为我们示例中网络的输入数据。它们是来自脑肿瘤分割挑战赛(BRATS 2015)图像的修改版本。
2.1 训练一个小型 CNN——验证系统是否正常工作
我们将在此训练一个小型 CNN 模型,并确认一切按预期运行。关于软件使用的进一步说明将在下一节中提供。
注意:请先参阅 第 1.2 节,了解必需软件的安装方法。
让我们开始 训练 一个模型:
./deepMedicRun -model ./examples/configFiles/tinyCnn/model/modelConfig.cfg \
-train examples/configFiles/tinyCnn/train/trainConfigWithValidation.cfg
该命令会解析给定的模型配置文件,该文件定义了网络架构并创建相应的卷积神经网络模型。随后,它会解析训练配置文件,该文件指定了训练方案的超参数。程序应已创建 ./examples/output/ 文件夹,所有输出都将保存在此处。接下来,模型将被训练两个轮次。整个过程的所有输出都会被记录下来,以便日后参考,这些日志文件位于 examples/output/logs/trainSessionWithValidTiny.txt。每完成一个轮次,训练好的模型会被保存到 examples/output/saved_models/trainSessionWithValidTiny 目录下。TensorFlow 会以 checkpoint 文件的形式保存模型。您应该会在每个轮次结束后看到类似 ./examples/output/cnnModels/tinyCnn.initial.DATE+TIME.model.ckpt.[data..., index] 的文件被创建。每组 DATE+TIMEmodel.ckpt[data,index] 被称为一个 checkpoint,即一个保存的模型版本。最后,每完成一个轮次,模型会对验证集图像进行分割,分割结果(.nii 文件)应出现在 examples/output/predictions/trainSessionWithValidTiny/predictions/ 文件夹中。如果训练正常结束(通常需要 5 分钟),并且您能在相应文件夹中看到上述文件,那就太好了!您可以稍作庆祝,然后继续……
您还可以使用配套脚本绘制训练进度图,该脚本会解析训练日志:
python plotTrainingProgress.py examples/output/logs/trainSessionWithValidTiny.txt -d
此外,默认情况下(在训练配置文件中设置 tensorboard_log=True),训练和验证指标也会被记录下来,以便通过 TensorBoard 进行可视化。相关的日志文件位于 examples/output/tensorboard/trainSessionWithValidTiny 目录下(非人类可读格式)。有关 TensorBoard 的使用方法,请参阅 TensorBoard 官方文档。您可以通过以下命令启动 TensorBoard:
tensorboard --logdir=./examples/output/tensorboard/trainSessionWithValidTiny
现在让我们用训练好的模型进行 测试(请替换 DATE+TIME):
./deepMedicRun -model ./examples/configFiles/tinyCnn/model/modelConfig.cfg \
-test ./examples/configFiles/tinyCnn/test/testConfig.cfg \
-load ./examples/output/saved_models/trainSessionWithValidTiny/tinyCnn.trainSessionWithValidTiny.final.DATE+TIME.model.ckpt
当然,请根据实际情况替换 DATE+TIME。
请注意,我们通过 -load 参数指定了要加载其参数的先前训练好的模型或 checkpoint。但请务必注意,此处提供的路径既不是指向 data 文件,也不是指向 index 文件,而是必须指向整个 checkpoint 集合(即 路径应以 .model.ckpt 结尾)。这是 TensorFlow 加载器的一个特殊要求。该过程应对测试集图像进行分割,结果应出现在 examples/output/predictions/testSessionTiny/ 文件夹下的 predictions 子文件夹中。此外,在 features 子文件夹中,您还应该能找到一些来自第二层的特征图。DeepMedic 提供了这一功能(详见 testConfig.cfg)。如果测试过程正常结束,并且所有输出文件都存在,那么就说明 一切似乎都在正常工作! 在 CPU 上是这样……
2.2 在 GPU 上运行
现在让我们来检查关键部分……确认您的系统是否能够顺利地在 GPU 上运行 DeepMedic。首先,为了确保从头开始,请删除 examples/output/ 文件夹。接下来,最重要的是将 CUDA 的 nvcc 路径添加到您的 PATH 环境变量中,并将 cublas.so 路径添加到您的 LD_LIBRARY_PATH 环境变量中(详见 第 1.3 节)。
您需要按照之前为 CPU 版本执行的步骤来进行训练和测试,只不过这次要在 GPU 上操作。为此,请重复之前的命令,并添加额外的 -dev cuda 参数。例如:
./deepMedicRun -model ./examples/configFiles/tinyCnn/model/modelConfig.cfg \
-train ./examples/configFiles/tinyCnn/train/trainConfigWithValidation.cfg \
-dev cuda0
如果您有多块 GPU,可以将 0 替换为其他设备编号以指定不同的 GPU。这些流程的输出应与之前类似。请务必确认进程正在 GPU 上运行,可以通过运行 nvidia-smi 命令来查看。您应该能看到 Python 进程已被分配到指定的 GPU 上。如果所有流程都能正常完成且没有报错,那就太棒了!现在看来,一切真的都正常运作了 :) 请继续阅读下一节,了解更多关于 DeepMedic 的信息以及如何使用我们更大的网络版本!
可能遇到的 GPU 相关问题:如果 TensorFlow 找不到与当前版本兼容的 CUDA 和 cuDNN 版本(具体取决于 TensorFlow 的版本),它将默认回退到 CPU 版本。当这种情况发生时,在模型创建完成后、正式训练开始之前,TensorFlow 会抛出一些警告,内容大致如下:
2018-06-06 14:39:34.036373: I tensorflow/core/platform/cpu_feature_guard.cc:140] 您的 CPU 支持一些本 TensorFlow 二进制未编译启用的指令:AVX2 FMA
2018-06-06 14:39:35.676554: E tensorflow/stream_executor/cuda/cuda_driver.cc:406] cuInit 调用失败:CUDA_ERROR_NO_DEVICE
2018-06-06 14:39:35.676616: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:158] 正在检索主机 neuralmedic.doc.ic.ac.uk 的 CUDA 诊断信息
2018-06-06 14:39:35.676626: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:165] 主机名:neuralmedic.doc.ic.ac.uk
2018-06-06 14:39:35.676664: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:189] libcuda 报告的版本是:384.111.0
2018-06-06 14:39:35.676699: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:193] 内核报告的版本也是:384.111.0
2018-06-06 14:39:35.676708: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:300] 内核版本似乎与 DSO 版本一致:384.111.0
如果进程未能按要求在 GPU 上启动,请确保您安装的 CUDA 和 cuDNN 版本与您当前使用的 TensorFlow 版本兼容(详情请参阅 https://www.tensorflow.org/install),并且环境变量已正确设置。有关更多提示,请参阅第 1.4 节以及 CUDA 官方网站。
3. 工作原理
此前我们简要介绍了如何快速运行一个预设的小型 CNN 示例,以便您检查系统是否一切正常。在本节中,我们将更详细地介绍整个流程。同时,我们还会解释配置文件中需要指定的主要参数,以便您能够根据自身需求定制网络和处理流程。
examples/configFiles/deepMedic/ 目录下的 .cfg 配置文件 包含了用于创建和训练 DeepMedic 的参数。为了支持更广泛的应用场景和用户群体,该目录中的配置文件正逐步更新,加入一些被认为能够提升系统整体性能的组件。(注意:这些参数与我们在文献 [1] 中使用的一致,但并不完全相同。论文中使用的原始配置可在归档的 GitHub 分支 'dm_theano_v0.6.1_depr' 中找到。)
注: 配置文件被解析为 Python 脚本,因此需遵循 Python 语法。任何被注释掉的配置变量都会在内部赋予 默认值。
3.1. 指定模型架构
在进行训练或测试时,我们需要定义网络的架构。为此,我们通过 -model 选项指向一个模型配置文件:
-model ./examples/configFiles/deepMedic/model/modelConfig.cfg
读取 modelConfig.cfg 中的参数后,网络的计算图会在内部被构建。程序会将所有用于模型创建的参数打印到屏幕上,并记录到 log.txt 文件中。
用于定义网络架构的参数
图 1:多尺度处理的双路径架构示例。每一层的特征图数量和尺寸以 (特征图数量 × 尺寸) 的格式表示。实际的 DeepMedic 默认有 11 层。
指定 CNN 模型的主要参数如下:
通用参数:
- modelName:此参数用于在保存每一轮训练的检查点时为其命名。请根据不同的架构更改名称。
- folderForOutput:主输出文件夹。保存的模型和日志都将放置于此。
任务相关参数:
- numberOfOutputClasses:DeepMedic 是一个多分类系统。该数值应 包含背景类,并定义最后一层(即分类层)的特征图数量(如图 1 所示为 2)。
- numberOfInputChannels:指定扫描数据的模态、序列或通道数。
架构参数:
- numberFMsPerLayerNormal:这是一个列表,其长度应等于我们希望创建的正常路径中的层数。每个条目代表对应层的特征图数量(如图 1 中为 [30, 40, 40, 50])。
- kernelDimPerLayerNormal:每层卷积核的尺寸。(如图 1 中为 [[5,5,5], [5,5,5], [5,5,5], [5,5,5]]。)
- useSubsampledPathway:将其设置为 “True” 可创建一个与正常路径结构相同的下采样路径。“False” 则仅使用正常路径进行单尺度处理。此外,还有一些参数可用于进一步调整该下采样路径。
- numberFMsPerLayerFC:高低分辨率路径的最后一层特征图会被拼接在一起,然后通过最终分类 (FC) 路径进行处理。此参数允许在分类层之前向 FC 路径添加隐藏层。列表中的条目数量决定了隐藏层的数量,而每个条目的数值则表示相应层的特征图数量。最终分类层不包括在内。(如图 1 中为 [[150], [150]]。)
图像片段与批大小:
- segmentsDim(Train/Val/Inference):输入片段的尺寸。训练、验证和推理(测试)可以使用不同大小的片段。较大的片段需要更多的内存和计算资源。训练片段的大小会显著影响训练样本的分布(如图 1 中为 [25,25,25])。验证片段的尺寸默认与感受野大小一致(即一个补丁)。测试片段的尺寸仅影响速度。
- Batch Size:同时在 GPU 上处理的片段数量。在训练过程中,较大的批大小通常能带来更好的收敛性和结果,但也会消耗更多计算资源和内存。验证和推理阶段的批大小相对不那么重要,较大的批大小只会加快处理速度。
还有其他一些参数可供使用,但它们的重要性较低(如正则化、优化器等)。这些参数已在提供的示例配置文件中详细说明。
3.2. 训练
您需要使用手动分割的真实标注数据来训练模型。为此,您需要指向一个包含训练会话参数的配置文件。我们结合 -model 选项(用于定义网络架构)和 -train 选项(用于指向训练配置文件,其中指定了训练方案和优化相关的参数)来完成这一操作:
./deepMedicRun -model ./examples/configFiles/deepMedic/model/modelConfig.cfg \
-train ./examples/configFiles/deepMedic/train/trainConfig.cfg \
-dev cuda0
请注意,如果您的机器拥有 多个 GPU,您可以将 0 替换为其他 GPU 设备编号。
训练流程
在一次训练会话中,会按照以下循环进行:
对于每个 epoch {
对于每个 subepoch {
加载验证病例
提取验证片段
分批进行验证(基于样本)
加载训练病例
提取训练片段
分批进行训练
报告 subepoch 样本上的准确率(验证/训练)。
}
报告整个 epoch 的准确率(验证/训练)
必要时降低学习率。
保存模型状态
每隔几个 epoch 对验证病例进行全量推理
报告全量推理的 DSC 值
保存全量推理的预测结果(分割图/概率图/特征图)
}
基于样本的验证以及对验证受试者扫描的全量分割是可选的。
使用 Matplotlib 绘制训练进度
可以通过随附的 plotTrainingProgress.py 脚本来绘制训练进度,该脚本会解析训练日志中记录的验证和训练准确率指标。常见的使用示例如下:
python plotTrainingProgress.py examples/output/logs/trainSession\_1.txt examples/output/logs/trainSession\_2.txt \
-d -m 20 -c 1
尝试使用 -h 选项获取帮助。这里指定了两个日志/实验,以便同时绘制两者的指标进行比较。您可以指定任意数量的日志。-d 选项会生成一张包含更多指标的 详细 图表。-m 20 会对 20 个子周期的数据进行移动平均,以平滑曲线。-c 1 会单独绘制标签为 1 的类别。需要注意的是,在存在多个类别的情况下,-c 0 实际上报告的是 非背景类 的指标,而非背景类本身(因为我们发现后者在大多数应用中并无太大意义),而是针对 整个前景类 进行统计,相当于将除 0(假设为背景)之外的所有类别合并为一个整体。
日志中记录的指标既包括训练数据,也包括验证数据。大多数指标都是基于 样本(即 子体积,也就是补丁)计算的。例外的是 整幅扫描的 DSC(即 全量分割),它是在每隔几个 epoch 对整个验证体积进行分割后计算得出的(如果已指定)。
使用 TensorBoard 绘制训练进度
此外,如果训练配置文件中启用了此功能(即 train-config 文件中的变量 tensorboard_log=True),训练指标也会被记录下来,以便使用 TensorFlow 的 TensorBoard 进行可视化。有关使用方法,请参阅 TensorBoard 文档。以 TensorBoard 所需格式保存的指标文件位于 examples/output/tensorboard/name-of-training-session/ 目录下。可以通过以下命令启动 TensorBoard:
tensorboard --logdir=./examples/output/tensorboard/name-of-training-session
为 TensorBoard 记录的指标与主日志 .txt 文件中记录的指标相同,并且可以通过上述脚本进行可视化。
恢复中断的训练会话
训练会话可能因各种原因而中断。为此,模型状态会在每个 epoch 结束时保存,并存储在输出文件夹中。除了可训练的卷积核之外,我们还会保存优化器的状态以及训练会话的相关参数(例如已训练的 epoch 数、当前学习率等),以便能够无缝地继续训练。中断的训练会话可以继续进行,方法与初始启动时类似,只需额外指定要加载已保存模型检查点的位置,从中断处继续训练:
./deepMedicRun -model ./examples/configFiles/deepMedic/model/modelConfig.cfg \
-train ./examples/configFiles/deepMedic/train/trainConfig.cfg \
-load ./examples/output/saved_models/trainSessionDm/deepMedic.trainSessionDm.DATE+TIME.model.ckpt \
-dev cuda0
或者,也可以在 trainConfig 文件中直接定义检查点路径。需要注意的是,路径绝不能指向 .index 或 .data 文件,必须以 .model.ckpt 结尾,这样加载器才能找到对应的 .index 和 .data 文件。
预训练模型与微调
神经网络的常见做法是先使用在一个任务或数据集上预训练好的网络,然后通过在第二个数据集上进行训练来对其进行微调。这可以通过在开始训练时指定预训练网络的检查点路径(-load)及其架构文件(-model)来实现。然而,非常重要的一点是,在微调阶段开始时,可能需要重置训练器的状态。否则,训练器仍会保留第一次训练会话中保存的状态信息(如已训练的 epoch 数、动量速度、学习率等)。这些参数都可以通过 -resetopt 选项重置,从而根据新的训练会话配置重新初始化,具体如下:
./deepMedicRun -model ./examples/configFiles/deepMedic/model/modelConfig.cfg \
-train ./examples/configFiles/deepMedic/train/trainConfigForRefinement.cfg \
-load ./path/to/pretrained/network/filename.DATE+TIME.model.ckpt \
-resetopt \
-dev cuda0
训练参数
通用参数:
- sessionName:训练会话的名称,用于保存训练好的模型、日志和结果。
- folderForOutput:主输出文件夹。
- cnnModelFilePath:已保存 CNN 模型的路径(用于恢复训练时使用;若使用
-load参数则忽略此设置)。 - tensorboard_log:指定是否启用指标记录以供 TensorBoard 可视化(见第 3.2 节),这会占用磁盘空间。
训练输入参数:
- channelsTraining:对于每个输入通道,该列表应包含一个条目,条目内容为对应通道文件的路径。这些文件列出了所有训练样本中各通道的路径。请参考示例中提供的预设文件,即可轻松理解。
- gtLabelsTraining:包含所有训练样本真实标签文件的路径。
- roiMasksTraining:在许多任务中,我们可以轻松定义感兴趣区域并生成其掩码,例如在人体扫描中排除空气部分,或在脑部扫描中提取脑部掩码。此时,该参数允许指定每个训练样本的 ROI 掩码。采样或推理将不会在该区域之外进行,从而使网络的学习能力集中在区域内。若无此参数,则将其删除或注释掉,采样将在整个体积上进行。
训练周期参数:
- numberOfEpochs:训练完成所需的总 epoch 数。
- numberOfSubepochs:每个 epoch 中要运行的子 epoch 数。
- numOfCasesLoadedPerSubepoch:在每个子 epoch 中,最多会加载指定数量病例的图像以提取训练样本。这样做是为了支持处理包含成百上千张图像的大规模数据集,避免一次性加载所有图像而导致资源消耗过大。
- numberTrainingSegmentsLoadedOnGpuPerSubep:在每个子 epoch 中,总共会提取指定数量的片段,并将其加载到 GPU 上以执行优化步骤。每个子 epoch 的优化步骤次数等于该数值除以训练批次大小(见模型配置)。片段越多,所需的 GPU 内存和计算量越大。
- batchsize_train:训练批次的大小。批次越大,所需的 GPU 内存越多。
- num_processes_sampling:在 GPU 上执行当前训练或验证的同时,可以并行提取用于下次验证或训练的样本。请指定并行采样进程的数量。
学习率调度:
- typeOfLearningRateSchedule:用于调整学习率的调度方式。“stable”表示保持学习率恒定;“predef”表示在预设的 epoch 下降学习率,用户需指定何时降低学习率;“auto”表示当验证准确率趋于平稳时自动降低学习率(不稳定);“poly”表示随时间缓慢降低学习率。建议使用恒定学习率,通过绘制曲线观察训练进展,并在改进停滞时手动创建“predef”调度来降低学习率。否则可选择“poly”,但务必确保训练时间足够长以达到收敛,可通过适当调整总训练 epoch 数来进行试验。
数据增强:
- reflectImagesPerAxis:指定是否希望在训练过程中对图像沿各个轴进行随机翻转以实现数据增强。
- performIntAugm:随机对片段的像素强度进行变换:I' = (I + shift) * multi
验证:
- performValidationOnSamplesThroughoutTraining、performFullInferenceOnValidationImagesEveryFewEpochs:布尔值,用于指定是否执行验证,因为验证过程实际上非常耗时。
- channelsValidation、gtLabelsValidation、roiMasksValidation:与对应的训练参数类似。如果启用了默认的验证采样设置,则会在整个体积范围内均匀地进行验证采样,以确保各类别的分布正确。
- numberValidationSegmentsLoadedOnGpuPerSubep:每次验证时加载到 GPU 上的验证片段(样本)数量。
- numberOfEpochsBetweenFullInferenceOnValImages:每隔多少个 epoch 执行一次完整的验证推理。频繁处理所有验证样本可能会比较慢。
- namesForPredictionsPerCaseVal:如果执行了完整推理验证,可以将结果保存下来以便直观地检查进度。这里需要指定一个文件路径,该文件应包含一个名称列表,每个病例对应一个名称,用于保存结果。只需填写名称,无需路径。结果将被保存在输出文件夹中。
3.3. 测试
当一个训练 epoch 结束时,模型的状态会被保存下来。这些模型可用于对之前未见过的扫描数据进行分割。需要指定一个测试配置文件。测试可以通过两种方式启动。
a) 直接在命令行中指定模型:
./deepMedicRun -model ./examples/configFiles/deepMedic/model/modelConfig.cfg \
-test ./examples/configFiles/deepMedic/test/testConfig.cfg \
-load ./path-to-saved-model/filename.model.ckpt \
-dev cuda0
b) 也可以在测试配置文件中指定已保存模型的路径,然后省略 -load 选项。注意: 使用 -load 选项指定的文件会覆盖配置文件中任何相关设置。
加载模型后,将在测试样本上执行推理。可以保存预测的分割掩码、每个类别的后验概率图以及任意层的特征图。如果提供了真实标签,DeepMedic 还会报告其预测结果的 DSC 指标。
请注意,此测试流程与每几个训练 epoch 就对验证样本执行一次的完整推理流程相似。
测试参数
主要参数:
- sessionName:会话名称,用于保存日志和推理结果。
- folderForOutput:用于保存日志和结果的输出文件夹。
- cnnModelFilePath:要使用的 CNN 模型路径。如果已在命令行中指定,则忽略此参数。
- channels:测试每个病例的通道文件列表路径。与训练时的相应参数类似。
- namesForPredictionsPerCase:保存每个病例预测结果所用名称的文件路径。
- roiMasks:如果可以创建受限感兴趣区域的掩码,则推理仅在该区域内进行。如果配置文件中未指定此参数,则会对整个体积进行扫描。
- gtLabels:每个病例的真实标签文件路径列表。测试时并非必需,但如果提供,将会报告 DSC 准确率指标。
保存预测结果:
- saveSegmentation、saveProbMapsForEachClass:指定是否需要保存分割掩码和各分类别的概率图。
保存特征图:
- saveIndividualFms、saveAllFmsIn4DimImage:指定是否需要保存特征图。可以选择将每个特征图单独保存为文件,或者将所有特征图合并成一个四维文件。需要注意的是,特征图数量较多,四维文件可能达到几百 MB 甚至 GB 的大小。
- minMaxIndicesOfFmsToSaveFromEachLayerOfABCPathway:由于特征图数量庞大,可以指定要保存的具体特征图。需提供希望保存的各层特征图的最小索引(包含)和最大索引(不包含)(索引从 0 开始)。
4. 如何在您的数据上运行 DeepMedic
examples/configFiles/deepMedic/ 中的 .cfg 配置文件 提供了用于创建和训练 DeepMedic 的参数。这些参数与我们在文献 [1] 中使用的内容相似(但不完全相同),也与我们在 ISLES 2015 挑战赛中的获奖方案 [2] 所使用的参数一致。为了支持更广泛的应用场景和用户群体,examples/configFiles/deepMedic/ 中的配置文件正逐步更新,加入一些被认为能够提升系统整体性能的组件。(注:上述论文中所使用的原始配置可在归档的 GitHub 分支 'dm_theano_v0.6.1_depr' 中找到。)
要在您的数据上运行 DeepMedic,您需要按照以下最低步骤操作:
a) 按照第 1.4 节所述对您的数据进行预处理。请务必将其归一化到均值为零、方差为 1 的空间。如果任务需要,尽可能生成 ROI 掩膜(例如脑掩膜)。
b) 在 modelConfig.cfg 文件中,将变量 numberOfOutputClasses = 5 修改为您任务中的类别数(例如,如果是二分类则设为 2),并将 numberOfInputChannels = 2 修改为输入模态的数量。现在您可以使用 -newModel 选项来创建模型。
c) (可选)如果您希望训练一个更大或更小的网络,最简单的方法是增加或减少每层的特征图数量。这可以通过修改变量 numberFMsPerLayerNormal = [30, 30, 40, 40, 40, 40, 50, 50] 中的特征图数量来实现。
d) 在开始训练网络之前,您需要修改 trainConfig.cfg 文件,以便让软件知道您的输入图像位于何处。变量 channelsTraining = ["./trainChannels_flair.cfg", "./trainChannels_t1c.cfg"] 已预先设置为指向两个文件,每个文件对应一个输入变量。请根据您的任务调整此设置。
e) 为您的任务创建与上述 ./trainChannels_flair.cfg 和 trainChannels_t1c.cfg 文件相对应的文件。这些文件本质上都是列表,每个文件都包含所有训练样本的条目,条目内容是该样本对应模态图像的 .nii 文件路径。查看提供的示例文件即可明白具体格式。
f) 同样地,通过变量 gtLabelsTraining = "./trainGtLabels.cfg" 指向用于训练的真值标签文件,并通过 roiMasksTraining = "./trainRoiMasks.cfg" 指向 ROI 掩膜文件(如果有)。如果未提供 ROI 掩膜,则推理将覆盖整个图像区域;否则,推理仅在 ROI 内进行。
g) 如果您希望在训练过程中定期进行 验证,可以参照上述方法,通过变量 channelsValidation、gtLabelsValidation 和 roiMasksValidation 指向验证集样本的文件。如果您不打算进行验证(因为耗时较长),请将 performValidationOnSamplesThroughoutTraining 和 performFullInferenceOnValidationImagesEveryFewEpochs 设置为 False。
h) (可选)如果您需要调整训练会话的长度,例如针对较小的网络,最简单的方法是降低总 epoch 数 numberOfEpochs=35。同时,您还应相应调整预定义的学习率调度表 predefinedSchedule。另一种选择是使用递减的学习率调度方式,将 typeOfLearningRateSchedule = 'poly' 设置为多项式调度。
i) 测试已训练好的网络时,您需要像 d) 点所述那样指向测试集样本的图像。调整变量 channels = ["./testChannels_flair.cfg", "./testChannels_t1c.cfg"] 来指向测试样本的模态图像。如果存在 ROI 掩膜,请通过 roiMasks 指向它们,这样推理将仅在 ROI 区域内进行。否则,请将此变量注释掉。同样,如果您通过 gtLabels 提供测试样本的真值标签,系统将计算预测准确率并报告 DSC 指标;否则,请将此变量注释掉。
j) 最后,您需要创建一个文件,列出为每个测试样本生成的预测结果所要使用的名称。请参阅 namesForPredictionsPerCase = "./testNamesOfPredictionsSimple.cfg" 变量及其对应的预设文件。完成以上步骤后,您就可以使用该模型进行测试了。
所提供的 DeepMedic 配置在 NVIDIA GTX Titan X 上大约需要 2 天时间才能完成训练。对标准大小的脑部扫描进行推理通常需要 2–3 分钟。如果您的任务耗时过长,请调整训练和测试的配置,或考虑对数据进行下采样。
5. 结语
我们希望公开发布这款软件能够加速深度学习在生物医学图像处理与分析领域的应用。目前该软件仍在积极开发中,因此请注意它尚未达到模块化和完全通用的程度。在当前状态下,我们认为它可以作为进一步研究的基准方法,也可用作各种工作流中的分割系统。如果您认为我们的工作对您的研究产生了积极影响,请引用我们的论文 [1]。
我深知该软件的许多功能尚未完全模块化,API 也远未完善。我希望 DeepMedic 能够成为社区中有用的工具。如您有任何反馈或问题,欢迎随时通过电子邮件与我联系:konstantinos.kamnitsas12@ic.ac.uk
祝好,
Konstantinos Kamnitsas
6. 许可证
DeepMedic 软件许可证:BSD 3-Clause 许可证。该许可证副本位于根目录中。
示例数据许可证:知识共享署名-非商业性使用-相同方式共享 3.0 瑞士许可协议。http://creativecommons.org/licenses/by-nc-sa/3.0/ch/deed.en
版本历史
v0.8.22020/04/26v0.8.02019/11/14v0.7.22019/03/18v0.7.12019/02/13v0.7.02018/06/27v0.5.12016/08/04v0.52016/08/04常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
gemini-cli
gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器