medicaldetectiontoolkit
medicaldetectiontoolkit 是由德国癌症研究中心医学图像计算部门开发的开源框架,专为医学图像的目标检测任务设计。它支持 2D 及 3D 图像的处理,集成了 Mask R-CNN、Retina Net 和 Retina U-Net 等主流检测算法,提供了从数据预处理、训练到推理的完整流程。
针对医学图像数据量大且复杂的特点,medicaldetectiontoolkit 解决了多尺度检测、动态切片拼接以及跨维度预测整合等技术难题。其模块化设计允许用户灵活共享处理步骤,便于模型间的对比研究。框架还支持边界框与像素级标注训练,并提供对象级与患者级的双重评估监控。
medicaldetectiontoolkit 主要面向医学影像领域的研究人员和开发者,尤其是需要复现或对比经典检测模型的用户。值得注意的是,medicaldetectiontoolkit 目前已停止维护,官方建议转向其后续框架 nnDetection。尽管如此,其代码结构和技术实现仍具有较高的参考价值,适合希望深入了解医学目标检测底层逻辑的学习者。
使用场景
某医疗 AI 研发团队正在构建基于 3D CT 影像的肺结节自动检测系统,需要高效训练深度学习模型以辅助医生诊断。
没有 medicaldetectiontoolkit 时
- 需手动编写 3D 图像动态切块代码,处理显存溢出与重叠区域预测融合非常耗时。
- 复现 Mask R-CNN 等主流检测算法需从头搭建,难以保证医学场景适配性且易出错。
- 缺乏统一的评估框架,物体级与患者级指标统计逻辑分散,容易得出错误结论。
- 医学数据增强策略零散,难以集成到训练流水线中,导致模型泛化能力不足。
使用 medicaldetectiontoolkit 后
- medicaldetectiontoolkit 内置 2D/3D 动态切块与拼接功能,自动加权处理重叠区域预测。
- 直接调用预实现的 Retina U-Net 等模型,模块化结构便于快速对比不同算法效果。
- 集成 COCO 评估指标,支持同时监控物体与患者层面的检测性能,评估更精准。
- 整合 MIC-DKFZ 数据生成器,轻松实现大规模医学图像增强,显著提升模型鲁棒性。
medicaldetectiontoolkit 显著降低了医学目标检测的开发门槛,让团队能专注于算法优化而非底层工程实现。
运行环境要求
- Linux
- macOS
需要 NVIDIA GPU (默认支持 TitanX,支持 GTX 960M/1070/1080 但需根据架构 sm_50/52/61 重新编译 CUDA 函数),需安装 CUDA toolkit (nvcc)
未说明

快速开始
*** MedicalDetectionToolkit 不再维护。请查看我们的后续框架: nnDetection ***

