信息速览
结核病至今仍是全球单一传染病的头号杀手,而它的初筛手段极其廉价:一张正位胸片。廉价带来的是海量读片需求,也带来了一个持续三十年的工程问题——把「有没有结核」变成模型能学的标签容易,把「结核在哪一叶、是活动性还是陈旧潜伏」变成标签很难。后者需要放射科医师逐张画框,需要病原学结果兜底,还需要有人愿意把这两件事同时做完再公开。TBX11K 就是少数把这套流程走完的公开数据集。
它的定位可以用一句话概括:不是又一个大而全的胸片库,而是一个只做结核、并且做到病灶级的窄口径数据集。一万一千余张图里,一万张是阴性对照(健康与患病但非结核各半),一千二百张是结核,其中约八百张带框。这个比例看上去很不平衡,但它恰好复刻了真实筛查场景中的先验:绝大多数来拍片的人没有结核,而其中相当一部分人并不是健康的,他们带着肺炎、积液、陈旧病灶——这些正是把二分类模型逼出假阳性的来源。
理解这个数据集,关键不在记住几个数字,而在接受它的三个设计选择:阴性对照被拆成健康与患病非结核两格;结核被拆成活动性与潜伏两格;标注只给框不给掩膜。这三点决定了它能做什么、不能做什么,也决定了它和泛病种胸片库之间的分工。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 全称 | TBX11K(Tuberculosis X-ray),亦称 TBX11K Dataset |
| 发布方 | 南开大学媒体计算实验室(VCIP / TKLNDST),国防科技大学与新加坡 A*STAR 参与 |
| 首发与扩展 | CVPR 2020 口头报告;IEEE TPAMI 2023 长文扩展,卷 46 期 4 |
| 图像规模 | 11,200 张,官方称一图一人 |
| 分辨率与格式 | 512×512 灰度 PNG,无 DICOM 头,原图约 3000×3000 未发布 |
| 图像级类别 | 健康、患病但非结核、活动性结核、潜伏结核;另有混合型与不确定型两个残类 |
| 类别计数 | 健康五千、患病非结核五千、结核一千二百(活动性 924、潜伏 212、混合 54、不确定 10) |
| 病灶标注 | 仅结核图像有矩形框,无像素级掩膜;阴性两类无框 |
| 标注格式 | Pascal VOC XML;COCO JSON 需运行官方脚本生成 |
| 官方划分 | 训练 6,600 / 验证 1,800 / 测试 2,800,结核各亚型按三比一比二分配 |
| 测试集 | 标签不公开,长期作为在线竞赛,提交至 Codabench |
| 获取方式 | 官方 Google Drive、百度网盘、Kaggle 镜像三选一 |
| 压缩包体积 | 约四吉字节(Kaggle 镜像 4,252,079,748 字节) |
| 许可 | 仓库未附标准许可证;一方标非商用共享,一方标署名共享,商用须确认 |
| 血缘 | 主集来自中国合作医院;另有四个公开小集的留出图放在 extra 目录 |
| 一句话定位 | 结核单病种、带病灶框、区分活动性与潜伏的胸片基准 |
§1 它要解决的具体麻烦
1.1 结核筛查的模型不缺口径,缺的是「病灶在哪」这一层
绝大多数胸片数据集解决的是分类问题:这张片子上有没有某种征象。结核的公开数据长期停在这一层——Montgomery 一百三十八张、深圳六百六十二张、DA 与 DB 各一百五十余张,四个集合起来刚过一千张,且只有图像级的是否结核。用这种数据训出来的模型,输出是一个概率,放射科医师拿到概率之后仍然要自己找病灶、自己判断活动性,工作流没有实质改变。
TBX11K 补的正是这一层。它把「结核区域」定义为一个可以回归的矩形,把「活动性还是潜伏」定义为框的属性,于是模型的输出从「八成是结核」变成「右肺上叶有一个框,框的类别是活动性」。这个变化对筛查流水线的意义远大于准确率提升几个点:有框才能做热区提示、才能做随访对比、才能把医师的注意力引到具体位置。
1.2 三条常见的错误期待
第一条是把发布方认错。这个数据集的常见误挂是「美国国家医学图书馆出品」,理由是它的图像常常与 Montgomery、Shenzhen 出现在同一批教程里。实际发布方是南开大学团队,NLM 只发布了那两个小集。这个误认会带来具体后果:有人按 NLM 的公有领域条款直接商用,而 TBX11K 的许可状态并不支持这种用法。
第二条是期待像素级标注。结核病灶在胸片上表现为浸润、结节、空洞、纤维条索,形态极不规则,逐像素勾画成本极高。TBX11K 选择了矩形框,这是一个明确的成本与精度折中,不是遗漏。想用它训练分割模型,必须自己补标。
第三条是期待它能直接当外部验证集。测试集标签不公开,本地拿到的两千八百张图是没有答案的;训练集又与四个公开集存在图像级重叠,任何「在 TBX11K 上训练、在深圳集上测试」的设计都会因重叠而虚高。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 训练结核二分类模型 | 一千二百张结核与一万张阴性,含患病非结核硬负例 | 够,且负例质量优于纯健康对照 |
| 训练结核病灶检测器 | 约八百张带框结核图,框级分型 | 勉强够,框数量偏少,建议配合强增广 |
| 区分活动性与潜伏 | 两级标签均具备 | 够做研究,潜伏样本稀少,指标波动大 |
| 像素级病灶分割 | 无掩膜 | 不够,须自标或换数据集 |
| 复现论文榜单 | 测试集无标签 | 不够,只能提交到在线竞赛换分数 |
| 评估人群泛化 | 单一国家、医院未具名 | 不够,跨国人种与设备的外部验证须另找数据 |
| 教学演示标注流程 | 原始 XML 与列表文件齐全 | 够,是很好的标注格式教学样本 |
| 做阴性对照的困难样本挖掘 | 五千张患病非结核 | 够,这一类是它最有价值的资产之一 |
| 直接商用部署 | 许可状态不明 | 不够,须先取得作者书面许可 |
| 随访与纵向研究 | 一图一人,无时间轴 | 不够,原理上无法回答 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 手里只有 Montgomery 与深圳两集,模型在患病非结核人群上假阳性高 | 五千张患病非结核硬负例,可直接补进训练集 | 用官方 all_train 列表训练,避免与验证集重叠 |
| 要向临床科室交付一个能圈出病灶的提示工具 | 框级标注与框级分型,可直接训检测头 | 把输出框按活动性着色,并明确标注「仅供参考」 |
| 论文需要一个结核检测的公开基准做对比 | 论文给出六种检测器的完整指标,可直接对标 | 用同一 512×512 输入、同一测试提交流程,否则不可比 |
| 想研究潜伏感染的影像学线索 | 两百余张潜伏结核与对应框 | 把它当探索性分析,结论须注明样本量限制 |
| 团队要练手医学目标检测 | 结构简单、体积可控、格式标准 | 从 §5 的解包与转 COCO 流程起步,半天可跑通 |
| 需要多病种、多征象的通用胸片能力 | 只有一个病种,无其他征象标签 | 改用泛病种胸片库,把本集当结核专项增强 |
| 要做结核的纵向随访或治疗转归 | 一图一人,无时间维度 | 换有纵向设计的队列数据 |
1.5 一句话判断
它是结核影像 AI 从「有没有病」跨到「病在哪、是哪一型」的那块踏板,踏板很窄,但踩上去之后整个工作流的形态会变。
1.6 不适合谁:四条边界
不适合只想做通用胸片多标签的人。它只有一个病种,十四个常见征象在这里一个标签都没有,用它训出来的特征在肺炎、气胸、结节任务上迁移效果有限。
不适合需要像素级定位的人。框只能告诉你病灶大致占了哪一块,给不出边界;对于空洞壁厚、树芽征这类需要形态学测量的任务,框的信息量不足。
不适合要求许可清晰可直接商用的人。仓库没有标准许可证文件,两方标注互相矛盾,合规部门无法据此签字。
不适合做人群泛化结论的人。合作医院未具名,人群年龄段、设备型号、摄片条件都没有披露,任何「模型在中国人群上表现如何」的表述都超出了这份数据能支撑的范围。
§2 数据构成与规格
2.1 一张表看清构成
| 组成 | 数量 | 说明 |
|---|---|---|
| 健康 | 5,000 | 无结核、影像学无明显异常 |
| 患病但非结核 | 5,000 | 有影像学异常但非结核,硬负例的主要来源 |
| 活动性结核 | 924 | 具传染性,含初发与原发感染 |
| 潜伏结核 | 212 | 不发病、不具传染性,多由接触史或治疗转归而来 |
| 活动与潜伏并存 | 54 | 同一胸片上两类征象同时存在 |
| 类型不确定 | 10 | 现有条件下无法判定型别,全部放在测试集 |
| 合计 | 11,200 | 官方称一图一人,无患者级重复计数 |
| 其中带框图像 | 约 800 | 仅训练与验证集中的结核图像 |
| 附加图像 | 约 1,100 | 四个公开小集的留出部分,单独放在 extra 目录 |
2.2 字段与记录的完整字典
图像表以文件名为唯一键,标注表以框编号为键,两张表通过文件名连接。下表把发布包里能用上的字段逐项列出,包括那些藏在 XML 属性里、容易被解析器忽略的项。
| 字段 | 类型 | 含义 | 示例 | AI 用途 | 取值与约束 |
|---|---|---|---|---|---|
| image_name | 字符串 | 去标识化文件名,全局主键 | tb0312.png | 索引与连接 | 结核图以 tb 起头,健康与患病另有前缀 |
| image_class | 枚举 | 图像级四分类标签 | Active TB | 分类监督 | 健康/患病非结核/活动性结核/潜伏结核 |
| tb_subtype | 枚举 | 结核亚型细分 | Latent TB | 亚型分析 | 与 image_class 在结核样本上冗余,混合型与不确定型只在细分中出现 |
| split | 枚举 | 官方划分归属 | train | 划分控制 | train/val/test 三值 |
| list_membership | 集合 | 该图属于哪几份列表 | TBX11K_trainval | 复现划分 | 官方列表与 all_ 前缀列表两套口径 |
| bbox_xmin | 整数 | 框左上角横坐标 | 63 | 检测回归 | 512×512 坐标系,零到五一一 |
| bbox_ymin | 整数 | 框左上角纵坐标 | 12 | 检测回归 | 同上 |
| bbox_xmax | 整数 | 框右下角横坐标 | 127 | 检测回归 | 须大于 xmin |
| bbox_ymax | 整数 | 框右下角纵坐标 | 76 | 检测回归 | 须大于 ymin |
| box_type | 枚举 | 框级别的结核类型 | active | 分型检测 | 活动性/潜伏/不确定三值 |
| box_count | 整数 | 该图上的框数 | 2 | 目标计数 | 结核图至少一框,阴性图为零 |
| source_dataset | 枚举 | 图像来源集合 | TBX11K | 去重与外部验证 | 主集为 TBX11K,附加图为 DA/DB/MC/SZ |
| is_extra | 布尔 | 是否位于 extra 目录 | false | 防止误混 | 为真时该图不在一万一千二百张之内 |
| width | 整数 | 图像宽度 | 512 | 预处理 | 全部为五一二 |
| height | 整数 | 图像高度 | 512 | 预处理 | 全部为五一二 |
| channels | 整数 | 通道数 | 1 | 读入方式 | 灰度单通道 |
| bit_depth | 整数 | 位深 | 8 | 归一化 | 发布版为八位,原始十二位信息已随降采样丢失 |
| dice_available | 布尔 | 是否带分割掩膜 | false | 任务可行性判断 | 恒为假,本集不提供掩膜 |
| patient_id | 字符串 | 患者级标识 | 无 | 泄漏检测 | 未提供,官方仅称一图一人 |
| acquisition_date | 日期 | 采集时间 | 无 | 时间漂移分析 | 未提供 |
| hospital | 字符串 | 采集医院 | 未具名 | 站点效应分析 | 官方未披露 |
2.3 一条记录的完整解剖
以训练集里一张带两个框的活动性结核胸片为例,它在磁盘上的全部信息由三部分组成:一个 PNG 文件、一个同名 XML、以及在若干列表文件中的一行。XML 采用 Pascal VOC 结构,解析时容易踩的坑是坐标是浮点数、以及 Object 节点会重复出现。
TBX11K/annotations/xml/tb0312.xml
<annotation>
<folder>TBX11K</folder>
<filename>tb0312.png</filename>
<size><width>512</width><height>512</height><depth>1</depth></size>
<object>
<name>active</name>
<bndbox><xmin>63</xmin><ymin>12</ymin><xmax>127</xmax><ymax>76</ymax></bndbox>
</object>
<object>
<name>latent</name>
<bndbox><xmin>301</xmin><ymin>210</ymin><xmax>389</xmax><ymax>286</ymax></bndbox>
</object>
</annotation>
对应的列表文件是纯文本,一行一个文件名,不带路径、不带标签。这意味着标签只能从目录结构或 XML 反推,而不能从列表里读出来——这是初学者最常卡住的地方。
TBX11K/lists/TBX11K_trainval.txt
tb0312.png
tb0313.png
normal_0147.png
sick_0921.png
把这三部分合成一条可用记录,只需要二十来行代码。下面这段可以直接跑,输入是解包后的根目录,输出是一张带框坐标的表。
#-- 读取 TBX11K 的 XML 标注并与列表文件对齐
import os, glob
import xml.etree.ElementTree as ET
import pandas as pd
ROOT = "/data/TBX11K"
rows = []
for xml_path in glob.glob(os.path.join(ROOT, "annotations/xml/*.xml")):
tree = ET.parse(xml_path)
root = tree.getroot()
name = root.findtext("filename")
for obj in root.findall("object"):
box = obj.find("bndbox")
rows.append({
"image_name": name,
"box_type": obj.findtext("name"),
"xmin": float(box.findtext("xmin")),
"ymin": float(box.findtext("ymin")),
"xmax": float(box.findtext("xmax")),
"ymax": float(box.findtext("ymax")),
})
boxes = pd.DataFrame(rows)
boxes["w"] = boxes.xmax - boxes.xmin
boxes["h"] = boxes.ymax - boxes.ymin
print(boxes.shape, boxes.box_type.value_counts().to_dict())
2.4 类别与划分的结构表
官方划分按类别做三比一比二分配,唯一例外是不确定型,十张全部落在测试集。这个例外不是疏忽,而是设计:不确定型在临床上是「读不出来」的那一类,把它放进训练会让模型学到一个没有临床对应物的类别。
| 类别 | 训练 | 验证 | 测试 | 合计 |
|---|---|---|---|---|
| 健康 | 3,000 | 800 | 1,200 | 五千 |
| 患病但非结核 | 3,000 | 800 | 1,200 | 五千 |
| 活动性结核 | 473 | 157 | 294 | 924 |
| 潜伏结核 | 104 | 36 | 72 | 212 |
| 活动与潜伏并存 | 23 | 7 | 24 | 54 |
| 类型不确定 | 0 | 0 | 10 | 10 |
| 合计 | 6,600 | 1,800 | 2,800 | 一万一千二百 |
从这张表里能读出三个结构性事实。其一,阳性与阴性的比例在训练集里约为一比八点三,这是刻意贴近筛查场景的先验,不是采样失误;如果按平衡采样重训,得到的阈值在真实场景里会系统性偏高。其二,潜伏结核在训练集里只有一百零四张,是活动性的四分之一不到,任何以潜伏类为核心指标的研究都会遇到方差问题。其三,不确定型训练集为零,意味着模型在测试时遇到这一类只能靠「类别无关」的检测分支去碰,分类分支无论怎么训都不会输出这个类。
2.5 与同类资源的规格差异
| 维度 | TBX11K | Montgomery | Shenzhen | NIH ChestX-ray14 | VinDr-CXR |
|---|---|---|---|---|---|
| 病种 | 结核单一 | 结核单一 | 结核单一 | 十四征象 | 多征象 |
| 图像数 | 一万一千余 | 一百三十八 | 六百六十二 | 十万余 | 一万八千 |
| 分辨率 | 512×512 | 约 4000×4900 | 约 3000×3000 | 1024×1024 | 原始 DICOM |
| 病灶框 | 有,约八百张 | 有共识 ROI | 有边界框 | 有,子集 | 有,逐病灶 |
| 像素掩膜 | 无 | 有肺野掩膜 | 有肺野掩膜 | 无 | 无 |
| 亚型分层 | 活动性与潜伏 | 无 | 无 | 无 | 无 |
| 测试标签 | 封闭 | 公开 | 公开 | 公开 | 公开 |
| 许可 | 不明 | 公有领域 | 公有领域 | 开放 | 非商用 |
§3 定位:一个病种、两种阴性、两级阳性
3.1 三个身份标签,缺一个就不成立
第一个标签是单病种。整个数据集只回答结核这一个问题,没有气胸、没有结节、没有心脏增大。这个选择牺牲了通用性,换来的是标注深度:所有的人力都投在一个病种上,才可能把框画到病灶级、把型别判到活动性。
第二个标签是框标注。框的存在把任务从分类扩到检测,也就把评价指标从准确率扩到平均精度。这一步的门槛不在于算法,而在于标注成本——一张胸片上可能有三四个结核相关区域,每个区域都要医师判断是不是病灶、属于哪一型、边界画到哪里。
第三个标签是亚型分层。活动性与潜伏的区分是这份数据最容易被低估的部分。影像学上,活动性结核表现为浸润、实变、空洞,潜伏感染多数没有可见病灶,少数留下钙化结节或纤维条索。要在同一套标签体系里同时容纳这两种表现,还要让模型学会区分,需要图像级与框级两层标签互相印证。
3.2 为什么非要把阴性拆成两格
如果阴性只有健康一类,模型学到的判别边界是「结核 vs 正常」。这条边界在实验室里很漂亮,一到门诊就崩:门诊里大量胸片是异常的,只是异常的原因不是结核。模型没见过这些异常,就会把浸润当结核、把积液当结核、把陈旧瘢痕当结核。
TBX11K 用五千张患病但非结核的图像把这条边界重新推了一遍。它的作用是让模型明白:异常不等于结核。这个设计在论文里被表述为「模拟临床数据分布」,实际效果是把假阳性率压下来——论文报告的特异度在九成六以上,这个数字如果没有硬负例支撑是拿不到的。
从工程角度看,这一格还带来一个副作用:它让数据集的类别不再互斥于病理,而是互斥于病因。健康、患病非结核、结核这三类在影像上是嵌套关系,患病非结核里包含各种可能被误认为结核的表现。使用者在做错误分析时会发现,模型的主要错误集中在「患病非结核被判成结核」,而不是「健康被判成结核」。
3.3 活动性与潜伏的标签从哪来
这是本集与所有纯影像数据集最不一样的地方。标签不是读片共识,而是病原微生物学金标准:痰涂片、痰培养、分子检测,加上临床确诊。放射科医师的任务是在已知金标准的前提下画框、判型,而不是自由地给出一张片子「像不像结核」。
这个顺序很重要。先有金标准再画框,意味着框的位置被约束在「支持这个诊断的影像学证据」上;如果反过来先读片再对金标准,医师会不自觉地被自己的第一印象带偏。论文描述的流程是:五到十年经验的医师初标,十年以上经验的医师复核,框的型别判定必须与金标准一致,不一致的图退回未标注池重标,且重标时医师不知道上一次标错的是哪一张。
框级与图像级的一致性校验还带来一个副产品:框的类型分布可以直接用来做弱监督研究。一张图上有两个框、一个标活动性一个标潜伏,这类样本对应图像级的混合型。这类样本只有五十余张,但它们是理解「同一肺野内新旧病灶共存」的唯一切入点。
3.4 命名与血缘:它和 NLM 两集到底是什么关系
先把关系说清楚,因为这是引用时最容易出错的地方。国家医学图书馆的 Lister Hill 中心公开发布了两个结核胸片集:蒙哥马利县集一百三十八张,深圳集六百六十二张,两者都带肺野掩膜与医师标注,都是公有领域。这两个集是结核影像研究的起点,也是绝大多数教程的默认数据。
TBX11K 的主集不是这两个集的合并。论文的表述是与中国多家医院长期合作采集,去标识化后经主管部门豁免,可以公开。一万一千二百张这个数字是主集规模,不含任何公开集图像。
但压缩包里确实有公开集的图。官方说明写得很直白:结核数据在实践中很昂贵,为了充分利用已有数据,把 DA、DB、蒙哥马利、深圳四个小集的图放进 extra 目录,一部分并入训练与验证,剩下的与官方测试集合并成 all_test。于是就出现了两个口径:
| 口径 | 数值 | 含义 | 适用场景 |
|---|---|---|---|
| 主集口径 | 一万一千二百张 | 只算合作医院采集的图像 | 论文报告数据规模、描述类别构成 |
| 全量口径 | 主集加四个公开集留出部分 | 含 extra 目录中的所有图 | 训练、竞赛提交、复现 all_ 前缀列表 |
| 测试口径 | 两千八百张 | 官方测试集,标签封闭 | 提交竞赛 |
| 扩展测试口径 | 两千八百张加公开集留出部分 | all_test 列表,行数多于两千八百 | 竞赛提交的另一套约定 |
引用时如果不区分这两个口径,会出现「说是一万一千二百张,下载下来发现文件更多」的困惑。正确写法是:主集一万一千二百张,另附约一千一百张来自四个公开集的图像,后者以 extra 目录与 all_ 前缀列表标识。
§4 质量与特色:一份标注能撑起什么
4.1 双校流程带来的可靠性上限
标注可靠性由三道关卡保证:医师经验门槛、复核机制、金标准交叉核对。这三道关卡决定了框的可信度下限,也决定了成本上限——一张图要过三遍,其中两遍是资深医师,这就是为什么一万余张图里只有约八百张带框。
具体到数字,第三方对发布包的重打包统计给出七百九十九张图、一千二百一十一个框,与官方「训练验证集中的结核图像带框」的表述吻合。平均下来一图一点五个框,说明多数结核胸片只有一个主要病灶区,多发病灶是少数。
值得强调的是,这套流程保证的是「框标在该标的地方」,不保证「框覆盖了全部病灶」。医师画框时关注的是支持诊断的主要区域,微小的卫星灶、对侧的小结节常常不入框。做检测评估时如果把召回率当成「找全所有病灶」来解读,会系统性低估模型表现。
4.2 512×512 这个决定
发布版统一缩放到 512×512,原始分辨率约 3000×3000。这个降采样是有代价的:结核的早期征象往往是几毫米的结节、细网格状的间质改变,降采样之后这些纹理被平均掉,只剩下密度和轮廓。
代价换来的是可比性。论文明确建议所有研究者使用 512×512 版本做实验,理由是公平比较。这个约定在结核检测领域有实际约束力:如果有人用原始分辨率做了增强再报分数,那个分数与官方榜单不可比,因为信息量本身就不同。
对使用者的实际影响是三条。第一,任何以细纹理为特征的征象(树芽征、粟粒样分布)在本集上都会被削弱,不要指望模型学会它们。第二,上采样回大分辨率没有意义,插值不能恢复已丢失的高频信息。第三,数据增强里的随机裁剪要谨慎,512 的图裁到 384 就可能把边缘病灶裁掉。
4.3 案例:一张 tb0312 胸片的三次判读
设想一张编号为 tb0312 的胸片,它在训练集里,XML 中记录了两个框,一个标活动性、一个标潜伏。这张图可以串起整个数据集的读法。
第一次判读发生在采集现场。患者因咳嗽三周就诊,拍正位胸片,同时留痰。胸片显示右肺上叶斑片状密度增高,左肺尖有钙化点。痰涂片阳性。金标准给出「活动性结核」,这是图像级标签的来源。
第二次判读发生在标注环节。放射科医师拿到片子与金标准,需要在右肺上叶画一个框覆盖斑片影,标为活动性;在左肺尖画一个框覆盖钙化灶,标为潜伏。两个框的型别与金标准不冲突:活动性框对应本次发病,潜伏框对应既往感染留下的痕迹。复核医师确认两个框的边界合理,这张图进入训练集。
第三次判读发生在模型侧。模型对这张图输出三个东西:三分类概率、一组框、每个框的型别。如果分类分支判对了活动性结核但检测分支漏掉左肺尖的钙化框,评估时分类指标满分、检测指标扣分。这个分离正是本集的价值所在——它让「答对了病」与「看对了位置」变成两个可以分别优化的目标。
§4.3 的案例还说明了一件容易被忽略的事:混合型样本的框级标签不是「混合」这个类,而是两个框各自带自己的型别。解析 XML 时如果只取图像级标签,就会丢掉这一层信息,而这层信息恰恰是做多病灶分型研究的全部依据。后文 §7.3 讨论偏差、§9.2 给出最短流程时,都会回到这张图。
4.4 它测不出来的东西
第一是潜伏感染的影像学阴性者。潜伏感染的定义里包含大量胸片完全正常的人,这些人不会出现在结核类里,而是散落在健康类中。这意味着健康类里混有真正的潜伏感染者,标签的「健康」指的是「无结核影像学证据」,不是「未感染」。
第二是肺外结核。数据集只收胸片,淋巴结核、骨结核、结核性脑膜炎都不在范围内。
第三是治疗转归。一图一人,没有时间轴,无法回答「治疗两个月后病灶吸收了多少」。
第四是儿童与免疫抑制人群。论文没有披露年龄构成,但从「潜伏者多因接触活动性结核而发现」的描述看,采集场景偏向成人门诊与筛查,儿童结核的典型表现(原发综合征、粟粒性)在本集里的代表性无法确认。
§5 取数:三条路径与一套可跑通的流程
5.1 三条获取路径的取舍
| 路径 | 入口 | 优点 | 风险 |
|---|---|---|---|
| 官方 Google Drive | 项目仓库首页链接 | 与论文口径一致,最新 | 需要稳定国际网络,大文件易中断 |
| 官方百度网盘 | 项目仓库首页链接 | 国内速度快 | 需要客户端,链接可能失效 |
| Kaggle 镜像 | usmanshams/tbx-11 | 可用命令行下载,带校验 | 由第三方上传,许可标注为未知 |
| Dataset Ninja 重打包 | 第三方站点 | 已转成通用标注格式 | 体积与结构均被改造,不适合复现论文 |
推荐顺序是官方优先、Kaggle 兜底。镜像的目录结构与官方包一致,都包含 README、CVPR 版论文 PDF、annotations 与 imgs 四部分,差异主要在压缩方式与是否附带列表文件。
5.2 目录结构
解包之后的结构是扁平的,没有按类别分子目录,类别只能从标签反推。
TBX11K/
├── README.md
├── TBX11K_CVPR2020.pdf
├── annotations/
│ ├── xml/ #-- Pascal VOC 标注,仅训练验证集的结核图
│ └── json/ #-- 空目录,需运行脚本生成 COCO
├── imgs/ #-- 主集图像,文件名如 tb0312.png
│ └── extra/ #-- 四个公开小集的留出图像
├── lists/
│ ├── TBX11K_train.txt
│ ├── TBX11K_val.txt
│ ├── TBX11K_trainval.txt
│ ├── all_train.txt
│ ├── all_val.txt
│ ├── all_trainval.txt
│ └── all_test.txt
└── code/
└── make_json_anno.sh #-- 生成 COCO 标注的官方脚本
两套列表的差别必须记住。TBX11K_ 前缀的列表只含主集,all_ 前缀的列表含 extra 目录的图像。做交叉验证用前者,做竞赛提交用后者。混用会导致同一个文件名在两套列表里指向不同的划分。
5.3 解包与完整性校验
下载完成后先校验再解包。镜像体积约四吉字节,解压后略大,预留十吉字节磁盘足够。
#-- 下载后先看体积,再解包,最后核对图像数与标注数
cd /data
ls -lh tbx11k.zip
unzip -q tbx11k.zip -d /data/
find /data/TBX11K/imgs -name "*.png" | wc -l
find /data/TBX11K/imgs/extra -name "*.png" | wc -l
find /data/TBX11K/annotations/xml -name "*.xml" | wc -l
wc -l /data/TBX11K/lists/*.txt
四个数字的含义分别是:主集图像数、附加图像数、带框图像数、各列表行数。如果主集图像数与官方口径差得多,先确认是不是把 extra 目录算进去了。
5.4 生成 COCO 标注
官方只提供 Pascal VOC 格式,检测框架多数吃 COCO。转换脚本随包提供,也可以自己写,自己写的版本更容易加字段。
#-- 官方脚本,在仓库根目录执行
cd /data/TBX11K
sh code/make_json_anno.sh
ls -lh annotations/json/
如果脚本因为路径问题跑不通,用下面这段替代。它把框级型别映射成类别编号,并在文件名里保留划分信息。
#-- 把 Pascal VOC 标注转成 COCO,保留框级型别
import json, glob, os
import xml.etree.ElementTree as ET
ROOT = "/data/TBX11K"
CATS = {"active": 1, "latent": 2, "uncertain": 3}
coco = {"images": [], "annotations": [], "categories": [
{"id": v, "name": k} for k, v in CATS.items()]}
ann_id = 1
for i, xml_path in enumerate(sorted(glob.glob(f"{ROOT}/annotations/xml/*.xml")), 1):
root = ET.parse(xml_path).getroot()
name = root.findtext("filename")
coco["images"].append({"id": i, "file_name": name, "width": 512, "height": 512})
for obj in root.findall("object"):
box = obj.find("bndbox")
x1, y1 = float(box.findtext("xmin")), float(box.findtext("ymin"))
x2, y2 = float(box.findtext("xmax")), float(box.findtext("ymax"))
coco["annotations"].append({
"id": ann_id, "image_id": i, "category_id": CATS[obj.findtext("name")],
"bbox": [x1, y1, x2 - x1, y2 - y1], "area": (x2 - x1) * (y2 - y1),
"iscrowd": 0})
ann_id += 1
os.makedirs(f"{ROOT}/annotations/json", exist_ok=True)
json.dump(coco, open(f"{ROOT}/annotations/json/tbx11k_coco.json", "w"))
print(len(coco["images"]), len(coco["annotations"]))
5.5 一套能同时喂分类与检测的读取器
官方任务是分类加检测双输出,数据读取器也要相应地把两种监督都带出来。下面这段只依赖 Pillow 与 PyTorch,可以直接嵌进训练脚本。
#-- 双任务 Dataset:返回图像、四分类标签、框张量与框类别
import os
import numpy as np
import torch
from PIL import Image
from torch.utils.data import Dataset
CLASSES = ["healthy", "sick_non_tb", "active_tb", "latent_tb"]
CLS2ID = {c: i for i, c in enumerate(CLASSES)}
class TBX11K(Dataset):
def __init__(self, root, records, transform=None):
self.root, self.records, self.transform = root, records, transform
def __len__(self):
return len(self.records)
def __getitem__(self, idx):
r = self.records[idx]
img = Image.open(os.path.join(self.root, "imgs", r["image_name"])).convert("L")
img = np.array(img, dtype=np.float32) / 255.0
img = torch.from_numpy(img).unsqueeze(0)
if self.transform:
img = self.transform(img)
boxes = torch.tensor(r["boxes"], dtype=torch.float32).reshape(-1, 4)
labels = torch.tensor([CLS2ID[r["label"]]], dtype=torch.long)
return img, labels, boxes
记录表需要自己拼:图像级标签从列表与文件名规则反推,框从 COCO json 读。没有框的图返回空张量,检测损失函数要能处理这种空样本——这是把阴性图混进检测训练时必须解决的问题,否则五千张健康图会被当成全背景,模型学到的是「什么都不框」。
5.6 提交竞赛的两种结果文件
竞赛同时评分类与检测。分类结果是逐图的类概率文本,检测结果是 COCO 格式的 json。两者都要提交,缺一个只有一半分数。
#-- 分类结果:每行 文件名 加三个概率
tb0312.png 0.02 0.11 0.87
normal_0147.png 0.94 0.05 0.01
检测结果的格式与训练时一致,只是 image_id 要换成测试集图像的编号。提交前务必确认用的是 all_test 列表对应的编号顺序,否则服务器会把结果对到错误的图上,分数接近随机。
§6 与库内条目的关系
6.1 关系图谱
库内胸片类资源已经形成三个圈层,TBX11K 站在第三层的窄口上。第一层是泛病种大库,覆盖十几种征象,用来做通用表征;第二层是单病种或单任务库,围绕新冠、结核、心衰、气胸各自成集;第三层是标注形态的变体,同一批图像被反复重标成框、掩膜、场景图、报告。
| 圈层 | 库内代表 | 与本集的关系 |
|---|---|---|
| 泛病种大库 | CheXpert Plus、MIMIC-CXR-JPG、PadChest、VinDr-CXR | 提供通用胸片表征,本集可作为结核专项微调集 |
| 结核家族 | Montgomery CXR、Shenzhen TB CXR、AI-TB-ZN | 同病种不同标注深度,本集是其中唯一带病灶框的 |
| 检测与框变体 | ChestX-Det10、VinBigData CXR、CXRGraph | 同为框或图结构标注,但病种范围与标注对象不同 |
| 任务型基准 | CXR-LT、BrixIA、ChestAgentBench | 任务定义不同,评测目标不重叠 |
需要说明的是,库内并没有以「NIH ChestX-ray14」或「CheXpert」为 slug 的独立词条,这两份资源以 CheXpert Plus 与 MIMIC-CXR-JPG 的形态存在;对比时按实际词条名引用,不要按论文里的数据集名去找。
6.2 区隔表:和谁像、哪里不一样
| 库内词条 | 病种范围 | 标注形态 | 与本集的关键差异 |
|---|---|---|---|
| CheXpert Plus | 十四征象 | 报告文本加标签 | 泛病种、弱监督、无框;本集单病种、强标注、有框 |
| MIMIC-CXR-JPG | 多征象 | 结构化标签加报告 | 规模大十倍但只有图像级;本集规模小、带框、带亚型 |
| PadChest | 百余种发现 | 报告映射标签 | 西班牙人群、标签来自报告;本集中国人群、标签来自金标准 |
| VinDr-CXR | 多征象 | 逐病灶框 | 同为逐病灶框,但病种十八类、无亚型分层、原始 DICOM |
| ChestX-Det10 | 十类异常 | 实例框 | 从泛病种库派生的子集,框来自报告挖掘;本集框来自医师初标复核 |
| CXRGraph | 多征象 | 实体关系图 | 标注对象是报告语义结构,不是病灶位置;两者可互补 |
| Montgomery CXR | 结核 | 图像级加肺野掩膜加共识 ROI | 一百余张、有掩膜、公有领域;本集规模大三十倍但无掩膜、许可不明 |
| Shenzhen TB CXR | 结核 | 图像级加肺野掩膜加病灶框 | 六百余张、双分类;本集多出活动性与潜伏的亚型层 |
| AI-TB-ZN | 结核 | 痰涂片显微图像二分类 | 模态不同,是显微镜图像不是胸片;可做多模态结核筛查组合 |
| ChestAgentBench | 结核与胸片推理 | 问答与推理链 | 评测基准,不是训练数据;本集可作为其底层图像来源之一 |
三句话概括区隔结论。第一,泛病种库解决「什么都能看一点」,本集解决「结核看得深」,二者是流水线上的上下游关系,不是替代关系。第二,结核家族内部,蒙哥马利与深圳两集是起点,本集是终点方向上的第一步——它把图像级标签推进到框级,把二分类推进到四分类。第三,检测类词条里,VinDr-CXR 与本集最接近,都是逐病灶框,差别在病种宽度与亚型深度:VinDr 宽而浅,本集窄而深。
本集的独占点可以压成一句:在公开可得的胸片资源里,同时具备「单一病种」「病灶框」「活动性与潜伏分层」三个属性的,目前只有它。任何两个属性都不稀缺,三个同时具备才稀缺。§4.3 的案例里那张两个框的胸片,正是这种稀缺性的最小单位——框告诉你位置,型别告诉你新旧,两者叠在一起才有临床意义。
6.3 检索路径
按需求找词条比按名字找更快。要通用胸片预训练,走 CheXpert Plus 与 MIMIC-CXR-JPG;要结核专项,走本集与 Montgomery、Shenzhen;要检测任务的对照实验,走 VinDr-CXR 与 ChestX-Det10;要报告生成与视觉语言,走 CXRGraph 与 OpenI;要评测而非训练,走 CXR-LT 与 ChestAgentBench。
反向检索也成立:如果一个项目的关键词里同时出现「结核」「病灶定位」「活动性」,那么候选集只有一个。这也是本集在库内的检索价值——它把三个分散的关键词收敛到一个 slug 上。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
看任何一份胸片数据集的评分之前,先校正一个默认假设:把「标注精细度」当成质量。精细度只是质量的一个维度,而且在单病种数据集上,精细度的提升往往以覆盖度为代价。本集就是典型:为了把框画准,它只给约八百张图配框,覆盖率不到结核样本的七成、不到全集的百分之八。如果按「标注覆盖率」打分,它会被判为不合格;如果按「标注深度」打分,它在结核领域排第一。
第二个需要校正的误判是把规模当质量。一万余张在胸片领域属于中等偏小,比它大十倍的数据集有的是。但那些大集的标签多是报告挖掘出来的弱标签,噪声率高;本集的标签有病原学金标准兜底,单位样本的信息量高出一个量级。规模与信息量不是同一件事,比较时不要混用。
第三个误判是把许可状态当技术属性忽略掉。许可不明不是文书瑕疵,它会直接阻断商用路径,也会让论文的「数据可获取性」声明变得难以措辞。这一点在 §7.3 会单独展开。
7.1 五维评分与 DAIMS 检查
按千方医数集的 DAIMS 框架,从可得性、标注完备度、结构规范性、可复现性、合规清晰度五个维度打分,再落到 24 项细查。
| 维度 | 分数 | 依据 |
|---|---|---|
| 可得性 | 4.5 / 5 | 三条公开路径,无需申请,体积可控 |
| 标注完备度 | 3.5 / 5 | 框与亚型齐全,但覆盖率低、无掩膜、无患者级标识 |
| 结构规范性 | 4.0 / 5 | 命名规范、列表清晰、XML 标准;缺少统一 schema 文档 |
| 可复现性 | 3.0 / 5 | 测试集封闭,本地无法复现榜单;两套列表易混用 |
| 合规清晰度 | 2.0 / 5 | 无标准许可证,两方标注矛盾,商用路径不明 |
| # | DAIMS 检查项 | 状态 | 说明 |
|---|---|---|---|
| 1 | 数据唯一标识 | 通过 | 文件名即主键,去标识化彻底 |
| 2 | 类别本体明确 | 通过 | 四类定义在论文中有文字界定 |
| 3 | 标签来源可溯 | 通过 | 金标准加医师标注,流程写在论文第三节 |
| 4 | 标注格式标准化 | 通过 | Pascal VOC,业界通用 |
| 5 | 划分可复现 | 通过 | 列表文件随包发布 |
| 6 | 测试集可评估 | 不通过 | 标签封闭,须在线提交 |
| 7 | 患者级去重 | 无法核验 | 官方称一图一人,无患者标识可验 |
| 8 | 时间信息 | 缺失 | 无采集日期,无法做时间漂移分析 |
| 9 | 站点信息 | 缺失 | 医院未具名,无法做站点效应校正 |
| 10 | 设备信息 | 缺失 | 无 DICOM 头,kVp 与 mAs 均不可得 |
| 11 | 像素级标注 | 缺失 | 只有框,无掩膜 |
| 12 | 阴性对照充分性 | 通过 | 一万张阴性,含五千硬负例 |
| 13 | 类别不平衡披露 | 通过 | 论文表格逐类给出计数 |
| 14 | 许可条款 | 不通过 | 无标准许可证文件 |
| 15 | 引用规范 | 通过 | 两篇论文均有 DOI |
| 16 | 文档完整性 | 部分 | README 覆盖结构,未覆盖字段语义 |
| 17 | 版本管理 | 部分 | CVPR 版与 TPAMI 版并存,无版本号 |
| 18 | 下载完整性校验 | 缺失 | 未提供校验和 |
| 19 | 预处理脚本 | 通过 | 提供 COCO 转换脚本 |
| 20 | 基线可复现 | 部分 | 代码开源,权重需另下 |
| 21 | 外部验证支持 | 通过 | 论文给出四个外部集的评测 |
| 22 | 隐私合规 | 通过 | 去标识化并经主管部门豁免 |
| 23 | 人群代表性披露 | 缺失 | 未披露年龄性别构成 |
| 24 | 失败模式披露 | 部分 | 论文报告了潜伏类检测弱,但未系统整理 |
合计十七分(满分二十四)。扣分集中在信息层与合规层,前者是采集年代与脱敏要求的必然结果,后者是可以修但作者没修的文书问题。
7.2 重叠:一个必须自己动手解决的问题
本集与蒙哥马利、深圳两集存在图像级重叠,这一点在 torchxrayvision 的文档里有明确警告:不要在其中一个上训练、在另一个上评估。原因很直接——extra 目录里就放着这两集的图,而很多人做外部验证时用的正是这两集的完整版本。
规避方法有三条。第一条最稳:任何跨集实验前,先按图像哈希去重,把 extra 目录的图从训练集中剔除。第二条:如果一定要用 extra,就把它整体划入训练,外部验证改用完全无关的数据(例如 DA、DB 或本院数据)。第三条:在论文里明确写出重叠处理方式,这比指标本身更能体现代码的严谨性。
§4.3 的案例在这里有第二重意义:那张 tb0312 的图如果同时出现在蒙哥马利集的某个子目录里,它在两个集合中的文件名不同,靠文件名去重会漏掉,必须靠感知哈希或像素级比对。
7.3 已知的、可枚举的偏差
| 偏差 | 表现 | 后果 |
|---|---|---|
| 类别不平衡 | 阳性与阴性约一比八 | 默认阈值偏高,须按场景调 |
| 亚型样本稀少 | 潜伏类训练集一百余张 | 该类检测指标方差极大,接近随机 |
| 不确定类只在测试 | 训练集零样本 | 分类分支无法输出该类 |
| 分辨率损失 | 降采样到 512 | 细纹理征象不可学 |
| 单一人群 | 中国合作医院,未具名 | 跨国泛化需外部验证 |
| 框覆盖率低 | 约八百张有框 | 纯检测训练样本不足,须强增广 |
| 阴性类无框 | 一万张无框图像 | 检测任务中作为背景,易被过采样 |
| 无时间维度 | 一图一人 | 纵向研究不可行 |
还有一类偏差不在数据里,而在使用方式上:把本集当成筛查工具的性能证明。筛查场景的患病率远低于数据集里的一比八,模型在低患病率下的阳性预测值会显著下降。任何以本集指标宣称「可用于大规模筛查」的结论,都缺少一步患病率校正。
7.4 外部验证矩阵
论文做了跨集验证:不重训直接测蒙哥马利、深圳、DA、DB 四个集,报告的分类指标优于当时的对比方法。这个结果的说服力要打个折,原因是重叠——训练时用过这四个集的部分图像,外部验证的「外」并不彻底。真正干净的外部验证应该用完全未参与训练的数据,这一点在使用本集做论文时必须自己补做。
| 验证设计 | 干净程度 | 建议 |
|---|---|---|
| 本集训练、本集测试 | 低 | 只能作为提交竞赛的内部参考 |
| 本集训练、蒙哥马利或深圳测试 | 很低 | 存在重叠,除非先按哈希去重 |
| 本集训练、本院数据测试 | 高 | 推荐,能真实反映部署效果 |
| 本集加外部集训练、第三家医院测试 | 最高 | 论文首选设计 |
7.5 它为何能持续:一个封闭测试集撑起的长期基准
在线竞赛是这份数据能活下来的主要原因。测试集标签不公开,任何人想报分数都必须走服务器,这保证了榜单上的数字来自同一套答案,也保证了数据集在论文发表多年后仍有人使用。相比之下,那些把测试标签一并放出的小型结核集,发布两年后基本只剩引用价值。
第二层原因是维护成本低。图像已固定为 512×512,标注已冻结,不需要持续追加;竞赛平台迁移过一次(从 CodaLab 到 Codabench),迁移成本远低于重新标注的成本。
第三层原因是需求侧稳定。结核筛查在资源有限地区的部署需求没有下降,任何要做结核检测的产品都需要一个公开基准来说服评审,而本集是目前唯一同时提供框与亚型的选项。
§8 生态位与历史
8.1 一条从两个小集长出来的时间线
| 时间 | 事件 | 意义 |
|---|---|---|
| 2014 | 蒙哥马利与深圳两集公开发布 | 结核胸片研究有了公共起点 |
| 2014 | DA 与 DB 两个小集发布 | 补足不同来源的结核样本 |
| 2019 | CVPR 投稿 | 提出大规模结核检测的构想 |
| 2020 | CVPR 口头报告 | 一万余张、带框、四分类的版本首次公开 |
| 2020 至 2023 | 在线竞赛运行 | 测试集封闭,形成榜单 |
| 2023 | TPAMI 长文扩展 | 补全方法、指标与跨集实验 |
| 2024 | 竞赛平台迁移 | 从 CodaLab 迁到 Codabench,服务延续 |
这条线里最值得注意的不是 2020 年的首发,而是 2014 到 2020 之间那六年的空窗。六年里结核胸片的公开数据几乎没变,研究者只能在两百张量级的数据上做实验,结论的可信度受限于样本量。本集的出现改变了这个局面,但它改变的是「有没有框」,不是「有没有更多图」——一万余张里真正的阳性只有一千二百张,比 2014 年的四个小集合起来也只多了一点。
8.2 两篇论文的分工
CVPR 版回答「能不能做」:给出数据集、给出检测基线、证明结核病灶可以被框出来。TPAMI 版回答「怎么做得更好」:提出对称注意力机制,利用胸片的左右对称先验,把分类与检测放进一个框架,同时把评价指标、跨集实验、在线竞赛补全。
对使用者的实际差别是:引用数据本身引 CVPR 版即可,引用指标与方法引 TPAMI 版。两篇的图表口径有细微差别,做对比实验时要说清用的是哪一版的数字。
8.3 社区中的实际位置
它不是那种被当作预训练底座的数据集。规模决定了它做不了自监督预训练,一千二百张阳性也撑不起大规模对比学习。它的实际位置是「专项微调集」与「评测基准」的合体:先用泛病种大库预训练,再用本集微调,最后在本集的封闭测试集上比较方法。
这个位置带来一个使用惯例:论文里报告本集指标时,必须同时说明预训练来源与输入分辨率,否则数字之间不可比。这一点在结核检测这个小领域里已经接近共识。
8.4 与新冠时期数据集的对照
2020 年前后涌现了一批新冠胸片集,规模动辄上万,多数只有图像级标签、来源混杂、许可宽松。本集与它们的对照很有说明性:同样是单病种、同样在 2020 年发布,本集选择了慢路线——少而精、带框、带亚型、测试封闭;新冠集多选择快路线——多而杂、只给标签、全部公开。两条路线的结果也相反:新冠集在疫情结束后迅速失去使用场景,本集的封闭测试集反而让它保持了长期引用。
§9 使用指引
9.1 三种角色的路径
| 角色 | 最短路径 | 需要绕开的坑 |
|---|---|---|
| 算法工程师 | 下载镜像、转 COCO、按 all_train 训练检测器 | 别用 TBX11K_ 列表训练却在 all_test 上提交 |
| 临床研究者 | 用四分类做亚型分析,重点看活动性与潜伏的混淆矩阵 | 别把潜伏类的低指标解读为模型无能,样本量是主因 |
| 教学与标注团队 | 用 XML 与列表做标注规范教学 | 别把框当成完整病灶范围,它只覆盖主要区域 |
9.2 一条最短的可用流程
从零到跑通一次训练,需要五步:取数、校验、转格式、拼记录、起训。下面这段把前四步串起来,第五步交给任意检测框架。
#-- 从 Kaggle 镜像取数到跑通一次前向,五步走完
pip install kaggle pillow torch torchvision pycocotools --quiet
kaggle datasets download -d usmanshams/tbx-11 -p /data --unzip
find /data/TBX11K/imgs -name "*.png" | wc -l
python3 make_coco.py
python3 - <<'PY'
import json, torch
coco = json.load(open("/data/TBX11K/annotations/json/tbx11k_coco.json"))
print("图像", len(coco["images"]), "框", len(coco["annotations"]))
print("每图平均框数", round(len(coco["annotations"]) / len(coco["images"]), 2))
PY
跑完之后先看每图平均框数,正常应落在一点五左右。如果接近零,说明 COCO 转换只处理了部分 XML;如果远大于二,说明框被重复计数,通常是 glob 匹配到了备份目录。
9.3 引用方式
数据引用用 CVPR 版,方法引用用 TPAMI 版。两者都要求注明 512×512 输入,否则数字不可比。
@inproceedings{liu2020rethinking,
title={Rethinking Computer-aided Tuberculosis Diagnosis},
author={Liu, Yun and Wu, Yu-Huan and Ban, Yunfeng and Wang, Huifang and Cheng, Ming-Ming},
booktitle={IEEE/CVF Conference on Computer Vision and Pattern Recognition},
pages={2646--2655},
year={2020}
}
使用本集做外部验证时,还应在方法节写明重叠处理方式。这一句往往是审稿人最先看的地方,也是区分「跑过」与「读懂」的分界线。
§10 AI 使用声明
| 项 | 说明 |
|---|---|
| 内容生成 | 正文由 AI 辅助撰写,事实以官方仓库与论文为准 |
| 事实核验 | 规模、类别、划分、标注形式逐项对照官方 README 与论文表格 |
| 未核验项 | 合作医院名单、人群年龄性别构成、单张文件体积 |
| 数字口径 | 硬数字取官方口径,概数在正文中以汉字表述 |
| 代码 | 示例代码为可运行片段,未在发布包上端到端执行 |
| 医学建议 | 不含诊断建议,任何临床决策须由执业医师作出 |
| 许可提示 | 许可状态存在分歧,商用前须取得作者书面确认 |
| 更新责任 | 官方若调整划分或补充标注,以官方页面为准 |
常见误读(避坑清单)
| 常见说法 | 实际情况 | 证据 |
|---|---|---|
| 这是国家医学图书馆发布的结核集 | 发布方是南开大学媒体计算实验室,NLM 只发布蒙哥马利与深圳两集 | 官方仓库首页署名与两篇论文作者单位 |
| 它是由四个公开结核集合并而成 | 主集来自合作医院;四个公开集只以 extra 目录形式附加 | 官方 README 写明主集规模与 extra 目录用途 |
| 有像素级的结核病灶掩膜 | 只有矩形框,掩膜一项恒为空 | 标注目录只有 xml 与 json 两类 |
| 测试集标签做了隐藏但仍可下载 | 测试标签从未发布,永久留在竞赛服务器 | 官方说明与竞赛页面 |
| 它是五分类任务 | 图像组织上是五个类目,分类评测用四类,不确定型只在测试出现且训练集为零 | 论文类别表训练列不确定型为零 |
| 框覆盖了图上所有结核病灶 | 框只覆盖支持诊断的主要区域,卫星灶常不入框 | 平均一图一点五个框,与多发结核的实际不符 |
| 缩放回原始分辨率能恢复细节 | 降采样已丢失高频信息,插值无法恢复 | 发布版统一 512×512,原图未公开 |
| 与蒙哥马利、深圳可以自由交叉验证 | 三者存在图像重叠,交叉验证会虚高 | torchxrayvision 文档的重叠警告 |
| 许可是标准的开放许可 | 仓库无许可证文件,两方标注互相矛盾 | 镜像标注未知,第三方标注两种不同协议 |
| 它可以直接用于结核筛查部署 | 数据集患病率远高于筛查场景,指标须做患病率校正 | 阳性与阴性约一比八,与真实筛查先验差距大 |
FAQ
Q1:TBX11K 到底有多少张图?
主集一万一千二百张。压缩包内另有约一千一百张来自四个公开小集的图像,放在 extra 目录,不计入主集口径。两个数字都对,区别在于是否把附加图像算进去。
Q2:为什么下载下来文件数比官方说得多?
因为 extra 目录。官方把四个公开集的留出部分一并打包,用于构建 all_ 前缀的列表。核对时先看 imgs 根目录,再看 imgs/extra。
Q3:标注是框还是分割掩膜?
全部是矩形框。格式为 Pascal VOC XML,需要时用官方脚本转成 COCO。没有掩膜,做分割任务必须自标。
Q4:怎么区分活动性结核和潜伏感染?
图像级用 Active TB 与 Latent TB 两个类名,框级用每个框自带的型别字段。图像级标签来自病原学金标准,框级型别由医师判定并与金标准核对。
Q5:为什么测试集没有标签?
官方把测试集保留为常驻在线竞赛,标签只在服务器侧。这是它维持长期基准地位的方式,也意味着本地无法复现论文分数。
Q6:能不能直接拿它做结核筛查产品?
不建议。数据集的阳性比例远高于真实筛查人群,直接套用会导致阳性预测值虚高。要用必须先做患病率校正,并在本地人群上重测阈值。
Q7:它和蒙哥马利、深圳两集是什么关系?
同病种、不同标注深度。那两集规模小但有肺野掩膜,本集规模大、带框与亚型但没有掩膜。三者图像存在重叠,交叉使用须先去重。
Q8:论文里的分数能在本地复现吗?
分类分数不能,因为测试标签封闭。检测分数也不能。本地能做的只有在训练加验证集上做交叉验证,结果与榜单不可直接比较。
Q9:许可到底能不能商用?
不确定。仓库没有许可证文件,镜像标注未知,第三方分别标注了非商用共享与署名共享两种。商用前须取得作者书面许可,不要自行推定。
Q10:一张图上有多个框时怎么处理?
每个框独立作为一条检测记录,框级型别各自保留。图像级的混合型标签只表示存在多个型别,不替代框级标签。
Q11:它的 512×512 会不会太小?
对结核的主要征象够用,对细纹理征象不够。官方建议统一用 512 以保证可比,上采样没有意义。
Q12:有没有更新的替代品?
结核领域目前没有在规模与标注深度上同时超过它的公开集。若只需要图像级分类,泛病种大库加结核子集也能凑出相近规模,但拿不到框。
术语表
| 术语 | 含义 |
|---|---|
| TBX11K | 本集官方名称,一万一千余张结核胸片的缩写式命名 |
| CXR | 胸部 X 线摄影,本集全部图像的模态 |
| 活动性结核 | 具传染性、有影像学活动病灶的结核,本集的主要阳性类 |
| 潜伏结核 | 感染未发病、通常无传染性,影像上多为陈旧痕迹 |
| 混合型 | 同一胸片上活动性与潜伏征象并存,仅五十余张 |
| 不确定型 | 现有条件下无法判型,十张全部在测试集 |
| 硬负例 | 有影像异常但非结核的样本,本集用五千张构建 |
| 边界框 | 覆盖病灶的矩形,以左上与右下坐标表示 |
| Pascal VOC | 一种以 XML 描述图像与框的标注格式 |
| COCO | 以单个 json 描述图像、框与类别的标注格式 |
| 金标准 | 病原微生物学检测结果,本集图像级标签的来源 |
| 双校 | 初标加复核的两级医师标注流程 |
| 病灶级 | 标注对象是具体病灶而非整张图像 |
| 图像级 | 标注对象是整张图像的类别 |
| 平均精度 | 检测任务的综合指标,对框位置与类别同时计分 |
| 特异度 | 阴性样本中被正确判为阴性的比例 |
| 敏感度 | 阳性样本中被正确判为阳性的比例 |
| 患病率校正 | 把数据集指标换算到真实人群先验下的步骤 |
| 数据泄漏 | 训练与测试共享样本导致指标虚高 |
| 感知哈希 | 按图像内容而非文件名判重的指纹方法 |
| extra 目录 | 存放四个公开集附加图像的目录 |
| all_ 前缀列表 | 含附加图像的扩展划分列表 |
| SymFormer | 论文提出的对称注意力基线,利用胸片左右对称先验 |
| 对称位置编码 | 在对称注意力中校准特征位置的分量 |
| 类别无关检测 | 不区分子型的检测评测方式,用于处理不确定型 |
| 在线竞赛 | 测试集标签封闭、需提交服务器换分数的评测形式 |
| Codabench | 承接本集竞赛的在线评测平台 |
| DAIMS | 千方医数集采用的数据就绪度评估框架,含二十四项细查 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 图像总数 | 11,200 | 官方仓库首页与论文类别表 | 官方 |
| 分辨率 | 512×512 | 官方仓库首页 | 官方 |
| 原始分辨率 | 约 3000×3000 | 论文数据集章节 | 论文 |
| 健康类 | 五千 | 论文类别表 | 论文 |
| 患病非结核类 | 五千 | 论文类别表 | 论文 |
| 结核总数 | 1,200 | 论文类别表 | 论文 |
| 活动性结核 | 924 | 论文类别表 | 论文 |
| 潜伏结核 | 212 | 论文类别表 | 论文 |
| 混合型 | 54 | 论文类别表 | 论文 |
| 不确定型 | 10 | 论文类别表 | 论文 |
| 训练集 | 6,600 | 官方仓库首页 | 官方 |
| 验证集 | 1,800 | 官方仓库首页 | 官方 |
| 测试集 | 2,800 | 官方仓库首页 | 官方 |
| 带框图像 | 约 800 | 官方说明与第三方重打包统计 | 官方加第三方 |
| 框总数 | 约一千二百 | 第三方重打包统计 | 第三方 |
| 压缩包体积 | 约 4.0 GB | 镜像接口返回字节数 | 第三方 |
| 附加图像 | 约 1,100 | 四个公开集规模相加 | 推算 |
| 类别数 | 四类评测,五个类目 | 官方首页与论文 | 官方 |
附录 B:数字的来源分层
| 层级 | 覆盖内容 | 可信度 |
|---|---|---|
| 官方页面 | 图像总数、分辨率、类别构成、官方划分、许可状态、下载入口 | 高,直接引用 |
| 论文正文 | 原始分辨率、标注流程、亚型定义、跨集实验结果、基线指标 | 高,需注明版本 |
| 第三方统计 | 带框图像数、框总数、压缩包体积、镜像结构 | 中,用于交叉印证 |
| 未核实 | 合作医院名单、人群年龄性别构成、单张文件大小、采集年份区间 | 低,写作时须标未披露 |
附录 C:完整参考文献
- Liu Y, Wu Y-H, Ban Y, Wang H, Cheng M-M. Rethinking Computer-aided Tuberculosis Diagnosis. CVPR 2020: 2646-2655. DOI 10.1109/CVPR42600.2020.00272
- Liu Y, Wu Y-H, Zhang S-C, Liu L, Wu M, Cheng M-M. Revisiting Computer-Aided Tuberculosis Diagnosis. IEEE TPAMI 2024, 46(4): 2316-2332. DOI 10.1109/TPAMI.2023.3330825;预印本 arXiv:2307.02848
- Jaeger S, Candemir S, Antani S, Wang Y-X, Lu P-X, Thoma G. Two public chest X-ray datasets for computer-aided screening of pulmonary diseases. Quantitative Imaging in Medicine and Surgery 2014, 4(6): 475-477
- Chauhan D, et al. Role of Gaussian filter and rib suppression in chest radiographs for tuberculosis detection. PLoS ONE 2014, 9(11): e112980
- Cohen J P, Viviano J D, Bertin P, Morrison P, Torabian P, Guarrasi V, et al. TorchXRayVision: a library of chest X-ray datasets and models. 2022
- 官方代码仓库与竞赛页面:github.com/yun-liu/Tuberculosis;codabench.org/competitions/17672
附录 D:一段可跑的评测代码
训练完之后最常做的一件事是评估。下面这段用一个极简的匹配逻辑算召回与查准,够用来判断模型有没有学到框。
#-- 按 IoU 0.5 做贪心匹配,算查准与召回
import numpy as np
def iou(a, b):
x1, y1 = max(a[0], b[0]), max(a[1], b[1])
x2, y2 = min(a[2], b[2]), min(a[3], b[3])
inter = max(0, x2 - x1) * max(0, y2 - y1)
union = (a[2] - a[0]) * (a[3] - a[1]) + (b[2] - b[0]) * (b[3] - b[1]) - inter
return inter / union if union > 0 else 0.0
def evaluate(preds, gts, thr=0.5):
tp = fp = fn = 0
for name, p in preds.items():
g = gts.get(name, [])
used = set()
for box in p:
best, idx = 0.0, -1
for j, gt in enumerate(g):
if j in used:
continue
v = iou(box, gt)
if v > best:
best, idx = v, j
if best >= thr:
used.add(idx); tp += 1
else:
fp += 1
fn += len(g) - len(used)
precision = tp / (tp + fp) if tp + fp else 0.0
recall = tp / (tp + fn) if tp + fn else 0.0
return {"precision": round(precision, 3), "recall": round(recall, 3),
"tp": tp, "fp": fp, "fn": fn}
这段代码故意没有按型别分组。实际评估要按 active、latent 分别算,否则潜伏类的低分会被活动性的高分掩盖——§4.3 的案例里那两个框,如果混在一起算,一个漏检只让总分掉两个点,看单个型别才会发现潜伏分支几乎全错。
附录 E:如果只记五件事
| # | 记住这一条 |
|---|---|
| 1 | 发布方是南开大学,不是国家医学图书馆 |
| 2 | 一万一千二百张主集,另有一千余张公开集附加图,两套列表口径不同 |
| 3 | 只有框,没有像素掩膜;框只覆盖训练与验证集的结核图 |
| 4 | 活动性与潜伏是两级标签,图像级与框级都有,这是它最稀缺的地方 |
| 5 | 测试集标签永久封闭,本地分数与榜单分数不可直接比较 |
需要更高工程化程度或合规出域的商业版本?
当前展示的公开版本适用于学术研究与原型验证。千方医数集依托三甲医院直采网络,提供经专家标注、符合伦理合规的专病数据集交易服务。
前往商城查看可交易产品 →
