2. 医学影像数据与模型生命周期
在医学影像 AI 工程中,模型版本管理从来不是孤立的问题。一个模型从 v1.0 迭代到 v1.3,背后往往同时发生着数据格式的转换、标注规范的修订、训练集与验证集的重新划分。如果只盯着模型权重文件做版本控制,而忽略数据侧的变化,就会出现“模型回滚了但数据没回滚”“同一版本号对应两套标注”这类难以排查的问题。本节把数据、标注、模型三条线放在同一时间轴上,说明它们如何相互约束,以及工程上应当如何组织。
一、DICOM 与 NIfTI 的数据特性差异
DICOM 是临床设备输出的原始格式,本质是“一次检查、一个序列、多张切片”的集合。每张切片都携带完整的头信息:患者标识(PatientID)、检查号(StudyInstanceUID)、序列号(SeriesInstanceUID)、实例号(InstanceNumber)、层厚(SliceThickness)、像素间距(PixelSpacing)、窗宽窗位(WindowCenter/WindowWidth)、重采样斜率与截距(RescaleSlope/RescaleIntercept)等。这些字段决定了像素值到物理量的映射关系,也决定了切片在三维空间中的正确排序。
NIfTI 则是为神经影像分析设计的单文件(.nii)或双文件(.hdr/.img)格式,核心是仿射矩阵(sform/qform),它把体素索引直接映射到世界坐标(RAS 或 LAS)。相比 DICOM,NIfTI 丢失了患者隐私字段和大部分设备参数,但保留了空间几何信息,便于直接送入深度学习框架。
两者的关键差异可以归纳为:DICOM 是“以切片为单位、头信息冗余、需要重建三维体数据”,NIfTI 是“以体数据为单位、几何信息集中、便于计算”。工程上常见的做法是:DICOM 作为归档与溯源层,NIfTI 作为训练与推理层,中间通过转换脚本建立映射关系。
二、标注版本:比模型版本更容易失控
标注是医学影像 AI 中最昂贵的资产。一个肺结节标注项目,可能经历三轮修订:第一轮由住院医师初标,第二轮由主治医师复核,第三轮由专家组仲裁分歧病例。每一轮都会产生新的标注文件,但图像本身没有变化。如果标注文件没有独立的版本标识,训练脚本读取到的可能是任意一轮的结果。
工程上推荐的做法是:标注以“标注批次(annotation batch)”为单位管理,每个批次包含批次号、标注规范版本、标注人员、复核状态、与图像数据的对应关系。例如:
annotation_batch: AB-2024-017
spec_version: v2.3
images: nifti_v1.2 (sha256: 3f8a...)
labeler: resident_07
reviewer: attending_03
status: reviewed
cases: 412
positive_slices: 1876
当标注规范从 v2.3 升级到 v2.4(例如把“磨玻璃结节最小直径”从 5mm 改为 4mm),必须重新评估受影响病例,而不是直接复用旧标注。否则模型学到的边界定义与临床预期不一致,表现为假阳性率异常升高。
三、模型迭代与数据、标注的绑定关系
模型迭代的本质是“在特定数据快照和标注快照上训练出的权重”。因此,一个可复现的模型版本应当同时记录三要素:
- 数据快照:NIfTI 数据集的版本号与哈希,包含预处理参数(重采样间距、归一化方式、方向编码)。
- 标注快照:标注批次号与规范版本,包含训练/验证/测试划分的随机种子或划分文件。
- 训练配置:网络结构、损失函数、学习率、数据增强策略、训练轮数。
三者中任何一个变化,都应产生新的模型版本号。常见的错误是只改数据增强就覆盖旧版本,导致线上模型无法回溯到具体训练条件。
四、发布环节的版本对齐
模型发布到推理服务时,输入数据的预处理必须与训练时完全一致。如果训练用的是 1×1×1 mm 重采样、RAS 方向、HU 截断到 [-1000, 400],而推理服务直接读取原始 DICOM 并做 0.8×0.8×1.25 mm 重采样,模型的输出分布会发生偏移。这种问题在离线评估中往往看不出来,因为评估集也是按训练预处理做的。
因此,发布清单中应包含一条“预处理契约”:
| 项目 | 训练侧 | 推理侧要求 |
|---|---|---|
| 重采样间距 | 1×1×1 mm | 必须一致 |
| 方向编码 | RAS | 必须一致 |
| HU 范围 | [-1000, 400] | 必须一致 |
| 归一化 | (x+1000)/1400 | 必须一致 |
| 输入尺寸 | 128×128×128 | 必须一致 |
五、生命周期中的版本关系总结
把三条线放在一起看:DICOM 归档是源头,NIfTI 转换是第一次版本化,标注批次是第二次版本化,模型训练是第三次版本化,发布是第四次版本化。每一次版本化都应产生不可变的标识,并通过外键关联到上游版本。这样,当线上出现问题时,才能沿着“模型版本 → 训练配置 → 标注批次 → NIfTI 数据集 → DICOM 序列”逐级回溯,定位到具体是哪一次变更引入了偏差。