☰
腹部多期CT开源数据集实测:M与P数据集的选择与处理
2026/10/20 5:36:34 网站建设 项目流程

开头先聊点实在的。做医学影像AI最头疼的往往不是模型选型,而是数据从哪来。尤其腹部增强CT,单期扫描的数据好找,随便一个公开平台都能翻到不少,可一旦项目需要“多期增强序列”,比如动脉期、门脉期、延迟期都齐全的完整检查,可选的开源资源立刻少了一个数量级。我去年在做一个肝脏肿瘤辅助检测的实验,光是找数据就花了快两周,最后翻来翻去,真正能下载、能合规用于研究、还带标注的开源腹部多期CT数据集,能打的也就那么几个。这篇文章就集中介绍我实际用过的两个开源腹部多期CT数据集。为了后文表述方便,下面分别用M数据集和P数据集来指代它们。文章会覆盖数据集概况、适合的任务、下载后的处理方式,以及不少文档里不会写的坑。

1. 为什么多期CT这么难找:先看懂四期影像到底给了什么信息

1.1 一次增强扫描,到底拍了什么

要理解这两个数据集的价值,得先搞清楚多期增强CT的原理。常规增强扫描不是单纯把同一部位拍四遍,而是在静脉注射含碘造影剂之后,按照造影剂在血液里流动的时间节点,卡着时间点分别拍几套容积数据。

以肝脏为例,最常见的采集节奏是:先做平扫,这是造影剂注射之前的基线图像,组织密度是原始状态;注射后大约25到30秒,造影剂主要还在动脉系统里,这时候采集的是动脉期,肝脏实质本身强化不明显,但肝动脉供血的富血供肿瘤会在这期异常显亮;再往后约60到70秒,造影剂已经流到门静脉系统和肝窦,肝实质整体强化明显,这期叫门脉期,很多病灶在动脉期的“亮”会回落,变成相对低密度;再过三到五分钟甚至更久,造影剂进入组织间隙再缓慢洗脱,采集到的是延迟期,不同病灶的廓清表现不同,又能进一步区分。

所以所谓“多期”,本质上是在追踪造影剂在一个器官里的流入、分布、消退全过程。单期CT像一张静态照片,多期CT像一段连续拍摄的视频,信息维度完全不一样。

1.2 多期数据为什么比单期值钱

单期CT做病灶检测,模型能学到的本质是一个时间点的密度特征。但很多腹部病变的鉴别诊断恰恰依赖动态变化模式。最典型的是肝细胞癌的“快进快出”:动脉期快速明显强化,门脉期或延迟期密度快速下降。肝血管瘤则是“慢进慢出”,动脉期边缘结节状强化,延迟期持续填充。还有一部分肝转移瘤,动脉期几乎看不出来,门脉期才表现为低密度灶。

这些病灶如果只有单期数据,模型看到的就是一个孤立密度值。你在某单个期相上标注了病灶,模型学到的也只是这个期相上的外观,很难泛化到其他时期或不同扫描方案的数据。多期数据则能让模型学到“随时间变化的增强曲线”,这对很多任务不是锦上添花,而是刚需。

1.3 开源资源稀少的三层原因

道理大家都懂,为什么开源的多期腹部CT数据这么少?我的理解有三层。

第一是采集门槛。多期扫描意味着患者要接受多次X线曝光,辐射剂量明显高于单期检查,公开释出这类数据必须做更严格的伦理和隐私审查。第二是标注成本。单期分割一个肝脏或一个肿瘤已经够累了,多期数据如果要配套完整标注,需要医生在多个期相上分别完成病灶勾画,或者至少完成跨期对应,这个工作量比单期翻了好几倍。第三是配准问题。患者呼吸、肠道蠕动、体位变化都会导致不同期相的器官位置不完全对齐,数据发布方如果不想背上“数据质量差”的争议,就得先做大量预处理工作。这一套流程下来,能公开的、带完整标注的多期腹部CT数据集自然就少。

所以如果你正好在找这类资源,能同时见到两个规模还算可以的开源多期腹部CT数据集,是一件值得认真对待的事情。

2. M数据集:肝脏四期增强数据,跑肝脏肿瘤实验的起点

2.1 数据概况

M数据集来自某个公开医学影像数据平台,是某医学中心历年的腹部增强CT检查脱敏后整理释出的版本,采集设备以多排螺旋CT为主。官方说明里提到约几百例量级的病例,每例基本包含平扫、动脉期、门脉期、延迟期四套序列。我实际下载后核对了随机抽样的几十例,绝大多数病例确实四个期相都有,但个别病例缺少平扫或延迟期,这点后面细说。