Copyright © 德国癌症研究中心 (German Cancer Research Center, DKFZ),医学图像计算部门 (Division of Medical Image Computing, MIC)。请确保您对此代码的使用符合代码 许可证 (license)。
概述
这是一个用于对象检测 (object detection) 的综合框架,特点包括:
- 主流对象检测器 (object detectors) 的 2D + 3D 实现:例如 Mask R-CNN [1], Retina Net [2], Retina U-Net [3]。
- 模块化且轻量级的结构,确保所有处理步骤(包括骨干架构 (backbone architecture))的共享,以实现模型的可比性。
- 使用边界框 (bounding box) 和/或像素级 (pixel-wise) 标注进行训练。
- 2D + 3D 图像的动态补丁化 (patching) 和平铺 (tiling)(用于训练和推理 (inference))。
- 跨补丁重叠 (patch-overlaps)、集成 (ensembles) 和维度的边界框预测的加权整合 [3]。
- 同时在对象和患者级别进行监控 + 评估。
- 2D + 3D 输出可视化。
- 集成 COCO 平均精度均值 (mean average precision) 指标 [5]。
- 集成 MIC-DKFZ 批量生成器 (batch generators) 用于广泛的数据增强 (data augmentation) [6]。
- 易于修改以评估实例分割 (instance segmentation) 和/或语义分割 (semantic segmentation)。
[1] He, Kaiming, et al. "Mask R-CNN" ICCV, 2017
[2] Lin, Tsung-Yi, et al. "Focal Loss for Dense Object Detection" TPAMI, 2018.
[3] Jaeger, Paul et al. "Retina U-Net: Embarrassingly Simple Exploitation of Segmentation Supervision for Medical Object Detection" , 2018
[5] https://github.com/cocodataset/cocoapi/blob/master/PythonAPI/pycocotools/cocoeval.py
[6] https://github.com/MIC-DKFZ/batchgenerators
如何引用此代码
请引用原始出版物 [3]。
安装
在虚拟环境 (virtual environment) 中设置包:
git clone https://github.com/pfjaeger/medicaldetectiontoolkit.git .
cd medicaldetectiontoolkit
virtualenv -p python3.6 venv
source venv/bin/activate
pip3 install -e .
我们使用两个 CUDA 函数:非极大值抑制 (Non-Maximum Suppression)(取自 pytorch-faster-rcnn 并添加了 3D 适配)和 RoiAlign(取自 RoiAlign,根据 此错误报告 进行了修复,并添加了 3D 适配)。在此框架中,它们已为 TitanX 预编译。如果您拥有不同的 GPU,则需要重新编译这些函数:
| GPU | 架构 (arch) |
|---|---|
| TitanX | sm_52 |
| GTX 960M | sm_50 |
| GTX 1070 | sm_61 |
| GTX 1080 (Ti) | sm_61 |
cd cuda_functions/nms_xD/src/cuda/
nvcc -c -o nms_kernel.cu.o nms_kernel.cu -x cu -Xcompiler -fPIC -arch=[arch]
cd ../../
python build.py
cd ../
cd cuda_functions/roi_align_xD/roi_align/src/cuda/
nvcc -c -o crop_and_resize_kernel.cu.o crop_and_resize_kernel.cu -x cu -Xcompiler -fPIC -arch=[arch]
cd ../../
python build.py
cd ../../
准备数据
此框架旨在让您能够在自己的数据集上训练模型。 在 medicaldetectiontoolkit/experiments 中提供了两个示例数据加载器 (data loaders),包含详细的文档,以确保您的项目快速启动。我加载数据的方式是使用一个预处理脚本,该脚本在预处理后将任何数据类型的数据保存为 numpy 数组 (numpy arrays)(这只需运行一次)。在训练/测试期间,数据加载器随后动态加载这些 numpy 数组。(请注意,数据输入端旨在由您根据自己的需求进行定制,提供的数据加载器仅是示例:LIDC 拥有一个强大的数据加载器 (Dataloader),可处理 2D/3D 输入,并针对基于补丁 (patch-based) 的训练和推理进行了优化。Toy-Experiments 拥有一个轻量级数据加载器,仅处理 2D 而不进行补丁处理。如果您想熟悉该框架,后者是合理的。)
执行
在配置文件中设置输入/输出 (I/O) 路径、模型和训练具体细节:medicaldetectiontoolkit/experiments/your_experiment/configs.py
训练模型:
python exec.py --mode train --exp_source experiments/my_experiment --exp_dir path/to/experiment/directory这会将配置和模型的快照 (snapshots) 复制到指定的 exp_dir,所有输出都将保存在那里。默认情况下,数据被分为 60% 训练、20% 验证和 20% 测试数据,以执行 5 折交叉验证 (5-fold cross validation)(可以在配置中更改为保留测试集 (hold-out test set)),并且所有折 (folds) 将迭代训练。为了训练单个折,请使用 folds 参数指定它:
python exec.py --folds 0 1 2 .... # specify any combination of folds [0-4]运行推理 (inference):
python exec.py --mode test --exp_dir path/to/experiment/directory这将运行预测管道 (pipeline) 并将所有结果保存到 exp_dir。
模型
此框架包含 [3] 中探索的所有模型(以 2D + 3D 实现):提出的 Retina U-Net,一种简单但有效的架构 (Architecture),融合了最先进的语义分割 (semantic segmentation) 与对象检测 (object detection),

还包括主流对象检测器 (object detectors) 的实现,例如 Mask R-CNN、Faster R-CNN+ (Faster R-CNN w\ RoIAlign)、Retina Net、U-Faster R-CNN+(Retina U-Net 的两阶段对应物:带有辅助语义分割的 Faster R-CNN)、DetU-Net(一种类似 U-Net 的分割架构,带有用于对象检测的启发式方法 (heuristics)。)

训练标注
本框架支持使用像素级(pixelwise)和/或边界框(bounding box)标注进行训练。为了克服数据增强中边界框坐标的问题,我们将标注掩膜(annotation masks)通过数据增强处理(如果仅提供边界框标注,则创建伪掩膜(pseudo mask)),然后再绘制边界框。

该框架进一步处理两种类型的像素级标注:
- 一个标签图(label map),其中各个感兴趣区域(Regions of Interest, ROIs)通过递增的标签值进行识别,并伴有一个向量,该向量在每个位置包含对应标签病灶(lesion)的类别目标(对于此模式,在数据加载器(Data Loader)中调用 ConvertSegToBoundingBoxCoordinates 时设置 get_rois_from_seg_flag = False)。
- 一个二值标签图(binary label map)。只有一个前景类(foreground class),不识别单个病灶。所有病灶具有相同的类别目标(前景)。在这种情况下,数据加载器会运行连通分量标记算法(Connected Component Labelling algorithm)来动态创建可处理的病灶 - 类别目标对(对于此模式,在数据加载器中调用 ConvertSegToBoundingBoxCoordinates 时设置 get_rois_from_seg_flag = True)。
预测流程
本框架提供一个推理模块(inference module),可自动处理输入的分块(patching),以及输出预测的平铺(tiling)、集成(ensembling)和加权整合(weighted consolidation):

预测整合(加权框聚类)
同一图像的多次预测(来自测试时增强(Test Time Augmentations)、测试过的 epoch(训练轮次)和重叠分块)会产生大量的框(或立方体),需要进行整合。在语义分割(semantic segmentation)中,最终输出通常通过对所有预测的每个像素进行平均来获得。如 [3] 所述,加权框聚类(Weighted Box Clustering, WBC)针对框预测执行此操作:


可视化 / 监控
默认情况下,会监控损失函数(loss functions)和性能指标(performance metrics):

每个前景类都会绘制训练/验证/测试的匹配输出预测直方图:
每个 epoch 后绘制采样验证批次(validation batch)的输入图像 + 真实标注(ground truth) + 输出预测(此处为 2D 采样切片,通道中包含 +-3 个相邻上下文切片(context slices)):

放大 plots 的最后两行:
许可证
本框架根据 Apache 许可证版本 2.0 发布。