只做结核的胸片集 — TBX11K 病灶框基准

11,200 张 512×512 / 四类标签 / 约 800 张带结核病灶框

来源 https://github.com/yun-liu/Tuberculosis发布时间: 2026-10-29最后更新: 2026-10-29 阅读 11
只做结核的胸片集 — TBX11K 病灶框基准

信息速览

数据集名称只做结核的胸片集 — TBX11K 病灶框基准
数据类型原始影像,人工标注,元数据
规模11,200 张胸片,官方称一图一人
接入方式https://github.com/yun-liu/Tuberculosis

结核病至今仍是全球单一传染病的头号杀手,而它的初筛手段极其廉价:一张正位胸片。廉价带来的是海量读片需求,也带来了一个持续三十年的工程问题——把「有没有结核」变成模型能学的标签容易,把「结核在哪一叶、是活动性还是陈旧潜伏」变成标签很难。后者需要放射科医师逐张画框,需要病原学结果兜底,还需要有人愿意把这两件事同时做完再公开。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:完整参考文献

  1. 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
  2. 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
  3. 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
  4. Chauhan D, et al. Role of Gaussian filter and rib suppression in chest radiographs for tuberculosis detection. PLoS ONE 2014, 9(11): e112980
  5. 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
  6. 官方代码仓库与竞赛页面: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 测试集标签永久封闭,本地分数与榜单分数不可直接比较

需要更高工程化程度或合规出域的商业版本?

当前展示的公开版本适用于学术研究与原型验证。千方医数集依托三甲医院直采网络,提供经专家标注、符合伦理合规的专病数据集交易服务。

前往商城查看可交易产品 →
返回 AI-Ready 数据集