信息速览
IU X-Ray 是放射报告生成这个研究方向的起点。2015 年 NLM 与印第安纳大学把它放出来的时候,公开可用的「影像 + 自由文本报告」配对数据几乎不存在。十年过去,MIMIC-CXR 用 37 万张片子把这个领域推到了另一个量级,但 IU X-Ray 没有被取代——它变成了「小而干净、跑得快、可比性强」的那一档基准。
规模上,近四千例检查、七千余张胸片、每例一份四段式报告、千余个 MeSH/RadLex 标记。报告包解压后只有 40 MB 左右,影像包 1.27 GB,一个人一台笔记本就能全量跑完。
一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 全称 | Indiana University Chest X-ray Collection(IU X-Ray / OpenI Chest X-ray) |
| 发布方 | NLM Lister Hill 中心 + 印第安纳大学医学院 |
| 首发 | 2015-07-01(JAMIA 在线),2016-03 正式刊出 |
| 托管 | NLM Open-i 服务(openi.nlm.nih.gov) |
| 检查数 | 近四千(XML 文件数) |
| 影像数 | 七千余 |
| 唯一 MeSH 标记 | 1,719 |
| 报告结构 | COMPARISON / INDICATION / FINDINGS / IMPRESSION |
| 影像格式 | PNG(原始 DICOM 未公开) |
| 报告格式 | XML |
| 报告包体积 | 约 1.06 MB |
| 影像包体积 | 1,360,814,128 字节(约 1.27 GB) |
| 许可 | CC BY-NC-ND 4.0 |
| 是否需要申请 | 否,直链下载 |
| 论文 | Demner-Fushman D 等,JAMIA 2016;23(2):304-310 |
§1 它要解决什么问题
1.1 2015 年之前的空白
放射报告生成这件事,本质是「看图写字」。要训一个模型,你需要成千上万个「同一张片子 + 放射科医生为它写的报告」的配对。这种数据在医院内部堆积如山,但没有一家愿意公开——去标识化的成本高,法律风险大,而且没人觉得这算学术产出。
2015 年之前,想做这个方向的研究者只能自己去医院谈合作,或者用小得多的私有数据集。结果是这个方向几乎没有可比性:每个人的数据不同,指标没法对齐。
IU X-Ray 的意义不在于它大,而在于它是第一个公开的、可引用的、有固定评测口径的配对集。它让「报告生成」从一个没法比较的方向变成一个能排榜的方向。
1.2 三条常见误解
误以为它是「胸片疾病分类数据集」。 它有 MeSH 标记,但那些标记是「关键发现」的描述,粒度极不统一,不是为分类任务设计的标签集。要做 14 类疾病分类,用 ChestX-ray14 或 CheXpert 更合适。
误以为它和 MIMIC-CXR 是替代关系。 两者规模差两个数量级(七千余对 37 万),但用途不同。IU X-Ray 适合快速迭代与消融实验,MIMIC-CXR 适合最终验证。很多论文的做法是「IU X-Ray 上刷结构,MIMIC-CXR 上验证规模」。
误以为影像质量够做病灶测量。 公开的是 PNG,经过缩放,原始 DICOM 的像素间距、窗宽窗位都丢了。要做结节测量、要做物理尺寸相关的分析,这份数据不够。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 影像-报告配对 | 近四千对 | 够做小样本实验 |
| 报告分段结构 | 四段齐全(含空段) | 够 |
| 关键发现标签 | 千余个 MeSH/RadLex 标记 | 够但要归并 |
| 正侧位配对 | 八成例双视图 | 够 |
| 原始 DICOM | 不给,只有 PNG | 不够 |
| 检查日期 | XML 里是发布日,非检查日 | 不够 |
| 患者年龄性别 | 无 | 不够 |
| 随访序列 | 无(每例只一次) | 不够 |
| 病灶级边界框 | 无 | 不够 |
| 商用授权 | 无(NC) | 不够 |
| 快速跑通 | 1.27 GB,笔记本可跑 | 够,这是它最大的优点 |
1.3b 你的处境与它能帮到的事
把上面那张「需求 / 给不给」的表倒过来看,就是一张决策卡:左边是你此刻的处境,右边是这份数据能替你解决什么。
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 刚接手一个报告生成项目,不知道从哪起步 | 一份能在一晚上跑完的完整闭环:图、报告、评测口径都齐 | 先下报告包做文本基线,再决定要不要碰图像 |
| 论文被审稿人问「为什么不用公开数据」 | 一个可引用的公开基准,有 JAMIA 正式论文可引 | 在方法节写清预处理与切分,别只写数据集名 |
| 想验证一个新解码策略是否真的有效 | 小到可以在单卡上跑十几次消融的规模 | 固定切分与指标实现,只改解码部分 |
| 需要中文场景的胸片图文对 | 帮不上,这份是英文报告 | 去找中文侧的配对集,别拿它硬凑 |
| 要做病灶定位或分割 | 帮不上,只有检查级文字标记,没有框和掩膜 | 改用带像素级标注的数据集 |
| 想拿它训一个能上线的产品 | 许可不允许,NC + ND 双重限制 | 只做内部验证,商用另找授权数据 |
| 想做跨语种图文对齐 | 可以作为英文侧的锚点,但只有一侧 | 需要另配一份非英语的胸片报告集 |
| 只想要一堆胸片做分类 | 标签粒度不适合分类 | 用 CheXpert 或 ChestX-ray14 的现成标签 |
左列写的是处境而不是特性,这一点很关键:同一份数据对不同处境的答案完全不同。同样一句「有 MeSH 标记」,对做检索的人是资源,对做 14 类分类的人是障碍。
1.4 一句话判断
你要做「报告生成的结构设计、解码策略、图文对齐消融」——它是性价比最高的一档,一晚上能跑完一轮。你要做「大规模预训练」或「病灶级定位」——去找 MIMIC-CXR 和带框的数据集。
1.5 不适合谁:四条边界
要商用的,许可不允许。 CC BY-NC-ND 4.0 三重限制,且 XML 里每条记录自己就写了 licenseURL,说明这不是一份笼统的站点声明,而是逐条绑定的。用这份数据训出来的模型能否商用,属于灰色地带,需要单独判断。
要按时间或按患者分层的,字段不支持。 XML 里没有检查日期、没有年龄、没有性别。全部记录的 articleDate 都是 2013-08-01。做「随时间变化的诊断分布」这类分析,这份数据做不了。
要做病灶检测的,没有框也没有掩膜。 MeSH 标记是检查级的(「这例有心脏增大」),不是像素级的。要找结节在哪,得用别处。
要非胸片影像的,只有胸片。 全是胸部 X 线,正位与侧位。没有 CT、没有 MRI、没有其他部位。
§2 数据构成:从三千九百余个 XML 说起
2.1 两个包,两种东西
下载入口只有两个直链:
| 包 | URL | 大小 | 内容 |
|---|---|---|---|
| 报告包 | NLMCXR_reports.tgz |
1,112,632 字节 | 三千九百余个 XML,解压后约 40 MB |
| 影像包 | NLMCXR_png.tgz |
1,360,814,128 字节 | 七千余张 PNG |
两个包的最后修改时间不同:报告包是 2017-06-06,影像包是 2016-09-06。也就是说报告侧在首次发布后还改过一次(大概率是补充或修正标记),影像侧自 2016 年起没动。
这一点值得注意:如果你在 2016 年下过影像包、2017 年之后又下了报告包,两者是配套的;反过来如果只下过 2016 年的报告,可能缺后来补的内容。
2.2 一条 XML 的完整解剖
以 1.xml(uId = CXR1)为例,它的结构是这样:
| 层级 | 字段 | 值 |
|---|---|---|
| 根 | eCitation |
整个检查容器 |
| 元信息 | uId/@id |
CXR1 |
pmcId/@id |
1 |
|
docSource |
CXR |
|
licenseType |
open-access |
|
licenseURL |
http://creativecommons.org/licenses/by-nc-nd/4.0/ |
|
ccLicense |
byncnd |
|
articleDate |
2013-08-01 |
|
articleType |
XR |
|
publisher |
Indiana University |
|
specialty |
pulmonary diseases |
|
subset |
CXR |
|
| 报告 | AbstractText[@Label="COMPARISON"] |
None. |
AbstractText[@Label="INDICATION"] |
Positive TB test |
|
AbstractText[@Label="FINDINGS"] |
The cardiac silhouette and mediastinum size are within normal limits. There is no pulmonary edema. There is no focal consolidation. There are no XXXX of a pleural effusion. There is no evidence of pneumothorax. |
|
AbstractText[@Label="IMPRESSION"] |
Normal chest x-XXXX. |
|
| 标记 | MeSH/major |
normal |
| 影像 | parentImage/@id |
CXR1_1_IM-0001-3001(F1)、CXR1_1_IM-0001-4001(F2) |
parentImage/caption |
Xray Chest PA and Lateral(两条相同) |
|
parentImage/panel/url |
/hadoop/storage/radiology/extract/CXR1_1_IM-0001-3001.jpg |
|
parentImage/panel/imgModality |
7 |
有几处细节是文档里没写的,得自己读 XML 才知道:
XXXX 是去标识化占位符。 上面 FINDINGS 里「There are no XXXX of a pleural effusion」,原文大概是「no evidence of」,被工具误判为可能的人名或日期而替换掉了。IMPRESSION 里的「chest x-XXXX」同理,原文是「chest x-ray」。这类过度替换在文本里很常见,做生成任务时会在这些位置产生不自然的输出。
url 字段是内部路径,不是可下载地址。 /hadoop/storage/radiology/extract/... 是印第安纳大学的内部存储路径。要拿图,得自己按 parentImage/@id 去影像包里找同名文件。
caption 不是报告的一部分。 它是图像的图注(「Xray Chest PA and Lateral」),描述的是视图,不是所见。做图文配对时不要把它当描述性文本用。
imgModality 全是 7。 七千余张全部是同一个值,说明这是 DICOM 的 modality code 而非有意义的分类字段。
2.3 规模数字的三个版本
同一份数据有三个不同的数字,经常被混用:
| 数字 | 出处 | 含义 |
|---|---|---|
| 3,996 份报告 / 8,121 张影像 | 原始论文(JAMIA 2016) | 采集阶段从院方系统取出的量 |
| 近四千份报告 / 七千余张影像 | 当前公开包 | 去标识化与筛选后的实际发布量 |
| 3,337 份 | 社区常用的「过滤版」 | 剔除 FINDINGS 段过短后的可用量 |
三个都对,但指的不是一回事。写论文时如果引「IU X-Ray 有 3,955 份报告」而实际用的是 3,337 份过滤版,会被审稿人抓。
2.4 每例检查的影像数分布
逐条统计 parentImage 节点数:
| 影像数 | 检查数 | 占比 |
|---|---|---|
| 0 | 104 | 2.6% |
| 1 | 446 | 11.3% |
| 2 | 3,208 | 81.1% |
| 3 | 181 | 4.6% |
| 4 | 15 | 0.4% |
| 5 | 1 | 0.03% |
两个关键事实:
104 例检查完全没有影像。 这些记录只有报告,没有图。做图文配对时如果不做过滤,会在这 104 条上崩掉。
81% 是标准的双视图。 正位 + 侧位,这是胸片检查的标准配置。剩下的单视图(11.3%)通常是便携机拍的床旁片,只有前后位。三视图以上(5%)是加了斜位或其他特殊体位。
§3 报告的四段结构
3.1 四个字段各管什么
每份报告严格分四段,这是放射科报告的标准结构:
| 段名 | 作用 | 典型长度 | 示例 |
|---|---|---|---|
| COMPARISON | 与既往检查对比 | 一句话 | None. / PA and lateral chest x-XXXX dated XXXX. |
| INDICATION | 检查原因 | 一句话 | Positive TB test / Cough |
| FINDINGS | 所见,主体段 | 数句 | 描述心影、纵隔、肺野、胸膜、骨骼 |
| IMPRESSION | 结论 | 一至两句 | Normal chest x-XXXX. |
这个结构对建模很友好:FINDINGS 是长文本生成任务,IMPRESSION 是摘要任务,INDICATION 是条件输入。很多论文直接把它拆成「以 INDICATION 为条件生成 FINDINGS」。
3.2 字段的完整度
逐条统计四段的填充情况:
| 段 | 非空 | 空 | 备注 |
|---|---|---|---|
| COMPARISON | 全部 | 0 | 但其中 1,402 条内容就是 None.,等于「无对比」 |
| INDICATION | 3,865 | 90 | 90 条完全空 |
| FINDINGS | 全部 | 0 | 但 531 条少于 10 个字符,实质为空 |
| IMPRESSION | 3,921 | 34 | 34 条完全空 |
FINDINGS 段看起来 100% 非空,但因为去标识化把整段内容替换掉的情况不少,实际可用率比这个数字低。按「至少 10 个字符」这条工业界常用的过滤线,会剩下 3,424 条;社区里更常见的做法是按「至少 10 个词」过滤,剩下的数量又少一些。
3.3 FINDINGS 的长度分布
| 指标 | 值 |
|---|---|
| 平均词数 | 27.4 |
| 中位词数 | 27 |
| 最短 | 0 |
| 最长 | 169 |
| 少于 10 字符 | 531 条 |
27 个词的平均长度是这份数据最容易低估的特性。放射科报告写得极简:一句描述心影、一句描述肺野、一句描述胸膜,就完了。这意味着:
第一,报告生成任务的输出空间很小。相比 MIMIC-CXR 那种动辄上百词的报告,这里的模型学不到复杂的行文结构。
第二,评测指标(BLEU、ROUGE、CIDEr)在短文本上波动很大。同一个模型换一个随机种子,BLEU-4 可能差两个点。
第三,也是最容易踩的坑:模板化输出能拿到不错的分数。因为报告高度程式化,「The cardiac silhouette and mediastinum size are within normal limits」这类句子反复出现,模型只要学会几句万能句就能刷到不低的 BLEU。这不代表它学会了看图。
3.4 一个真实的完整样本
CXR1 的报告值得逐句读一遍,它展示了这份数据的典型样子:
COMPARISON: None.
INDICATION: Positive TB test
FINDINGS: The cardiac silhouette and mediastinum size are within normal limits. There is no pulmonary edema. There is no focal consolidation. There are no XXXX of a pleural effusion. There is no evidence of pneumothorax.
IMPRESSION: Normal chest x-XXXX.
四句话的 FINDINGS,覆盖心影、肺水肿、实变、胸腔积液、气胸五个阴性发现。没有阳性所见,没有具体测量值,没有建议随访。IMPRESSION 一句话结论「正常」。
这就是 §4.4 的案例要反复引用的那个样本——它同时具备「结构完整」「内容典型」「去标识化痕迹明显」三个特点,是理解这份数据的最佳切口。
§4 标注体系:一千七百余个 MeSH 标记
4.1 标记是怎么来的
原始论文写得很清楚:关键发现由编码人员手工标注,术语取自 MeSH(Medical Subject Headings)与 RadLex(RSNA 的放射学词汇)。另用 MTI(Medical Text Indexer)从报告文本自动生成一份标注,作为对照,验证手工标注是否提升了检索效果。
论文的结论是:手工编码显著提升了检索的相关性。这句话背后的意思是,纯自动标注(MTI)不够准,人工这一步不能省。
4.2 标记的分布
逐条统计 MeSH/major 节点:
| 排名 | 标记 | 出现次数 |
|---|---|---|
| 1 | normal |
一千三百九十一 |
| 2 | Lung/hypoinflation |
245 |
| 3 | Lung/hyperdistention |
164 |
| 4 | Cardiomegaly |
157 |
| 5 | Cardiomegaly/mild |
135 |
| 6 | Aorta/tortuous |
126 |
| 7 | Spine/degenerative |
115 |
| 8 | Thoracic Vertebrae/degenerative |
114 |
| 9 | Granulomatous Disease |
98 |
| 10 | Atherosclerosis/aorta |
97 |
| 11 | No Indexing |
95 |
| 12 | Thoracic Vertebrae/degenerative/mild |
93 |
| 13 | Technical Quality of Image Unsatisfactory |
86 |
| 14 | Calcinosis/aorta |
69 |
| 15 | Markings/bronchovascular |
68 |
这张表能读出四件事:
「正常」占三分之一。 一千三百九十一条标了 normal,占全部的 35.2%。这份数据的阴性样本比例很高,做分类任务时要注意类别不平衡。
同一发现的粒度不统一。 Cardiomegaly(157)与 Cardiomegaly/mild(135)分列两个标记,加起来 292 例。Aorta/tortuous(126)、Atherosclerosis/aorta(97)、Calcinosis/aorta(69)三个都是主动脉相关,但用了三套不同术语。Thoracic Vertebrae/degenerative(114)与 Spine/degenerative(115)几乎是同义。
多标记的检查占四成多。 一千六百九十例有不止一个 MeSH 标记,占 42.7%。一例检查平均标 1.6 个。
有 95 条标了 No Indexing。 这些是编码人员认为无需索引的记录,做监督学习时应当排除。
4.3 标记的归并难题
要做分类任务,第一步是把 千余个标记归并成可用的类别。这不是简单的字符串处理,因为同一概念在不同术语体系下有不同的写法。
一个可行的归并思路:
| 归并目标 | 原始标记 | 合并后数量 |
|---|---|---|
| 心脏增大 | Cardiomegaly、Cardiomegaly/mild、Heart/enlarged |
约 300 |
| 主动脉异常 | Aorta/tortuous、Aorta, Thoracic/tortuous、Atherosclerosis/aorta、Calcinosis/aorta |
约 290 |
| 肺容积不足 | Lung/hypoinflation、Atelectasis、Pulmonary Atelectasis/* |
约 400 |
| 退行性变 | Spine/degenerative、Thoracic Vertebrae/degenerative、Thoracic Vertebrae/degenerative/mild |
约 320 |
| 正常 | normal |
1,391 |
归并的依据是报告文本里的实际表述,不是术语表的层级关系。这一点很重要:MeSH 的树状结构在这份数据里被用得很随意,Cardiomegaly/mild 在 MeSH 里并不是 Cardiomegaly 的子节点,是编码人员自己加的修饰。
4.4 案例:CXR1 为什么是理解这份数据的最佳切口
回到 §3.4 那条记录。它是一个「教科书式的阴性样本」,值得拆开看六层。
第一层,标记与文本一致。 MeSH 标的是 normal,IMPRESSION 写的是「Normal chest x-XXXX」,FINDINGS 五句话全是阴性。三者一致,这是一条干净的正样本——如果「正常」算正类的话。
第二层,去标识化痕迹可见。 XXXX 出现两次,一次在「no XXXX of a pleural effusion」(原文应是 evidence),一次在「chest x-XXXX」(原文应是 ray)。这两处都是过度替换,说明去标识化工具对人名、日期的识别很激进。
第三层,视图与影像数匹配。 两条 parentImage 分别是 F1 与 F2,caption 都是「Xray Chest PA and Lateral」。也就是说这一例是标准的正位 + 侧位双视图,与 81% 的双视图比例一致。
第四层,INDICATION 透露了临床情境。 「Positive TB test」——结核筛查阳性,所以拍了这张片子。这是一个非常具体的临床场景,与「正常」的结论形成对照:筛查阳性但影像正常。这种「检查原因与结论不一致」的样本在数据里不少,做生成模型时如果只用 FINDINGS 训,会遗漏 INDICATION 这个重要的条件信息。
第五层,报告极短。 FINDINGS 五句话 30 多个词,IMPRESSION 三个词。这是这份数据的常态(中位数 27 词),不是特例。
第六层,XML 元信息完整。 licenseType、licenseURL、ccLicense、publisher、specialty、subset 六个字段全有。这是逐条绑定的许可声明,意味着即使你把某一个 XML 单独拿出来分发,许可信息也是跟着走的。这一点比很多数据集只在首页写一句「CC BY」要严谨。
§3.4、§4.2、§5.3、§6.2 里反复引用的都是这一条。
§5 任务与基准
5.1 三类主流任务
| 任务 | 输入 | 输出 | 典型评测 |
|---|---|---|---|
| 报告生成 | 一张或两张影像 | FINDINGS 或整份报告 | BLEU-1/4、ROUGE-L、CIDEr、METEOR |
| 图文检索 | 报告文本 | 排序后的影像列表 | Recall@K、mAP |
| 关键发现分类 | 影像 | MeSH 标记(多标签) | AUC、F1(按归并后的类别) |
报告生成是绝对主流。绝大多数引用 IU X-Ray 的论文做的是这件事。
5.2 官方切分与社区切分
原始论文没有给官方切分。社区里最常用的是「7:1:2」按检查随机切分,但这个做法有隐患:同一患者的正位与侧位会分到不同集合,导致信息泄漏。
更严谨的做法是患者级切分,但 XML 里没有患者标识,做不了。退而求其次的做法是「按检查切分,但同一检查的所有视图必须在同一集合内」——这是可以做到的,因为一例检查的所有 parentImage 都在同一个 XML 里。
一个常见的可用切分(过滤 FINDINGS 后剩三成多):
| 集合 | 检查数 | 占比 |
|---|---|---|
| 训练 | 2,335 | 70.0% |
| 验证 | 333 | 10.0% |
| 测试 | 669 | 20.0% |
这个切分是社区里某一版预处理脚本的产物(随机种子 42),不是官方标准。你自己切分完全可以,只要在论文里写清规则。
5.3 基准数字该怎么读
公开文献里 IU X-Ray 上的 BLEU-4 大致落在 0.10–0.16 区间,CIDEr 在 0.3–0.9 区间。这个跨度很大,原因是三件事叠加:
预处理不同。 有的论文只生成 FINDINGS,有的生成 FINDINGS + IMPRESSION,有的把两次拼起来。输出空间不同,指标不可比。
切分不同。 随机切分与按患者切分的结果差几个点。更麻烦的是有些论文重复用了测试集调参。
评测脚本不同。 BLEU 的实现差异(是否平滑、n-gram 权重)能带来 1–2 个点的差别。
一个实用建议:看论文时先找它的预处理与切分说明,再看指标。如果这两项没写清,指标不可信。
5.4 为什么小数据还有价值
一个问题值得回答:MIMIC-CXR 有 37 万张片子,为什么还要用七千余张的 IU X-Ray?
三个理由:
跑得快。 全量 1.27 GB,一张消费级显卡几小时能跑完一轮。做消融实验(换个解码器、换个注意力机制)时,这个速度决定了你一天能试几个想法。
可比性强。 十年积累下来的论文都用它,你的数字能直接和它们对。用 MIMIC-CXR 的话,得先复现别人的预处理才能比。
过拟合风险可见。 数据小,模型好坏的分化更明显。在 MIMIC-CXR 上,两个模型可能都到 0.15 BLEU 而看不出差别;在 IU X-Ray 上,一个 0.12 一个 0.16,差别一眼可见。
反过来,它的局限也明确:不能用来证明「模型有临床价值」。近四千例、单一机构、单一部位,任何在这个上面刷出来的数字都不能直接外推。
§6 AI 就绪指南
6.1 十分钟跑通
mkdir -p iuxray && cd iuxray
curl -O https://openi.nlm.nih.gov/imgs/collections/NLMCXR_reports.tgz
curl -O https://openi.nlm.nih.gov/imgs/collections/NLMCXR_png.tgz
tar xzf NLMCXR_reports.tgz # 得到 ecgen-radiology/1.xml … 3955.xml
tar xzf NLMCXR_png.tgz # 得到影像目录
ls ecgen-radiology | wc -l # 3955
报告包只有 1 MB,秒下。影像包 1.27 GB,看带宽。
6.2 解析 XML 的最小脚本
import os, xml.etree.ElementTree as ET
ROOT = "ecgen-radiology"
def parse(path):
r = ET.parse(path).getroot()
uid = r.find("uId").get("id")
texts = {a.get("Label"): (a.text or "").strip()
for a in r.findall(".//AbstractText")}
mesh = [m.text for m in r.findall(".//MeSH/major") if m.text]
imgs = [{"id": p.get("id"),
"fig": (p.find("figureId").text if p.find("figureId") is not None else None),
"caption": (p.find("caption").text or "").strip()
if p.find("caption") is not None else ""}
for p in r.findall(".//parentImage")]
lic = r.findtext("licenseURL")
return {"uid": uid, "texts": texts, "mesh": mesh, "images": imgs, "license": lic}
recs = [parse(os.path.join(ROOT, f)) for f in os.listdir(ROOT) if f.endswith(".xml")]
print(len(recs)) # 3955
print(sum(len(r["images"]) for r in recs)) # 7470
跑完这两个数就对上了:报告数与影像数。如果对不上,说明包下得不完整。
6.3 过滤:三个必须做的动作
def usable(r, min_words=10):
f = r["texts"].get("FINDINGS", "")
if len(f.split()) < min_words:
return False # 过滤 FINDINGS 过短
if not r["images"]:
return False # 过滤无影像
if "No Indexing" in r["mesh"]:
return False # 过滤未索引
return True
clean = [r for r in recs if usable(r)]
print(len(clean))
按 min_words=10 过滤,会掉到三千三百条左右。这三个过滤条件在几乎所有下游论文里都被用过,但很少有人写清具体阈值。
6.4 影像路径的对应关系
影像包里没有目录结构映射表,只能靠 parentImage/@id 拼:
def image_path(img_id):
# img_id 形如 CXR1_1_IM-0001-3001
return os.path.join("NLMCXR_png", img_id + ".png")
有些发布的解压版本会带一层子目录(按检查分文件夹),下载后先 find . -name "CXR1_1_*.png" 确认实际路径。
6.5 坑点 1:把 articleDate 当检查日期
全部记录的 articleDate 都是 2013-08-01。这是批量发布时打的标记。
如果你要按时间做分析(比如「诊断分布是否随时间变化」),这份数据做不到。唯一的时间线索是 COMPARISON 段里偶尔出现的「dated XXXX」,但那些日期本身也被去标识化替换了。
6.6 坑点 2:把 caption 当报告
caption 字段写的是「Xray Chest PA and Lateral」这种视图描述,不是放射科所见。
有人拿 caption 当「简短描述」做图文对齐训练,结果模型学会了「看片子判断这是 PA 还是 Lateral」——这个任务太简单,学到的表征没用。
6.7 坑点 3:忽略 XXXX 占位符的影响
XXXX 是被去标识化工具替换掉的内容,原文可能是人名、日期、也可能只是被误判的普通词(比如「evidence」被当成名字)。
统计一下占位符的密度会发现问题不小:FINDINGS 段里带 XXXX 的比例相当高。这意味着模型在这些位置学到的是「输出 XXXX」,而不是「输出正确的词」。
处理方式有两种:一是把 XXXX 当特殊 token 保留(模型学会在合适位置输出它);二是按上下文还原(有风险,可能还原错)。第一种更稳妥。
6.8 坑点 4:用随机切分导致泄漏
按检查随机切分时,同一患者的正位与侧位有概率分到训练集和测试集两侧。虽然 XML 里没有患者 ID,但同一患者的多次检查在文本上会有相似表述(比如 COMPARISON 段提到「与某日片子对比」)。
更隐蔽的泄漏是模板重复。同一台机器、同一位技师拍的片,报告措辞高度相似。随机构分时,测试集里会出现训练集见过的句式模板。
6.9 坑点 5:BLEU 高就是模型好
前面提过:27 个词的平均长度让模板化输出能拿高分。
一个具体的检验方法:把你的模型输出与「训练集里出现频率最高的那句 FINDINGS」做对比。如果两者 BLEU 只差 2–3 个点,说明模型没学到多少东西——它只是学会了这句万能话。
更靠谱的评测是加上临床相关性指标(比如 CheXpert labeler 抽出的发现是否一致),或者做人工评分。
6.10 坑点 6:拿论文的采集数字当实际数量
论文里的采集数字,是采集阶段的计数。当前公开包要少一些——差在去标识化剔除上。
差的那部分去哪了?论文没细说,但从逻辑上看是去标识化阶段剔除的(比如影像里检出 PHI 的、报告无法脱敏的)。论文提到「Images for two of 3996 patients (0.05%) showed protected health information」——这两个患者的影像应当是被剔除了,但 8,121 到 7,470 差 651 张,远不止两例,说明还有别的筛选。
6.11 坑点 7:忽略许可的逐条绑定
XML 里每条记录都有 licenseURL 字段。这不是装饰——它意味着许可声明跟着每条记录走。
如果你把某几条记录的影像与报告打包再分发,许可要求(署名、非商业、禁止演绎)依然适用。把影像重采样、裁剪、加标注之后再发布,可能构成「演绎」,需要谨慎。
§7 质量评估:DAIMS 框架
7.0 阅读本节前的一个前置校正
多数人看「数据集质量」,首先想到的是「标注准不准」。对 IU X-Ray 来说,这个默认框架会产生误判:它的标注(MeSH 标记)本身就不是为机器学习设计的,用的是图书馆学的受控词表,粒度与一致性都按检索需求而非分类需求来组织。
真正要评的是三件事:去标识化的彻底程度、报告的可用比例、以及元数据的完整度。这三项决定了你能从这个库里拿到多少可用样本,而不是「标签准不准」。
7.1 五维评分
| 维度 | 评分 | 依据 |
|---|---|---|
| Data Collection(采集) | ★★★☆☆ | 单机构、单一部位、无时间跨度、无随访;优点是多院区、真实临床文本;扣分项:无检查日期、无人口学字段 |
| Annotation(标注) | ★★★☆☆ | 双人手工 MeSH/RadLex 编码 + MTI 自动对照,是当时的高标准;扣分项:粒度不统一、1,719 个标记无法直接当标签用、95 条 No Indexing |
| Intrinsic Quality(内在质量) | ★★★☆☆ | 文本去标识化达 100% 精确率(论文自述),影像有 2 例漏网已修正;扣分项:PNG 丢失采集参数、531 条 FINDINGS 实质为空、104 条无影像 |
| Metadata(元数据) | ★★☆☆☆ | 逐条许可、发布方、专业领域齐全;扣分项:无年龄、性别、检查日期、设备、体位(除 caption)等关键字段 |
| Standardization(标准化) | ★★★★☆ | XML 结构规范、四段式报告是行业标准、MeSH/RadLex 是权威术语表、DICOM 去标识化遵循 Supplement 142;扣分项:PNG 格式使标准化成果部分失效 |
7.2 为什么 Metadata 只给两星
这份数据最刺眼的问题不是标注质量,是元数据的贫瘠。
XML 里有什么:uId、pmcId、docSource、licenseType/URL、articleDate、articleType、publisher、title、note、specialty、subset、作者列表、MeSH、parentImage。
XML 里没有什么:患者年龄、性别、种族、检查日期、设备厂商、设备型号、kVp、mAs、体位(除 caption 里的自由文本)、临床科室、是否住院、既往检查的链接。
这个缺口决定了三件事做不了:按人口学分层、按设备做域偏移研究、按时间做趋势分析。
对照 2017 年之后的同类数据集(比如 MIMIC-CXR 给了 view position、patient ID、study date),这份 2015 年的数据集在元数据设计上明显落后于时代。这不能怪它——2015 年没人预料到这些字段会成为标配。
7.3 已知的、可枚举的偏差
| 偏差 | 来源 | 方向 |
|---|---|---|
| 单机构偏倚 | 仅印第安纳大学健康系统 | 设备、协议、书写习惯同质化 |
| 门诊偏倚 | 论文称多为门诊检查 | 重症与急症比例低 |
| 结核筛查富集 | INDICATION 里 TB 相关比例高 | 与普通人群分布不同 |
| 阴性偏多 | normal 占 35% |
阳性发现样本相对少 |
| 模板化书写 | 报告高度程式化 | 语言多样性低 |
| 去标识化过度 | XXXX 大量替换 |
部分语义丢失 |
| 编码粒度漂移 | 同一编者在不同时期用不同粒度 | 标签一致性不稳定 |
| 无随访 | 每例一次检查 | 纵向变化不可研究 |
7.4 它为何能持续:一个「小而稳」的生存逻辑
一个只有 1.27 GB、近四千条记录、十年没更新的数据集,为什么还活跃在论文里?
第一,它占住了一个不可替代的位置:最小可用基准。 报告生成这个方向需要「跑一轮只要几小时」的数据。MIMIC-CXR 太大,做消融太慢;私有数据不可比。IU X-Ray 恰好卡在「够用且够快」的区间。这个位置不是靠规模守住的,是靠「别人都在用」守住的。
第二,它的托管方是 NLM。 美国国家医学图书馆的长期保存承诺,意味着这个下载链接十年后大概率还在。对基准数据集来说,「链接一直有效」比「数据一直更新」更重要。很多同期的小数据集因为托管在个人主页上,早就 404 了。
第三,它的格式足够简单。 XML + PNG,没有专有格式,没有需要特殊库才能读的二进制。任何人写二十行 Python 就能解析。低门槛意味着高复用。
它不可替代的部分:在「小样本、快迭代、可比性强」这三点上,目前没有同量级的替代品。ChestX-ray14 有 11 万张图但没有报告;MIMIC-CXR 有报告但体量大两个数量级;PadChest 有报告但语种是西班牙语。
四种失效情形:一是若 NLM 停止维护 Open-i 服务,直链会失效,虽有镜像但完整性难保证。二是若社区转向 MIMIC-CXR 作为唯一标准基准,它会被边缘化为「历史数据集」。三是若 CC BY-NC-ND 的执行趋严(比如要求下游模型也受限),工业界使用会停止。四是若出现一个「同等体量但带完整元数据」的新数据集,它的性价比优势会被取代。
§8 生态位
8.1 与四类替代品的对照
| 数据集 | 影像数 | 报告 | 元数据 | 许可 | 定位 |
|---|---|---|---|---|---|
| IU X-Ray | 七千余 | 有,四段式 | 极简 | CC BY-NC-ND | 最小可用基准 |
| MIMIC-CXR | 377,110 | 有,自由文本 | 丰富 | PhysioNet 协议 | 大规模预训练 |
| ChestX-ray14 | 112,120 | 无 | 14 类标签 | CC0 类 | 多标签分类 |
| PadChest | 160,868 | 有,西班牙语 | 较丰富 | 需申请 | 多语种、多标签 |
| CheXpert | 224,316 | 无(有抽取标签) | 中等 | 需申请 | 不确定性标签 |
8.2 与 MIMIC-CXR 的分工
这是最常被问的对比。三个维度:
规模。 七千余对 377,110,差 50 倍。前者笔记本可跑,后者要专门的数据管道。
报告质量。 MIMIC-CXR 的报告更长、更详细、有更多阳性所见描述。IU X-Ray 的报告短、模板化、阴性表述多。
元数据。 MIMIC-CXR 有 patient ID、study date、view position、设备信息,能做纵向分析与分层研究。IU X-Ray 几乎没有。
实践中的分工很清楚:IU X-Ray 刷方法与结构,MIMIC-CXR 验规模与泛化。
8.3 与 ChestX-ray14 的分工
ChestX-ray14 有 11 万张图、14 类标签,但没有报告,是纯分类任务的数据集。
两者的关系是互补而非竞争:ChestX-ray14 训一个多标签分类器,IU X-Ray 训一个生成模型,两个可以串起来(分类器给弱标签,生成模型写报告)。
8.3b 与 PadChest、CheXpert 的分工
胸片图文数据这一族里,常被拿来同台比较的还有西班牙的 PadChest 与斯坦福的 CheXpert。三者的分工可以一句话切分:IU X-Ray 给「报告全文 + 人工 MeSH 编码」,PadChest 给「西班牙语报告 + 层级标签」,CheXpert 给「英文报告摘录 + 14 类弱标签」。
语言维度。 PadChest 是这三者里唯一非英语的,报告原文为西班牙语,另有相当比例加泰罗尼亚语。它适合做跨语种图文对齐与低资源语言迁移,但不适合直接套用英文侧的通用的发现抽取工具链——那些工具的关键词表、否定检测规则、缩写展开表都是按英文写的,搬到西班牙语上会大面积误判。
标签维度。 CheXpert 的核心贡献不是报告,而是那套 14 类观察(Atelectasis、Cardiomegaly、Consolidation、Edema、Enlarged Cardiomediastinum、Fracture、Lung Lesion、Lung Opacity、No Finding、Pleural Effusion、Pleural Other、Pneumonia、Pneumothorax、Support Devices),以及它的三态标注约定(阳性、阴性、不确定)。这套体系后来被社区当成事实标准,反过来移植到 IU X-Ray 上做重标注。移植的代价在 §4.4 已经讲过:IU X-Ray 的 MeSH 粒度与这 14 类不对齐,一次映射会丢掉大量信息。
用途挑选的实用判据。 如果要做的是「把一份报告逐句生成出来」,选 IU X-Ray——它是这三者里唯一逐条给出四段式完整报告原文的。如果要做的是「把一张片子归类到某个发现」,选 CheXpert 或 PadChest——标签现成、规模大、评测协议成熟。如果要做的是「在非英语环境下验证一个图文模型」,选 PadChest。三者的交集很小,这也正是它们能长期共存的原因。
一个容易踩的隐性差别:阳性率。 CheXpert 的阳性率整体偏高(因为它收的是转诊人群),PadChest 的阴性比例更高,IU X-Ray 则因为 normal 占三分之一而介于两者之间。跨数据集直接比 AUROC 时,这个差别会让结论完全反过来。§5.3 谈过的「基准数字该怎么读」,在跨数据集场景下要再打一层折扣。
8.4 在千方医数集库内的位置
库内胸片相关的条目已有多条,各自的位置不同:
| 条目 | 定位 |
|---|---|
| MIMIC-CXR | 大规模胸片 + 报告,需 PhysioNet 认证 |
| MIMIC-CXR-JPG | 结构化标签版 |
| CheXchoNet | 胸片配超声心动图标签 |
| NODE21 | 肺结节检测与生成 |
| Medical-CXR-VQA | 胸片问答 |
| ReXVQA | 大规模胸片 VQA |
| REFLACX | 眼动定位 |
| IU X-Ray | 最小可用报告生成基准 |
这份数据在库里的独特性很清楚:它是唯一一个「体量小到能一晚上跑完、又带完整报告结构」的条目。
8.5 三类替代品的边界条件
「能不能不用它」这个问题,取决于三个边界条件。
第一个边界:任务是否要求逐句原文。 报告生成、报告结构化、句子级发现抽取这三类任务,必须有逐句原文。IU X-Ray 之外能提供原文的公开集极少——MIMIC-CXR 是最大的一份,但它的获取门槛是 PhysioNet 认证培训加签署数据使用协议,通常要等数个工作日,且不允许把原文再分发。IU X-Ray 的优势在这里体现得最直接:不用注册、不用签协议、点开链接就能下,一兆的报告包足以让一个学生在一节课内跑通全流程。这个「零门槛」属性不是附带优点,而是它十年后仍被引用的主要原因之一。
第二个边界:是否需要可复现的评测基线。 教学场景、方法对比、消融实验这三类需求,看重的不是数据规模,而是「大家用的是同一版」。IU X-Ray 的好处是版本几乎冻结:报告包最后一次更新停在 2017 年,之后没有变过。这意味着 2018 年论文报的 BLEU-4 与 2025 年论文报的 BLEU-4,至少在数据切片上是可比的(预处理仍可能不同,见 §5.3)。反过来,任何仍在持续扩充的数据集,跨年份比数都要先确认版本号。
第三个边界:是否要做大规模预训练。 这一条是 IU X-Ray 明确不擅长的。七千余张影像做自监督预训练,学到的表征很容易过拟合到这家机构的成像设备与摆位习惯上。常见做法是拿 MIMIC-CXR 或 CheXpert 做预训练,再拿 IU X-Ray 做小样本微调与评测。这个「大库预训练 + 小库评测」的分工,在实践中比「只用一份数据」稳得多。
三条边界之外的场景,通常有更合适的替代品;三条边界之内,IU X-Ray 的性价比仍然很难被替代。
§9 使用指引
9.1 四类用户的路径
| 你的身份 | 建议用法 |
|---|---|
| 做报告生成的研究者 | 直接下两个包,按 §6.2 解析,用 §6.3 过滤,跑你的模型 |
| 做图文检索的研究者 | 把 FINDINGS 当查询,影像当文档,注意去掉 COMPARISON 段的模板句 |
| 做医学 VQA 的研究者 | 这份数据没有问答对,只能当预训练语料 |
| 做教学与演示 | 最合适——数据小、格式清、许可明确,适合课堂演示完整流程 |
9.2 引用方式
标准引用是原始论文:
Demner-Fushman D, Kohli MD, Rosenman MB, Shooshan SE, Rodriguez L, Antani S, Thoma GR, McDonald CJ. Preparing a collection of radiology examinations for distribution and retrieval. J Am Med Inform Assoc. 2016;23(2):304-310. doi:10.1093/jamia/ocv080
如果用了具体版本,建议同时注明下载日期与包的大小,因为报告包在 2017 年更新过。
9.3 版本与不可变性
报告包 Last-Modified: 2017-06-06,影像包 Last-Modified: 2016-09-06。两个时间点之后没有再动过。
对一个基准数据集来说,「不再更新」其实是好事——意味着你的实验三年后还能复现。缺点是里面的已知问题(比如 531 条空 FINDINGS)也永远不会被修。
9.4 提交侧:你能往里加东西吗
不能。这是 NLM 单方发布的数据集,不接受社区提交。
如果你在自己的预处理上做了改进(比如更好的 MeSH 归并、更合理的切分),常见做法是在 GitHub 或 Hugging Face 上另发一个派生版本,并在说明里写清与原版的差异。注意 CC BY-NC-ND 的「ND」条款:如果派生版本重新分发了影像本体,可能触及「演绎」的边界,需要谨慎处理(很多做法是只发切分清单与代码,不发影像)。
§10 AI 使用声明
本篇数字来自两处:一是对报告包(NLMCXR_reports.tgz,约 1.06 MB,2017-06-06 版本)的逐条解析,二篇原始论文(JAMIA 2016, doi:10.1093/jamia/ocv080)的摘要与正文。
逐条解析得到的数字分四类。规模类:XML 文件数、parentImage 节点数、每例影像数分布。文本完整度类:FINDINGS 平均词数、过短文本、空 INDICATION 与空 IMPRESSION 条数、COMPARISON 为 None. 的条数。标注类:唯一 MeSH 标记数、多标记检查数、No Indexing 条数、normal 条数。分布类:Top MeSH 频次表与每例影像数直方图。全部可用 §6.2 的脚本复算。
未做的核验:影像包(1.27 GB)未下载,因此影像的格式细节、像素尺寸、是否统一缩放、PNG 位深均未核对,全部依据论文描述与社区文档。XML 里 url 字段指向的 /hadoop/storage/... 是内部路径,未验证其与 PNG 包内文件名的完整对应关系。
论文里的采集数字与公开包的实际计数之间的差额构成,论文未细说,本篇只能推测为去标识化筛选,未获证实。
articleDate 全部为 2013-08-01 的原因未查明——可能是批量导入时统一打的时间戳,也可能是原始数据本身就是 2013 年一次性导出的。这一点不影响使用,但影响任何按时间的分析。
MeSH 标记的手工编码一致性(两位编码者的 Kappa 值)论文未给出具体数字,只说「分歧经讨论解决」,本篇无法量化标注可靠性。
§11 三个人群的三条最短路径
不同的人打开这份数据,要的东西完全不同。下面三条路径是把前面的内容压缩成行动清单。
11.1 学生或第一次接触胸片报告生成的人
第一步,只下报告包。它只有一兆出头,解压后是三千九百余个 XML,几分钟就能全看完。不要一上来就下 1.27 GB 的影像包——先确认自己对文本侧有兴趣,再决定要不要碰图像。
第二步,随便挑一个 XML 打开,把 MedlineCitation 里的四段读一遍。重点看 INDICATION 与 FINDINGS 的关系:前者是「为什么拍这张片子」,后者是「看到了什么」。这两段之间的落差,正是报告生成任务要学的东西。
第三步,跑 §6.2 的解析脚本,把三千九百余条记录读成一个表格。这时候你会有两个直观感受:一是 FINDINGS 的长度分布很不均匀,短的只有几个词;二是 COMPARISON 段有大量 None.,等于没有历史对比。
第四步,写一个最朴素的基线:把 INDICATION 拼上一句固定的话当作输出,测 BLEU。这个基线通常能拿到不低的分数,原因是报告文本高度模板化。先看到这个数字,你才会明白为什么这个任务的绝对指标不能直接当质量看。
11.2 要做落地方案的数据工程师
先算清三件事:许可、规模、更新。
许可这条最硬:CC BY-NC-ND 4.0,非商业、禁演绎。这意味着两件事不能做——把数据打包进商业产品,以及把影像重采样、重标注后当作新数据集发布。可以做的是内部研究、论文实验、教学演示。每条 XML 里都有 licenseURL 字段逐条声明,写合规文档时直接引这个字段最稳妥。
规模这条要按用途分开算:只做文本侧,三千九百余条够;做图文配对,要按「有影像的检查」重新计数(§2.4 有分布);做双视图配对,只剩八成左右。三个口径混用是最常见的翻车原因。
更新这条基本可以忽略:报告包停在 2017 年,影像包停在 2016 年,之后没有变化。好处是版本稳定,坏处是任何希望「数据会越来越多」的规划都不成立。
11.3 要做方法对比的研究者
先确认对手用的是什么预处理。这一步不能省,因为同一份数据在不同预处理下,可用样本量能差两成,指标能差好几个点。
具体要核三件事。一是过滤阈值:FINDINGS 少于 10 词的是否剔除。二是切分方式:官方没有给切分,社区多用 7:1:2 随机切分,但随机种子不同结果就不同;更严格的做法是按患者切分,避免同一患者的多次检查跨集合泄漏。三是指标实现:BLEU 的实现差异(是否平滑、n-gram 权重、是否 lowercase)足以让同一份预测结果的分数上下浮动数个百分点。
这三件事核对完,再谈「谁比谁高」。如果对手论文只写了数据集名字没写这三项,那这个对比本身就不成立。
常见误读(避坑清单)
| 误读 | 实际 | 依据 |
|---|---|---|
| 采集阶段影像计数 | 公开包实际计数少于该值 | 包内逐条统计 |
| 论文的采集计数 | 公开包 XML 数少于该值 | 同上 |
| 「包内 XML 全部可用」 | 过滤空 FINDINGS 与无影像后约少两成 | 逐条统计 |
| 「MeSH 标记是分类标签」 | 是检索用受控词,粒度不统一 | 标记分布 |
| 「Cardiomegaly 是一类」 | 与 Cardiomegaly/mild 分列,需归并 |
标记计数 |
| 「有检查日期」 | articleDate 全是 2013-08-01,是发布标记 |
XML 字段 |
| 「有患者年龄性别」 | 完全没有 | XML 字段 |
| 「影像是原始 DICOM」 | 只有 PNG,采集参数已丢 | 官方下载包 |
| 「caption 是图像描述」 | 是视图名(PA and Lateral) | XML 抽查 |
| 「XXXX 是数据错误」 | 是去标识化占位符 | 上下文可推 |
| 「BLEU 0.15 说明模型会写报告」 | 模板句能刷到相近分数 | 长度分布 |
| 「可以商用」 | CC BY-NC-ND 4.0,逐条绑定 | licenseURL |
| 「和 MIMIC-CXR 可互换」 | 规模差 50 倍,元数据差距更大 | 对照 |
| 「104 条无影像是小问题」 | 占 2.6%,不过滤会在训练时崩 | 逐条统计 |
FAQ
问:到底有多少张图、多少份报告?
答:报告包解压后三千九百余个 XML;影像包内七千余张 PNG。原始论文写的采集数字是阶段数字。三个数都对,指不同阶段。
问:为什么报告包只有 1 MB?
答:里面全是文本 XML,压缩后约 1 MB。影像包约 1.27 GB。两个要分开下,别以为只下小包就够了。
问:XML 里的 articleDate 是检查日期吗?
答:不是。全部记录都是 2013-08-01,是批量发布标记。想知道真实检查日期,这份数据给不了。
问:为什么有 104 例没有影像?
答:XML 里没有 parentImage 节点。可能是影像未通过去标识化检查,也可能是采集时就没配上。论文没说原因。做图文配对时先过滤掉。
问:531 条 FINDINGS 少于 10 字符,都是空吗?
答:多数是被去标识化整段替换掉了,或者是极简表述(比如只有一个句号)。用 len(text.split()) >= 10 过滤是社区惯例。
问:一千七百余个 MeSH 标记怎么用?
答:先归并。同一概念有多个粒度(Cardiomegaly / Cardiomegaly/mild),还有跨术语体系的同义(Aorta/tortuous / Aorta, Thoracic/tortuous)。归并到 10–14 类才能做分类。
问:No Indexing 是什么?
答:编码人员认为无需索引的记录,95 条。做监督学习时应排除,因为它们没有有效的标签信息。
问:normal 有多少条?
答:一千三百九十一条,占 35.2%。这份数据阴性样本偏多,做分类要注意不平衡。
问:影像是什么格式、什么尺寸?
答:PNG。具体尺寸未逐一核对(影像包未下载),社区反馈多为 1024×1024 或接近该量级,但不同检查之间可能不一致。
问:能拿到 DICOM 吗?
答:不能。NLM 只发布 PNG。原始 DICOM 在印第安纳大学,未公开。
问:有官方切分吗?
答:没有。论文未给切分方案。社区常用 7:1:2 随机切分(训练 2,335 / 验证 333 / 测试 669,基于 3,337 条过滤后样本),但这是某一版预处理脚本的产物,非官方标准。
问:为什么不能按患者切分?
答:XML 里没有患者标识。同一患者的多次检查无法识别,所以只能按检查切分。这也是这份数据在纵向分析上的根本限制。
问:能做多标签分类吗?
答:可以,但需要先归并标记。四成多的检查有多标记,平均 1.6 个。归并到 14 类后可以按多标签 AUC 评测。
问:报告长度为什么这么短?
答:平均 27.4 词,中位 27。放射科报告本身写得极简,加上这份数据多为阴性正常例,描述更短。相比 MIMIC-CXR 动辄上百词,这里的输出空间很小。
问:BLEU 多少算好?
答:公开文献里 BLEU-4 大致 0.10–0.16。但这个区间不可直接比——预处理(生成 FINDINGS 还是整份)、切分、评测脚本都不同。看论文时先确认这三项。
问:模板化输出能拿多少分?
答:接近真实模型的下限。因为报告高度程式化,只输出「The cardiac silhouette and mediastinum size are within normal limits」这类万能句,BLEU 也能到 0.08–0.10。所以看指标时要做这个对照。
问:XXXX 该怎么处理?
答:建议当特殊 token 保留。强行还原有风险(可能还原错),而且原文里有一部分 XXXX 本身就是误判产生的,还原无意义。
问:caption 能当描述用吗?
答:不建议。它是视图名(「Xray Chest PA and Lateral」),不是所见。拿它做图文对齐,模型会学成「判断体位」,任务太浅。
问:能商用吗?
答:不能。CC BY-NC-ND 4.0,且每条 XML 里有 licenseURL 字段逐条声明。用这份数据训的模型能否商用是灰色地带,需单独判断。
问:派生版本能重分发影像吗?
答:要谨慎。ND 条款禁止演绎,重采样、裁剪、加标注后再分发可能构成演绎。社区常见做法是只发切分清单与预处理代码,不发影像本体。
问:还更新吗?
答:不更新了。报告包 2017-06-06 最后修改,影像包 2016-09-06。对基准数据集来说这是优点——复现性有保障。
问:和 MIMIC-CXR 怎么选?
答:做方法消融、快速迭代、需要可比性——用 IU X-Ray。做大规模预训练、需要元数据分层、需要纵向分析——用 MIMIC-CXR。两者可以串起来。
问:为什么还有人在 2026 年用它?
答:三个原因:跑得快(1.27 GB)、比得了(十年论文都用它)、门槛低(二十行 Python 能解析)。这三点在「最小可用基准」这个位置上很难被取代。
问:有没有中文版或中国数据?
答:没有。全部是美国印第安纳州的胸片与英文报告。
问:怎么引用?
答:Demner-Fushman D, et al. Preparing a collection of radiology examinations for distribution and retrieval. J Am Med Inform Assoc. 2016;23(2):304-310. doi:10.1093/jamia/ocv080。用了具体版本建议加下载日期。
术语表
| 术语 | 含义 |
|---|---|
| IU X-Ray | Indiana University Chest X-ray Collection 的通用简称 |
| OpenI | NLM 的开放影像检索服务,IU X-Ray 的托管方 |
| NLMCXR | 下载包文件名前缀(NLMCXR_reports.tgz) |
| uId | XML 内的检查标识,形如 CXR1 |
| parentImage | XML 内代表一张影像的节点,含 figureId、caption、url |
| MeSH | Medical Subject Headings,美国国家医学图书馆的受控词表 |
| RadLex | RSNA 的放射学词汇表 |
| MTI | Medical Text Indexer,NLM 的自动标引工具 |
| COMPARISON | 报告段:与既往检查对比 |
| INDICATION | 报告段:检查原因 |
| FINDINGS | 报告段:影像所见,主体段 |
| IMPRESSION | 报告段:结论 |
| XXXX | 去标识化占位符,替代被判定为敏感的内容 |
| PHI | Protected Health Information,受保护健康信息 |
| Regenstrief Scrubber | 印第安纳大学开发的文本去标识化工具 |
| DICOM Supplement 142 | 医学影像去标识化的行业规范 |
| RSNA CTP | RSNA 的临床试验处理器,用于影像去标识化流水线 |
| BLEU / ROUGE / CIDEr | 文本生成任务的自动评测指标 |
| PA / AP | 后前位 / 前后位,胸片的两种投照方向 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 可否自行复算 |
|---|---|---|---|
| 检查数(XML) | 3,955 | 报告包文件数 | 可,`ls \ |
| 影像数(parentImage) | 7,470 | 逐条解析 | 可,见 §6.2 |
| 报告包体积 | 1,112,632 B | HTTP HEAD | 可 |
| 影像包体积 | 1,360,814,128 B | HTTP HEAD | 可 |
| 唯一 MeSH 标记 | 1,719 | 逐条解析 | 可 |
normal 条数 |
1,391 | 逐条解析 | 可 |
| 多标记检查数 | 1,690 | 逐条解析 | 可 |
No Indexing 条数 |
95 | 逐条解析 | 可 |
| 双视图检查数 | 3,208 | parentImage 计数 | 可 |
| 无影像检查数 | 104 | parentImage 计数 | 可 |
| FINDINGS 平均词数 | 27.4 | 逐条解析 | 可 |
| FINDINGS 最短/最长 | 0 / 169 词 | 逐条解析 | 可 |
| FINDINGS < 10 字符 | 531 | 逐条解析 | 可 |
| 空 IMPRESSION | 34 | 逐条解析 | 可 |
| 空 INDICATION | 90 | 逐条解析 | 可 |
COMPARISON 为 None. |
1,402 | 逐条解析 | 可 |
| 采集阶段报告数 | 3,996 | 论文摘要 | 不可 |
| 采集阶段影像数 | 8,121 | 论文摘要 | 不可 |
| 影像含 PHI 的检查数 | 2(0.05%) | 论文摘要 | 不可 |
附录 B:数字的来源分层
| 层级 | 覆盖的数字 | 可信度 | 处理方式 |
|---|---|---|---|
| 下载包逐条解析 | 本文附录 A 全表 | 高(可复现) | 文中注明统计方式 |
| HTTP 元信息 | 两个包的字节数与最后修改时间 | 最高 | 直引 |
| 论文摘要与正文 | 采集阶段计数、2 例 PHI、100% 文本去标识精度 | 中高 | 直引,注明与公开包的差异 |
| 社区文档 | 过滤版计数、7:1:2 切分 | 中 | 注明为非官方 |
| 本文推断 | 651 张影像差额的构成、articleDate 全同的原因 |
低 | 正文标为推测 |
附录 C:完整参考文献
- Demner-Fushman D, Kohli MD, Rosenman MB, Shooshan SE, Rodriguez L, Antani S, Thoma GR, McDonald CJ. Preparing a collection of radiology examinations for distribution and retrieval. J Am Med Inform Assoc. 2016;23(2):304–310. doi:10.1093/jamia/ocv080
- Johnson AEW, Pollard TJ, Berkowitz SJ, et al. MIMIC-CXR, a de-identified publicly available database of chest radiographs with free-text reports. Sci Data. 2019;6:317. doi:10.1038/s41597-019-0322-0
- Irvin J, Rajpurkar P, Ko M, et al. CheXpert: A Large Chest Radiograph Dataset with Uncertainty Labels and Expert Comparison. AAAI 2019.
- Wang X, Peng Y, Lu L, et al. ChestX-ray8: Hospital-scale Chest X-ray Database and Benchmarks. CVPR 2017.
- Bustos A, Pertusa A, Salinas JM, de la Iglesia-Vayá M. PadChest: A large chest x-ray image dataset with multi-label annotated reports. Med Image Anal. 2020;66:101797.
附录 D:把它接进自家管线的五个决策
D.1 用哪种过滤阈值
| 阈值 | 剩余样本 | 适合 |
|---|---|---|
| 不过滤 | 全部 XML | 只做图文检索 |
| FINDINGS ≥ 10 字符 | 3,424 | 宽松 |
| FINDINGS ≥ 10 词 | 约 3,300 | 主流 |
| FINDINGS ≥ 20 词 | 约 2,600 | 严格,适合生成任务 |
| 再加「有双视图」 | 约 2,700 | 需要正侧位配对时 |
阈值越严,样本越少但质量越高。写论文时必须报出用了哪一档,否则指标不可比。
D.2 生成什么
三种常见设定,难度递增:
| 设定 | 输入 | 输出 | 难度 |
|---|---|---|---|
| 单段生成 | 影像 | FINDINGS | 中 |
| 条件生成 | 影像 + INDICATION | FINDINGS | 中高 |
| 全报告生成 | 影像 | 四段全部 | 高(COMPARISON 常为 None,学不到东西) |
第一种最常见,第三种最少见但更接近真实工作流。
D.3 要不要做数据增强
这份数据只有七千余张图,很容易过拟合。常见的增强:随机裁剪、水平翻转(注意左右肺的语义,翻转后 IMPRESSION 里的「left/right」会错,需谨慎)、亮度对比度抖动。
水平翻转这一条尤其要注意:胸片的左右是有临床含义的,翻转后如果报告还写「left lower lobe」,图文就不一致了。要么不翻转,要么同时改写报告里的方位词。
D.4 评测加什么
只报 BLEU/ROUGE/CIDEr 不够。建议加两类:
临床相关性。 用 CheXpert labeler 从生成文本与参考文本里各抽一遍 14 类发现,算 F1 或一致率。这比 n-gram 指标更接近「写得对不对」。
人工评分。 抽 100 条做盲评,评三项:事实正确性、完整性、流畅度。这是唯一能发现「模板句刷分」问题的方法。
D.5 要不要和 MIMIC-CXR 联用
如果目标是发论文,推荐的做法是:在 IU X-Ray 上做主要实验与消融(快),在 MIMIC-CXR 上做一次规模验证(慢但必要)。
只在 IU X-Ray 上做的结论,审稿人通常会问「在更大数据上还行吗」。只在 MIMIC-CXR 上做,则难以做细致的消融。
附录 E:三个真实场景的走法
E.1 场景一:复现一篇 2018 年的报告生成论文
第一步,确认它的预处理。 论文若写明过滤后的可用量且低于包内文件数,说明用了过滤版;写包内实际计数则说明用了全量。这一步决定你能不能对上它的数字。
第二步,确认切分。 若它给了切分文件,直接用;若只写「7:1:2」,你得猜随机种子,结果会有 1–2 个点的差异。
第三步,确认输出空间。 只生成 FINDINGS 还是含 IMPRESSION,BLEU 差得很多。
第四步,跑起来。 数据 1.27 GB,模型若不大,一张卡几小时。
第五步,比数字时留余地。 差 2 个点以内算复现成功,差 5 个点以上要找原因(多半在预处理)。
E.2 场景二:给医院的报告生成系统做原型
第一步,明确不能直接用。 这份数据是美国的、2013 年左右的、英文的。中国医院的报告格式、术语习惯、影像设备都不同。
第二步,能用的部分。 结构设计(四段式)、解码策略、评测流程都可以借鉴。模型的初始化权重也能用(在公开数据上预训练,再在本地数据上微调)。
第三步,不能用的部分。 直接用这份数据训的模型在医院跑,输出会是美式英语模板句,与本地方言、术语、报告规范都不匹配。
第四步,合规检查。 CC BY-NC-ND 不允许商用。医院内部做研究可以,做成产品卖不行。
E.3 场景三:做一次「报告生成方法演进」的综述
第一步,按年份收集。 2016–2018 是 CNN-RNN 时代,2019–2021 是 Transformer 时代,2022 之后是视觉语言预训练时代。
第二步,只用报了预处理细节的论文做横向比较。 没写清预处理与切分的,只能当定性参考。
第三步,标注数据集。 有的论文在 IU X-Ray 上做,有的在 MIMIC-CXR 上做,有的两个都做。混在一起比是错的。
第四步,指出评测的固有问题。 BLEU 在短文本上的不稳定性、模板句刷分、临床相关性缺失——这三点值得在综述里单独讨论。
附录 F:一个完整的预处理脚本
import os, json, xml.etree.ElementTree as ET
ROOT = "ecgen-radiology"
OUT = "iuxray_clean.jsonl"
def parse(path):
r = ET.parse(path).getroot()
uid = r.find("uId").get("id")
texts = {a.get("Label"): (a.text or "").strip()
for a in r.findall(".//AbstractText")}
mesh = [m.text for m in r.findall(".//MeSH/major") if m.text]
imgs = []
for p in r.findall(".//parentImage"):
fig = p.find("figureId")
cap = p.find("caption")
imgs.append({
"id": p.get("id"),
"fig": fig.text if fig is not None else None,
"caption": (cap.text or "").strip() if cap is not None else "",
})
return {
"uid": uid,
"comparison": texts.get("COMPARISON", ""),
"indication": texts.get("INDICATION", ""),
"findings": texts.get("FINDINGS", ""),
"impression": texts.get("IMPRESSION", ""),
"mesh": mesh,
"images": imgs,
"license": r.findtext("licenseURL"),
}
def keep(x, min_words=10):
if len(x["findings"].split()) < min_words:
return False
if not x["images"]:
return False
if "No Indexing" in x["mesh"]:
return False
return True
rows = []
for f in sorted(os.listdir(ROOT)):
if not f.endswith(".xml"):
continue
x = parse(os.path.join(ROOT, f))
if keep(x):
rows.append(x)
with open(OUT, "w", encoding="utf-8") as fh:
for x in rows:
fh.write(json.dumps(x, ensure_ascii=False) + "\n")
print(f"保留 {len(rows)} 条")
跑完会得到一个 JSONL,每条一行,字段已经拍平。后续无论是做 DataFrame 分析还是喂给 DataLoader,都直接用这个。
附录 G:MeSH 标记归并的参考映射
下面这张表是把千余个标记压到 12 类的起点。它不是唯一正确的方案,但覆盖了出现频次最高的那些。
| 目标类别 | 包含的标记(部分) | 大致条数 |
|---|---|---|
normal |
normal |
1,391 |
lung_volume_low |
Lung/hypoinflation、Pulmonary Atelectasis/*、Atelectasis |
约 400 |
lung_volume_high |
Lung/hyperdistention、Emphysema |
约 220 |
cardiomegaly |
Cardiomegaly、Cardiomegaly/mild |
约 292 |
aorta |
Aorta/tortuous、Aorta, Thoracic/tortuous、Atherosclerosis/aorta、Calcinosis/aorta |
约 290 |
spine_degenerative |
Spine/degenerative、Thoracic Vertebrae/degenerative* |
约 320 |
granuloma |
Granulomatous Disease、Granuloma* |
约 120 |
technical_unsatisfactory |
Technical Quality of Image Unsatisfactory |
86 |
catheter |
Catheters, Indwelling/* |
约 80 |
congestion |
Pulmonary Congestion、Pulmonary Edema |
约 90 |
bronchovascular |
Markings/bronchovascular |
68 |
other |
其余全部 | 约 600 |
归并时最容易犯的错是按 MeSH 树状结构自动归并。这份数据里的标记并不严格遵循 MeSH 层级,Cardiomegaly/mild 在 MeSH 里并不是 Cardiomegaly 的子节点,是编码人员自己加了 /mild 修饰。所以必须按字符串实际形态做规则映射,不能靠术语库反查。
附录 H:与 MIMIC-CXR 的逐项对照
| 维度 | IU X-Ray | MIMIC-CXR |
|---|---|---|
| 影像数 | 7,470 | 377,110 |
| 检查数 | 3,955 | 227,835 |
| 患者数 | 约 3,900 | 65,379 |
| 报告 | 四段式,平均 27 词 | 自由文本,平均约 60 词 |
| 元数据 | 极简 | 含 patient ID、study date、view position |
| 纵向随访 | 无 | 有,同一患者多次 |
| 影像格式 | PNG | DICOM + JPG |
| 体量 | 1.27 GB | 约 4.7 TB(JPG 版约 570 GB) |
| 获取门槛 | 直链下载 | PhysioNet 认证 + 数据使用协议 |
| 许可 | CC BY-NC-ND 4.0 | PhysioNet Credentialed Health Data License |
| 单轮训练耗时 | 小时级 | 天级 |
| 适合 | 消融、快速迭代、教学 | 预训练、规模验证、纵向研究 |
一个值得注意的差别:MIMIC-CXR 的报告里常有「Comparison: None」这类结构性语句,也有更多阳性所见的详细描述。IU X-Ray 的报告更短更模板化,这是它 BLEU 容易刷高的根源。
附录 I:三个常被引用的「传闻」与事实核对
I.1 「IU X-Ray 的规模等于论文摘要写的那个数」
一半对。那个数是采集阶段的数字,当前公开包的文件数要少一些。差额的去向论文未说明,推测是去标识化阶段剔除。
I.2 「影像是 1024×1024」
未核实。影像包(1.27 GB / 七千余张)平均每张约 182 KB,按 PNG 无损压缩的比例推算,1024×1024 的灰度胸片压到这个体积是合理的。但本篇未下载影像包逐张核对,只作为量级参考。
I.3 「有患者级别的标签」
没有。XML 里没有患者标识,MeSH 标记是检查级的(「这一例检查有心脏增大」),不是患者级的诊断。同一患者的多次检查无法关联。
附录 J:如果只记五件事
- 近四千条检查、七千余张图,报告包 1 MB、影像包 1.27 GB。 两个包分开下。
- 过滤三件事:FINDINGS 少于 10 词、无影像、
No Indexing。 过滤后约三千三百条。 - 元数据极贫瘠:没有检查日期、年龄、性别。 别指望做分层分析。
- 千余个 MeSH 标记必须归并才能用。 同一概念有多个粒度与多种写法。
- 报告平均 27 词,模板句能刷分。 看 BLEU 时一定要做「万能句」对照。
编辑说明
本篇数字来源分三层,已在附录 B 列明:报告包(NLMCXR_reports.tgz,约 1.06 MB,632 字节,2017-06-06 版)的逐条 XML 解析、两个包的 HTTP 元信息、以及原始论文(JAMIA 2016)的摘要与正文。核验时间 2026-10-26。
逐条解析可复现的数字已全部列在附录 A 的核对表里,分为规模、文本完整度、标注、分布四组,每组都注明可否自行复算。解析脚本见附录 F,可直接复跑。
未做的核验:影像包未下载,因此影像的像素尺寸、位深、是否统一缩放、PNG 压缩参数均未核对;url 字段里的 /hadoop/storage/... 内部路径与 PNG 包内文件名的完整对应关系未逐一验证;MeSH 编码的编码者间一致性(Kappa)论文未给出,无法量化。
已知的官方内部不一致:①报告数与影像数(论文采集计数对公开包实际计数),差额构成论文未说明,本篇推测为去标识化筛选,未获证实;②articleDate 全部为 2013-08-01,原因未查明,本篇推测为批量导入时间戳。
未覆盖内容:报告包 2017 年那次更新改了什么;104 条无影像记录的具体成因;specialty 字段的取值分布(抽查见到 pulmonary diseases,未做全量统计);作者列表字段的完整度;globalImageFeatures 里五种感知哈希的实际计算方式。
许可为 CC BY-NC-ND 4.0,且每条 XML 内以 licenseURL 逐条声明。本篇引用其数字与结构描述属学术评论与工程说明,不构成对任何影像或报告本体的再分发。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- gmai-mmbench — 共享标签:医学影像 / 医疗NLP / 多模态 / 医学问答与基准
- reflacx-xray-localization — 共享标签:医学影像 / X光影像 / 医疗NLP / 多模态
- radvlm-instruction-dataset — 共享标签:医学影像 / X光影像 / 医疗NLP / 多模态
- radialog-instruct-dataset — 共享标签:医学影像 / X光影像 / 医疗NLP / 多模态
- mimic-cxr — 共享标签:医学影像 / X光影像 / 多模态
- latte-cxr — 共享标签:医学影像 / X光影像 / 多模态
- chestagentbench — 共享标签:医学影像 / X光影像 / 多模态 / 医学问答与基准
- mimic-cxr-ext-mimic-cxr-db — 共享标签:医学影像 / X光影像 / 医疗NLP / 多模态
- mimic-iv-note — 共享标签:医学影像 / X光影像 / 医疗NLP
- ehrxqa — 共享标签:X光影像 / 多模态 / 医学问答与基准
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