数据格式官方给出的是DICOM序列,按病例分文件夹存放,每个期相是一个独立的序列目录。标注方面,M数据集主打肝脏肿瘤,提供两类标签:一类是肝脏整体分割mask,另一类是肝脏病灶的分割mask,标注主要基于门脉期完成,有少数病例额外提供了动脉期和延迟期的病灶标注。这样的标注设计其实很合理,门脉期肝实质强化最均匀,病灶和正常组织的对比度最好,医生勾画边界时最有信心。

2.2 适合做什么、不适合做什么

我的实践结论是,M数据集最适合三类任务。

第一类是肝脏肿瘤检测和分割。因为病灶mask质量整体不错,直接拿门脉期做单期模型、或者拿四期做多期融合模型,都有充足数据量支持。第二类是肿瘤多期增强模式分析。有了四个期相,你可以提取每个病灶的增强曲线特征,用来训练良恶性分类或病灶分型模型。第三类是作为多期影像预训练数据,先用它训练一个自监督或分割预训练模型,再迁移到其他任务上。

不太适合用M数据集做的任务,包括但不限于:多器官分割,因为它只标了肝脏和病灶,其他腹部器官都是背景;胰腺、肾脏等器官的精细解剖结构分析,以及需要逐期配准的精细研究,因为官方没有提供各期之间的配准位移场,默认情况下三期之间是存在呼吸位移的。

2.3 期相顺序和窗宽窗位:这两个坑我替你们踩过了

用M数据集跑实验,我遇到的第一个坑是期相顺序。

不同病例的DICOM系列描述并不统一。有的序列名写得很清楚,比如“C+ Portal Venous Phase”,一眼能认出是门脉期;有的就写成“V 70s”或者“Series 3”,只给一个增强后秒数;还有极少数病例连系列描述都是空的,只有扫描协议里的触发信息。如果直接按文件夹名字的自然排序把四个期相当成固定顺序塞给神经网络,后果就是模型内部把门脉期和动脉期搞混。第一次跑训练时我偷懒没做序列重排,结果模型在验证集上的指标看起来还行,但可视化预测结果发现同一病灶在不同期相上的位置根本对不上,排查了一整个晚上才发现是序列顺序错乱了。

现在我处理M数据的第一步永远是写脚本自动判读期相,结合系列描述、触发监测信息和扫描延迟时间三重判断,然后人工抽查至少十例,确认无误再进入下一步。

第二个坑是窗宽窗位和体素值分布。肝脏增强扫描不同期相的CT值范围差别很大:平扫肝脏实质一般在40到60HU,动脉期因为有造影剂进入血管和部分富血供区域,CT值跨度更宽,门脉期肝实质整体抬升到80到130HU也正常。如果像处理单期CT那样,把全数据集所有期相合在一起算一个全局均值和标准差做归一化,相当于人为抹平了增强曲线的动态差异。我后来改成每个期相分别统计归一化参数,模型在动脉期病灶检测上的表现稳定了很多。

3. P数据集:多器官多期分割数据,做解剖量化更合适

3.1 数据概况

P数据集同样来自公开医学影像数据平台,但定位和M数据集完全不一样。它的重点是腹部多器官解剖结构,而不是单一脏器。数据集中每一例都提供多个腹部器官的分割mask,包括肝脏、胰腺、左右肾脏、脾脏、胆囊、主动脉、下腔静脉、胃、食管、十二指肠等,部分病例还额外标注了胰腺病变或者肝脏转移灶。

期相方面,P数据集多为两到三期增强扫描,比较常见的是动脉期和门脉期,少数病例有平扫或延迟期。病例数量级在百余例到两百例之间,比M数据集略少,但由于每个病例的标注器官数量多,总标注单元非常可观。

来源背景上与某个公开分割挑战赛相关,因此标注质量经历过竞赛和基线系统的反复验证,整体可信度比较高。数据和mask的存储格式以NIfTI为主,每个器官一个独立的mask文件,或者一个多标签mask文件,具体看你下载的版本。

3.2 多器官标签带来的新问题

M数据集只标肝脏和病灶,处理起来相对单纯;P数据集器官多,使用时的麻烦也随之增加。

最典型的问题是器官边界的标注不一致。胰腺和十二指肠周围、肝脏和胃壁之间的边界、胆囊壁这种薄层结构,标注医生容易在几个像素范围内产生分歧。直接拿所有这些mask拼成一个多标签体数据去训练模型,边界处的标签噪声会被放大,尤其是做精细分割任务时,预测mask容易在器官交界处出现“融成一团”的现象。

另外,不是每一例都完整标注了所有器官。我统计过P数据集里各器官的mask可用例数,最常见的器官如肝脏、胰腺覆盖率高一些,但十二指肠、食管这类结构时有缺失。如果你不加检查直接假设每个病例都有全器官标签,训练时就会遇到“标签空洞”的问题,这部分病例在loss计算时要么被跳过,要么引入错误的背景监督信号。

