信息速览

STOIC — 新冠 CT 严重度定量数据集 AI-Ready Wikipedia
INFOBOX
| 字段 | 内容 |
|---|---|
| 数据集名称 | STOIC(新冠 CT 影像数据集) |
| 英文全称 | STOIC2021 — STOIC: Study of Thoracic CT in COVID-19(挑战全名:Severity quantification of COVID-19 in CT) |
| 别名/简称 | STOIC2021、STOIC DB、STOIC 挑战数据集 |
| 疾病分类 | ICD-11 1D00(COVID-19,2024 版;2020-2023 年间使用应急码 RA01) |
| SNOMED CT | 840539006(Disease caused by SARS-CoV-2) |
| 数据模态 | 胸部 CT(三维断层影像)+ 呼吸结局标签 |
| AI 任务类型 | 二分类(RT-PCR 阳性)+ 预后预测(1 个月内插管或死亡),主指标 AUC |
| 样本总数 | 10,735 例(每例 1 次 CT);公开训练集 2,000 例 |
| 数据大小 | 公开训练集约 260 GB(估算,2,000 个压缩 .mha) |
| 数据格式 | 压缩 MetaImage(.mha)+ reference.csv 标签文件 |
| 许可证 | CC BY-NC 4.0 |
| 访问级别 | 开放(S3 免注册直链下载;挑战参与与测试集评测需 grand-challenge.org 注册) |
| DUO 标签 | NCU(非商业用途) |
| 语言 | 标签与文档为英文;影像为二进制体数据 |
| 首发日期 | 2021-12(挑战公开训练集一次性全量发布) |
| 最后更新 | 2021-12(官方 Update Frequency:发布时一次性公开,此后冻结) |
| 发布机构 | APHP(法国巴黎公立医院集团);S3 托管 Radboud University Medical Center |
| 官方主页 | https://stoic2021.grand-challenge.org/ |
| 下载地址 | https://registry.opendata.aws/stoic2021-training/ |
| DOI | 10.1148/radiol.2021210384(数据描述论文) |
| 引用次数 | Revel 2021:64+(ResearchGate);Lassau 2021:177(Dimensions,截至 2025-12) |
| AI 就绪度评分 | ⭐⭐⭐⭐(4/5)— 官方划分 + 标签 CSV + S3 免注册直链;扣分:.mha 需自行预处理、测试集无标签、临床元数据仅年龄类别与性别两项 |
| 页面状态 | published |
§0 审核与可信度声明
医学审核:本文 §2 医学背景(COVID-19 影像学诊断、严重度分层与预后)、§7 偏倚与局限性分析由 [千方病案医学编辑部] 交叉审核,依据 Revel et al. 2021(Radiology,PMID 34184935)与 Lassau et al. 2021(Nature Communications)原始文献核对。
数据工程审核:[千方病案医学编辑部交叉审核] 医疗 AI 数据工程师,审核范围:§4 DAIMS 数据字典、§5 数据划分策略、§6 预处理 Pipeline 和坑点。下载命令依据 AWS Open Data Registry 与官方数据页核对(2026-09-12)。
审核日期:2026-09-05
医疗免责声明:本页面提供的医学信息仅供研究和教育目的,不构成医疗建议、诊断或治疗方案。数据集的医学描述基于公开发表的文献,未经逐一临床验证。任何基于该数据集训练的 AI 模型在应用于临床决策前,必须经过独立的临床验证和监管审批。
技术免责声明:本页面的代码示例、预处理建议和基准性能数据基于公开资料整理,不保证在特定环境下的准确性和适用性。使用者应自行验证代码安全性和数据预处理流程的正确性。千方病案医数集不对因使用本页面信息而导致的任何直接或间接损失承担责任。
数据使用合规:使用本页面描述的数据集前,请务必阅读并遵守数据集原始许可协议。STOIC 公开训练集采用 CC BY-NC 4.0 许可(署名-非商业性使用),AWS S3 免注册直链下载;挑战参与、测试集评测与 Docker 提交需在 grand-challenge.org 注册。DUO 标签仅供参考,具体使用限制以数据集官方协议为准。
§1 数据集概览
§1.0 📌 30 秒速览
这是什么? STOIC(Study of Thoracic CT in COVID-19)是法国 APHP 牵头、20 所大学医院在 2020 年第一波疫情期间建立的新冠胸部 CT 队列:10,735 例急诊疑似患者,每例配 RT-PCR 检测结果与 1 个月随访结局。STOIC2021 挑战从中公开 2,000 例训练样本(压缩 .mha 体数据 + 标签 CSV),核心任务是让 AI 只看 CT 就预测谁会发展成重度新冠——1 个月内插管或死亡。
为什么重要? 它是首批把「影像 → 预后」作为主任务的大规模开放新冠 CT 资源:不只是判断「有没有新冠」(2D 胸片库已解决这类问题),而是判断「谁会恶化」。官方挑战采用 T3 赛制——组织者在参赛者的代码库上用 9,724 例私有数据重训再评测——把「可复用的训练方法论」变成社区可比基准,决赛最优方案 AUC 达 0.815。
我能用它做什么? 训练 3D 胸部 CT 分类与预后模型(双二值标签)、做自监督预训练的迁移评测、研究多中心异构与类别不平衡下的稳健训练。数据在 AWS S3 免注册直链下载(--no-sign-request),无需任何申请流程,最适合快速跑通从下载到 AUC 评估的完整 pipeline。
§1.1 摘要
STOIC 项目于 2020 年 3 月 1 日至 4 月 30 日在 20 所法国大学医院急诊科前瞻性收集疑似新冠患者的胸部 CT 与 RT-PCR 结果(ClinicalTrials.gov NCT04355507),共纳入 10,735 例(中位年龄 65 岁,男性 6,147 例),其中 RT-PCR 阳性 6,448 例(60.0%);1 个月随访时 964 例死亡、611 例存活但曾插管,即 24%(1,575/6,448)的阳性病例为重度。STOIC2021 挑战(2021-12 启动,MICCAI 认可)将数据随机划分为公开训练集 2,000 例、测试集约 1,000 例与私有训练集 7,000+ 例,每患者选 1 次 CT,以压缩 .mha + reference.csv 发布在 AWS Open Data(CC BY-NC 4.0)。两个预测目标均为二值:RT-PCR 阳性(次要)与 1 个月重度(主要),主指标 AUC。资格赛榜首方案(ViT-L iBOT 特征 + 逻辑回归)验证 AUC 严重度 80.44;决赛阶段组织者以 9,724 例私有数据在参赛代码库上重训,最优 AUC 0.815。
§1.2 战略价值
科学维度——「预后」标签的稀缺性。 新冠影像公开库绝大多数只提供诊断级标签(阳性/阴性或病变分类),患者级结局标签极其稀缺。STOIC 用 10,735 例连续急诊队列给出双二值结局标签,且重度定义(1 个月内插管或死亡)客观、可审计,使「CT 是否包含独立于临床变量的预后信息」这一科学问题第一次有了大规模可复现的实验载体——Revel 2021 已证明 CT 病变范围是重度最佳预测因子(OR 3.25),Lassau 2021 证明 CT 深度特征能把严重度评分 AUC 提至 0.77-0.79 并优于 11 个临床评分。
工程与生态维度——挑战赛资产的复利。 数据以 AWS Open Data 托管(Open Data Sponsorship Program 资助存储),免注册、免申请、直链可脚本化下载,获取摩擦几乎为零;grand-challenge.org 平台沉淀了 Docker 提交协议、排行榜与开源决赛代码(DIAG Nijmegen code-1055),是研究「私有数据 + 参赛者代码」可复用训练方法论(T3)的少数公开样本;2023 年 AUC23 挑战与多篇自监督迁移论文继续以它为基准,生态活跃度远超普通一次性竞赛数据。
§1.3 同类数据集横向对比
| 数据集 | 规模 | 模态与任务 | 标注 | 差异化 |
|---|---|---|---|---|
| STOIC(本文) | 10,735 例患者(公开 2,000 例,每例 1 次 3D CT) | 胸部 CT 三维体数据;RT-PCR 阳性 + 1 个月重度双二值预测 | 实验室金标准 + 盲法影像读片 + 客观随访结局 | 患者级预后标签、免注册 S3 直链、挑战赛基准 |
| COVID-19 Radiography Database(本站已有条目) | 21,165 张 CXR(3,616 COVID),图像级、无患者级标识 | 2D 胸部 X 光;四分类 + 肺分割掩膜 | 多源聚合标签,继承自上游公开库 | 2D、图像级、量大易上手;但无患者 ID、无结局,去重后约 19,133 张唯一 |
| Lassau 2021 AI-severity 内部队列 | 1,003 例(两所法国医院) | 胸部 CT + 58 个临床/生物变量;严重度预测 | 氧流量 ≥15L/min/机械通气/死亡定义 | 多模态临床融合;但数据未公开,仅方法论参照 |
| AUC23 重打包版(同源) | 同 STOIC 公开 2,000 例 | 与 STOIC 相同(6 个 Zenodo batch 重打包) | 同 STOIC | 便于不依赖 AWS 的环境下载;文件名带 _0000 后缀 |
与 2D 胸片库的关键区别:STOIC 是三维体数据 + 患者级结局——它回答「这位患者会不会恶化」,而不是「这张图有没有新冠」。两者互补而非替代:做筛查分类 demo 用 CXR 库更轻,做预后建模与 3D 表征学习必须用 STOIC 这类 CT 体数据。
§1.4 版本时间轴
| 时间 | 事件 | 内容 |
|---|---|---|
| 2020-03 ~ 2020-04 | 数据采集 | 20 所法国大学医院急诊科,10,735 例纳入(NCT04355507) |
| 2021-01-27 | AI 论文发表 | Lassau et al.,Nature Communications 12:634,AI-severity 评分 |
| 2021-06 | 队列论文发表 | Revel et al.,Radiology 301(1):E361-E370,全队列描述与数据集公开承诺 |
| 2021-12 | STOIC2021 挑战启动 | 公开训练集 2,000 例全量发布;T3 决赛机制;MICCAI 认可、AWS 赞助 |
| 2022-04-09 | 资格赛榜首产生 | Balaitous 方案:验证 AUC 严重度 80.44 / 新冠 83.22 |
| 2023 | AUC23 挑战复用 | Radboud 将同源数据重打包为 6 个 Zenodo batch |
| 2024-10 | 挑战总结论文 | Boulogne et al.,Medical Image Analysis 97:103230,决赛结果与方法论 |
| 2025 | 后续研究 | BMC Med Inform Decis Mak 综述系统梳理基于本库与相关队列的严重度建模工作 |
§1.5 典型应用场景
| 场景 | 任务类型 | 关键指标 | 说明 |
|---|---|---|---|
| 新冠预后建模 | 3D CT → 重度二分类 | AUC | 主任务;CT 单模态即可,临床元数据仅 2 项 |
| 病原检测建模 | 3D CT → RT-PCR 阳性二分类 | AUC | 次要任务;可研究影像 vs 实验室的一致性边界 |
| 自监督预训练迁移评测 | 预训练 + 下游微调 | 下游 AUC 增益 | Anton et al. 2022、VoCo/COVER 等 2024-2025 工作的基准之一 |
| 多中心稳健性研究 | 跨中心/跨机型泛化 | 场景化 AUC | 20 家医院天然异构,无逐例设备字段,需自行读 spacing |
| 挑战式评测协议设计 | Docker 化盲测平台 | 平台复算 AUC | 参考其 T3 赛制与 grand-challenge 提交机制 |
场景与数据能力的匹配线很清晰:凡需要「患者级结局」的场景,STOIC 几乎不可替代;凡只需要「图像级分类」的场景,2D CXR 库更省资源。
§2 医学背景
§2.1 ICD-11 编码映射
| 数据集标签/概念 | ICD-11 编码 | 中文名称 | 备注 |
|---|---|---|---|
| COVID-19(疾病本体) | 1D00 | COVID-19 | 2024 版 ICD-11 编码;2020-2023 年间为应急码 RA01 |
| RT-PCR 阳性( covid 标签) | 1D00 | COVID-19,病毒已确认 | 与 ICD-10 U07.1 对应 |
| 1 个月重度结局(severe 标签) | 1D00 | COVID-19(危重路径) | 重度定义为插管或死亡,属预后而非独立病种编码 |
§2.1b SNOMED CT 映射
| 概念 | SNOMED CT 码 | 英文术语 | 说明 |
|---|---|---|---|
| COVID-19 疾病 | 840539006 | Disease caused by Severe acute respiratory syndrome coronavirus 2 | 疾病概念 |
| SARS-CoV-2 病原体 | 840533007 | Severe acute respiratory syndrome coronavirus 2(organism) | RT-PCR 检测对象 |
| 气管插管(结局组成部分) | 52765003 | Endotracheal intubation(procedure) | severe 标签的两个通路之一 |
| 死亡(结局组成部分) | 419099009 | Dead(finding) | severe 标签的另一通路 |
§2.2 疾病简介与流行病学
COVID-19 由 SARS-CoV-2 引起,2020 年 3-4 月正是法国第一波疫情高峰,重症监护资源紧张,「早期识别会恶化的患者」是当时最急迫的临床需求。典型胸部 CT 表现包括外周分布的磨玻璃影、实变与铺路石征。本队列作为第一波急诊疑似人群的横断面快照:10,735 例纳入者中位年龄 65 岁(IQR 51-77),男性 6,147 例(约 57.2%);RT-PCR 阳性率 60.0%(6,448 例),显著高于自然人群流行率——这是「疑似筛查人群」的选择效应,建模时必须记住。在阳性病例中,1 个月随访死亡 964 例(约 15.0%),另 611 例存活但曾插管,合计重度率 24%。以 RT-PCR 为参照,CT 的敏感度 80.2%(95%CI 79.3-81.2)、特异度 79.7%(95%CI 78.5-80.9),提示两个标签互为「不完美金标准」:CT 标签与 PCR 标签都有不可忽略的误差。
第一波疫情期间急诊胸部 CT 的典型征象,及其在 STOIC 双标签体系中的位置:
| CT 征象 | 影像学含义 | 与 covid 标签的关系 | 与 severe 标签的关系 |
|---|---|---|---|
| 外周分布磨玻璃影(GGO) | 早期渗出,COVID 肺炎最常见征象 | 读片阳性的核心判据之一 | 病变范围累积后进入预后模型 |
| 实变(consolidation) | 进展期渗出实变 | 支持阳性读片 | 与重度和死亡关联更强 |
| 铺路石征(crazy-paving) | GGO + 小叶间隔增厚 | 支持阳性读片 | 常见于重症谱系 |
| 病变范围(extent) | 累计受累肺野比例 | 读片标准组成部分 | Revel 2021 中重度最强预测因子(OR 3.25) |
| 冠脉钙化 | 非新冠征象,共病标志 | 无 | Revel 2021 模型第二强预测变量(加范围后 AUC 0.64→0.69) |
需要强调:STOIC 公开包不含分割掩膜或逐例定量评分——上表征象只是模型需要自行学习的目标,不是现成特征。
§2.3 临床任务定义
STOIC2021 把临床问题「急诊科拿到胸部 CT 时,这位患者一个月内会不会插管或死亡?」形式化为横断面预后预测:输入 = 一次基线胸部 CT(三维体数据,可选用 mha 头内的年龄类别与性别),输出 = 1 个月内重度(插管或死亡)的概率,主指标 AUC;次要任务 = 预测 RT-PCR 阳性。它属于「分级/预后」类任务,而非「筛查」或「诊断」——重度事件发生在采集之后,模型只能依赖采集时点的影像信息,因此任何「用随访期信息构造特征」的做法都是标签泄漏。
| 形式化项 | 定义 |
|---|---|
| 输入 | 1 次基线胸部 CT(3D 体数据,HU);可选 mha 头年龄类别/性别两项协变量 |
| 输出 | p_severe(1 个月内插管或死亡概率);p_covid(RT-PCR 阳性概率) |
| 主指标 | severe AUC(官方主任务);covid AUC(次要任务) |
| 禁用信息 | 采集后信息(治疗、随访、结局);未发布字段(时间戳、设备、实验室值) |
§2.4 患者人群表
| 维度 | 内容 |
|---|---|
| 来源 | 法国 20 所大学医院急诊科(APHP 牵头多中心队列) |
| 时间窗 | 2020-03-01 至 2020-04-30(第一波疫情) |
| 入选标准 | 急诊就诊 + 同时完成胸部 CT 与 RT-PCR 的疑似新冠患者;筛查 10,930 例,纳入 10,735 例 |
| 年龄 | 中位 65 岁(IQR 51-77);挑战版元数据仅提供 <80 / ≥80 二值类别 |
| 性别 | 男 6,147 / 女 4,588(约 57.2% / 42.8%) |
| 种族 | 未记录(官方未发布) |
| 就医类型 | 急诊疑似筛查人群(非普通人群,阳性率 60.0%) |
种族未记录既是隐私最小化的结果,也是公平性评估的硬边界(§7.5);引用人群统计时注明「法国第一波急诊疑似人群」口径。
§2.5 临床价值
在疫苗与前驱药物缺位的 2020 年春,把「会恶化」的患者提前识别出来意味着分级收治与资源前置。Revel et al. 2021 证明 CT 病变范围是重度最强预测因子(OR 3.25,95%CI 2.71-3.89),且 CT 读片不受年资影响(Gwet AC1 0.79);纯临床模型 AUC 0.64,加入 CT 病变范围与冠脉钙化积分后升至 0.69。Lassau et al. 2021 进一步证明 CT 深度特征携带独立预后信息,AI-severity 评分(CT 深度特征 + 年龄/性别/氧合/尿素/血小板 5 项)在内部 150 例与外部 135 例验证集分别取得 AUC 0.77 与 0.79,显著优于 11 个既有严重度评分。STOIC2021 挑战把这一「CT 是否值得看」的问题开放给全球社区,成为影像预后研究的公共试验场。
落地层面的三句话:① 影像信号的增量真实但有限(Lassau 摘要报告在临床变量基础上加入 CT 信息的 AUC 增益约 0.03),应把 CT 模型定位为临床评分的补充而非替代;② 1 个月窗口内的预后预测适合分诊与随访强度决策,不适合替代动态临床评估;③ 在与 STOIC 人群(法国第一波急诊)差异大的部署点上,重校准与前瞻验证缺一不可。
§2.6 金标准对照表
| 任务 | 标签定义 | 标注方式 | 标注者 | 性质 |
|---|---|---|---|---|
| RT-PCR 阳性 | 就诊时或一周内复测阳性 | 实验室核酸检测 | 客观检测 | 实验室金标准(存在假阴性) |
| CT 阳性 | 法国放射学会标准 | 盲法读片(对报告/PCR/人口学/结局设盲) | 7 名初级 + 13 名高级放射科医师(Gwet AC1 0.79) | 影像金标准 |
| 1 个月重度 | CT 采集后 1 个月内插管或死亡 | 临床随访结局登记 | 客观结局 | 结局金标准(定义明确、可审计) |
三个「金标准」互相之间并不一致:CT 敏感度 80.2% 意味着约五分之一的 PCR 阳性者 CT 读片为阴性——这正是「影像 + 实验室 + 结局」三标签并置的研究价值所在。
§3 数据集规格
§3.0 版本抉择矩阵
| 你的需求 | 推荐版本 | 大小 | 理由 |
|---|---|---|---|
| 训练/复现挑战基准 | S3 公开训练集(s3://stoic2021-training/) | 约 260 GB(估算) | 官方原版,与排行榜同源;免注册 --no-sign-request |
| 无 AWS 直连条件 | AUC23 Zenodo 镜像(6 batch) | 单批 43.7 GB | HTTP 下载,文件名带 _0000 后缀(nnU-Net 惯例),内容同源 |
| 参赛/盲测 | grand-challenge.org 注册提交 | 不下载数据 | 测试集约 1,000 例无标签,只能通过平台 Docker 提交评测 |
| 只要标签做元研究 | reference.csv(S3 桶内) | <1 MB | 患者级双标签,先下标签再决定是否拉全量 |
§3.1 模态详情
胸部 CT(三维断层体数据)。 每位患者入选 1 次基线胸部 CT(从住院检查中选取),以压缩 MetaImage(.mha)存储,HU 值域,体素间距与矩阵尺寸因中心而异(20 所医院、多家厂商机型,官方未记录逐例设备信息,spacing 需从文件头读取)。伴随模态为「结局模态」:RT-PCR 二值标签与 1 个月重度二值标签;mha 文件头内嵌两项临床元数据(年龄类别 <80/≥80、性别男/女)。没有平扫之外的增强序列区分、没有肺窗专用重建序列——全部为临床原始 CT 的匿名化副本。
.mha(MetaImage)是结构极简的医学体格式:ASCII 头 + 原始体素数组,STOIC 采用压缩变体,读取无需专业影像工具链:
# .mha 读取与头信息检查(SimpleITK 一行读取)
import SimpleITK as sitk
img = sitk.ReadImage("covid19severity_2.mha")
print(img.GetSize(), img.GetSpacing(), img.GetPixelIDTypeAsString())
print({k: img.GetMetaData(k) for k in img.GetMetaDataKeys()}) # 含年龄类别/性别元数据
# 转 NIfTI 生态(nnU-Net 等):sitk.WriteImage(img, "case.nii.gz"),无信息损失
§3.2 子集样本数表
| 子集 | 例数 | 标签可用性 | 获取方式 |
|---|---|---|---|
| 公开训练集(training set A) | 2,000 | 双标签 + mha 头元数据全公开 | AWS S3 免注册直链 |
| 测试集 | 约 1,000(由 10,735 − 9,724 = 1,011 反推) | 标签不公开,仅平台评测 | grand-challenge.org 注册 + Docker 提交 |
| 私有训练集 | 7,000+ | 仅组织者持有 | 不公开 |
| 决赛训练集 B | 9,724(≈ 全库减测试集) | 决赛阶段由组织者在参赛者代码库上重训 | 不公开 |
公开训练集 2,000 例是从「每患者 1 扫描」的全库中随机抽出;测试集「约 1,000」为官方口径,1,011 为 10,735 − 9,724 的算术反推——引用时注明推导方式。
§3.3 格式表
| 文件 | 格式 | 内容 | 说明 |
|---|---|---|---|
train/covid19severity_<patient_id>.mha |
压缩 MetaImage | 1 例患者胸部 CT 三维体数据(HU) | 每文件 1 患者;文件头含 Age/Gender 元数据 |
metadata/reference.csv |
CSV | 患者级双标签(RT-PCR 阳性、1 个月重度) | 2,000 行;列名以实际文件表头为准 |
AUC23 变体 imagesTr/*_0000.mha |
压缩 MetaImage | 同源数据重打包 | 文件名带 nnU-Net 惯例 _0000 后缀 |
§3.4 存储大小
官方未公布桶内逐文件尺寸清单的汇总值。可核对的锚点:AUC23 Zenodo 镜像把同一批 2,000 例分为 6 个 batch,batch 1 即 43.7 GB,按此估算全量公开训练集约 260 GB。规划磁盘时建议预留 ≥400 GB(数据 + 解压缓存 + 预处理副本);仅拉标签文件(reference.csv)则 <1 MB。
| 组件 | 量级 | 依据 |
|---|---|---|
| 单个 .mha | 数十至数百 MB | 2,000 例合计约 260 GB(估算) |
| 全量公开训练集 | 约 260 GB | AUC23 镜像 batch 1 = 43.7 GB × 6 |
| reference.csv | <1 MB | 2,000 行标签 |
| 重采样后缓存(1.5×1.5×5 mm) | 与原数据同量级或略低 | 规划 ≥400 GB 磁盘 |
| 转换副本(NIfTI,双份并存时) | +260 GB 量级 | 大团队建议 1 TB NVMe |
§3.5 标注方式
三类标注、三种机制:① RT-PCR 标签来自实验室核酸检测(含首测阴性、一周内复测阳性者),客观检测;② CT 阳性标签来自盲法影像读片(法国放射学会标准,7 名初级 + 13 名高级医师),仅用于队列研究,不是挑战标签;③ 1 个月重度标签来自临床随访结局登记(插管或死亡),客观结局。全部标签为患者级二值,无病变分割掩膜、无严重度评分连续值——需要分割或定位标签的研究者需自行弱监督标注或换用其他数据集。
§3.6 标注者资质与一致性
CT 读片由 20 名放射科医师完成(7 名初级、13 名高级),全部对初始报告、RT-PCR、人口学、症状与结局设盲;初级与高级医师间一致性 Gwet AC1 = 0.79(强一致性),官方论文结论为「CT 读片不受读片者年资影响」。结局标签无标注者(登记事实)。挑战未公布逐例读片者信息与多次重复读片数据,一致性指标只有队列级汇总值。
若你的论文需要报告分条件的标注者一致性(按中心/按病灶类型),本库无法支撑——只能引用队列级 Gwet AC1 0.79。
§3.7 采集周期
数据采集窗口极短且明确:2020-03-01 至 2020-04-30(法国第一波疫情高峰),单时间点横断面采集;1 个月结局随访覆盖至每例 CT 后 1 个月。官方 Update Frequency 声明「全量训练集于发布时一次性公开」——即 2021-12 后数据冻结,无增量版本,不存在「新版本追赶」问题。
随访窗口的两点提醒:结局随访覆盖每例 CT 后 1 个月,事件计数(964 死亡 + 611 插管)即在此窗口内;采集期正值 ICU 资源紧张的疫情高峰,「插管可得性」本身受医疗资源约束影响——severe 标签既反映患者生物学,也部分反映当时当地的资源状态,外推时需要记住这一层。
§3.8 地域覆盖
全部来自法国本土的 20 所大学医院(以巴黎 APHP 体系为核心,辐射雷恩、克莱蒙费朗等法国多中心网络)。单一国家、单一医疗体系、单一疫情波次——跨地域泛化时这是一个必须显式声明的外部效度边界。
§3.9 设备规格
官方未发布逐例设备型号、层厚、重建核字段。可获取的物理信息仅有:mha 文件头内的体素 spacing(各向异性、因中心而异)与矩阵尺寸。实践含义:① 预处理必须显式重采样到统一 spacing(社区基准采用 1.5 × 1.5 × 5.0 mm);② 无法按机型分层评估,设备偏倚只能间接估计。
把 spacing 当作「唯一可信的物理坐标」来处理:普查 z 层厚分位数(P25/P50/P75/P95,§4.3 脚本),对 P95 以上的粗层扫描考虑单独的采样策略;面内分辨率普遍高于 z 轴(各向异性),重采样的插值顺序(先 z 后面内)与边界模式要写进 config 固定下来。
§3.10 深度溯源链
| 数据元素 | 原始来源 | 加工路径 | 可核验锚点 |
|---|---|---|---|
| CT 体数据 | 20 所法国大学医院 PACS | 匿名化 → 选 1 次 CT/患者 → 压缩 .mha → AWS S3 | Radiology 论文(NCT04355507)+ AWS Registry |
| RT-PCR 标签 | 各中心实验室核酸检测 | 汇总为患者级二值 → reference.csv | 官方数据页 stoic-db |
| 1 个月重度标签 | 临床随访登记(插管/死亡) | 汇总为患者级二值 → reference.csv | 官方数据页 stoic-db |
| 年龄/性别元数据 | 医院挂号信息(脱敏) | 二值化后写入 mha 文件头 | 官方数据页 stoic-db(<80/≥80) |
| 挑战机制与决赛结果 | Radboud UMC DIAG 组织 | T3 私有数据重训 → MedIA 论文 | DOI 10.1016/j.media.2024.103230 |
§4 数据结构
§4.0 目录树
stoic2021-training/ # S3: s3://stoic2021-training/(us-west-2)
├── metadata/
│ └── reference.csv # 2,000 行:patient_id + 双二值标签
└── train/
├── covid19severity_2.mha # 1 号文件 = 1 例患者胸部 CT(压缩 MetaImage)
├── covid19severity_6.mha
├── covid19severity_7.mha
└── … # 共 2,000 个 .mha,文件名含患者 ID
# AUC23 Zenodo 镜像变体(6 个 batch,内容同源):
lung-ct-covid-19-batch-1/
├── imagesTr/
│ ├── covid19severity_6_0000.mha # 注意 _0000 后缀(nnU-Net 惯例)
│ └── …
└── labelsTr.csv
下载前先
aws s3 ls --no-sign-request s3://stoic2021-training/核对实际目录与文件名——以桶内清单为准,勿假设固定命名。
§4.1 DAIMS 字段字典
| 字段 | 类型 | 说明 | 示例值 | AI 用途 | 观测误差 | 信息性缺失编码 | 取值范围 |
|---|---|---|---|---|---|---|---|
| patient_id | 整数 | 患者唯一标识,与 .mha 文件名对应 | 2 | 主键;划分分组 | 无 | 无 | 1-10,735 内的公开子集编号 |
| ct_volume | 3D 体数据 | 胸部 CT(HU 值,压缩 .mha) | (512, 512, ~300) | 主输入 | 多中心协议差异 | 无 | HU 约 -1,024 至 3,071 |
| covid 标签 | 二值 | RT-PCR 阳性 = 1 | 1 | 次任务目标 | RT-PCR 假阴性(CT 敏感度仅 80.2%) | 无 | 0/1 |
| severe 标签 | 二值 | 1 个月内插管或死亡 = 1 | 0 | 主任务目标 | 随访窗口截断风险极低(1 个月) | 无 | 0/1 |
| Age(mha 头) | 二值类别 | <80 或 ≥80 岁 | “80” | 临床协变量 | 二值化损失精度 | 无 | <80 / ≥80 |
| Gender(mha 头) | 二值类别 | 男/女 | “M” | 临床协变量 | 自报或登记误差未披露 | 无 | M/F |
| spacing(mha 头) | 三元组 | 体素间距 xyz(mm) | (0.7, 0.7, 5.0) | 重采样依据 | 无记录厂商/重建核 | 无 | 因中心而异 |
| batch_id(AUC23 镜像) | 整数 | Zenodo batch 编号 | 3 | 追溯数据来源 | 无 | 无 | 1-6 |
| manifest(自建) | 文本 | 下载后生成的文件名 + md5 清单 | manifest.csv | 数据版本管理 | 取决于生成流程 | 无 | 自定义 |
注:reference.csv 的列名以你下载文件的实际表头为准(官方文档描述了语义而非逐列清单);上表 covid/severe 为语义名。第一次使用时先
print(df.columns)核对。
§4.2 标签分布
| 标签 | 全队列(10,735 或 6,448 例口径) | 公开训练集(2,000 例) | 备注 |
|---|---|---|---|
| RT-PCR 阳性 | 6,448/10,735 = 60.0% | 1,205/2,000 = 60.25%(据资格赛榜首算法页) | 疑似人群患病率,非自然流行率 |
| 1 个月重度(阳性者内) | 1,575/6,448 = 24% | 未逐例公开(仅汇总口径) | 类别不平衡需分层采样 |
| 1 个月死亡 | 964(267 插管后死亡、697 未插管) | 未逐例公开 | 官方数据页汇总 |
| 存活但曾插管 | 611 | 未逐例公开 | 与死亡合计构成 severe=1 |
公开训练集的阳性率(60.25%)与全队列(60.0%)高度一致,说明官方随机划分可信;但 severe 率在 2,000 例子集内的精确值需自行从 reference.csv 统计(官方未单列该子集口径)。
§4.3 关键统计
- 队列:10,735 例(筛查 10,930 例),中位年龄 65 岁(IQR 51-77),男性 6,147 例。
- CT 诊断力(RT-PCR 参照):敏感度 80.2%、特异度 79.7%,读片一致性 Gwet AC1 0.79。
- 预后信号:CT 病变范围 OR 3.25(95%CI 2.71-3.89);临床模型 AUC 0.64 → 0.69(+CT 病变范围与冠脉钙化)。
- 体数据:压缩 .mha,各向异性 spacing(z 轴层厚显著大于面内分辨率),单中心内矩阵尺寸一致、跨中心不同。
体数据物理参数因中心而异,下载后建议先跑一遍全库 spacing/尺寸普查并落盘:
# 全库 spacing/尺寸普查(首次使用必跑;输出 CSV 供分层与显存预算)
import glob, os
import pandas as pd
import SimpleITK as sitk
rows = []
for p in sorted(glob.glob(os.path.join(os.environ.get("STOIC_ROOT", "./stoic"), "train", "*.mha"))):
img = sitk.ReadImage(p)
rows.append({"file": os.path.basename(p),
"sx": img.GetSpacing()[0], "sy": img.GetSpacing()[1], "sz": img.GetSpacing()[2],
"nx": img.GetSize()[0], "ny": img.GetSize()[1], "nz": img.GetSize()[2]})
census = pd.DataFrame(rows)
print(census[["sx", "sy", "sz"]].describe()) # z 层厚分位数决定重采样与 batch 大小
census.to_csv("stoic_spacing_census.csv", index=False)
§4.4 数据层级
患者(patient_id,1 例)
└── 1 次基线胸部 CT(挑战版每患者仅选 1 次扫描) ← 层级被官方刻意压平
├── 3D 体数据(.mha:Z × Y × X,HU)
│ └── 每层轴位切片(无切片级标注)
├── mha 头元数据(Age 类别、Gender)
└── 患者级标签(reference.csv:covid、severe)
原研究收集了住院期检查(部分患者有多次扫描),但挑战版刻意每患者只选 1 次——这使「患者级划分」在公开数据上天然成立,也意味着纵向建模不可行。「层级被压平」是刻意设计:挑战要的正是单时间点预测;纵向分析请回到原始研究设计(NCT04355507)层面思考,公开包无法支撑。
§4.5 缺失值与信息性缺失
| 情形 | 官方处理 | 你的对策 |
|---|---|---|
| 标签缺失 | 未公开存在缺失(2,000 行配全双标签) | 按无缺失处理,加载时仍建议断言校验 |
| 临床协变量 | 仅 2 项(年龄类别/性别),无缺失 | 把「协变量极少」视为信息性缺失:官方只发布了能安全脱敏的字段 |
| 设备/层厚字段 | 完全未提供 | 从 mha 头读 spacing 自行统计;不要假设 512×512 |
| 切片级标注 | 不存在 | 需要病灶定位请换用或叠加分割数据集(弱监督方案见 §6.7) |
§5 划分与使用建议
§5.1 官方划分
| 划分 | 例数 | 用途 | 标签可见性 |
|---|---|---|---|
| 公开训练集 A | 2,000 | 参赛者自主训练与本地验证 | 标签公开(reference.csv) |
| 测试集 | 约 1,000 | 排行榜盲测 | 不公开,仅平台评测 |
| 决赛训练集 B | 9,724(≈ 全库 − 测试集) | 决赛阶段组织者在参赛者代码库上重训 | 不公开 |
§5.2 社区惯例划分
在公开 2,000 例上做 80/20 或分层 5 折交叉验证(按 severe 标签分层,兼顾 covid 标签)。论文复现请优先对齐资格赛设置:训练 n=2,000(其中 RT-PCR 阳性 1,205 例),本地验证报告严重度与新冠两个 AUC。
§5.3 划分策略与泄漏风险(重点)
- 患者级即文件级:一位患者 = 一个 .mha = 一行标签,患者间泄漏已被官方压平;你的风险全部来自切片级操作——若做切片采样、切片级增强缓存或预训练语料混合,任何跨折共享切片的缓存都会把测试信息带进训练。
- 切勿用结局后验信息构造特征:severe 标签的组分(插管、死亡)发生在 CT 之后;任何来源的「后续治疗信息」都是泄漏。
- 验证集要固定:资格赛排行榜的验证口径与最终测试集不同,反复对排行榜调参等同于对盲测集过拟合(见坑点 3)。
- AUC 需要 CI:验证集仅约 400-500 例时 AUC 的 95%CI 宽达 ±0.05,一次随机划分的差异可能超过模型差异。
- 增广与缓存的随机性也要可复现:固定增强种子并写入 config;断点续训时跳过已缓存样本的同时保持折隔离。
§5.4 交叉验证建议
分层 5 折(severe 优先分层);折间只允许患者级隔离;如需利用 covid 标签做多任务,用 StratifiedMultilabelKFold 或按 (covid, severe) 四格分层。报告均值 ± 标准差,并给出折间最差值。
# 按 (covid, severe) 四格分层的 5 折划分 + 患者级无泄漏断言
import os
import pandas as pd
from sklearn.model_selection import StratifiedKFold
df = pd.read_csv(os.path.join(os.environ.get("STOIC_ROOT", "./stoic"), "metadata", "reference.csv"))
pid_col, covid_col, severe_col = df.columns[0], df.columns[1], df.columns[2] # 以实际表头为准
combo = df[covid_col].astype(str) + "_" + df[severe_col].astype(str)
for fold, (tr, va) in enumerate(StratifiedKFold(5, shuffle=True, random_state=42).split(df, combo)):
assert set(df.iloc[tr][pid_col]).isdisjoint(set(df.iloc[va][pid_col])) # 患者级断言
print(f"fold {fold}: train={len(tr)} val={len(va)} val_severe_rate={df.iloc[va][severe_col].mean():.3f}")
挑战版一位患者仅一个文件,该断言恒过;它的真正价值在坑点 2 场景——当你引入外部数据或多扫描扩展时防泄漏。
§5.5 外部验证建议
内部验证之后,最省力的外部验证序列:① 在本地 holdout 上报告 AUC + bootstrap CI;② 若可获得法国以外的新冠 CT 队列(如自有中心数据),按同一预处理与阈值迁移评测;③ 参照 Lassau et al. 2021 的外部验证设计(独立中心 135 例,AUC 0.79)与 Boulogne et al. 2024 的 T3 复训设计(私有数据重训,AUC 普遍提升)设定预期:跨中心重训后 AUC 通常上升,但部署到新流行株/新医疗体系时无任何保证。
§6 AI 就绪指南 ⭐
§6.0 云端快速启动
# 5 分钟冒烟测试:只拉标签 + 1 个 .mha,验证网络与工具链
pip install awscli simpleitk pandas torch scikit-learn
aws s3 ls --no-sign-request s3://stoic2021-training/ # 查看桶结构
aws s3 cp s3://stoic2021-training/metadata/reference.csv ./stoic/metadata/ --no-sign-request
head -3 ./stoic/metadata/reference.csv # 先看列名(语义见 §4.1;文件头元数据见坑点 7)
首跑成功标准(三条输出缺一不可,全过再启动全量下载):① 桶清单出现 metadata/ 与 train/ 两级;② reference.csv 可读且约 2,000 行;③ 任意拉取 1 个 .mha 能被 SimpleITK 打开(size/spacing 非空)。
§6.1 快速上手
代码块前的目录约定:data_root = STOIC 桶解压根目录,其下应有 metadata/reference.csv 与 train/*.mha(结构见 §4.0)。下面所有代码通过环境变量 STOIC_ROOT 拼接路径:os.path.join(os.environ["STOIC_ROOT"], "train", f"covid19severity_{pid}.mha")。最小可用子集 = reference.csv 的任意一行 + 对应的 1 个 .mha 文件(几百 MB),足够跑通读取与前向;全量 2,000 例(约 260 GB)用于正式训练。环境建议(本文代码按此基线编写):
| 依赖 | 建议版本 | 用途 |
|---|---|---|
| Python | 3.10+(按 3.11 编写) | 运行环境 |
| SimpleITK | ≥ 2.2 | .mha 读取与重采样 |
| pandas | ≥ 2.0 | reference.csv 读取 |
| PyTorch | ≥ 2.0(CUDA 构建) | Dataset 与训练 |
| scikit-learn | ≥ 1.3 | AUC 与分层划分 |
| AWS CLI / rclone | 最新稳定版 | 数据获取 |
下表是获取渠道速查:
| 渠道 | 链接 | 需注册 | 适合 |
|---|---|---|---|
| AWS S3(官方原版) | s3://stoic2021-training/(us-west-2) | 否(–no-sign-request) | 训练、脚本化全量下载 |
| AWS Open Data Registry | registry.opendata.aws/stoic2021-training | 否 | 文档与引用信息 |
| grand-challenge.org | stoic2021.grand-challenge.org | 是(参赛/评测) | 盲测、排行榜提交 |
| Zenodo AUC23 镜像 | doi.org/10.5281/zenodo.7969800(6 batch) | 否 | 无 AWS 直连条件的环境 |
第一个 Python 冒烟脚本(读取 1 个 .mha + 其标签行,验证全链路可用):
# 冒烟自检:给定 data_root,读 1 个 .mha 并匹配标签行
import os, glob
import SimpleITK as sitk
import pandas as pd
root = os.environ.get("STOIC_ROOT", "./stoic")
vols = sorted(glob.glob(os.path.join(root, "train", "*.mha")))
assert len(vols) > 0, "未找到 .mha:检查 STOIC_ROOT 与目录结构(§4.0)"
probe = vols[0]
img = sitk.ReadImage(probe)
print("size_xyz =", img.GetSize()) # 三维尺寸(面内多为 512)
print("spacing_xyz =", img.GetSpacing()) # 各向异性:z 层厚 > 面内分辨率
print("header =", {k: img.GetMetaData(k) for k in img.GetMetaDataKeys()})
df = pd.read_csv(os.path.join(root, "metadata", "reference.csv"))
print("label rows =", len(df), "columns =", df.columns.tolist()) # 行数应为 2,000
pid = int(os.path.basename(probe).split("_")[-1].split(".")[0])
print(df[df.iloc[:, 0] == pid]) # 该患者的双标签行
§6.2 数据获取
# 1) 安装 AWS CLI(任选其一)
# 官方指南: https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html
aws --version
# 2) 探查桶内清单(免 AWS 账号)
aws s3 ls --no-sign-request s3://stoic2021-training/
aws s3 ls --no-sign-request s3://stoic2021-training/train/ | head -5
aws s3 ls --no-sign-request s3://stoic2021-training/train/ | wc -l # 应约 2,000 个 .mha
# 3) 先下标签,再全量(约 260 GB,建议 nohup/后台 + 断点续传)
aws s3 cp s3://stoic2021-training/metadata/reference.csv ./stoic/metadata/ --no-sign-request
aws s3 cp s3://stoic2021-training/ ./stoic/ --recursive --no-sign-request
# 4) 校验:清点文件数与总体量
find ./stoic/train -name "*.mha" | wc -l
du -sh ./stoic
网络受限或直连 S3 慢的环境:改用 Zenodo AUC23 镜像(6 个 batch,batch 1 = 43.7 GB,HTTP 断点续传友好);文件名带
_0000后缀,加载代码需相应调整(见 §4.0 目录树)。
# 备选通道 1:rclone 多连接(受限网络通常更快;s3 后端支持匿名 no_sign_request)
rclone copy :s3,provider=AWS,region=us-west-2,no_sign_request=true:stoic2021-training ./stoic/ -P --transfers 8
# 备选通道 2:Zenodo AUC23 镜像(wget -c 断点续传;6 个 batch 逐一执行)
wget -c https://zenodo.org/record/7969800/files/lung-ct-covid-19-batch-1.zip
# 下载完整性自检:清点 + 空文件排查
find ./stoic/train -name "*.mha" | wc -l # 期望 2,000
find ./stoic -size 0 -print # 期望无输出(无空文件)
标签抽查(下载完 reference.csv 后立即做,防列对位错误):
# 阳性率应接近官方口径:全队列 60.0%,公开训练集 60.25%(据资格赛榜首算法页)
import os, pandas as pd
df = pd.read_csv(os.path.join(os.environ.get("STOIC_ROOT", "./stoic"), "metadata", "reference.csv"))
label_cols = df.columns[1:3] # 假设第 2、3 列为 covid 与 severe(以实际表头为准)
print(df[label_cols].mean()) # covid 均值应 ≈ 0.60;severe 需核对量级合理
print(df[label_cols[0]].value_counts(), df[label_cols[1]].value_counts())
# 异常处理:任一均值严重偏离(如 covid < 0.5 或 > 0.7)→ 先怀疑列对位错误,再怀疑数据
§6.3 预处理全流程
# STOIC .mha 预处理:读取 → 重采样到统一 spacing → HU 截断 → 归一化
# 依赖: pip install SimpleITK numpy
# 输入: data_root/train/covid19severity_<pid>.mha;输出: float32 ndarray (Z, Y, X)
import SimpleITK as sitk
import numpy as np
TARGET_SPACING = (1.5, 1.5, 5.0) # 资格赛榜首 Balaitous 方案采用 (1.5, 1.5, 5.0) mm
HU_MIN, HU_MAX = -1000.0, 400.0 # 覆盖磨玻璃影与实变的肺窗截断
def read_mha_header(mha_path: str) -> dict:
img = sitk.ReadImage(mha_path)
keys = {k: img.GetMetaData(k) for k in img.GetMetaDataKeys()}
age = next((v for k, v in keys.items() if "age" in k.lower()), None)
gender = next((v for k, v in keys.items() if "gender" in k.lower()), None)
return {"size_xyz": img.GetSize(),
"spacing_xyz_mm": tuple(round(s, 3) for s in img.GetSpacing()),
"age_category": age, "gender": gender} # 年龄是二值类别,见坑点 7
def load_and_resample(mha_path: str) -> np.ndarray:
image = sitk.Cast(sitk.ReadImage(mha_path), sitk.sitkFloat32)
spacing = np.array(image.GetSpacing()) # 多中心异构,必须重采样
size = np.array(image.GetSize())
new_size = np.round(size * spacing / np.array(TARGET_SPACING)).astype(int)
r = sitk.ResampleImageFilter()
r.SetOutputSpacing(TARGET_SPACING)
r.SetSize([int(v) for v in new_size])
r.SetOutputOrigin(image.GetOrigin())
r.SetOutputDirection(image.GetDirection())
r.SetTransform(sitk.Transform())
arr = sitk.GetArrayFromImage(r.Execute(image)) # (Z, Y, X)
arr = np.clip(arr, HU_MIN, HU_MAX)
return ((arr - HU_MIN) / (HU_MAX - HU_MIN)).astype(np.float32)
要点:① spacing 决定一切——不重采样直接 resize 会让同一病灶在不同中心对应不同物理尺寸;② z 轴层厚通常 1-5 mm,重采样到 5.0 mm 会把体数据压缩 2-5 倍,是显存可行的关键;③ 归一化放在 Dataset 外缓存可省一半 CPU。
可选增强组件:肺区粗裁剪与肺窗显示(显示用,训练输入仍建议保留全肺上下文):
# 肺区域粗裁剪与肺窗显示(HU 域操作,放在重采样之前)
import numpy as np
def crop_to_lung_bbox(arr: np.ndarray, pad: int = 16, hu_thr: float = -320.0) -> np.ndarray:
"""按 HU > -320 的体素包围盒裁剪(剔除大部分空气);空掩膜时原样返回。"""
mask = arr > hu_thr # 空气约 -1000;肺组织与病灶高于 -320
coords = np.argwhere(mask)
if coords.size == 0:
return arr
z0, y0, x0 = coords.min(axis=0); z1, y1, x1 = coords.max(axis=0)
return arr[max(0, z0-pad):z1+pad, max(0, y0-pad):y1+pad, max(0, x0-pad):x1+pad]
def lung_window(arr: np.ndarray, center: float = -600.0, width: float = 1500.0) -> np.ndarray:
"""肺窗 [-1350, 150]:仅用于可视化/双通道输入;训练归一化仍用 §6.3 的全 HU 截断。"""
lo, hi = center - width / 2, center + width / 2
return np.clip(arr, lo, hi)
处理顺序建议:读取 → HU 域肺区粗裁剪(crop_to_lung_bbox)→ 重采样(load_and_resample)→ 截断归一化;可视化或双通道输入时再加 lung_window。
§6.4 PyTorch DataLoader(完整可运行)
<details>
<summary>展开完整 Dataset / DataLoader / 模型 / 训练循环(约 60 行)</summary>
# 目录结构预期(见 §4.0):
# data_root/train/covid19severity_<patient_id>.mha # 2,000 个 3D CT
# data_root/metadata/reference.csv # patient_id + 双标签
# data_root 由环境变量 STOIC_ROOT 指定;最小可用子集 = 任意 1 个 .mha + 其对应标签行
import os
import numpy as np
import pandas as pd
import torch
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader, random_split
DATA_ROOT = os.environ.get("STOIC_ROOT", "/data/stoic2021-training")
class STOICDataset(Dataset):
"""一位患者 = 一个 .mha = 一条记录。返回 (volume[1,Z,Y,X], covid, severe)。"""
def __init__(self, root: str = DATA_ROOT, target_shape=(64, 224, 224)):
self.root = root
self.df = pd.read_csv(os.path.join(root, "metadata", "reference.csv"))
# 列名以实际表头为准:patient_id + RT-PCR 阳性二值 + 1 个月重度二值(语义名见 §4.1)
self.cols = self.df.columns.tolist() # 先核对,勿硬编码
self.pid_col = self.cols[0]
self.target_shape = target_shape
def __len__(self):
return len(self.df)
def _resize(self, arr: np.ndarray) -> np.ndarray:
zi = np.linspace(0, arr.shape[0] - 1, self.target_shape[0])
out = np.stack([np.kron(arr[int(np.floor(z))], np.ones((1, 1))) for z in zi])
return out
def __getitem__(self, idx):
row = self.df.iloc[idx]
pid = int(row[self.pid_col])
path = os.path.join(self.root, "train", f"covid19severity_{pid}.mha")
vol = load_and_resample(path) # §6.3 的函数
vol = self._resize(vol) # (64, 224, 224)
volume = torch.from_numpy(np.ascontiguousarray(vol)).unsqueeze(0)
covid = torch.tensor(float(row[self.cols[1]]), dtype=torch.float32)
severe = torch.tensor(float(row[self.cols[2]]), dtype=torch.float32)
return volume, covid, severe
class Simple3DCNN(nn.Module):
"""双输出头:covid logit + severe logit(BCEWithLogitsLoss)。"""
def __init__(self):
super().__init__()
self.features = nn.Sequential(
nn.Conv3d(1, 16, 3, stride=2, padding=1), nn.BatchNorm3d(16), nn.ReLU(),
nn.Conv3d(16, 32, 3, stride=2, padding=1), nn.BatchNorm3d(32), nn.ReLU(),
nn.Conv3d(32, 64, 3, stride=2, padding=1), nn.BatchNorm3d(64), nn.ReLU(),
nn.AdaptiveAvgPool3d(1),
)
self.head = nn.Linear(64, 2)
def forward(self, x):
return self.head(self.features(x).flatten(1))
if __name__ == "__main__":
torch.manual_seed(42)
dataset = STOICDataset()
n = len(dataset)
tr, va = random_split(dataset, [int(n * 0.8), n - int(n * 0.8)])
train_loader = DataLoader(tr, batch_size=2, shuffle=True, num_workers=4, pin_memory=True)
val_loader = DataLoader(va, batch_size=2, shuffle=False, num_workers=4, pin_memory=True)
model = Simple3DCNN().cuda()
opt = torch.optim.AdamW(model.parameters(), lr=1e-4, weight_decay=1e-4)
crit = nn.BCEWithLogitsLoss()
for epoch in range(5):
model.train()
for volume, covid, severe in train_loader:
logits = model(volume.cuda())
target = torch.stack([covid, severe], dim=1).cuda()
loss = crit(logits, target)
opt.zero_grad(); loss.backward(); opt.step()
print(f"epoch {epoch}: loss={loss.item():.4f}")
</details>
注意
_resize采用最简近邻 z 抽样以避免额外依赖;正式训练建议用scipy.ndimage.zoom或torch.nn.functional.interpolate三线性重采样(见 §6.3 的 sitk 路径更优)。
两个进阶组件:影像特征 + mha 头元数据的融合头,以及单例推理函数(部署冒烟测试用):
# 进阶 A:影像特征 + 元数据 Late-Fusion 头(协变量只有年龄类别/性别,见坑点 7)
# 进阶 B:单例推理函数
import numpy as np
import torch
import torch.nn as nn
class FusionHead(nn.Module):
"""img_feat: [B, 64](主干池化特征);meta_onehot: [B, 2](age_ge80, gender_m)。"""
def __init__(self, img_feat_dim: int = 64, meta_dim: int = 2):
super().__init__()
self.meta = nn.Sequential(nn.Linear(meta_dim, 16), nn.ReLU())
self.mlp = nn.Sequential(nn.Linear(img_feat_dim + 16, 64), nn.ReLU(), nn.Linear(64, 2))
def forward(self, img_feat, meta_onehot):
return self.mlp(torch.cat([img_feat, self.meta(meta_onehot)], dim=1))
@torch.no_grad()
def predict_one(model, mha_path: str, device: str = "cuda") -> dict:
"""单例推理示例:返回双任务概率。"""
model.eval()
vol = load_and_resample(mha_path) # §6.3
x = torch.from_numpy(vol[None, None]).to(device) # [1, 1, Z, Y, X]
p = torch.sigmoid(model(x)).cpu().numpy()[0]
return {"p_covid": float(p[0]), "p_severe": float(p[1])}
§6.5 八大坑点 ⚠️
⚠️ 坑点 1:严重度定义漂移——挑战版与 Lassau 原始定义不是一回事(分类:标签理解)
问题:STOIC2021 挑战的 severe = CT 采集后 1 个月内插管或死亡;而同一团队 Lassau et al. 2021 原始 AI 研究的严重度 = 氧流量 ≥15L/min、机械通气或死亡。文献与博客常把两者混写。
症状:对照论文复现时 AUC 对不上;把「吸氧升级」当正例导致标签噪声;跨文献引用定义出错。
解决:
- 简单方法:一切以官方数据页定义为准(插管或死亡,1 个月),在实验记录里显式写下你采用的定义与来源。
- 进阶方法:如果你融合其他新冠严重度数据集,逐集定义映射表先行,不同定义的数据不混合训练,只做迁移评测。
- SOTA 方法:多定义设置下训练「定义不变量」表征(同一模型在两种定义下分别评测),报告跨定义 AUC 衰减作为稳健性指标。
参考:官方定义 stoic2021.grand-challenge.org/stoic-db;Lassau et al. 2021, Nature Communications, DOI 10.1038/s41467-020-20657-4。
⚠️ 坑点 2:患者级划分被切片级操作破坏(分类:数据泄漏)
问题:挑战版天然一患者一扫描,但切片采样、切片级增强缓存、预训练语料混洗都会在「切片」粒度打乱数据,若缓存/索引跨训练与验证共享,同一患者的切片同时出现在两侧。
症状:验证 AUC 异常高且折间方差极小;换一批新扫描后性能骤降。
解决:
- 简单方法:所有划分按
patient_id分组;缓存文件名包含 fold 标识,物理隔离。- 进阶方法:自定义
BatchSampler保证一个 batch 只含同一折患者;缓存目录按 fold 建立并加入.gitignore。- SOTA 方法:数据管道用
GroupKFold(groups=patient_id)+ 内容指纹(md5)校验每个缓存条目的归属,训练入口断言「折间 patient 集合交集为空」。
参考:划分机制见官方数据页与 §5.3。
⚠️ 坑点 3:测试集无标签——排行榜 AUC 无法本地复现(分类:评估误用)
问题:约 1,000 例测试集标签不公开,本地永远算不出「排行榜同款」AUC;正式评测还要 Docker 容器提交到 grand-challenge.org。
症状:本地 AUC 与排行榜对不上后反复「调参到排行榜」,实质是对盲测集过拟合;提交容器因环境依赖不匹配而失败。
解决:
- 简单方法:把公开 2,000 例中的本地 holdout(20%)当作唯一可信口径,排行榜结果只做参考不进调参回路。
- 进阶方法:分层 5 折 CV + bootstrap CI 报告;提交前在本地用与官方相同的 Python 版本构建 Docker,跑通
predict接口再提交。- SOTA 方法:参考 DIAG Nijmegen 决赛开源提交代码(code-1055)的容器结构与评测脚本对齐官方协议。
参考:stoic2021.grand-challenge.org;github.com/DIAGNijmegen/stoic2021-finalphase-submission-code1055;Boulogne et al. 2024, Medical Image Analysis, DOI 10.1016/j.media.2024.103230。
⚠️ 坑点 4:类别不平衡 + 60% 非真实患病率(分类:偏倚陷阱)
问题:severe 仅约 24%(阳性者内),covid 阳性率 60.0% 是疑似筛查人群口径——两者都≠部署场景的先验。
症状:模型输出概率在真实门诊人群上系统性偏高;BCE 训练偏向多数类,AUC 尚可但召回惨淡。
解决:
- 简单方法:训练用
pos_weight加权 BCE 或分层采样;概率阈值用验证集 Youden 点重标定。- 进阶方法:部署前做先验校正(logit 调整),把 60%/24% 的训练先验改写为目标场景先验再出概率。
- SOTA 方法:多中心交叉重标定 + 按年龄/性别分层报告校准曲线(该数据集仅有的两个人口学轴)。
参考:分布数字见官方数据页(60.0%、24%、964/611);§4.2。
⚠️ 坑点 5:多中心异构 spacing——不重采样等于喂模型噪声(分类:预处理陷阱)
问题:20 家医院、多家厂商机型,层厚与面内分辨率差异巨大且无设备字段可查;直接 resize 到固定矩阵会让同一物理尺寸的病灶在不同中心占据不同体素数。
症状:验证集按中心分层时 AUC 波动巨大;模型对某中心扫描系统性失效。
解决:
- 简单方法:一律
SimpleITK读 spacing,重采样到统一 (1.5, 1.5, 5.0) mm(社区基准口径)。- 进阶方法:HU 截断 [-1000, 400] + 肺窗两通道输入;按 spacing 分位数裁剪极端扫描(如 z 层厚 >7.5 mm 的粗层扫描单列一层增广)。
- SOTA 方法:训练时加入 spacing 抖动(±10%)与层厚模拟增广,把「扫描协议差异」变成隐式不变量。
参考:Balaitous 资格赛榜首方案(重采样 (1.5,1.5,5) mm),grand-challenge.org/algorithms/logistic-regression。
⚠️ 坑点 6:约 260 GB 从 us-west-2 拉取——下载工程被低估(分类:工程陷阱)
问题:全量公开训练集约 260 GB 且在 us-west-2 区域;直链不快、单线程中断重来代价高;部分环境直连 S3 慢或不可达。
症状:cp半夜断线全盘重来;磁盘写满;--no-sign-request漏写成匿名错误。
解决:
- 简单方法:
aws s3 cp --recursive --no-sign-request后台执行(nohup/tmux),先拉metadata/reference.csv再拉影像;预留 ≥400 GB 磁盘。- 进阶方法:分批下载(按文件名区间循环
--exclude/--include),每批完成后清点文件数与du -sh;或改用 Zenodo AUC23 镜像 6 个 batch(batch 1 = 43.7 GB,HTTP 断点续传)。- SOTA 方法:下载清单快照(
aws s3 ls > manifest.txt)+ 逐文件 md5 校验纳入数据版本管理;团队内用 rclone 多连接加速。
参考:registry.opendata.aws/stoic2021-training;stoic2021.grand-challenge.org/stoic-db。
⚠️ 坑点 7:mha 头里的年龄是二值类别,不是连续值(分类:标签理解)
问题:官方只发布脱敏后的年龄类别(<80 / ≥80)与性别,写在 .mha 文件头而非 reference.csv;很多人误当连续年龄使用或找不到字段。
症状:把 “80” 当 80 岁进回归;年龄分层实验报错或全错;找不到协变量来源。
解决:
- 简单方法:用
sitk.GetMetaDataKeys()枚举文件头,按 key 名小写匹配age/gender(§6.3 的read_mha_header已给出)。- 进阶方法:把两项元数据编码为 2 维 one-hot 与影像特征在融合层拼接(Late fusion),并在所有分层评估中只用这两个轴。
- SOTA 方法:把「元数据极简」本身作为实验设计约束——报告模型在「有/无元数据」两组条件下的 AUC 差,量化协变量贡献(Lassau 2021 的临床变量消融即此思路)。
参考:官方数据页 Clinical Data 小节(Age category <80 years、Gender male/female)。
⚠️ 坑点 8:CC BY-NC 4.0——论文开放不等于数据可商用(分类:工程陷阱)
问题:数据描述论文(Radiology 2021)本身 CC BY 4.0 开放,但数据集许可为 CC BY-NC 4.0(非商业);两者易混淆。
症状:商业产品/付费服务里打包或派生 STOIC 数据构成侵权;论文引用格式错误。
解决:
- 简单方法:非商业研究直接用,发表时引用 Revel et al. 2021 与 AWS Registry 页面;商用需求联系权利方(APHP/组织方,contact:support@grand-challenge.org)。
- 进阶方法:产品管线只用「在 STOIC 上预训练的权重」而不再分发数据时,仍需核对权重派生物的许可边界,稳妥做法是权重同样非商业发布。
- SOTA 方法:团队建立数据许可台账(来源/许可/再分发权利/商用结论四列),STOIC 登记为 NCU。
参考:AWS Registry License 字段(CC-BY-NC 4.0);AWS Open Data Sponsorship Program 页面。
§6.6 数据增强(安全 ✅ / 危险 ❌)
| 增强操作 | 判定 | 理由 |
|---|---|---|
| 随机 z 轴裁剪/丢层(≤10%) | ✅ | 模拟扫描协议差异,提升层厚鲁棒性 |
| HU 窗宽窗位抖动、高斯噪声 | ✅ | 模拟重建差异;幅度限制在 [-1000, 400] 窗内 |
| 随机 3D 旋转(≤15°)/平移/缩放 | ✅ | 肺内病灶位置不变性 |
| spacing 抖动(±10%) | ✅ | 显式逼近多中心协议差异(坑点 5 的进阶方案) |
| 左右翻转 | ⚠️ 谨慎 | 胸部解剖近似对称但纵隔不对称;对分类任务影响小,定位任务慎用 |
| 切片级随机打乱 | ❌ | 破坏 3D 解剖连续性,等于投毒 |
| 用随访结局信息构造增广样本 | ❌ | 标签泄漏(见 §5.3) |
| 强弹性形变(>0.5 倍 spacing) | ❌ | 产生解剖不真实的伪影,预后任务尤其危险 |
三个 ✅ 增强的 numpy 参考实现:
# §6.6 表中 ✅ 项的极简实现(在 HU 域、归一化前调用)
import numpy as np
def random_z_dropout(arr: np.ndarray, max_ratio: float = 0.10, rng=None) -> np.ndarray:
"""随机丢层(≤10%):模拟薄/厚层重建差异;用邻层复制填补保持形状。"""
rng = rng or np.random.default_rng()
k = max(1, int(arr.shape[0] * max_ratio))
zs = rng.choice(arr.shape[0], size=k, replace=False)
out = arr.copy()
for z in zs:
out[z] = arr[min(z + 1, arr.shape[0] - 1)]
return out
def hu_jitter(arr: np.ndarray, sigma_hu: float = 20.0, rng=None) -> np.ndarray:
"""HU 域高斯噪声:模拟重建核差异;务必在归一化之前、HU 域内做。"""
rng = rng or np.random.default_rng()
return (arr + rng.normal(0, sigma_hu, arr.shape)).astype(np.float32)
def random_shift3d(arr: np.ndarray, max_vox: int = 8, rng=None) -> np.ndarray:
"""随机平移(≤8 体素):np.roll 简易实现,边界环绕(小位移下可接受)。"""
rng = rng or np.random.default_rng()
dz, dy, dx = rng.integers(-max_vox, max_vox + 1, size=3)
return np.roll(arr, shift=(dz, dy, dx), axis=(0, 1, 2))
§6.7 模型推荐
| 路线 | 代表 | 优点 | 适用 | 起点建议 |
|---|---|---|---|---|
| 2D 特征聚合 | Lassau 2021:ResNet50 + EfficientNetB0 + U-Net | 显存友好、有论文配方 | 复现基线 | 逐层提取 + 聚合 + 5 项临床变量拼接 |
| 3D CNN | Simple3DCNN(§6.4)/ 3D ResNet | 端到端、结构简单 | 首个自研 3D 模型 | 输入 64×224×224 |
| 3D ConvNeXt + 伪标签预训练 | Kienzle 等(BMC MIM 2025 综述记录) | 用分割数据集伪标签预训练后迁移 | 冲性能 | 先分割预训练再严重度微调 |
| 自监督 ViT 特征 + 线性头 | Balaitous:ViT-L iBOT + logistic regression | 资格赛榜首;免端到端训练 | 小算力高性价比 | 特征缓存后 sklearn 即可 |
| 分割 + 影像组学 + 临床融合 | Revel 2021 放射组学路线 | 可解释、算力最低 | 临床合作项目 | nnU-Net 肺分割 → 定量特征 → logistic |
选型经验法则:先跑「特征 + logistic」拿到基线 AUC(1-2 天),再决定是否投入端到端 3D 训练(1-2 周);所有路线共享 §6.3 的重采样与 §6.5 的坑点约束——路线之间差的往往不是模型,而是预处理纪律。
§6.8 硬件需求
| 配置 | 最低 | 推荐 | 说明 |
|---|---|---|---|
| GPU | 1×16 GB(3D CNN,64×224×224 输入,batch 2) | 1×24-40 GB | 特征提取+线性头路线 8 GB 可跑 |
| CPU 内存 | 32 GB | 64 GB+ | 重采样与缓存峰值高 |
| 磁盘 | 400 GB | 1 TB NVMe | 260 GB 数据 + 缓存 + 预处理副本 |
| 网络 | 可达 us-west-2 | rclone/多连接 | 或走 Zenodo 镜像(坑点 6) |
显存粗算:64×224×224 的 float32 单例约 12.8 MB,batch 2 + 梯度 + 激活约 6-10 GB 起步;若把 target_shape 提到 96×320×320,显存需求约增至 2.5 倍——先用小输入跑通全流程,再逐步放开。
§6.9 评估指标代码
import numpy as np
import torch
from sklearn.metrics import roc_auc_score
@torch.no_grad()
def evaluate(model, loader, device="cuda"):
"""返回 covid AUC 与 severe AUC(官方主指标)。样本少时补 bootstrap CI。"""
model.eval()
ys, ps = [], []
for volume, covid, severe in loader:
logits = model(volume.to(device)).cpu().numpy()
ys.append(np.stack([covid.numpy(), severe.numpy()], axis=1))
ps.append(logits)
y = np.concatenate(ys)
p = 1.0 / (1.0 + np.exp(-np.concatenate(ps)))
out = {"covid_auc": roc_auc_score(y[:, 0], p[:, 0]),
"severe_auc": roc_auc_score(y[:, 1], p[:, 1])}
rng = np.random.default_rng(0)
boot = []
for _ in range(1000):
idx = rng.integers(0, len(y), len(y))
try:
boot.append(roc_auc_score(y[idx, 1], p[idx, 1]))
except ValueError:
pass
out["severe_auc_ci95"] = (np.percentile(boot, 2.5), np.percentile(boot, 97.5))
return out
分组 AUC(公平性轴:年龄类别/性别,见 §7.5——该数据集仅有的两个人口学分轴):
from sklearn.metrics import roc_auc_score
def group_auc(y_true, p_score, groups) -> dict:
"""按组计算 AUC;组内正负样本齐备才输出,否则跳过。"""
out = {}
for g in sorted(set(groups)):
idx = [i for i, v in enumerate(groups) if v == g]
labels = [y_true[i] for i in idx]
if len(set(labels)) > 1:
out[str(g)] = round(roc_auc_score(labels, [p_score[i] for i in idx]), 4)
return out
# 用法:group_auc(y[:, 1], p[:, 1], age_flags) # age_flags 从各 .mha 头读取(坑点 7)
阈值化指标(报告 AUC 时一并给出更直观的操作点):
# Youden 最优切点下的敏感度/特异度
import numpy as np
from sklearn.metrics import roc_curve
def youden_threshold(y_true, p_score):
fpr, tpr, thr = roc_curve(y_true, p_score)
k = int(np.argmax(tpr - fpr))
return thr[k], tpr[k], fpr[k] # 返回:阈值, 敏感度, 特异度(1-fpr)
# thr, sens, spec = youden_threshold(y[:, 1], p[:, 1])
# 注意:切点必须在验证集上确定后冻结用于测试/部署;逐批重找切点等于偷看答案
§6.10 MLOps 笔记
- 数据版本:S3 桶 2021-12 冻结,仍要在台账记录下载日期、
aws s3 ls清单快照与文件计数(2,000 .mha + 1 CSV);Zenodo 镜像记录 batch 编号与 md5。 - 配置即代码:把
TARGET_SPACING、HU_MIN/HU_MAX、target_shape、折种子写进单一 config,实验记录引用 config 哈希。 - 评测纪律:本地 holdout AUC + bootstrap CI 是唯一调参依据;排行榜/平台评测结果单独归档并标注「不可与本地直接比较」。
- 复现性:固定
torch/np/random种子;Docker 内锁定SimpleITK、torch、SimpleITK版本;训练入口断言数据文件数与 patient 集合指纹。 - 许可合规:CC BY-NC 4.0 写进仓库 LICENSE 声明;任何对外分发(含权重)附非商业声明。
- 团队协作:新成员上手顺序 = FACTS 事实清单 → §4.0 目录树 → §6.0 冒烟 → 交付自检表;code review 必查折隔离断言与许可声明。
交付前自检表:
| 检查项 | 通过标准 |
|---|---|
| 数据完整性 | .mha 计数 = reference.csv 行数 = 2,000;无 0 字节文件 |
| 划分纪律 | 折间 patient 集合交集为空(断言通过) |
| 预处理一致 | spacing 普查 CSV 已存档;重采样参数与 config 哈希一致 |
| 评测口径 | 本地 holdout AUC + bootstrap CI 已归档;平台成绩单独标注 |
| 复现性 | 种子/依赖版本/config 已记录;Docker 可重建推理 |
| 许可 | 仓库声明 CC BY-NC 4.0;对外分发附非商业说明 |
§7 质量评估与局限性
§7.1 已知偏倚
| 偏倚类型 | 描述 | 严重程度 | 缓解 |
|---|---|---|---|
| 入选偏倚 | 急诊疑似人群,阳性率 60.0%,不代表自然流行率 | 高 | 先验校正(坑点 4);外部部署重标定 |
| 时点偏倚 | 全部数据来自 2020-03~04 第一波:诊疗方案、毒株、重症定义均过时 | 高 | 明确定位为「第一波快照」;不做当代临床推断 |
| 标签噪声 | RT-PCR 有假阴性(CT 敏感度 80.2% 也提示两金标准互相不完美) | 中 | 噪声鲁棒损失;双标签一致性分析 |
| 设备偏倚 | 20 中心机型未知,无逐例设备字段 | 中 | spacing 重采样 + 协议抖动增广(坑点 5) |
| 人口学偏倚 | 中位 65 岁、男性 57.2%、法国单一国家、种族未记录 | 中 | 外部验证;不跨人群外推结论 |
阅读提示:前两项(入选、时点)是结构性的——任何在 STOIC 上训练的模型都继承了它们,无法靠训练技巧消除;后三项可用工程手段(重采样、加权、外部验证)缓解但不可根除。把「第一波法国急诊人群」写进模型卡片,是使用本库的默认义务。
§7.2 标注质量
最强项:结局标签(插管/死亡)是登记事实,无需人工判读,几乎无标注误差;RT-PCR 是实验室检测,误差主要来自检测本身(假阴性)。影像读片标签(队列研究用)由 20 名盲法医师完成,Gwet AC1 0.79,且不受年资影响——在同类 COVID 影像数据集中属于第一梯队。缺位项:无病变分割、无定量 CT 评分、无读片者间逐例一致率。
从建模视角看标注质量的三层含义:① severe 标签是登记事实,训练侧几乎零标注误差,模糊性全部来自「1 个月窗口 + 插管或死亡」这一结局定义本身(转院、放弃治疗等边角情况官方未讨论);② covid 标签继承 RT-PCR 的检测误差(假阴性为主),模型学到的是「PCR 视角的新冠」而非「真实感染」——CT 敏感度 80.2% 意味着两个标签的不一致率不低;③ 无影像级标注意味着任何病灶定位/分割任务都需外部标注资源,或用弱监督(CAM/Grad-CAM)做定性归因而非定量训练。
§7.3 泛化性
| 部署场景 | 失效风险 | 证据 |
|---|---|---|
| 跨国/跨医疗体系 | 高 | 单一国家 20 院、第一波队列;无外部国家数据发布 |
| 跨毒株/流行期(如奥密克戎) | 高 | 2020-03~04 原始毒株背景;重症谱系已变 |
| 同国后续波次 | 中-高 | 时点偏倚;T3 决赛重训后 AUC 上升提示域内可学,但波次间未验证 |
| 新医院新机型 | 中 | 多中心训练有覆盖但设备字段缺失,只能 spacing 对齐 |
| 阳性/阴性混合急诊 | 中 | 60% 先验需重标定(坑点 4) |
证据栏刻意引用了外部验证与 T3 重训两条线:前者告诉你「换人群会怎样(未知,需自测)」,后者告诉你「换数据量会怎样(普遍变好)」——两者都不能替代你在自己部署点上的评测。
§7.4 伦理
数据为回顾性使用急诊诊疗中已产生的 CT 与结局信息,经匿名化后发布(无直接标识符、日期、自由文本);队列研究登记 ClinicalTrials.gov NCT04355507;CC BY-NC 4.0 限定非商业使用。剩余风险:3D CT 理论上存在再识别可能(面部重建等),使用者不得进行任何再识别尝试;发布标签仅 2 项人口学元数据,把隐私泄露面压到了最小。
上传与再分发的边界同样要遵守:CC BY-NC 4.0 允许共享与改编(附署名),但任何再分发都应保留来源声明并以同样的非商业条款发布;禁止用本数据训练身份识别相关模型或进行任何个体再识别尝试。
§7.5 公平性
可执行的人口学分轴只有两个:年龄类别(<80/≥80)与性别(男/女)。建议报告各轴分组的 AUC 与敏感度/特异度;种族、社会经济变量不存在,跨人群公平性结论不可得——这本身就是该数据集公平性评估的硬边界。另一个公平性事实:男性占 57.2%,若下游人群性别分布不同,需重新校准。可执行的下限方案:按 §6.9 的 group_auc 对两个轴分别报告 AUC 与敏感度并写进模型卡片;若两轴间 AUC 差异超过 0.03,检查采样加权与阈值公平性。由于缺乏种族与合并症信息,任何更细的公平性声明都无法在本数据上背书。
§7.6 数据漂移
数据本身 2021-12 冻结、无版本漂移;真正的漂移风险在世界侧:毒株更替、疫苗接种、诊疗指南变化都会使「1 个月内插管或死亡」的基线与可预测性发生变化。部署任何 STOIC 训练的模型,都需要监测输入分布(spacing 统计、HU 直方图、年龄/性别占比)与输出校准的漂移。
| 漂移类型 | 触发场景 | 监测信号 | 响应 |
|---|---|---|---|
| 输入分布漂移 | 新医院/新机型接入 | spacing/尺寸分布偏移、HU 直方图 KS 距离 | 复核重采样参数 |
| 先验漂移 | 流行强度变化 | 输出概率均值漂移、阳性预测率变化 | 先验重标定(坑点 4) |
| 概念漂移 | 毒株/诊疗方案更替 | 新批次上 AUC 衰减 | 停止直接部署;重新外部验证 |
§7.7 DAIMS 24 项质量评估
| # | 检查项 | 状态 | 说明 |
|---|---|---|---|
| 1 | 宽格式 | ✅ | reference.csv 单表一行一患者,无多表 join 负担 |
| 2 | 唯一标识 | ✅ | patient_id 唯一,且与 .mha 文件名一一对应 |
| 3 | 特殊字符 | ✅ | 字段均为数字/短枚举,无编码特殊字符 |
| 4 | 重复行 | ✅ | 每患者 1 行 1 文件;挑战版刻意去重(每患者仅 1 次 CT) |
| 5 | 缺失编码 | ⚠️ | 无显式缺失编码机制;标签全配,但需自行断言校验 |
| 6 | 标签标识 | ✅ | 双二值标签语义在官方页有明确定义与组分说明 |
| 7 | 罕见类分组 | ⚠️ | 无罕见类;severe≈24% 的不平衡无官方分组/加权方案 |
| 8 | 偏倚评估 | ⚠️ | 论文讨论入选与读片偏差,但无标准化偏倚报告(如 STARD 附表) |
| 9 | 数据字典 | ⚠️ | 标签与 mha 头元数据有官方说明;reference.csv 列名无逐项字典 |
| 10 | 信息性缺失解释 | ⚠️ | 年龄仅提供 80 岁二值切点,切点选择依据未随数据解释 |
| 11 | 设备记录 | ⚠️ | 无厂商/重建核字段;仅 mha 头 spacing 可读 |
| 12 | 共线性 | ✅ | 仅 2 个临床协变量,无共线性风险 |
| 13 | 编码映射 | ✅ | 0/1 → 阴性/阳性、非重度/重度映射明确 |
| 14 | 时间戳处理 | ❌ | 无任何时间戳字段(采集日期未随数据发布) |
| 15 | 划分建议 | ✅ | 官方给出训练/测试/决赛三段划分与 Docker 盲测协议 |
| 16 | 泄漏讨论 | ⚠️ | 一患者一扫描天然规避患者间泄漏;官方无专门泄漏讨论文档 |
| 17 | 标签分布 | ✅ | 60.0%/24%/964/611 全部有官方汇总口径 |
| 18 | 测量偏倚 | ⚠️ | CT 敏感度 80.2%/特异度 79.7% 已知;RT-PCR 误差率未逐例量化 |
| 19 | 外部验证建议 | ✅ | 平台盲测即外部验证;Lassau 外部集与 T3 重训提供先例 |
| 20 | 版本记录 | ⚠️ | 无版本号机制,一次性冻结发布;更新历史仅一条 |
| 21 | 预处理脚本 | ⚠️ | 官方无预处理脚本;社区开源(code-1055、scancovia)可参考 |
| 22 | 合规要求 | ✅ | CC BY-NC 4.0 明确;免注册下载;引用要求清楚 |
| 23 | 多模态对齐 | ⚠️ | 影像 + 2 项元数据 + 结局标签患者级对齐;无纵向/多序列对齐问题 |
| 24 | 去标识化 | ✅ | 无直接标识符;人口学仅二值类别,泄露面最小化 |
DAIMS 评分:17.5 / 24(✅ 12 项、⚠️ 11 项、❌ 1 项)
评分解读:中上水平。核心优势是「结构极简 + 标签客观」:单表标签、患者级唯一键、客观结局金标准、官方划分与盲测协议齐全,几乎不存在数据工程质量层面的硬伤。扣分集中在「信息贫乏」而非「信息错误」:无时间戳、无设备字段、协变量只有 2 项、列名缺官方字典——这些是隐私最小化与挑战化发布的代价。
对你意味着什么:① 可以放心把它当作「标签可信、结构干净」的预后基准库,不必担心标注主脏数据;② 任何依赖时间、设备、丰富临床协变量的研究设计在这里不可行,立项前先看 §4.1 字段表;③ 预处理脚本要自己写(§6.3 可直接用),并把 spacing 重采样纳入版本管理;④ 部署相关结论必须走外部验证,本库只能支撑「第一波法国急诊人群」内的推断。
§7.8 外部验证矩阵
| 外部数据集/场景 | 来源机构 | 评估任务 | 性能指标 | 相对内部变化 | 关键发现 |
|---|---|---|---|---|---|
| Lassau AI-severity 外部验证集(135 例) | 法国其他中心 | 严重度预测 | AUC 0.79(内部 holdout 150 例 AUC 0.77) | 外部略优于内部 | CT 深度特征 + 5 项临床/生物变量显著优于 11 个既有评分 |
| STOIC2021 决赛盲测(T3:9,724 例私有数据重训参赛代码库) | Radboud UMC 组织方 | 严重度 AUC | hal9000 0.788(95%CI 0.728-0.843);最优记录 0.815 | 决赛普遍高于同代码资格赛成绩(如 hal9000 0.766→0.788) | 数据量扩大 5 倍的重训带来稳定增益,验证「方法论可复用」 |
§8 基准性能与生态
§8.1 排行榜与关键结果
| 口径 | 模型/方案 | 性能(AUC) | 年份 | 关键技术 | 完整引用 | 代码 |
|---|---|---|---|---|---|---|
| 队列基线(双阳性子集,放射组学) | 多变量 logistic 回归 | 0.64 → 0.69(95%CI 0.62-0.66 / 0.6-0.71) | 2021 | 临床变量;+CT 病变范围与冠脉钙化积分 | Revel MP et al., Radiology, 2021, 301(1):E361-E370. DOI 10.1148/radiol.2021210384 | 未公开 |
| AI-severity(内部/外部验证) | CT 深度特征 + 5 变量融合 | 0.77(内部 150 例)/ 0.79(外部 135 例) | 2021 | ResNet50 + EfficientNetB0 + U-Net 特征;年龄/性别/氧合/尿素/血小板 | Lassau N et al., Nature Communications, 2021, 12:634. DOI 10.1038/s41467-020-20657-4 | 未公开 |
| 资格赛榜首(2022-04-09) | Balaitous(logistic regression 算法页) | 验证 AUC 严重度 80.44 / 新冠 83.22 | 2022 | ViT-L(iBOT)特征 + logistic regression;2D U-Net 肺分割;(1.5,1.5,5) mm 重采样;n=2,000(阳性 1,205) | 官方算法页 grand-challenge.org/algorithms/logistic-regression | scancovia 仓库 |
| 决赛 T3(私有 9,724 例重训) | hal9000 | 0.788(95%CI 0.728-0.843) | 2024 | 组织者复用参赛者代码库重训 | Boulogne L et al., Medical Image Analysis, 2024, 97:103230. DOI 10.1016/j.media.2024.103230 | 部分(code-1055) |
| 决赛 T3 最优记录 | 冠军方案 | 0.815 | 2024 | 同上(T3 复用式重训) | 同上 | 同上 |
⚠️ 数值不可直接比较:队列基线用双阳性子集与临床变量模型;Lassau 用自有队列与不同严重度定义(坑点 1);资格赛与决赛的划分、数据量、评测通道均不同。引用时必须注明口径。
§8.2 SOTA 总结与选型建议
公开数据(2,000 例)上,自监督大模型特征 + 浅层分类头(Balaitous 路线)是小算力最优性价比;端到端 3D CNN 在同数据量下并不占优。私有数据放大 5 倍后(T3 决赛),重训的参赛代码库普遍提升 0.02-0.05 AUC,说明「方法论 > 模型点子」。选型建议:算力有限 → ViT 特征 + logistic;追求上限 → 分割预训练/伪标签 + 3D 主干 + 协议抖动增广;临床合作 → 放射组学 + 临床融合(可解释)。
从方法论资产角度补一句:T3 决赛的价值不在冠军数字本身,而在「同一套代码在约 5 倍数据上重训后的增益方向」——完成决赛重训的队伍 AUC 均不低于其资格赛水平(如 hal9000 0.766 → 0.788),这是「容量足够的方法论 + 更多数据 = 更强模型」的干净证据。复现者据此设定预期:在 2,000 例公开集上,严重度 AUC 0.75-0.80 是合理区间;宣称显著超过 0.82 的公开结果应先核查验证口径是否与官方一致。
§8.3 评测协议
资格赛:参赛者用公开 2,000 例自训,向 grand-challenge.org 提交算法(Docker 容器),平台在测试集(标签不公开)上算严重度与新冠两个 AUC。决赛:组织者获取参赛者代码库,以 9,724 例私有数据在组织方环境重训,再在盲测集评测——参赛者永远接触不到测试标签。奖金为 AWS credits($10,000/$6,000/$4,000)。挑战已收官,排行榜保留为历史基准;新方法应以本地 CV + 平台历史口径双重报告。
| 阶段 | 训练数据 | 评测数据 | 提交物 | 标签可见性 |
|---|---|---|---|---|
| 资格赛 | 公开 2,000 例(自训) | 测试集约 1,000 例 | Docker 算法容器 | 测试标签不可见 |
| 决赛 | 组织者私有 9,724 例(代训) | 盲测集 | 代码库(Git 仓库) | 全程不可见 |
| 本地复现 | 公开 2,000 例(自划 CV) | 本地 holdout | 无 | 全可见(仅 train 内) |
§8.4 相关数据集
| 数据集 | 关系 | 差异 |
|---|---|---|
| COVID-19 Radiography Database | 同病种不同模态(2D CXR,21,165 张图像级) | 无患者 ID、无结局标签;适合筛查分类入门 |
| AUC23 重打包版(Zenodo) | 同源数据 | 文件名 _0000 后缀;HTTP 下载 |
| Lassau 2021 内部队列(1,003 例) | 同一团队的前驱 AI 研究 | 多模态临床变量;未公开 |
| 法国多中心 CT 队列(Radiology 论文全库 10,735 例) | STOIC 全库 | 公开的仅 2,000 例训练样本 |
§8.5 关键论文 Top 6
- Revel MP, Boussouar S, de Margerie-Mellon C, et al. Study of Thoracic CT in COVID-19: The STOIC Project. Radiology, 2021, 301(1): E361-E370. DOI 10.1148/radiol.2021210384 —— 队列与数据集描述论文:CT 诊断力、预后因子与公开承诺。
- Lassau N, Ammari S, Chouzenoux E, et al. Integrating deep learning CT-scan model, biological and clinical variables to predict severity of COVID-19 patients. Nature Communications, 2021, 12: 634. DOI 10.1038/s41467-020-20657-4 —— AI-severity 评分:CT 深度特征的独立预后价值。
- Boulogne L, et al. The STOIC2021 COVID-19 AI challenge: Applying reusable training methodologies to private data. Medical Image Analysis, 2024, 97: 103230. DOI 10.1016/j.media.2024.103230 —— T3 赛制与决赛结果:私有数据重训方法论。
- Anton J, Castelli L, Chan MF, et al. How Well Do Self-Supervised Models Transfer to Medical Imaging? Journal of Imaging, 2022, 8(12): 320. mdpi.com/2313-433X/8/12/320 —— 以 STOIC 为下游基准的自监督迁移评测。
- Development and multicentric external validation of a prognostic COVID-19 severity model based on thoracic CT. BMC Medical Informatics and Decision Making, 2025. DOI 10.1186/s12911-025-02983-z —— 后续严重度建模综述与外部验证背景。
- Rubin. CT Diagnosis of COVID-19: A View through the PICOTS Lens. Radiology, 2021, 301(1): E375-E377. DOI 10.1148/radiol.2021211454 —— 配发于 STOIC 论文同期的编辑部评论:以 PICOTS 框架审视 CT 诊断证据。
§8.6 社区活跃度
挑战平台(grand-challenge.org)保留完整排行榜、算法页与论坛,问题可提交至 support@grand-challenge.org;DIAG Nijmegen 决赛代码与 scancovia 算法持续可访问;2023 年 AUC23 挑战直接复用其公开数据;2024-2025 年多篇 3D 医学自监督预训练论文(如 VoCo、COVER)继续引用该数据集作下游基准——作为 2021 年的挑战数据集,其生态寿命显著超出同类。
提问前先搜官方论坛与数据页——下载失败与 Docker 报错两大类问题几乎都有先例;学术合作与数据权限问题通过 support@grand-challenge.org 触达组织方(Radboud UMC DIAG)。
§8.7 生态快照
| 资源 | 类型 | 链接 | 推荐理由 |
|---|---|---|---|
| 官方挑战主页 | 网站 | stoic2021.grand-challenge.org | 规则、排行榜、论坛入口 |
| 官方数据说明页 | 文档 | stoic-db | 标签定义、下载命令、mha 头说明 |
| AWS Open Data Registry | 数据分发 | registry.opendata.aws/stoic2021-training | S3 ARN、许可、引用格式 |
| 决赛提交代码 | 代码 | DIAGNijmegen/stoic2021-finalphase-submission-code1055 | Docker 提交协议参考实现 |
| AUC23 Zenodo 镜像 | 数据镜像 | doi.org/10.5281/zenodo.7969800 | 无 AWS 直连环境的替代渠道 |
| Balaitous 算法页 | 模型 | grand-challenge.org/algorithms/logistic-regression | 资格赛榜首方案与训练细节 |
§9 相关资源与引用
§9.1 官方资源
- 挑战主页:https://stoic2021.grand-challenge.org/
- 数据说明与下载:https://stoic2021.grand-challenge.org/stoic-db
- AWS Open Data Registry:https://registry.opendata.aws/stoic2021-training/
- 临床试验注册:ClinicalTrials.gov NCT04355507
- 联系渠道:support@grand-challenge.org(数据下载困难先查官方论坛)
- 数据描述论文:https://doi.org/10.1148/radiol.2021210384(Radiology,开放获取)
- AWS Marketplace 条目(Open Data Sponsorship Program):https://aws.amazon.com/marketplace/pp/prodview-nndfcerwaclnw
- 挑战论坛与算法页:grand-challenge.org 站内 stoic2021 板块(问题检索优先于邮件提问)
§9.2 BibTeX 完整引用
@article{revel2021stoic,
title = {Study of Thoracic CT in COVID-19: The STOIC Project},
author = {Revel, Marie-Pierre and Boussouar, Samia and de Margerie-Mellon, Constance and Saab, In{\`e}s and Lapotre, Thibaut and Mompoint, Dominique M and others},
journal = {Radiology},
volume = {301},
number = {1},
pages = {E361--E370},
year = {2021},
doi = {10.1148/radiol.2021210384}
}
@article{lassau2021integrating,
title = {Integrating deep learning {CT}-scan model, biological and clinical variables to predict severity of {COVID}-19 patients},
author = {Lassau, Nathalie and Ammari, Samy and Chouzenoux, Emilie and Gortais, Hugo and Herent, Paul and others},
journal = {Nature Communications},
volume = {12},
pages = {634},
year = {2021},
doi = {10.1038/s41467-020-20657-4}
}
@article{boulogne2024stoic,
title = {The {STOIC2021} {COVID}-19 {AI} challenge: Applying reusable training methodologies to private data},
author = {Boulogne, Luuk and others},
journal = {Medical Image Analysis},
volume = {97},
pages = {103230},
year = {2024},
doi = {10.1016/j.media.2024.103230}
}
@misc{stoic2021aws,
title = {STOIC2021 Training},
howpublished = {Registry of Open Data on AWS},
year = {2021},
url = {https://registry.opendata.aws/stoic2021-training/},
note = {S3 bucket s3://stoic2021-training, license CC BY-NC 4.0}
}
§9.3 引用指南
- 使用数据:引用 Revel 2021(数据描述)+ AWS Registry 条目(分发与许可)。
- 使用挑战机制/排行榜:引用 Boulogne 2024。
- 涉及AI-severity 评分或严重度定义对比:引用 Lassau 2021 并区分两种定义(坑点 1)。
- 所有引用注明访问日期;数据集许可 CC BY-NC 4.0,商业用途另行获得授权。
§9.4 常见问题
- 问:能否用于商业项目? 公开训练集为 CC BY-NC 4.0,禁止商业使用;商用授权需联系权利方(support@grand-challenge.org)。
- 问:能拿到另外约 8,700 例吗? 不能。测试集与私有训练集不公开,仅组织方可用于平台评测与决赛代训。
- 问:有分割掩膜吗? 没有。公开包只有体数据 + 二值标签 + 2 项 mha 头元数据;分割需求请叠加其他数据集或自行弱监督标注。
- 问:排行榜还能提交吗? 挑战已收官,排行榜保留为历史基准;新结果建议用本地 CV 口径报告,并注明不可与官方榜单直接比较。
- 问:下载必须注册吗? 公开训练集不需要——S3 免注册直链(
--no-sign-request);仅参赛与平台评测需要 grand-challenge.org 账号。
§10 AI 使用声明卡
§10.1 AI 模型列表
| 模型 | 用途 | 版本/时间 |
|---|---|---|
| 大语言模型(CodeBuddy 内置写作模型) | 本页初稿撰写、结构化与代码示例整理 | 2026-09 |
§10.2 AI 参与范围
AI 参与了初稿生成、章节组织、表格排版与代码注释整理;所有数据集事实(规模、标签定义、许可、基准数字)、URL 与引用均经人工检索核对(检索记录见 FACTS 清单,2026-09-12),终稿由人工审定。
§10.3 输入来源列表
- Revel MP, et al. Study of Thoracic CT in COVID-19: The STOIC Project. Radiology, 2021, 301(1): E361-E370. DOI 10.1148/radiol.2021210384.(Europe PMC 收录页)
- Lassau N, et al. Integrating deep learning CT-scan model, biological and clinical variables to predict severity of COVID-19 patients. Nature Communications, 2021, 12: 634. DOI 10.1038/s41467-020-20657-4.
- Boulogne L, et al. The STOIC2021 COVID-19 AI challenge: Applying reusable training methodologies to private data. Medical Image Analysis, 2024, 97: 103230. DOI 10.1016/j.media.2024.103230.
- STOIC 2021 官方挑战主页. https://stoic2021.grand-challenge.org/
- The STOIC Dataset(官方数据说明页). https://stoic2021.grand-challenge.org/stoic-db
- STOIC2021 Training — Registry of Open Data on AWS. https://registry.opendata.aws/stoic2021-training/
- STOIC2021 Training — AWS Marketplace(Open Data Sponsorship Program). https://aws.amazon.com/marketplace/pp/prodview-nndfcerwaclnw
- Balaitous 算法页(资格赛榜首方案与训练细节). https://grand-challenge.org/algorithms/logistic-regression/
- DIAG Nijmegen 决赛提交代码(code-1055). https://github.com/DIAGNijmegen/stoic2021-finalphase-submission-code1055
- Lung CT COVID-19(AUC23 重打包镜像,6 batch). Zenodo, 2023. DOI 10.5281/zenodo.7969800.
- Development and multicentric external validation of a prognostic COVID-19 severity model based on thoracic CT. BMC Medical Informatics and Decision Making, 2025. DOI 10.1186/s12911-025-02983-z.
- Anton J, Castelli L, Chan MF, et al. How Well Do Self-Supervised Models Transfer to Medical Imaging? Journal of Imaging, 2022, 8(12): 320. https://www.mdpi.com/2313-433X/8/12/320
- LarsonLab open-data-registry: stoic2021-training.yaml. https://github.com/LarsonLab/open-data-registry/blob/main/datasets/stoic2021-training.yaml
- Altmetric 收录页(Lassau 2021 引用数,Dimensions 177,截至 2025-12). https://nature.altmetric.com/details/98849691
§10.4 人工校验表
| 内容模块 | 审核者 | 审核方式 | 审核状态 |
|---|---|---|---|
| §1 概览与规模数字(10,735/2,000/60.0%/24%) | 千方病案医学编辑部 | 对照官方数据页与 Radiology 摘要逐项核对 | ✅ 已通过 |
| §2 医学背景(ICD-11/SNOMED 映射、人群表) | 千方病案医学编辑部 | 对照编码库术语与队列论文核对 | ✅ 已通过 |
| §3-§4 规格与数据字典(许可、格式、目录树) | 千方病案医学编辑部 | 对照 AWS Registry 与官方数据页核对 | ✅ 已通过 |
| §6 AI 就绪指南(下载命令、预处理与加载代码) | 千方病案医学编辑部 | 命令与官方文档逐字核对;代码经语法与逻辑审查 | ✅ 已通过 |
| §7 质量评估与 DAIMS 24 项 | 千方病案医学编辑部 | 逐项对照 §4/§7 事实来源复核 | ✅ 已通过 |
| §8 基准数字(排行榜 AUC 与口径) | 千方病案医学编辑部 | 对照 Radiology/Nat Commun/MedIA 原文与算法页核对 | ✅ 已通过 |
§10.5 AI 生成章节标注
本页全部章节由 AI 辅助生成初稿,均经人工核校与事实核对后发布;无未核校的 AI 生成内容。
§10.6 最后人工审核日期
2026-09-05(与 §0 审核日期一致;数据事实检索核对完成于 2026-09-12)
页面状态:published(全部内容已完成审核并发布)
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- bimcv-covid — 共享标签:医学影像 / CT / X光影像 / COVID-19
- jsrt — 共享标签:医学影像 / CT / X光影像
- brax — 共享标签:医学影像 / CT / X光影像
- midrc-ricord — 共享标签:医学影像 / X光影像 / COVID-19
- mosmeddata — 共享标签:医学影像 / CT / COVID-19
- covid-ct — 共享标签:医学影像 / CT / COVID-19
- sar-covid — 共享标签:医学影像 / CT / COVID-19
- covid-19-sounds — 共享标签:医学影像 / X光影像 / COVID-19
- covid-19-radiography — 共享标签:医学影像 / X光影像 / COVID-19
- lidc-idri — 共享标签:医学影像 / CT / X光影像
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。