3.3 用它的正确姿势

基于几次实验的经验,我对P数据集的使用建议是:先做标签统计分析,确认要用的器官在哪些病例中有完整mask,然后只在这些病例上做相应的训练子集;对边界重叠或紧邻的器官,训练时可以对mask做轻微腐蚀,或者把重叠区单独设为一个忽略类别,避免模型在边界上无所适从。

P数据集最适合的任务是多器官解剖结构分割、器官体积量化、胰腺及周边结构研究和跨器官关系建模。它的胰腺标注尤其宝贵,胰腺形态变异大、周围脂肪组织多、边界模糊,是腹部分割里的硬骨头,能用来做模型鲁棒性的压力测试。但如果你想拿它做肿瘤精细检测,我不太建议:肿瘤标注只覆盖了部分病例,且不是这个数据集的建设重心,病灶层面的信息密度远不如M数据集。

4. 直接按任务选型:两套数据的对比与组合策略

4.1 核心参数对比

把两个数据集放在一起看,差异挺明显。列个表帮助快速决策:

对比维度M数据集P数据集
覆盖器官肝脏为主多个腹部器官
期相数量多为四期(平扫/动脉/门脉/延迟)多为两到三期(动脉/门脉为主)
病例规模数百例量级百余例到两百例量级
标注类型肝脏mask、肿瘤mask多器官mask、部分病灶mask
主要用途肝脏肿瘤检测、分割、多期融合多器官分割、解剖结构量化
数据格式DICOM序列为主NIfTI为主
标注基准期相门脉期为主各器官独立标注,无统一基准期相

4.2 三种典型场景的选型建议

如果任务围绕肝脏肿瘤展开,M数据集是更合适的基础。四个期相齐全对多期融合类模型特别友好,病灶标注密度也高。

如果任务是腹部多器官分割或者要分析胰腺、肾脏、脾脏等结构,选P数据集会更省事。一口气能拿到多个器官的mask,不用自己花大量时间去重新标注。

如果目标是做一个泛化性更强的模型,我建议把两个数据组合起来使用:先在P数据集上做多器官分割预训练,让模型学会腹部解剖结构的通用特征,再到M数据集上针对肝脏肿瘤任务微调。这一步迁移在对比实验里通常比直接从零训练收敛更快,而且对小病灶的检测稳定性更高,因为预训练阶段让encoder学到了更丰富的腹部纹理和边界特征。

4.3 混合使用时需要注意的分布差异

把两个数据集合并训练,看起来数据量变大了,但实际操作中有几个坑。

扫描协议不同会让同一个器官在视觉外观上有明显差异。层厚、重建核、造影剂剂量和注射速率都会影响图像质感,如果模型容量不够,它会倾向于记住“哪个数据集来的”而不是“病灶长什么样”。我在一次合并训练时发现,验证loss震荡得很厉害,后来检查发现M数据集和P数据集的动脉期CT值分布相差明显,把两边的病例混在一个batch里,网络输入分布剧烈波动。

缓解办法有两个:一是对所有数据统一重采样和归一化之后再合并;二是尽量控制每个batch内部的数据来源比例,或者干脆把数据集来源作为一个条件变量引入模型。更简单的做法是做两阶段训练,P数据预训练、M数据微调,这个方案在我自己的实验里更省心。

5. 下载之后怎么处理:我在预处理阶段踩过的坑

5.1 从DICOM到NIfTI的整理流程

不管从哪个平台下载,第一步都是把原始数据整理成统一格式。M数据集是DICOM,需要批量转换;P数据集直接给NIfTI,相对轻松。

转换我建议分两步走。第一步先用DICOM读取工具把每个序列转成独立的NIfTI文件,同时保留spacing、orientation这些元信息。这一步骤里最容易犯的错误是贪省事把增强后的多个期相直接合并成一个4D文件。4D NIfTI在医学影像工具里不算难处理,但很多分割框架加载起来并不方便,尤其在要单独做归一化和裁剪时,拆成多个3D文件灵活性高得多。

第二步是期相重排。我把M数据集的每个序列都过一遍自动分类逻辑,判断它到底是平扫、动脉期、门脉期还是延迟期。示意代码如下,实际使用时请根据自己的数据结构做调整:

# 示意代码:多期序列的期相判读逻辑 # 假设dcm是已经读取的DICOM对象 def guess_phase(dcm): desc = dcm.series_description.lower() if 'non' in desc or '平' in desc: return 'plain' if 'arter' in desc or '动脉' in desc: return 'arterial' if 'portal' in desc or '门' in desc or 'ven' in desc: return 'portal' if 'delay' in desc or '延迟' in desc: return 'delay' return 'unknown'

函数本身不难,难点在于“unknown”的处理。我的原则是宁可手动核对,也不要硬塞进某个期相。一次放错位置,后面整个训练过程都会被污染,而且这种问题往往要到可视化预测结果时才会被发现,排查成本极高。

5.2 重采样、裁剪与归一化

腹部CT原始数据的spacing差异很大,层厚从1mm到5mm都有,x和y方向的像素间距也不一致。统一重采样是必需步骤。我常用的配置是将图像重采样到约1mm×1mm×2mm的体素网格,这个配置在保持细节和节约显存之间比较平衡。图像用线性插值,mask一定要用最近邻插值,否则器官边缘会被插出一堆并不存在的灰度过渡带,label就污染了。

重采样之后是裁剪。对M数据集,我会先用肝脏mask计算包围盒,把图像裁剪到包围盒外扩若干体素的范围。这样既能显著减少背景计算量,又能让模型专注于肝脏区域,小病灶的检测精度通常会有提升。对P数据集则不建议按单个器官裁剪得太狠,因为它本身的价值就在于多器官空间关系,裁剪范围至少要把肝脏、胰腺、肾脏、脾脏全部包住。

归一化方面,肝脏增强CT我习惯先把CT值裁到[-125, 275]HU区间,再除以一个固定尺度,把所有体素压到接近0到1的范围。注意每个期相都要单独做这个操作,而不是所有期相混在一起。如果你用的是预训练模型,需要考虑预训练阶段的归一化方式,不能在这里自作主张引入新的偏移。

5.3 评估指标在多期任务里的坑

很多人在多期CT任务上沿用单期分割的评估习惯,只报一个Dice,这容易掩盖问题。Dice对体积较大的器官比较友好,但对小病灶非常苛刻。一个直径只有1厘米的肝转移灶,在512×512的矩阵里可能就几百个体素,预测结果只要偏了两个毫米,Dice就可能掉到0.5以下。所以做病灶检测和分割时,我更看重病灶级别的指标:先把预测和真值按连通域拆成单个病灶,再做配对,统计检出率、每个病灶的Dice、以及体积相对误差。

另一个必须提前定义清楚的问题是跨期病灶的匹配策略。多期模型输出的四个期相中,同一个病灶可能在动脉期被识别、在门脉期被识别、在延迟期漏检,那么在汇总指标时到底算检出还是漏检?我通常的做法是:任一期内检出就算检出,但会单独统计“跨期检出一致性”,也就是在多少期内同时检出的比例。这个指标对临床场景更有意义,因为医生看多期CT本来就是靠多个期相互相印证。

6. 存储、算力与现实落差:几个容易被忽略的问题

6.1 数据体量带来的工程问题

多期CT的数据量比拼单期大不少。粗略估算一下:一例四期腹部扫描,假设每期是512×512×300的矩阵,每个体素存成两个字节的CT值,一例就是约190MB,两百例就是将近40GB。这还不算转换产生的中间文件、mask文件、训练缓存和模型检查点。研究用的工作机上要预留至少两三倍的余量。

训练时更要注意加载策略。不要一次性把所有病例的四期数据全部读进内存,哪怕机器内存足够大,这种做法也会让数据预处理的故障点增多。我习惯用流式读入配合缓存机制,每次只把一个batch的patch读进显存,并且把已经完成预处理的NIfTI文件按病例单独存放,训练时按索引动态加载。

6.2 公开数据集和临床脏数据的落差

最后说一个心态上的问题。很多刚接触这两个数据集的同行,费了很大力气跑通流程,看到模型在测试集上指标不错,会以为距离临床落地只差一步。但实际上公开数据集和真实临床数据之间有相当大距离。公开数据经过脱敏、筛选、整理,扫描设备来源相对单一,图像质量相对稳定,连病灶都往往是医生挑过的典型病例。

真实临床数据则完全不是这样:期相缺失、扫描范围不一致、呼吸伪影、金属伪影、不同品牌的扫描仪重建差异、甚至同一台机器不同时期设置变化,都会让模型表现大幅回退。所以我的建议是,把这两个数据集当作开发基准和实验起点,用来验证模型结构和训练策略是否合理,但最终评估一定要落到自建的、贴近真实业务的验证集上,否则很容易在模型的泛化能力上产生误判。

写到这里,把我做这两个开源腹部多期CT数据集的完整经历和盘托出了。坦白说,医学影像开源数据这几年越来越多,但腹部多期CT的缺口依然很大。M数据集和P数据集一个偏肿瘤一个偏解剖,正好覆盖了我目前实验里最需要补齐的两类数据需求。如果你手头也在跑相关项目,建议拿到数据后先别急着训练,按这篇文章提到的顺序把期相核对、重采样、归一化都做扎实,后面会省下大量返工时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询