信息速览

DDR — 糖尿病视网膜病变分级与病灶分割眼底数据集 AI-Ready Wikipedia
INFOBOX
| 数据集名称 | DDR(OIA-DDR)Diabetic Retinopathy Dataset |
| 英文全称 | OIA-DDR: A General-purpose High-quality Dataset for Diabetic Retinopathy Classification, Lesion Segmentation and Lesion Detection |
| 别名/简称 | DDR、DDR-dataset、OIA-DDR |
| 疾病分类 | 糖尿病视网膜病变(ICD-11:9B71.00 非增殖性 / 9B71.01 增殖性 / 9B71.0Z 未特指) |
| SNOMED CT | 390834004 Nonproliferative diabetic retinopathy / 154679002 Proliferative diabetic retinopathy(详见 §2.1b) |
| 数据模态 | 彩色眼底照相(45° 视野、单视野、分辨率不一) |
| AI 任务类型 | DR 严重度分级、四类病灶语义分割、四类病灶目标检测、病灶感知分类 |
| 样本总数 | 13,673 张眼底图 / 9,598 名患者(分级);757 张 DR 图像(病灶分割与检测精标) |
| 数据大小 | 约 3 GB(压缩后 zip 分 10 个 chunk) |
| 数据格式 | JPEG 眼底图 + PNG/TIFF 分割掩膜 + XML(检测包围框)+ CSV(分级标签) |
| 许可证 | MIT License(GitHub 仓库 LICENSE) |
| 访问级别 | 开放(百度网盘 / Google Drive 直链公开下载,无申请制) |
| DUO 标签 | GRU(通用研究) |
| 语言 | 元数据英文;图像内容医学多语通用 |
| 首发日期 | 2019-05-07(GitHub 首次提交) |
| 最后更新 | 2024-02-28(README 补充解压说明) |
| 发布机构 | 南开大学 NKiCS 智能计算系统研究室 & 北京上工医信 & 中国微循环学会 & 北大健康医疗大数据国家研究院 & 同仁医院眼科专家组 |
| 官方主页 | https://github.com/nkicsl/DDR-dataset |
| 下载地址 | 百度网盘(PWD: ue0t)/ Google Drive 直链(详见 §6.2) |
| DOI | 10.1016/j.ins.2019.06.011(原始论文) |
| 引用次数 | 200+(Google Scholar,截至 2026-09) |
| AI 就绪度评分 | ⭐⭐⭐⭐(4/5)— 官方划分 + 公开直链下载,病灶精标质量高;扣分项:病灶标注与分级图像跨 patch/整图使用混乱、无官方 preprocessing 脚本、掩膜 TIFF/PNG 混用 |
| 页面状态 | published |
§0 E-E-A-T 信任声明与免责声明
医学审核者:千方病案医学编辑部交叉审核:§2 医学背景(ICD-11 与 SNOMED CT 映射、DR 分级与临床任务定义、金标准描述)、§7 偏倚分析。
数据工程审核者:千方病案医学编辑部交叉审核:§4 DAIMS 数据字典(分级标签与病灶掩膜字段)、§5 数据划分策略、§6 预处理 Pipeline 和坑点。
审核日期:2026-09-05
审核方式:交叉审核
利益冲突声明:千方病案医数集与南开大学 NKiCS、北京上工医信及任何 OIA 联合机构无商业利益关联。本页面不销售 DDR 数据集本身,仅提供 AI 就绪指南与学术信息服务。编辑者未接受上述机构的任何形式资助。
医疗免责声明:本页面提供的医学信息仅供研究和教育目的,不构成医疗建议、诊断或治疗方案。数据集的医学描述基于公开发表的文献,未经逐一临床验证。任何基于该数据集训练的 AI 模型在应用于临床决策前,必须经过独立的临床验证和监管审批。
技术免责声明:本页面的代码示例、预处理建议和基准性能数据基于公开资料整理,不保证在特定环境下的准确性和适用性。使用者应自行验证代码安全性和数据预处理流程的正确性。千方病案医数集不对因使用本页面信息而导致的任何直接或间接损失承担责任。
数据使用合规:使用本页面描述的数据集前,请务必阅读并遵守数据集原始许可协议。DDR 以 MIT License 在 GitHub 公开,下载源为百度网盘与 Google Drive 直链,可免费用于研究、教学与商业用途;但请遵守机构伦理要求,不得将脱敏图像逆向关联到具体患者。DUO 标签仅供参考,具体使用限制以数据集官方协议为准。
§1 数据集概览
§1.0 📌 30 秒速览
DDR(OIA-DDR) 是南开大学计算机学院 NKiCS 智能计算系统研究室与北京上工医信等机构于 2019 年联合发布的中国大型糖尿病视网膜病变(DR)眼底数据集:13,673 张彩色眼底图像来自 9,598 名患者,覆盖全国 23 个省份的 147 家医院。它把"分级 + 病灶分割 + 病灶检测"三类任务打包进一个数据集——既是国内最大、也是最"真实医院场景"的公开眼底 DR 数据之一。
它为什么重要?在 DDR 之前,主流眼底数据集要么只有 DR 分级标签(如 EyePACS/APTOS),要么只有少量病灶精标(如 IDRiD),且都非中国人群。DDR 第一次用大规模、多中心、多设备的中国临床图像,同时给出 6 类 DR 分级和 757 张图的四病灶像素级标注,成为国内 AI+眼科研究的事实标准,也暴露出病灶分割/检测远比分级困难这一关键事实。
你可以用它来做:DR 严重度分级(ICDRSS 五级 / 加"不可分级"六级)、微动脉瘤/出血/硬渗/软渗的分割与检测、病灶感知分级、跨设备与域迁移的稳健性研究,以及筛查分诊模型的训练。想上手眼底 DR 的 AI 研究,它是性价比最高的起点之一。
§1.1 摘要
DDR 由南开大学计算机学院智能计算系统研究室(NKiCS)与北京上工医信科技有限公司等机构联合构建,2019 年 5 月在 GitHub 公开(nkicsl/DDR-dataset),同年 10 月在 Elsevier《Information Sciences》发表原始论文。团队从来自全国多中心、多机构的眼底图像库中抽取 13,673 张合格眼底图(覆盖 2016-2018 采集周期),对应 9,598 名患者,图像由 42 种不同眼底相机在 45° 视野下拍摄,分辨率不统一。每张图由 7 名训练有素的标注者按国际临床 DR 分类(ICDRSS)独立分级,争议样本由资深专家复核共识,最终形成 6 类标签:正常、轻度、中度、重度非增殖、增殖性 DR,以及第 6 类"不可分级(ungradable)"以标记图像质量不合格的样本。同时,团队另选出 757 张含 DR 的图像,由眼科专家对四类典型病灶——微动脉瘤(MA)、出血(HE)、硬渗(EX)、软渗(SE)——做像素级与包围框级双重标注,构成病灶分割与检测子集。官方将分级数据按 6,835/2,733/4,105 划分为训练/验证/测试。论文作者用 SE-BN-Inception 等模型评估,DR 分级最高准确率约 82.84%,而病灶检测 mAP 仅约 9.2,凸显病灶识别仍是开放难题。
核心数字速查表(本条目全篇据此展开,均来自可检索来源):
| 指标 | 数值 | 出处口径 |
|---|---|---|
| 分级图像 / 患者 | 13,673 / 9,598 | Li et al. 2019 摘要 |
| 医院 / 省份 | 147 / 23 | 数据来源整理 |
| 相机种类 / 视野 | 42 种 / 45° | IET 论文 |
| 采集期 | 2016-2018 | 数据来源整理 |
| 分级标注者 | 7 人 | Li et al. 2019 摘要 |
| 病灶精标图 | 757 | Li et al. 2019 摘要 |
| 病灶类别 | MA / HE / EX / SE | 官方及论文 |
| 分级官方划分 | 6,835/2,733/4,105 | 文献分布表 |
| 原作者分级 ACC | 82.84%(6 类) | Li et al. 2019 摘要 |
这一速查表帮助读者在后续小节与代码中快速对齐数字,并作为检索事实的锚点;任何与官方发布文件冲突处,以实际解压文件为准。
§1.2 战略价值分析
大规模真实临床维度:DDR 是国内首个达到万级规模的公开 DR 眼底数据集,且其多中心、多设备(42 种相机)、多散瞳状态的真实采集环境,使其比人工采集的高质量小数据集更贴近临床筛查场景。这对验证模型在光照、色彩、分辨率漂移下的鲁棒性具有不可替代价值——也是 EyePACS 式西方竞赛数据与中国真实临床读片差异之间的桥梁。
任务覆盖完整性维度:多数公开 DR 数据集只做"分级"单一任务;DDR 在同一批图像上同时提供分级标签与 757 张图的四病灶像素/包围框精标,天然支持"病灶感知分级"“先分割后分级”"检测辅助分级"等可解释 AI 路径。病灶精标与整图分级的并存,使 DDR 能承担从"黑盒分级"到"可解释病灶定位"的研究进阶,这一任务闭环在 2019 年前罕见。
不可分级(质量感知)维度:DDR 独有 8.4% 的"不可分级"图像,这一设计直指真实筛查的痛点——低质量图如何被可靠拒收、重拍或转人工。其它主流数据集(EyePACS/APTOS/IDRiD)要么剔除低质图、要么没有该标签,研究者无法在它们上训练图像质量控制模块。DDR 因此成为研究"AI 何时该说不知道"(不确定性/拒收/图像质量回归)的稀缺资源,对落地筛查系统有直接工程价值。
§1.3 同类数据集横向对比
| 数据集 | 年份 | 规模 | 模态 | DR 分级 | 病灶标注 | 差异化 |
|---|---|---|---|---|---|---|
| DDR(本条目) | 2019 | 13,673 图 / 9,598 患者 | 彩色眼底 | 6 类(ICDRSS 0-4+不可分级) | 757 张四病灶像素+包围框 | 中国多中心多设备、最大国内公开集 |
| EyePACS(Kaggle) | 2015 | 88,702 图 | 彩色眼底 | 5 类(0-4) | 无 | 西方竞赛数据、量大 |
| IDRiD | 2018 | 516 图 | 彩色眼底 | 5 级 + 病灶 | 81 张全像素精标 | 印度人群、病灶标注精细 |
| FGADR | 2020 | 2,842 图 | 彩色眼底 | 5 级 | 病灶精细标注 | 病注重标注质量 |
| ODIR-5K | 2019 | 5,000 图 | 彩色眼底 | 多疾病 8 标签 | 无 | 多病种筛查而非 DR 专病 |
| APTOS 2019 | 2019 | 3,662 图 | 彩色眼底 | 5 类(0-4) | 无 | Kaggle 竞赛、无不可分级类 |
差异化小结:DDR 以"中国真实多中心 + 万级分级 + 病灶多任务精标"组合取胜;EyePACS/APTOS 体量更大但无病灶精标、西方/竞赛人群;IDRiD/FGADR 病灶标注更精但规模小一个量级且单中心。数据来源:见 §8.4 相关数据集表引用。
§1.4 版本时间轴
| 日期 | 里程碑 | 说明 |
|---|---|---|
| 2019-05-07 | GitHub 首次提交 | nkicsl/DDR-dataset 仓库建立,OIA-DDR 公开 |
| 2019-10-01 | 原始论文发表 | Li et al., Information Sciences Vol.501, pp.511-522(DOI 10.1016/j.ins.2019.06.011) |
| 2019-11-29 | OIA 系列正式对外发布 | 南开新闻网报道 OIA-DDR 与 OIA-ODIR 向全社会公开发布 |
| 2024-02-28 | README 更新 | 补充"zip 分 10 chunk 需先合并再解压"的官方说明 |
| 持续 | 数据冻结 | 数据集主体自 2019 年发布后未再有版本更替,为单版本数据 |
§1.5 典型应用场景
- DR 筛查分级:在 6 类(或剔除不可分级后的 5 类)上训练深度分级模型,用于大规模眼底筛查分诊,识别中重度需转诊患者。
- 病灶分割与检测:利用 757 张精标图训练 MA/HE/EX/SE 的语义分割或目标检测模型,作为可解释 DR 诊断的基础模块。
- 病灶感知可解释分级:结合分割热图与全局分级,构建先定位病灶、再据病灶证据分级的双分支网络,提升决策可解释性与鲁棒性。
- 多设备/域迁移研究:利用其 42 种相机的真实异质性,研究模型在不同成像条件下的泛化,或作为预训练集迁移到 IDRiD/APTOS。
- 不可分级图像处理:针对"不可分级"类研究图像质量控制、模型不确定性估计与重拍提示,贴近真实筛查中的拒收样本。
§1.6 命名辨析与检索要点
在检索、下载与引用 DDR 时极易因同名/近义词造成混淆,需特别注意以下区分:
| 名称/易混对象 | 说明 | 如何区分 |
|---|---|---|
| DDR = OIA-DDR | 本条目数据集,官方仓库名 nkicsl/DDR-dataset | 认准 GitHub 仓库与 Li et al. 2019 论文 |
| OIA 系列 | Ophthalmic Image Analysis,南开牵头面向眼科图像分析的系列数据集总称 | DDR 与 ODIR 均为其子集 |
| OIA-ODIR / ODIR-5K | OIA 系列另一子集,多病种 8 标签筛查(10,000/5,000 图) | 任务不同(多病种 vs DR 专病),勿混用标签 |
| DIARETDB1 | 芬兰老旧眼底数据库(89 张),常被 OCR 误读为 “DDR” | 体量与来源差异巨大 |
| DRIVE/STARE | 血管分割数据集(40/400 张) | 任务是血管分割,非 DR 分级/病灶 |
| “DDR 官方全称” | 官方自述为 long-title 功能描述而非缩略展开 | 不要臆造 “Diabetic Retinopathy Detection and Related Lesion Segmentation” 这类非官方展开,官方英文标题以 GitHub 为准 |
一句话规约:无论你看到 “DDR”“OIA-DDR”“DDR-dataset”,指的都是同一个数据集,下载一律认准 nkicsl/DDR-dataset。凡是宣称"官方全称含某短语"但无 GitHub 依据的说法,都应打回核实。
§2 医学背景
§2.1 ICD-11 疾病分类编码表
| ICD-11 编码 | 中文名 | 与本数据集的关系 |
|---|---|---|
| 9B71.00 | 非增殖性糖尿病视网膜病变(NPDR) | 对应分级 1(轻度)/2(中度)/3(重度 NPDR) |
| 9B71.00 & XS5W | 轻度非增殖性 DR | 对应 DR grade 1 |
| 9B71.00 & XSOT | 中度非增殖性 DR | 对应 DR grade 2 |
| 9B71.00 & XS25 | 重度非增殖性 DR | 对应 DR grade 3 |
| 9B71.01 | 增殖性糖尿病视网膜病变(PDR) | 对应 DR grade 4 |
| 9B71.0Z | 糖尿病视网膜病变,未特指 | 分级时用于无法细分的情形 |
| 9B71.02 | 糖尿病性黄斑水肿(DME) | DDR 未单列 DME,需另源标注 |
依据 WHO ICD-11 MMS 2025-01 的 postcoordination 规则,NPDR 严重度用后组合码(&XS25 重度 / &XSOT 中度 / &XS5W 轻度)表示,且应另配糖尿病本身(5A1x)编码。
§2.1b SNOMED CT 映射表
| 标签(中文) | ICD-11 | SNOMED CT 码 | SNOMED CT 术语 |
|---|---|---|---|
| 糖尿病视网膜病变 | 9B71.0Z | 390834004(NPDR)/ 154679002(PDR) | Nonproliferative / Proliferative diabetic retinopathy |
| 非增殖性 DR(轻度/中度/重度) | 9B71.00 | 390834004 | Nonproliferative diabetic retinopathy (disorder) |
| 增殖性 DR | 9B71.01 | 154679002 | Proliferative diabetic retinopathy (disorder) |
| 微动脉瘤(病灶 MA) | — | 268220002(约,见注) | Microaneurysm of retina |
| 视网膜出血(病灶 HE) | — | 3975000 | Retinal hemorrhage |
| 渗出(硬渗 EX / 软渗 SE) | — | 276321007 / 46587004(棉絮斑) | Retinal exudate / Cotton-wool spot |
注:病灶级 SNOMED 码需以机构术语库二次核对;本表 DR 主分类码(390834004 / 154679002)已核实,病灶细节术语码供参考索引。
§2.2 疾病简介与流行病学
糖尿病视网膜病变(Diabetic Retinopathy, DR)是糖尿病最常见的微血管并发症之一,也是全球工作年龄成年人(20-64 岁)致盲的首要原因。长期高血糖损伤视网膜毛细血管,先后出现周细胞丢失、内皮屏障破坏与管腔堵塞,形成微动脉瘤、点状出血,进一步渗出脂质(硬渗)与神经纤维层梗死(软渗/棉絮斑)。当缺血缺氧加重,视网膜代偿性长出新血管,即进入增殖性 DR(PDR),新生血管脆弱易破裂出血,并可牵拉视网膜导致脱离与不可逆视力丧失。
流行病学上,DR 患病率与糖尿病病程强相关:病程 5 年内约 1/4、病程 20 年以上超过半数患者可发生不同程度 DR。国际糖尿病联盟(IDF)估计全球糖尿病患者已超 5 亿且持续增长,这意味着需要筛查的 DR 高危人群规模极其庞大。DR 早期常无症状,等到出现视力下降往往已进入需激光/抗 VEGF/手术干预的中晚期,因此"早筛查、早分级、早转诊"是控制 DR 致盲的核心策略——这也正是眼底 DR 分级 AI 的临床落脚点。
中国是全球糖尿病负担最重的国家之一,患病人数数以亿计,而专业眼底读片医生相对稀缺、城乡医疗资源不均,使"AI 辅助眼底筛查"成为国家重点关注的落地方向。DDR 的意义恰在于:它用中国真实多中心的万级数据,为验证这类 AI 在本地人群与本地设备上的表现提供了不可替代的基准,也为跨机构通用性(42 种相机)研究提供了素材。理解这一背景,才能读懂 DDR "分级 + 病灶 + 不可分级"三件套设计为何与国外数据集风格迥异——它瞄准的不是竞赛刷分,而是真实筛查工作流。
§2.3 临床任务定义
| 任务 | 输入 | 输出 | DDR 对应资源 |
|---|---|---|---|
| DR 筛查/分级 | 单张彩色眼底图 | DR 严重度等级(0-4 或含不可分级 5) | 13,673 张分级标签 |
| 病灶语义分割 | 单张彩色眼底图 | 每个病灶类别像素级掩膜 | 757 张四病灶 mask |
| 病灶目标检测 | 单张彩色眼底图 | 病灶类别 + 包围框 | 757 张 bbox 标注 |
| 病灶感知分级(组合) | 眼底图(+分割引导) | 病灶定位 + DR 等级 | 精标图 + 分级标签并存 |
DR 分级采用国际临床 DR 分类(ICDRSS/ETDRS 简化五级),其判定要点如下表,DDR 在此五级外增设第 6 类"不可分级":
| DDR Grade | ICDRSS 名称 | 眼底判定要点 | 常见病灶 | 转诊意义 |
|---|---|---|---|---|
| 0 | 无 DR | 无明显视网膜微血管病变 | — | 随访 |
| 1 | 轻度 NPDR | 仅见微动脉瘤(MA) | MA | 常规随访 |
| 2 | 中度 NPDR | 有出血/硬渗/软渗等,但无重度征象 | MA、HE、EX、SE | 密切随访 |
| 3 | 重度 NPDR | 任一象限内出血≥20 个,或 ≥2 象限静脉串珠,或 ≥1 象限 IRMA;无新生血管 | 大量 HE、IRMA、串珠 | 考虑转诊、眼底激光/抗 VEGF |
| 4 | 增殖性 PDR | 出现新生血管(视盘或视网膜),可伴玻璃体/视网膜前出血 | 新生血管、出血 | 紧急转诊治疗 |
| 5 | 不可分级 | 图像质量差(欠曝/过曝/模糊/视野不全)无法判读 | 不定 | 需重拍/人工复核 |
注意:分级"5 不可分级"在 ICDRSS 本无对应,是 DDR 面向真实筛查的图像质量层扩展。做分级模型时,是否保留该类的决策会显著改变任务难度与指标口径(详见 §5.2 与坑点 5)。
§2.3b 病灶类型医学术语表
DDR 四类病灶的病理含义与形态特征,是理解分割/检测标注语义的前提:
| 病灶 | 英文缩写 | 病理本质 | 眼底形态特征 | 相对大小/识别难度 |
|---|---|---|---|---|
| 微动脉瘤 | MA | 毛细血管局部扩张膨出 | 小而圆、边界清晰的红色小点,多位于黄斑周围 | 最小、最易漏标,<125μm 常见 |
| 出血 | HE | 毛细血管破裂出血 | 点状/片状出血,可呈火焰状或圆斑状 | 中,大小跨度大 |
| 硬渗 | EX | 血管渗漏脂质沉积 | 黄白色、边界清晰、有蜡样光泽的硬性斑块 | 中,边界相对清晰 |
| 软渗 | SE | 神经纤维层梗死(棉絮斑) | 灰白/灰黄色、边界模糊、绒毛状 | 中,边界模糊难勾画 |
理解四类病灶的形态学差异,有助于解释为何 DDR 分割/检测任务难:MA 与细小 HE 颜色接近、SE 边界模糊、EX 与 SE 在色彩上易混,加之病灶像素占比常 <0.1%,对分割网络是典型的"小目标 + 长尾 + 类间相似"三难问题(见坑点 6)。
§2.4 患者人群表
| 维度 | 数据(来源) |
|---|---|
| 采集地域 | 中国 23 个省份、147 家医院 |
| 采集时间 | 2016-2018 年 |
| 患者数 | 9,598 名 |
| 年龄范围 | 1-100 岁,平均 54.13 岁 |
| 性别分布 | 男 48.23% / 女 51.77% |
| 就医类型 | 多中心真实门诊/筛查眼底档案(非单中心随机对照) |
| 拍摄设备 | 42 种型号眼底相机,45° 视野 |
人群维度数据出处为二次文献整理(见 §10.3 引用),原始论文未逐项披露年龄/性别统计,使用时应以官方发布文件为准。
§2.5 临床价值
DDR 的临床价值在于其"真实性":它来自真实的多中心医院档案,图像质量参差、含不可分级样本、设备高度异质——恰是筛查场景的真实写照。这使得在 DDR 上表现稳健的模型,比在精挑细选的小数据集上刷高的模型更有可能在实际筛查中落地。其"分级 + 病灶定位"双轨标注又为读片医生提供可解释依据,是连接 AI 黑盒分级与循证眼底诊疗的关键资产。对于筛查转诊工作流,DDR 的"不可分级"类别提供了研究图像质量控制与 AI 拒收(abstention)的天然素材,这在其他主流 DR 数据集中常付之阙如。
§2.6 金标准描述表
| 项目 | 描述 |
|---|---|
| 分级金标准划分 | 官方 6 类分级;对应 ICDRSS 0-4 + 第 6 类不可分级 |
| 标注方式 | 7 名训练有素的标注者独立分级,意见不一致/疑难样本由资深眼科专家复核并达成共识 |
| 标注者 | 受过统一训练的分级人员 + 资深眼科专家复核 |
| 金标准性质 | 多人共识分级(含少量标注噪声),非单一临床"真值" |
| 病灶金标准 | 757 张含 DR 图,由专家做 MA/HE/EX/SE 四类病灶的像素级分割与包围框检测标注 |
§3 数据集规格
§3.0 版本抉择矩阵
| 你的需求 | 推荐用集 | 大小/标注 | 理由 |
|---|---|---|---|
| DR 五级/六级分级基准 | 官方 DR_grading train/val/test | 13,673 图分级标签 | 官方固定划分,论文与社区可比 |
| 病灶分割(语义) | 病灶子集 train/val/test | 约 757 张四病灶 mask | 唯一有像素级病灶标注的部分 |
| 病灶检测 | 病灶子集 bbox 标注 | 757 张 XML bbox | 需自行将 XML 转 YOLO 等格式 |
| 多设备鲁棒性/域迁移 | DR_grading 全量 | 13,673 图(42 相机) | 需按设备/来源自行分组,官方无设备字段 |
| 病灶感知分级 | 精标子集 + 全量分级 | 精标图均有分级标签 | 可做分割引导分级的联合建模 |
DDR 为单版本数据集(2019 初始发布至今无迭代版本),§3.0 矩阵针对的是"同一个数据集内部按子集选用"的策略抉择,而非版本切换。
提醒:分级与病灶精标虽是同一数据体系,但精标覆盖仅约 5.5% 的图像(757/13,673)。若你的研究目标是从分级全集中做病灶定位,需注意 DDR 只在 757 张上给了病灶真相,其余 12,916 张并无病灶标签——这决定了"病灶级任务"的统计边界与结论适用面(详见 §4.5)。
§3.1 模态详情
DDR 全部为单视野彩色眼底照相(color fundus photography):以 45° 视野拍摄后极部(含黄斑、视盘与主要视网膜血管弓),是 DR 筛查的标准成像模态。图像覆盖范围、分辨率与色彩在不同医院/相机间差异明显(官方未统一 resize),部分图像为散瞳拍摄、部分为免散瞳,成像质量从可判读到不可判读均有分布。病灶分割与检测的输入与分级一致,均为同源彩色眼底图。
| 模态属性 | 说明 |
|---|---|
| 成像类型 | 彩色眼底照相(RGB) |
| 视野 | 45° 单视野(后极部) |
| 设备 | 42 种眼底相机型号 |
| 分辨率 | 各来源不一(无统一分辨率) |
| 散瞳 | 混合(部分散瞳 / 部分免散瞳) |
| 图像格式 | JPEG(分级);分割需原图与掩膜对齐 |
任务间模态一致性与"病灶-分级同源"提示:病灶精标 757 张图与 13,673 张分级全集是同一采集体系下的同源眼底图,但官方并不保证"病灶精标图全部带分级标签"或"分级标签覆盖全部精标图"。做"病灶感知分级"前,务必对精标图逐一反查是否存在 grade 标签(用 §4.7 的一致性脚本),再决定是否过滤只保留"既有病灶 mask 又有 grade"的样本。同理,病灶检测 XML 与分割掩膜是否覆盖同一批图、是否逐类一一对应,也需实测确认,不能默认三套标注天然对齐。
§3.2 按子集样本数表
| 子集 | 用途 | 图像数 |
|---|---|---|
| DR_grading / train | 分级训练 | 6,835 |
| DR_grading / valid | 分级验证 | 2,733 |
| DR_grading / test | 分级测试 | 4,105 |
| 分级合计 | — | 13,673 |
| 病灶精标子集 | 分割/检测 | 757 张(train/val/test 官方划分,不同文献记载不一,见坑点 3) |
§3.3 格式表
| 数据 | 文件格式 | 说明 |
|---|---|---|
| 眼底分级图 | .jpg | 时间戳命名(如 20170413102628830.jpg) |
| 分级标签 | .csv(image_id, diagnosis) | 每行一张图的等级 0-5 |
| 病灶分割掩膜 | .png(后期)/ .tiff(早期) | 每类病灶一张掩膜,缺失类为全零 |
| 病灶检测标注 | .xml(VOC 风格) | class 名 ex/he/ma/se + bndbox 坐标 |
| 整体压缩包 | .zip(分 10 chunk) | 需先 cat 合并再 unzip |
§3.4 存储大小
压缩后 zip 约 3 GB(分 10 个 chunk);解压后含 JPEG 原图、分割 PNG/TIFF 掩膜与 XML/CSV 标注。建议预留约 6-8 GB 磁盘(含中间产物),病灶分割训练若生成叠加多通道 mask 需额外空间。单一分级任务仅需 DR_grading 目录与 CSV,约占用较小。
| 资源 | 预估大小 | 说明 |
|---|---|---|
| zip 压缩包(10 分卷) | 约 3 GB | 下载所需 |
| DR_grading 全量 JPEG | 约 2-3 GB | 13,673 张原图 |
| 病灶掩膜(PNG/TIFF) | 数百 MB-1 GB | 757 张 × 多类 |
| 检测 XML + 分级 CSV | 极小(<10 MB) | 标注文本 |
| 训练缓存/增广 | 视设置 | resize+增强后大增 |
分卷合并与解压需双倍瞬时空间(合并 zip + 解压产物),建议下载盘与解压盘预留 ≥10 GB 余量;跨国下载分卷建议边下载边对分卷做完整性校验(见 §6.2b)。
§3.5 标注方式
分级标签为人工多人标注:7 名受过统一训练的分级人员按国际临床 DR 分类对每张图独立判读,最终等级综合多人意见并经专家复核共识产生——这意味着标签携带一定的"多人投票"性质,极少数疑难样本可能存在主观分歧。病灶分割与检测为人工精细标注:由专家在 757 张含 DR 图上逐病灶描绘像素级轮廓(并给出包围框),标注过程延续数月、跨多个标注阶段(早期用 TIFF、后期转 PNG),反映了真实长周期标注工程中工作流演进的痕迹。
§3.6 标注者资质与一致性
分级标注者为"受过训练的分级人员",其判定以 ICDRSS 规则为准绳,最终由资深眼科专家复核;病灶标注面向 MA/HE/EX/SE 四类,病灶外观在专家间的一致性通常良好但细小微动脉瘤仍存在漏标/边界分歧。官方未公布每样本的逐人标注记录或 Krippendorff/κ 一致性系数,因此研究者无法直接量化标注者间差异——这构成一项已知局限(见坑点 5)。
§3.7 采集周期
图像来自 2016-2018 年(3 年内)多中心真实采集,配合 2019 年发布。数据为回顾性抽取,非前瞻性流行病学设计。
§3.8 地域覆盖
覆盖中国 23 个省份、147 家医院(部分中文宣传口径称源自更大范围眼底库,但可下载数据标注来源为 147 家医院)。这一地理广度使 DDR 具有跨南北地域、城乡差异的多样性,但仍是"中国单一人种居主导"的分布,跨种族泛化需谨慎。
§3.9 设备规格
42 种眼底相机、45° 视野、多分辨率、混合散瞳状态。设备多样性是其鲁棒性研究的财富,但也带来色温/亮度/清晰度的高度漂移。官方未提供逐图像所属相机型号的元数据字段,研究者无法直接做"按设备分组消融",这是深度溯源链上的一个断点。
§3.10 深度溯源链
| 环节 | 状态 | 说明 |
|---|---|---|
| 采集来源 | ✅ 已知 | 147 家医院 / 23 省,2016-2018 |
| 脱敏环节 | ✅ 已做 | 发布前去除患者可识别信息(desensitized) |
| 相机/散瞳元数据 | ❌ 缺失 | 逐图设备型号、散瞳与否未随数据提供 |
| 逐样本标注者记录 | ❌ 缺失 | 未见逐人标注/一致性系数文件 |
| 伦理审批记录 | ⚠️ 有限 | 公开文件未附带详尽的 IRB 审批文本 |
| 精确病灶实例计数 | ⚠️ 部分 | 官方未给出逐类病灶总实例数,社区二次统计口径不一 |
§3.11 拍摄质量与散瞳差异对建模的影响
DDR 图像质量受三类因素主导,理解它们对预处理与模型设计至关重要:
| 因素 | 表现 | 对 AI 的影响 | 处理建议 |
|---|---|---|---|
| 光照/曝光 | 欠曝偏暗或过曝泛白 | 病灶对比度下降,小病灶更难检出 | 曝光归一化、CLAHE、亮度增强 |
| 色温漂移 | 不同相机偏黄/偏红/偏冷 | 色彩特征不可靠 | HSV 抖动、色域归一化 |
| 清晰度/散瞳 | 免散瞳成像偏模糊、景深浅 | 边界清晰度低,分割 Dice 下降 | 适度锐化、避免过度下采样 |
| 视野裁剪 | 部分图只拍到部分后极部 | 病灶遗漏/视野外不可见 | 全视野训练需自检覆盖 |
官方对"图像必须清晰、曝光适当、覆盖关键结构(黄斑+视盘)“有采集标准,但发布包内仍存在质量梯度,其中约 8.4%(1,151 张)被判为"不可分级”——正是采集标准的"质量下限"体现。建议在训练/评测时对亮度与清晰度做直方图分桶,识别模型易崩的图像子群(见坑点 7)。
§4 数据结构
§4.0 目录树(解压后预览)
DDR/
├── DR_grading.csv # 分级标签:image_id, diagnosis(0-5)
├── DR_grading/ # 分级图像全集
│ ├── train/ # 6,835 张
│ │ └── 20170413102628830.jpg
│ ├── valid/ # 2,733 张
│ │ └── ...
│ └── test/ # 4,105 张
│ └── ...
├── lesion_segmentation/ # 病灶像素级分割子集(社区常见拆分)
│ ├── train/{images, masks}
│ ├── valid/{images, masks}
│ └── test/{images, masks}
└── lesion_detection/ # 病灶检测包围框子集(XML)
├── train/*.xml
├── valid/*.xml
└── test/*.xml
说明:以上为社区实践中最常见的组织形态。官方压缩包内的 lesion_segmentation / lesion_detection 顶层目录名与拆分细节,请以实际下载解压后的官方结构为准(不同镜像/二次整理版本略有出入)。分级图与病灶精标图同源,但精标子集图可跨 train/valid/test 归属,切勿在跨任务评估时重复使用同图(见坑点 4)。
§4.1 DAIMS 字段字典(核心表)
| 字段名 | 类型 | 说明 | 示例值 | AI 用途 | 观测误差 | 信息性缺失编码 | 取值范围 |
|---|---|---|---|---|---|---|---|
| image_id | Text | 眼底图文件名(时间戳) | 20170413102628830.jpg | 主键/图匹配 | 低 | 无 | 唯一名 |
| diagnosis | Integer | DR 严重度等级 | 2 | 分级标签/监督目标 | 多人共识引入主观噪声 | 不可分级记 5,不缺失 | 0-5 |
| grade_set | Text | 训练/验证/测试归属 | train | 划分 | 低 | 无 | train/valid/test |
| lesion_class | Text | 病灶类别 | ma | 分割/检测类别 | 专家勾画主观差异 | 某图无该类病灶=掩膜全零 | ex/he/ma/se |
| mask_png/tiff | Image | 单类病灶像素掩膜 | (0/1 掩膜) | 分割监督 | 边界勾画误差 | 全零=无该病灶 | |
| bbox (xmin/ymin/xmax/ymax) | Integer | 病灶包围框 | 120,340,380,410 | 检测监督 | 框定位误差 | 无该病灶则无框 | 图内坐标 |
| age / sex(未随附) | — | 患者年龄/性别 | — | 分层分析 | 官方未随附 | 缺失 | — |
| device(未随附) | — | 相机型号 | — | 设备消融 | 官方未随附 | 缺失 | — |
§4.2 标签分布
DDR 分级标签(官方 train/val/test 合计)极度不平衡:
| Grade | 类别 | train | valid | test | 合计 | 占比 |
|---|---|---|---|---|---|---|
| 0 | 无 DR(正常) | 3,133 | 1,253 | 1,880 | 6,266 | 45.8% |
| 1 | 轻度 NPDR | 315 | 126 | 189 | 630 | 4.6% |
| 2 | 中度 NPDR | 2,238 | 895 | 1,344 | 4,477 | 32.7% |
| 3 | 重度 NPDR | 118 | 47 | 71 | 236 | 1.7% |
| 4 | 增殖性 PDR | 456 | 182 | 275 | 913 | 6.7% |
| 5 | 不可分级 | 575 | 230 | 346 | 1,151 | 8.4% |
| 合计 | — | 6,835 | 2,733 | 4,105 | 13,673 | 100% |
病灶像素级类别极端失衡:文献记载背景类像素约 8.66 亿,而最小病灶类(软渗)仅约 21.7 万像素——病灶像素占比常 <0.1%,分割任务需针对长尾做损失设计。
分布解读与建模含义:
- 正常(0) 与中度(2) 合计占 78.5%,轻/重/增殖三类合计不足 13%,是典型的"中部隆起 + 两端稀疏"分布——多数算法学得最稳的是 0 与 2,真正易错的恰是临床上最需要区分的 3(重度)与 4(增殖)。
- 中度(2) 独大意味着即使模型只会把多数样本判为 2 也能有较高 ACC,因此分级务必以 QWK 为准、并单列 3/4 类召回。
- 不可分级(5) 占 8.4% 与真实筛查拒收率量级吻合,研究图像质量模块时是稀缺正样本。
- 病灶端背景远大于前景,若不做类别加权/patch 训练,模型普遍退化为"全背景"——分割必须用 PRAUC 佐证 Dice(见坑点 6)。
§4.3 关键统计
- 图像总数 13,673;患者 9,598;平均每患者约 1.4 张(部分患者多张)。
- 不可分级 1,151 张(8.4%),是理解"真实筛查拒收率"的重要统计。
- 病灶精标 757 张中:MA 出现在 570 张、HE 601 张、EX 486 张、SE 239 张(不同文献统计略有出入)。
- DR 阳性(grade≥1 且可分级)合计 = 630+4,477+236+913 = 6,256 张,与正常 6,266 张大致对半,但按严重度看分布严重偏斜(中度独大)。
§4.4 数据层级
层级为 患者 → 眼底检查(单张)→(病灶掩膜/包围框)。DDR 不含多视野、序列或像素级血管/视盘金标准,属于"单图单标签"扁平结构,但在病灶任务上叠加了"每图 → 4 张类掩膜(分割)"或"每图 → 若干包围框(检测)"的子结构。官方未提供患者→图像的显式分组文件,多张同患者图需靠文件名时间戳近似推断,跨患者级泄漏的控制受限(见坑点 4)。
§4.5 缺失值与信息性缺失编码
| 场景 | 处理方式 | 说明 |
|---|---|---|
| 图像不可判读 | 打标 grade=5(不可分级) | 信息性:quality 差本身是标签而非缺失 |
| 某图无某类病灶 | 该病灶掩膜全零 / 无对应 bbox | 全零掩膜即"负例"编码 |
| 病灶精标仅限 757 张 | 其余 12,916 张无病灶标签 | 结构性缺失:非随机,仅含 DR 图有病灶精标 |
| 患者年龄/性别 | 官方未随附 | 缺元数据而非缺编码 |
| 相机/散瞳元数据 | 未提供 | 缺元数据,无法做设备分层 |
§4.6 病灶掩膜与检测标注的读取语义
理解病灶标注的"逐图存法"是正确加载监督信号的前提,不同镜像/阶段的组织略有差异,务必以实测为准:
| 标注形态 | 常见组织 | 语义 | 易错点 |
|---|---|---|---|
| 分割掩膜(单类单文件) | masks/<id>_<cls>.png 或 tiff |
每图按类分文件,某类缺席时缺文件或全零 | 缺文件 ≠ 无该病灶?需确认;全零即负例 |
| 分割掩膜(多通道堆叠) | 社区常重排为 4 通道二值堆叠 | 每通道一类病灶 | 通道序/颜色空间需与预训练对齐(BGR vs RGB) |
| 检测包围框 | lesion_detection/*.xml | VOC 风格:<name>ex/he/ma/se</name> + bndbox |
类名小写缩写,需映射成 0-3 |
| 类坐标 | XML 中 xmin/ymin/xmax/ymax 整数像素 | 相对原图尺寸 | resize 后必须等比换算坐标 |
读取检测标注时注意:XML 的 <name> 使用小写缩写(ex/he/ma/se),与分割掩膜的类名大小写/排序可能不同,构建统一 label→index 映射时务必核对;若需转 YOLO/COCO,先确认图像原尺寸与 XML 坐标是否同源(见坑点 8 与 §6.7 代码)。
§4.7 分级 CSV 与目录的一致性校验流程
因官方对标签文件说明有限,强烈建议在训练前完成一次标签-图像一致性自检:
- 读取官方/社区 CSV 得到
{image_id: grade}字典; - 列出
DR_grading/{train,valid,test}三目录内的实际.jpg文件名集合; - 校验:① CSV 的每个 image_id 都能在三目录之一找到;② 每张实际图像在 CSV 中都有标签;③ 三者交集外的条目(孤儿 CSV 行 / 无标签图)单独列出人工裁决;
- 将过滤后的标签字典固化为
grade_map.json供 DataLoader 使用,并把文件哈希入库,避免下次重跑重复排查。
一个可靠的一致性断言示例:
import os, glob, json
def build_map(csv_path, split_dirs, out_json):
import csv
raw = {}
with open(csv_path) as f:
for r in csv.DictReader(f):
raw[r["image_id"]] = int(r["diagnosis"])
seen = set()
for d in split_dirs:
for p in glob.glob(os.path.join(d, "*.jpg")):
seen.add(os.path.basename(p))
valid = {k: v for k, v in raw.items() if k in seen}
missing_label = seen - set(raw) # 有图无标签
orphan = set(raw) - seen # 有标签无图
print("图-标签均匹配:", len(valid), "| 无标签图:", len(missing_label),
"| 孤儿标签:", len(orphan))
json.dump(valid, open(out_json, "w"))
return valid
这一步几乎能一次性规避"标签错位"类复现事故,是 DDR 上手最值得投入的 10 分钟。
§5 划分与使用建议
§5.1 官方划分
分级任务官方固定划分 train 6,835 / valid 2,733 / test 4,105,比例约 50/20/30。此划分在原始论文与后续绝大多数 DDR 分级论文中被直接沿用,是社区可比基准的事实标准。病灶精标(757 张)在官方压缩包内亦按 train/valid/test 拆分,但不同论文记载的病灶拆分数字不一致(如有的记训练 606 / 测试 149,有的记 384/150/226),这可能源于社区对官方 lesion 目录的二次整理,使用前务必以自己解压实测为准,并在论文中写明自己实际使用的病灶划分。
§5.2 社区惯例划分
社区常见两种分级策略:① 直接做官方 6 类(含不可分级),用于研究图像质量与分级联合建模;② 剔除 grade=5 后做 ICDRSS 5 类(train 6,320 / valid 2,503 / test 3,759),这是多数 DR 分级基准论文的默认做法。病灶分割社区通常将 757 张按图像级互斥拆成三份(避免同图泄漏),并统一转 PNG。
§5.3 泄漏风险
- 同患者多张图跨划分:官方未给患者级分组,若一张患者的左/右眼或重复拍摄图落入 train 而另一张落入 test,会高估泛化。缓解:按文件名时间戳前缀近似归并,或接受该风险并在论文 limitations 声明。
- 跨任务重复用图:精标 757 张与分级全集同源。若你把分级 train 也用于分割训练、又在分级 test 上评测"病灶感知分级",可能隐性重复利用。缓解:分割与分级各用各自官方划分,不混。
- 二次镜像/增广的污染:HuggingFace/Kaggle 上的二次加工版(如已裁黑边、已 resize、已增强)与官方原图可能不一致;用它训练再在官方 test 评测会因分辨率/预处理不匹配而失真。
§5.4 交叉验证建议
分级类别高度不平衡,建议用**分层 K 折(Stratified K-Fold,K=5)**而非随机 K 折,确保稀有类(grade 3 重度 NPDR 仅 236 张)在每折中按比例出现。分割任务因样本仅 757 张且病灶像素稀少,宜用图级互斥的分层折并在折内报告病灶级 Dice/PRAUC,避免小样本折内方差掩盖结论。
§5.5 外部验证建议
在 DDR 上得到的结论应在独立数据集上复核:分级可外推验证到 APTOS 2019 / EyePACS / Messidor-2(尤其验证"多设备鲁棒性"声明);病灶分割可外推验证到 IDRiD(同为四病灶、但印度人群)与 FGADR。建议在论文中同时报告"训练集(DDR)内部"与"外部迁移"两类指标,标注相对变化,避免仅以内测数字宣称泛化。
§5.6 计算预算与复现策略
| 目标 | 建议投入 | 说明 |
|---|---|---|
| 快速验证想法(分级) | 官方 train 抽 5-10% 做 2-4 小时快速训练 | 先跑通 pipeline,再上全量 |
| 完整复现基线 | 全量 6,835 train,单卡 RTX 级别 1-2 天 | 用官方划分,固定 seed 上报 QWK/ACC |
| 病灶分割起步 | 先用病灶 patch(围绕含病灶区域裁剪)小训 | 全图小病灶分割收敛慢,先 patch 验证 |
| 严格发表级 | 记录随机种子、固定预处理哈希、复核划分 | 与 §6.10 MLOps 结合,做到他人可复现 |
复现自检三问:① 我的 train/val/test 图是否完全互斥?② 病灶掩膜/bbox 是否与原图精确对齐(尺寸、坐标、通道序)?③ 是否记录并上报"剔除 ungradable 与否 + 病灶划分计数"?三问皆 yes,复现风险已大幅下降。
§6 AI 就绪指南
本章节提供从下载到训练的完整可运行路径。所有代码基于 Python 3.9+ / PyTorch 2.x,请在理解目录结构后按需裁剪。官方未提供预处理脚本,以下为社区验证的通用做法。
§6.1 快速上手(5 分钟)
# ============================================================
# 预期目录结构(解压 + 合并后):
# <data_root>/DDR/DR_grading/{train,valid,test}/*.jpg
# <data_root>/DDR/DR_grading.csv # 若官方 CSV 在仓库内
# <data_root>/DDR/lesion_segmentation/{train,valid,test}/{images,masks}
# <data_root>/DDR/lesion_detection/{train,valid,test}/*.xml
# 本示例走"最小可用子集":仅用 DR_grading 分级做 5 类(剔除不可分级)。
# data_root 需指向 DDR 解压根目录,代码以 {data_root}/DR_grading 为准。
# ============================================================
import os, csv, glob
from PIL import Image
data_root = "DDR" # 改成你的解压根目录
split_dir = os.path.join(data_root, "DR_grading", "train")
print("train jpg 数:", len(glob.glob(os.path.join(split_dir, "*.jpg"))))
print("样例文件名:", os.path.basename(glob.glob(os.path.join(split_dir, "*.jpg"))[0]))
输出会显示 train 约 6,835 张与形如 20170413102628830.jpg 的时间戳文件名,验证路径正确。
§6.2 数据获取
DDR 为开放直链下载,无需申请审核:
| 源 | 链接/口令 | 说明 |
|---|---|---|
| GitHub 仓库(主页) | https://github.com/nkicsl/DDR-dataset | 官方信息与引用入口 |
| 百度网盘 | 见仓库 README(PWD: ue0t) | 中国大陆用户首选 |
| Google Drive | 见仓库 README 直链 | 海外用户 |
下载到的是一个被拆成 10 个 chunk 的 zip,必须先合并再解压(官方明确说明):
cd 下载目录
cat DDR-dataset.zip.0* > DDR-dataset.zip # 合并 10 个分卷
unzip DDR-dataset.zip # 解压(约 3GB 压缩,需若干 GB 磁盘)
坑:直接对单个 chunk 解压会报"损坏/中央目录错误",必须先用
cat合并。这是 DDR 新手最常见的第一个坎。
推荐下载与校验流程(逐步):
| 步骤 | 操作 | 说明/坑 |
|---|---|---|
| 1 | 从 GitHub README 取最新百度网盘口令或 Google Drive 直链 | 口令偶有失效,留意仓库 README 更新 |
| 2 | 下载 10 个分卷到同一目录 | 分卷名需连续(.00~.09 或 0*) |
| 3 | cat DDR-dataset.zip.0* > DDR-dataset.zip 合并 |
分卷序错误会静默出错,建议按名排序后合并 |
| 4 | `unzip -l DDR-dataset.zip | head` 先试列 |
| 5 | 解压并 `find . -name “*.jpg” | wc -l` 抽查 |
| 6 | 记录目录树与标签 CSV 哈希 | 供 §4.7 一致性与 MLOps 复用 |
国内网络下载 Google Drive 大文件常需代理/分段工具;百度网盘非会员限速时可考虑官方直链替代。下载完成后务必做步骤 5 的图像总数抽查,DDR 分卷在跨国下载中易缺失,解压后"缺图"是最隐蔽的坑之一。
§6.3 预处理全流程
分级与病灶任务建议分开预处理。
# 分级 5 类预处理:剔除不可分级、构造标签映射、可选裁黑边
import os, csv
from PIL import Image
grade_map = {0:0, 1:1, 2:2, 3:3, 4:4, 5:-1} # 5=不可分级丢弃
rows = []
# 若使用官方 CSV:列 image_id, diagnosis
# 若官方 CSV 缺失,可按目录 + 众包 label 自行构建(见坑点 2)
# 这里演示从官方/社区 CSV 读取
def build_label_csv(img_dir, out_csv):
with open(out_csv, "w") as f:
w = csv.writer(f)
w.writerow(["image_id", "diagnosis"])
for jpg in os.listdir(img_dir):
w.writerow([jpg, 0]) # 占位,实际替换为你已验证的官方标签
病灶分割预处理:统一所有掩膜为 PNG、resize 到同一分辨率并与原图对齐,缺失类掩膜补全零:
import os
from PIL import Image
# seg 目录结构假设:images/<id>.jpg 与 masks/<id>_<cls>.png
classes = ["ma", "he", "ex", "se"]
def prep_mask(mask_dir, cls, size=(512,512)):
p = os.path.join(mask_dir, f"{cls}.png")
if not os.path.exists(p): # 该图无此类病灶
return Image.new("L", size, 0) # 全零掩膜
m = Image.open(p).convert("L").resize(size)
return m
黑边(border)处理说明:DDR 眼底图通常含圆形视网膜成像外围的黑色/暗色背景区域。保留黑边会让背景像素占比更高、加剧病灶长尾;裁剪黑边则可能改变图像有效视野与病灶相对坐标。建议统一策略并全程一致(训练/验证/测试同用)——多数社区做法是裁掉非视网膜黑边后 resize,或直接 resize 保留黑边。若做检测/分割,裁剪黑边后必须同步换算掩膜与 bbox 坐标(见坑点 8),切忌"原图裁边但标注没跟着裁"。
§6.4 PyTorch DataLoader 完整示例
# 分级 5 类 DataLoader(含 transform + 实例化),可直接运行
import os, glob
import torch
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms
from PIL import Image
CLASSES = ["no_dr", "mild", "moderate", "severe", "pdr"] # 剔除 ungradable
class DDRGrade(Dataset):
def __init__(self, root, split="train", grade_map=None, transform=None):
# grade_map: {filename: 0..4},来源为官方/社区标签(剔除 5)
self.files = sorted(glob.glob(os.path.join(root, "DR_grading", split, "*.jpg")))
assert grade_map is not None
self.grade_map = grade_map
self.transform = transform
def __len__(self):
return len(self.files)
def __getitem__(self, i):
path = self.files[i]
name = os.path.basename(path)
img = Image.open(path).convert("RGB")
label = self.grade_map[name]
if self.transform:
img = self.transform(img)
return img, torch.tensor(label, dtype=torch.long)
tf = transforms.Compose([
transforms.Resize((512, 512)),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)),
])
# grade_map 需来自你已验证的标签文件;此处以空字典占位,切勿直接运行未填充版
grade_map = {}
dataset = DDRGrade(root="DDR", split="train", grade_map=grade_map, transform=tf)
loader = DataLoader(dataset, batch_size=32, shuffle=True, num_workers=4)
print("batch 数:", len(loader))
关键:DDR 官方将分类标签放在哪一文件、文件名如何对应目录,仓库 README 语焉不详,社区普遍依赖 GitHub issue / 二次整理的
DR_grading.csv(含 image_id 与 diagnosis 两列)。上手第一件事就是核对标签与图像的一一对应,否则 DataLoader 会静默错配。
§6.4b 病灶检测:VOC XML → YOLO 格式转换
检测标注为 VOC 风格 XML(<object><name>ex</name><bndbox>...</bndbox></object>),主流检测框架多用 YOLO 归一化 txt 或 COCO JSON。以 YOLO txt 为例,转换要点是把像素坐标除以图像宽高归一化,且先定位同文件名图像在 train/valid/test 的归属目录再转:
import os, glob, xml.etree.ElementTree as ET
# 类名小写缩写 → 0-3 索引(务必与官方一致)
class_map = {"ex": 0, "he": 1, "ma": 2, "se": 3}
def find_img_path(img_name, grading_dirs):
for d in grading_dirs:
p = os.path.join(d, img_name)
if os.path.exists(p):
return p
return None
def xml_to_yolo_txt(xml_path, img_dir_dirs):
# 解析 XML,返回 (img_name, w, h, list[(cls, xc, yc, bw, bh)])
tree = ET.parse(xml_path)
root = tree.getroot()
img_name = root.findtext("filename") or (os.path.basename(xml_path)[:-4] + ".jpg")
img_path = find_img_path(img_name, img_dir_dirs)
if img_path is None:
raise FileNotFoundError(f"找不到 {img_name},请核对 lesion_detection 与 DR_grading 是否同图")
# 用 PIL 取真实宽高,而非假设
from PIL import Image
W, H = Image.open(img_path).size
lines = []
for obj in root.findall("object"):
name = obj.findtext("name").lower()
b = obj.find("bndbox")
xmin = int(float(b.findtext("xmin"))); ymin = int(float(b.findtext("ymin")))
xmax = int(float(b.findtext("xmax"))); ymax = int(float(b.findtext("ymax")))
xc = ((xmin + xmax) / 2.0) / W
yc = ((ymin + ymax) / 2.0) / H
bw = (xmax - xmin) / W
bh = (ymax - ymin) / H
lines.append(f"{class_map[name]} {xc:.6f} {yc:.6f} {bw:.6f} {bh:.6f}")
return img_path, lines
# 用法:遍历 lesion_detection/{train,valid,test}/*.xml 并写同名 .txt
# 核心提醒:图像真实宽高应从文件读取,resize 后需用同一缩放系数回写坐标
这段代码同时演示了坑点 4 与坑点 8 的落地解法:按真实文件尺寸归一化坐标、找不到图立即报错,避免静默错配。
§6.5 八大坑点
⚠️ 坑点 1:zip 分 10 个 chunk,不解压会怀疑人生(分类:工程陷阱)
问题:DDR 下载包是被切成 10 段的 zip(
DDR-dataset.zip.00~.09),直接双击或unzip单个文件会报"中央目录损坏/不支持的压缩方法"。
症状:解压报错、文件截断、图像打不开、以为官方数据损坏。
解决:
- 简单方法:按官方说明
cat DDR-dataset.zip.0* > DDR-dataset.zip先合并成一个完整 zip 再unzip,即可正常解压。- 进阶方法:写脚本校验合并后哈希(
sha256sum)并与官方/镜像对比,防止下载分卷残缺。- SOTA 方法:在大内存环境用
bsdtar/7z 直接流式读分卷,或边下边用curl --range续传,避免重复整包下载。
参考:nkicsl/DDR-dataset README(官方解压说明)
⚠️ 坑点 2:标签文件与图像的对应关系要靠自己核对(分类:工程陷阱 / 标签理解)
问题:GitHub README 只给了论文引用,没有给清晰的"哪张图属于哪个等级"的随包表格使用说明;官方把标签放在数据包内但命名与 CSV 结构未经详尽文档化。
症状:DataLoader 训练时 label 与图像错位、精度异常低、不同人复现结果天差地别。
解决:
- 简单方法:以官方压缩包内自带的标签 CSV(image_id, diagnosis)为唯一真源,用文件名精确 join,绝不靠目录顺序猜。
- 进阶方法:先做 20 张人工抽查(对比 CSV 等级与图像病灶视觉严重度),确认读取逻辑无系统偏移后再全量训练。
- SOTA 方法:编写可复现的标签解析脚本并开源,比对 Kaggle/HuggingFace 二次版标签 diff,交叉验证官方 CSV 是否有社区已报告的行级纠错。
参考:DDR Kaggle 二次整理版(含 DR_grading.csv 样例)
⚠️ 坑点 3:病灶子集官方拆分口径不一,数字互相打架(分类:标签理解 / 工程陷阱)
问题:757 张病灶精标图在 train/val/test 的划分,不同论文/平台记载不一致(如"train 606 / test 149"vs"train 384 / valid 150 / test 226"),官方 README 未给权威数字。
症状:你跑出来的分割/检测分数无法与他人直接比较,社区复现出现系统性偏差。
解决:
- 简单方法:以自己解压后
ls实测得到的目录计数为准,并在论文实验节写明"本实验使用官方压缩包实测划分 train/val/test = X/Y/Z"。- 进阶方法:统一用官方 lesion 目录自带的 train/valid/test 文件集合(而非社区拆法),保证图级不重叠。
- SOTA 方法:对病灶任务采用"全量 757 张图级互斥 5 折 + 报告折均值"的自定义协议,弱化对某单一拆分口径的依赖。
参考:DDR 病灶分割社区配置(HACDR-Net 的 dir/split 结构)
⚠️ 坑点 4:同患者多张图 + 病灶图跨任务重复,易泄泛化(分类:数据泄漏)
问题:9,598 名患者对应 13,673 张图,部分患者多张;官方未给患者级分组文件,病灶精标 757 张又与分级全集同源。若不做患者级/任务级隔离,train/test 之间可能共享同一患者或同一张图,高估真实泛化。
症状:内测精度很高,换到 APTOS/IDRiD 外推暴跌——典型的"过拟合到内部重复"信号。
解决:
- 简单方法:按文件名时间戳前缀将同一患者的多张图尽量归并到同一划分,并在论文中声明"未能做严格患者级分组,存在潜在同患者跨划分"。
- 进阶方法:若你仅用病灶任务,严格按"图像级互斥"拆 757 张;分级与分割各用各的划分,不混训混测。
- SOTA 方法:向官方/社群索取患者映射,或自行构建去重后做患者级 stratified split,并报告与"图像级 split"的分数差以量化泄漏上界。
参考:DDR 病灶分割论文对 9,598 患者 / 757 张病灶精标的说明
⚠️ 坑点 5:无逐样本一致性数据,多专家共识标签≠单点真值(分类:标签理解 / 评估误用)
问题:分级是 7 名标注者独立判读 + 专家共识的结果,但官方未发布逐人记录或一致性系数(如 Cohen/加权 Kappa)。边界病例(轻度 vs 中度、重度 vs 增殖)本就存在临床主观性,共识标签掩盖了这种不确定性。
症状:把共识标签当绝对真值、对模型在等级边界上的"错误"过度苛责,或忽略标注噪声对 kappa 类指标的天花板限制。
解决:
- 简单方法:报告 QWK(二次加权 Kappa)而非仅 ACC,QWK 对相邻等级误判更宽容,更贴合临床共识本质。
- 进阶方法:对 test 集做二次人工复核子集,估算"标签本身的近似上限",与模型表现对照解释差距。
- SOTA 方法:用 soft-label / 标签分布学习建模标注分歧,或在评估时引入等级距离感知的损失与指标,显式承认分级连续可分性。
参考:RadFuse 论文强调用 QWK 作为 DDR 主指标的论述
⚠️ 坑点 6:病灶像素极端长尾 + 类别极不平衡(分类:预处理陷阱 / 评估误用)
问题:病灶像素在整图中占比常 <0.1%——背景约 8.66 亿像素 vs 最小病灶(软渗)约 21.7 万像素;且四病灶出现频率悬殊(SE 仅 239 张 vs HE 601 张)。
症状:直接用普通 Dice/CE 训练,网络学到"全输出背景"也有高精度;硬渗/软渗类别 Dice 极低。
解决:
- 简单方法:病灶分割评估改用 PRAUC、FROC 或在裁剪的病灶 patch 上评估,避免被背景主导的 Dice 迷惑。
- 进阶方法:训练用加权 Dice + CE、在线难例挖掘,或先按含病灶区域裁剪 patch 再训练小病灶分割。
- SOTA 方法:用噪声调整损失(NALoss)与类别加权(如 HACDR-Net 对 5 类设 cls_num_list 权重 0.5/0.7/1.5/0.7/1.1),配合多尺度特征与长程依赖建模提升小病灶召回。
参考:HACDR-Net 记录的 DDR 病灶像素分布与 NALoss 配置
⚠️ 坑点 7:42 种相机 + 混合散瞳,训练/测试域不一致被低估(分类:偏倚陷阱)
问题:DDR 的多设备/多机构特性使成像域高度异质(色温、亮度、锐度、散瞳与否、分辨率),官方 test 与 train 的域组成未必同分布;忽略这一点会把"数据集内平均精度"误读成"真实筛查泛化"。
症状:在官方 test 表现良好,但按医院/相机子集分组评测时某几类设备/某些不可分级临近图精度骤降。
解决:
- 简单方法:训练做颜色/几何增强(亮度、对比度、Gamma、HSV 抖动、翻转旋转),提升对设备漂移的耐受。
- 进阶方法:在结果分析里按"可分级 vs 不可分级边缘"与亮度直方图分桶报告,识别模型易崩的图像子群。
- SOTA 方法:引入域泛化/风格归一化技术,或用 DDR 做预训练后到 IDRiD/APTOS 做少样本微调,检验跨域迁移是否真的稳健。
参考:IET 论文对 42 种相机、45° FoV、质量多样性的说明
⚠️ 坑点 8:病灶掩膜 TIFF/PNG 混用 + 全零掩膜约定不清(分类:工程陷阱 / 预处理陷阱)
问题:病灶掩膜早期标注用 TIFF、后期用 PNG,官方发布内格式不统一;某图缺某类病灶时,对应掩膜是否为"全零文件/缺文件/单独标注"需自行确认,格式与读取方式错误会直接污染监督信号。
症状:加载掩膜时 dtype/通道错(BGR vs RGB、单通道 vs 三通道)、缺失类误判为异常、分割偶见整块伪影。
解决:
- 简单方法:预处理统一把所有掩膜转成单通道 PNG 二值,缺文件/全零图一律补
Image.new("L", size, 0)。- 进阶方法:读掩膜时显式
convert("L"),用 PIL 而非 cv2 以免 BGR/RGB 与通道序不一致;堆叠多类掩膜前先统一到同尺寸同坐标系。- SOTA 方法:建一个格式清洗 pipeline(TIFF→PNG、补全零、resize 对齐),把结果哈希记录入库,从源头消除格式漂移对后续所有实验的影响。
参考:arXiv 2602.07301 对 DDR 掩膜 TIFF/PNG 工作流差异的说明
§6.6 数据增强安全与危险清单
安全 ✅:水平/垂直翻转、随机 90° 旋转(眼底方向性弱)、轻微亮度/对比度/Gamma 抖动、HSV 色相微调、±10~15° 小角度旋转、轻微缩放(应对设备差异)。这些与真实相机漂移一致,不改变 DR 病灶语义。
危险 ❌:整图大幅裁切掉病灶/视网膜边缘(会误删信息)、拉伸变形(扭曲微动脉瘤形态、破坏几何真实性)、把不可分级图当正常图增广、在分割任务上对原图与掩膜做不一致的几何变换(掩膜必须同步 transform)、镜像后病灶类别/形状可能失真需谨慎。
针对 DDR 的具体增强建议细化为:
| 增强 | 是否推荐 | 理由 / 注意 |
|---|---|---|
| 随机翻转/90°旋转 | ✅ | 眼底方位角不固定,安全 |
| ±10~15° 旋转 + 轻微缩放 | ✅ | 模拟相机角度差异,防过拟合 |
| 亮度/对比度/Gamma 抖动 | ✅ | 直接对抗 42 相机色偏 |
| HSV 色相微调 | ✅ | 强化色域鲁棒性(EX 与 SE 靠颜色区分时需克制) |
| 大幅随机裁剪 | ❌ | 可能裁掉关键病灶/黄斑 |
| 拉伸/仿射剧烈变形 | ❌ | 扭曲微动脉瘤几何形态 |
| 对分割任务单独增强原图 | ❌ | 掩膜必须与图像同 transform |
裁剪安全范例:若必须裁剪,优先做"以黄斑/病灶聚集区为中心的保留缩放 + 周边填充(resize)"而非随机裁剪,最大限度保留病灶像素(小病灶极易被裁掉而消失)。
§6.7 模型推荐表
| 任务 | 推荐基线 | 理由 | 备注 |
|---|---|---|---|
| 分级(5/6 类) | ResNet-50 / EfficientNet-B3 预训练 | 图像分类成熟基线 | 原作者用 SE-BN-Inception 得 ACC 82.84% |
| 病灶感知分级 | 分割引导 + 注意力双分支 | 利用 757 张病灶证据提升可解释分级 | 近期 lesion-guided attention 在 DDR 达 85.93% |
| 病灶分割 | U-Net 类 / nnU-Net 变体 + 类别加权损失 | 小病灶长尾需加权 | 病灶像素占比常 <0.1% |
| 病灶检测 | Faster R-CNN / YOLO(XML→YOLO 转格式) | 原作者 Faster R-CNN mAP≈9.2 | 检测仍难,需强增强 |
| 多设备鲁棒分级 | 域泛化 + 颜色增强的 CNN/ViT | 42 相机域漂移大 | 需跨设备评估 |
§6.8 硬件需求表
| 任务 | 推荐 GPU 显存 | 输入分辨率 | 单卡可行 | 建议 |
|---|---|---|---|---|
| 分级(分类) | 8-16 GB | 512×512 | 是 | RTX 2080 Ti 起即可 |
| 病灶分割 | 16-24 GB | 512×512~1280×1280 | 是(小 batch) | 高分辨率需 24 GB |
| 病灶检测 | 16 GB | 原图/512 | 是 | batch 调小 |
| 大模型/高分辨率微调 | 24-48 GB | 1280×1280 | 需多卡或梯度累积 | 参考 HACDR-Net 每卡 sample=1 |
§6.9 评估指标代码
# 分级用 QWK + ACC;分割用 Dice + PRAUC;检测用 mAP
import numpy as np
from sklearn.metrics import cohen_kappa_score, accuracy_score
def qwk(y_true, y_pred, weights="quadratic"):
return cohen_kappa_score(y_true, y_pred, weights=weights)
def dice_torch(pred, target, eps=1.0):
# pred/target: binary tensor
inter = (pred * target).sum()
return (2.0 * inter + eps) / (pred.sum() + target.sum() + eps)
# 分级:QWK 比 ACC 更能容忍相邻等级误判(临床共识本质)
# y_true, y_pred 为 int 数组
print("ACC:", accuracy_score(y_true, y_pred), "QWK:", qwk(y_true, y_pred))
§6.10 MLOps 笔记
- 版本管理:DDR 单版本但病灶划分口径不一,建议把"自己实测的划分 + 标签 CSV 哈希 + 预处理脚本"一并纳入 DVC/代码仓库,确保可复现。
- 实验追踪:记录 batch 里是否混入不可分级图、是否裁边、resize 尺寸——这些都能显著改变精度。
- 数据溯源:因官方无设备/患者元数据,务必在数据卡片里声明"未做患者级隔离、未做设备分组消融"两项已知限制。
- 二次文件核验:用第三方下载的二次整理版前,先比对官方 zip 内文件数/哈希,防止预处理污染(黑边裁切、已增强)导致结果失真。
- 部署红线:DDR 训练的分级/分割模型不得直接作为临床决策输出。真实筛查部署需接入人机协同流程(AI 预筛 + 高危转人工 + 不可分级重拍),并满足当地 AI 医疗器械审批要求;上线前用独立前瞻队列验证性能(见 §7.6 漂移监测)。
- 可复现数据卡:为每个 DDR 实验固化一张数据卡(划分计数、是否剔 ungradable、黑边/分辨率/增强策略、标签文件哈希),随模型一同发布——这既是对审稿人的交代,也是自查复现事故的最快手段。
§6.11 端到端训练策略速查
针对三类任务给出一份"拿来即用"的训练要点表:
| 阶段 | DR 分级(5 类) | 病灶分割 | 病灶检测 |
|---|---|---|---|
| 图像规模 | 全量 6,835 train | 官方 lesion train(约数百张) | lesion_detection train XML |
| 输入分辨率 | 512×512 起 | 建议 ≥1024,小病灶需高分辨率 | 原图或 1024 |
| 数据加载 | RGB,ImageNet 归一化 | 原图 + 对应类掩膜成对加载 | 图像 + 归一化 bbox |
| 损失 | CE / Focal(类不平衡) | 加权 Dice + CE / NALoss | 检测框架自带(focal+ciou) |
| 数据增强 | 翻转/旋转/颜色抖动 | 原图与掩膜同步几何变换 | 翻转需同步翻转 bbox |
| 评估 | ACC + QWK | Dice + PRAUC | mAP@[.5:.95] |
| 易错 | 忘剔 ungradable 或口径不一致 | 掩膜格式/坐标未统一 | XML 类名/尺寸误读 |
共同铁律:① 训练/验证/测试集必须"图级互斥",病灶图不得跨集共享;② 任何几何增强(裁剪/缩放/旋转)都必须让掩膜或 bbox 同步变换;③ 每次实验记录数据集口径(剔 ungradable 与否、病灶划分计数)——这三条能消除 DDR 上绝大多数复现事故。
§7 质量评估与局限性
§7.1 已知偏倚表
| 偏倚类型 | 描述 | 严重程度 | 缓解 |
|---|---|---|---|
| 人群/地域偏倚 | 中国 23 省 147 家医院,人种单一中国人群为主 | 中 | 外推到 IDRiD/APTOS/EyePACS 做跨人群验证 |
| 类别不平衡 | 正常 6,266(45.8%)vs 重度 NPDR 仅 236(1.7%) | 高 | 分层采样/类别加权/罕见类增强 |
| 图像质量偏倚 | 含 8.4% 不可分级图;多设备多散瞳导致质量分布不均 | 高 | 显式处理 ungradable,分桶评估 |
| 病灶标注偏倚 | 仅 757 张(含 DR 者)有病灶精标,负样本图像缺失病灶标签 | 中 | 分割评估聚焦 757 张,勿在全集算病灶指标 |
| 设备偏倚 | 42 种相机,无逐图设备元数据,无法设备分层 | 中 | 用亮度/直方图代理分组,或域泛化 |
| 标注主观性 | 多专家共识分级,边界病例有临床争议 | 中 | QWK 指标 + soft-label + 二次复核 |
| 病灶长尾偏倚 | 软渗仅 239 张、像素占比 <0.1% | 高 | 类别加权损失 + patch 训练 + PRAUC |
§7.2 标注质量
分级标签由 7 名标注者独立判读、专家复核共识,整体质量在同类眼底 DR 数据集中属上乘,且是国内多中心真实图。病灶精标为专家人工描绘,细小微动脉瘤存在边界不确定性与潜在漏标。已知局限:① 官方未公开逐人一致性统计,无法量化标注噪声;② 病灶掩膜历史存在 TIFF/PNG 混用,需统一格式;③ 757 张精标规模偏小,分割/检测结论的统计功效有限。
§7.3 泛化性表
| 外部场景 | 失效风险 | 证据 |
|---|---|---|
| 跨到印度/西方人群 | 中-高:眼底色素、疾病谱、设备均不同 | 需迁移到 IDRiD/EyePACS 实测,原作者未给跨人群数据 |
| 跨到真正不可分级低质图 | 高:模型未显式建模 ungradable 时易误判 | 需显式用 grade=5 训练或做拒收 |
| 跨设备(新相机型号) | 中:颜色/清晰度漂移 | 42 相机训练可提升,但新设备仍需验证 |
| 免散瞳 vs 散瞳 | 中:散瞳状态改变血管/病灶对比 | DDR 混合散瞳,需分桶看是否稳定 |
| 病灶分割外推到新场景 | 高:精标仅 757 张、小病灶脆弱 | 需在 FGADR/IDRiD 病灶分割上外推 |
§7.4 伦理
DDR 图像已脱敏(发布前去除患者可识别信息),公开分发不携带患者身份字段。作为回顾性多中心影像数据集,研究者使用时仍应:遵守机构伦理与 IRB 要求、不得尝试将脱敏图逆向关联患者、在论文中如实声明数据来源与脱敏属性。任何基于 DDR 训练的模型若用于真实临床筛查,必须满足所在司法辖区的医疗器械监管审批(如国内需遵循相应 AI 医疗器械规范),本文档不构成临床使用许可。
§7.5 公平性
DDR 单一人种(中国)主导,无法单独支撑"跨种族公平"结论。若用于人群筛查公平性研究,应警惕将中国样本上训练的模型直接套用于其他肤色/人群而不做外部验证。分类别性能差异(重度/增殖类样本少)意味着模型对"最难、最需转诊"病例的可靠性可能更低——这正是公平性风险所在。
§7.6 数据漂移
数据集冻结于 2019(单版本)。采集期 2016-2018 的成像设备与如今(2026)新一代眼底相机的光谱/分辨率特性可能漂移。随时间推移,基于 DDR 训练模型的临床相关性可能下降,建议结合更新的中国眼底数据与前瞻性读片做周期性复验。
漂移监测建议:若将 DDR 训练模型部署用于实时筛查,建议建立轻量监测——定期抽检新采集眼底图的直方图/清晰度分布与 DDR 训练分布对比,一旦出现系统性偏移(如换用新相机型号、调整散瞳策略),触发再校准或补充微调。这一"分布哨兵"机制可避免模型在无感知的成像漂移下悄悄劣化。
§7.4b 合规使用清单(给研究者)
| 事项 | 应做 | 不应做 |
|---|---|---|
| 数据身份 | 声明来源 OIA-DDR / 南开 | 谎称自采数据 |
| 脱敏 | 尊重已脱敏事实 | 尝试逆向关联患者 |
| 伦理 | 遵守所在机构 IRB/伦理 | 未经审批做涉及患者身份的使用 |
| 发表 | 引用 Li et al. 2019 原始论文 | 隐去数据来源 |
| 部署 | 走 AI 医疗器械审批/验证 | 未经验证宣称临床可用 |
| 版权 | 遵循 MIT License | 声称独占/私售数据 |
§7.7 DAIMS 24 项质量自评
| # | 检查项 | 状态 | 说明 |
|---|---|---|---|
| 1 | 宽格式 | ✅ | 分级/病灶各自为扁平表结构,长表记录病灶实例 |
| 2 | 唯一标识 | ✅ | 图像以时间戳文件名/image_id 唯一标识 |
| 3 | 特殊字符 | ✅ | 文件名与标签无语义干扰字符 |
| 4 | 重复行 | ⚠️ | 同患者多张图官方未给分组,存在图级相近样本 |
| 5 | 缺失编码 | ⚠️ | 病灶全零掩膜即"缺该类"编码,需使用者理解 |
| 6 | 标签标识 | ✅ | grade 0-5 语义清晰,但 5=不可分级易被误用 |
| 7 | 罕见类分组 | ⚠️ | 重度 NPDR 236 张、软渗 239 张,需特殊处理 |
| 8 | 偏倚评估 | ⚠️ | 人群/设备/病灶长尾偏倚已知但未随包给出量化 |
| 9 | 数据字典 | ⚠️ | 官方缺完整随包数据字典,本文档 §4.1 为补全 |
| 10 | 信息性缺失解释 | ⚠️ | ungradable 即信息性缺失,官方未系统解释 |
| 11 | 设备记录 | ❌ | 无逐图设备/散瞳元数据 |
| 12 | 共线性 | ✅ | 单模态单图,特征高度相关为固有 |
| 13 | 编码映射 | ✅ | ICDRSS 分级映射 ICD-11/SNOMED 可行(§2) |
| 14 | 时间戳处理 | ⚠️ | 文件名含时间戳可辅助患者归并,官方未说明 |
| 15 | 划分建议 | ✅ | 官方 train/val/test 固定划分存在 |
| 16 | 泄漏讨论 | ✅ | 本文档 §5.3 明确同患者/跨任务泄漏 |
| 17 | 标签分布 | ✅ | §4.2 给出完整 6 类分布 |
| 18 | 测量偏倚 | ⚠️ | 42 相机混散瞳,测得的域漂移已知 |
| 19 | 外部验证建议 | ✅ | §5.5 给出 IDRiD/APTOS/FGADR 迁移建议 |
| 20 | 版本记录 | ✅ | 2019 单版本,2024 README 更新,冻结 |
| 21 | 预处理脚本 | ❌ | 官方无预处理脚本,本文档 §6.3 供参考 |
| 22 | 合规要求 | ✅ | MIT License、脱敏图,开源合规清晰 |
| 23 | 多模态对齐 | ⚠️ | 分级与病灶同源但拆分/格式需自行对齐 |
| 24 | 去标识化 | ✅ | 发布前图像已脱敏 |
DAIMS 评分:16.5 / 24
评分解读:DDR 在"规模、官方划分、多任务并存、脱敏与开源合规"上表现扎实(✅ 密集),核心扣分集中在官方随包工程化不足:无数据字典、无预处理脚本、无逐图设备元数据、病灶掩膜格式混用与拆分手径不一。这些问题不损害数据的医学价值,但显著抬高了使用者上手的工程成本。
对你意味着什么:若你要严肃使用 DDR,请把它当作"高质量医学原始数据",而非"开箱即用的 benchmark 包"。动工前自建三层脚手架——① 用 §6.3/§6.4 的自写预处理与 DataLoader 锁定标签-图像对应;② 用你实测的病灶划分固定评估口径并写进论文;③ 在数据卡片声明"无设备元数据、未做患者级隔离"两项已知限制。把这三件事做扎实,你就能规避评分中 7.5 个 ⚠️/❌ 项里的绝大多数复现陷阱。
§7.8 外部验证矩阵
| 外部数据集/场景 | 来源 | 评估任务 | 性能指标 | 相对内部变化 | 关键发现 |
|---|---|---|---|---|---|
| APTOS 2019 | Kaggle | DR 分级 | ACC | 作者双数据评测需自行迁移 | DDR 训练+APTOS 迁移常用于验证跨域(社区实践) |
| IDRiD | IEEE Dataport | 病灶分割 | Dice/PRAUC | 跨人群迁移需实测 | 病灶分割算法多在 IDRiD/DDR 双集评测(Wiley 2024) |
| FGADR | 公开 | 病灶分割 | Dice | 需实测 | 常作病灶分割第二外部集 |
| ATOPS/APTOS 外推 | Kaggle | 分级 | ACC 87.18% vs DDR 85.93% | 同源方法双集 | lesion-guided 注意力双集均高,佐证跨域 |
注:§7.8 仅录有文献报道的双集结果;DDR→跨人群的严格外部验证结果在公开文献中仍偏少,引用时以原文为准,勿自行补"相对内部变化"数字。
矩阵解读:目前 DDR 的外部验证主要集中在"同任务跨数据"方向——分级模型常以 DDR 训练后在 APTOS 上测(反之亦然),病灶分割则惯用 IDRiD/FGADR 作第二验证集。这类交叉验证帮助确认方法不是"背 DDR 的题";但真正约束临床价值的"跨人群(中国→欧美)+ 跨成像系统前瞻性"验证仍稀缺。因此,若你的研究声称 DDR 模型具备临床泛化,强烈建议补一项真实外部读片集或独立采集队列的评测,并把"DDR 内部 vs 外部"的数字差写进结论,这正是本领域当前最缺的证据。
§8 基准性能与生态
§8.1 排行榜(代表性结果,非官方 leaderboard)
DDR 无官方维护的排行榜,下列为代表性论文结果,数值多不可直接横向比较(因是否剔除不可分级、是否用官方划分、输入分辨率、预处理不同)。
| 排名 | 模型/方法 | 性能 | 年份 | 关键技术 | 完整引用 | 代码 |
|---|---|---|---|---|---|---|
| — | SE-BN-Inception(原作者) | DR 分级 ACC 82.84% | 2019 | SE 模块 + BN-Inception | Li, Gao, Wang, Guo, Liu, Kang, Information Sciences, 2019 | 未开源 |
| — | Faster R-CNN(原作者) | 病灶检测 mAP ≈ 9.2 | 2019 | 两阶段检测 | 同上 | 未开源 |
| — | Lesion-guided attention | 分级 ACC 85.93% | 2026 | 病灶引导注意力双分支 | Liu et al., Multimedia Tools and Applications, 2026(DOI 10.1007/s11042-026-21344-0) | 见原文 |
| — | MDGNet | APTOS+DDR 双集分级 | 2024 | 图卷积多尺度融合 | Sci. Rep. 14, 2024(DOI 10.1038/s41598-024-56389-4) | 见原文 |
| — | HACDR-Net | 病灶分割 | 2024 | 异构感知卷积 + NALoss | mmsegmentation 实现配置 | GitHub(HACDR-Net) |
标注:以上结果来自不同协议(5 类 vs 6 类、是否剔除 ungradable),不可直接排名。原作者 82.84% 为 6 类含不可分级口径;多数后作剔除 ungradable 用 5 类,故分数偏高属正常,非"进步"证据。病灶分割/检测指标分散,无统一 leaderboard。
§8.2 SOTA 总结与选型建议
分级方向:剔除不可分级的 5 类任务上,现代 CNN/ViT + 病灶感知注意力可达 ~85%+ ACC(6 类含不可分级则更低)。分割/检测方向仍是被公认为难的任务——原作者检测 mAP≈9.2 至今未根本改变"小病灶难、长尾难"的格局。选型建议:入门分级用 ResNet-50/EfficientNet 预训练 + QWK 评估;做可解释诊断加分割引导分支;专攻病灶用带类别加权/NALoss 的 U-Net 家族并优先裁剪 patch 训练。
§8.2b 复现原作者基线的关键设定
原作者 82.84% 的分级准确率并非一个"随手可超"的简单数字,复现时需对齐下列设定,否则容易得出误导性对比:
| 设定 | 原作者做法 | 复现注意 |
|---|---|---|
| 任务口径 | 6 类(含不可分级 grade=5) | 直接剔除 grade 5 会人为抬高 ACC,与 82.84% 不可比 |
| 输入预处理 | 裁黑边/缩放到固定输入 | 分辨率与归一化影响显著 |
| 模型 | SE-BN-Inception | 现代预训练骨干(ResNet/EfficientNet)通常在其上有提升,属"骨干进步"而非任务变易 |
| 划分 | 官方 train/valid/test | 必须用官方划分才能对照 |
| 评估指标 | 原作者主要报告 ACC | 建议同时报 QWK,更能反映分级质量 |
可复现底线:任何声称"超越 DDR 基线"的论文,都必须写明是否剔除 ungradable、用哪种预处理、哪个划分。只给一个 ACC 数字而无协议说明的结果,无法与 82.84% 或 85.93% 严格比较。
§8.3 评测协议
社区主流协议:① 分级用官方 train/val/test,剔除 grade=5(5 类)或保留(6 类),主指标 QWK + ACC;② 病灶分割用官方 lesion 划分的 757 张,指标 Dice/PRAUC,图像级互斥;③ 病灶检测将 XML 转 YOLO/COCO 格式,用 mAP@[.5,.95]。跨论文比较前必须先核对"是否剔 ungradable、分辨率、划分口径"三个变量。
| 对比维度 | 检查项 | 说明 |
|---|---|---|
| 类别口径 | 5 类 vs 6 类 | 含 ungradable 的 6 类明显更难 |
| 输入分辨率 | 512 vs 原图 vs 1280 | 小病灶分割高度依赖分辨率 |
| 划分来源 | 官方 vs 二次镜像 | 病灶划分口径不一,需注明 |
| 数据预处理 | 是否裁黑边/色彩归一 | 影响色偏类方法对比 |
| 指标 | ACC vs QWK vs Dice/PRAUC | 分级建议 QWK,分割建议 PRAUC 佐证 Dice |
§8.4 相关数据集表
| 数据集 | 年份 | 规模 | 与 DDR 的关系/差异 |
|---|---|---|---|
| EyePACS | 2015 | 88,702 图 | 更大分级集但西方人群、无病灶精标 |
| IDRiD | 2018 | 516 图 | 印度人群,病灶标注精细,常作 DDR 分割外推集 |
| APTOS 2019 | 2019 | 3,662 图 | Kaggle 竞赛,5 类无不可分级,常作分级外推集 |
| FGADR | 2020 | 2,842 图 | 病灶精细标注,作分割补充 |
| ODIR-5K | 2019 | 5,000 图 | OIA 同门,多病种 8 标签筛查 |
| OIA-DDR 姊妹集 OIA-ODIR | 2019 | 10,000 图 | 同一 OIA 系列多病种数据 |
§8.5 关键论文 Top 8
- Li T, Gao Y, Wang K, Guo S, Liu H, Kang H. Diagnostic Assessment of Deep Learning Algorithms for Diabetic Retinopathy Screening. Information Sciences, 501:511-522, 2019. — DDR 原始论文,定义数据、6 类分级、757 张病灶精标与基线(ACC 82.84%)。
- Li T, et al.(南开新闻/学术报道) — OIA 系列数据集的构建机构与合作背景。
- Zheng H, Liu F. A Cascade U-Net With Transformer for Retinal Multi-Lesion Segmentation. Int. J. Imaging Syst. Technol., 34(5):e23163, 2024. — 在 IDRiD/DDR/DIARETDB1 上验证多病灶分割。
- (GCN)A graph convolutional network with dynamic weight fusion … for diabetic retinopathy grading. Scientific Reports, 14, 2024. — MDGNet 在 APTOS+DDR 上的多尺度图卷积分级。
- RadFuse: Integrating non-linear radon transformation for diabetic retinopathy grading. 2024(PMC).
- Image preprocessing-based ensemble deep learning classification of diabetic retinopathy. IET Image Processing, 2023. — 提供 DDR 6 类官方分布表的论文级证据。
- Diabetic Retinopathy Lesion Segmentation through Attention Mechanisms. arXiv:2602.07301. — 详述 757 张内病灶图像数(MA570/HE601/EX486/SE239)与 TIFF/PNG 混用。
- Lesion-guided attention mechanism for enhanced diabetic retinopathy image classification. Multimedia Tools and Applications, 2026(DOI 10.1007/s11042-026-21344-0). — 病灶引导注意力分级,DDR ACC 85.93%。
§8.5b 从 DDR 走向可解释与可信
DDR 的"病灶精标 + 整图分级"结构天然适合研究病灶定位与分级决策之间的因果——这是其相对纯分级数据集的最大差异化价值。建议的进阶研究路径:
- 病灶证据消融(evidence ablation):用分割模型定位病灶,掩去病灶再分级,对比分级分数的变化,验证模型是否"真的看病灶"而非凭背景纹理猜。
- 可靠性校准与拒收:把不可分级图当作"分布外"样本,研究模型置信度校准与 OOD 拒收,让 AI 在低质图上"承认不知道"而非硬给等级。
- 标注不确定性:虽然官方未公开逐人标签,仍可在 test 上做二评人复核,估算标签噪声上限,指导 QWK 类指标的合理预期。
- 域迁移诊断:用 42 相机带来的真实漂移做"自然分布偏移(natural distribution shift)"研究——比人造增广更贴近临床,是 DDR 独有优势。
审慎提醒:病灶"位置与分级相关"不等于"因果关系被模型正确利用"。若要支持"病灶引导增强了临床可信度"的论断,仍需热图/消融 + 临床医生评估的双重证据,避免仅凭 ACC 提升宣称可解释。
§8.6 社区活跃度
DDR 是国产眼底数据集中被引用与使用最广者之一,广泛见于 DR 分级/分割/检测论文的"数据集"小节。GitHub 仓库(nkicsl/DDR-dataset)为官方发布主源,更新不活跃(2024-02 README 更新后停滞),无 issue/PR 活跃讨论区;社区生态散落在 Kaggle 二次整理(分级 CSV、病灶分割镜像)、HuggingFace 与 mmsegmentation 配置中。整体属于"数据活跃、仓库工程欠维护"的成熟数据集。
§8.7 生态快照表
| 资源 | 类型 | 说明 | Star/活跃(截至 2026-09) | 推荐理由 |
|---|---|---|---|---|
| github.com/nkicsl/DDR-dataset | 官方仓库 | 数据主页/引用 | 仓库星标适中、长期低活跃 | 唯一官方源 |
| Kaggle DDR 分级二次整理 | 镜像 | DR_grading.csv 样例 | 数据表可用 | 快速看标签结构 |
| Kaggle DDR-Segmentation | 镜像 | lesion_segmentation 划分 | 免下载即可试跑 | 病灶分割快速上手 |
| HACDR-Net(GitHub) | 代码 | DDR 病灶分割配置 | 学术镜像 | mmsegmentation 可直接套用 |
| Ultralytics DDR-lesion | 平台 | YOLO 检测格式重托管 | 检测基准 | 检测任务速起 |
生态使用建议:优先用官方仓库 + 官方压缩包做研究与发表级实验(保证划分与预处理可声明);二次镜像(Kaggle/HF/Ultralytics)适合快速试跑与格式参考,但不得作为最终结果的数据源而不核对差异。官方仓库活跃度低是常态——DDL 级数据集的工程维护往往滞后,属预期而非缺陷。使用前先读 §9.4 FAQ,可避开绝大多数"首次接触"问题。
§9 相关资源与引用
§9.1 官方与社区资源
| 资源 | 类型 | 链接/位置 |
|---|---|---|
| 官方 GitHub 仓库 | 官方 | https://github.com/nkicsl/DDR-dataset |
| 原始论文(ScienceDirect) | 论文 | https://www.sciencedirect.com/science/article/pii/S0020025519305377 |
| 论文 DOI | DOI | https://doi.org/10.1016/j.ins.2019.06.011 |
| OIA 系列发布报道 | 官方新闻 | 南开新闻网(2019-12) |
| DDR 分级 CSV 二次整理 | 社区 | Kaggle:ddrdataset(mariaherrerot) |
| DDR-Segmentation 镜像 | 社区 | Kaggle:ddr-segmentation(sunfish141) |
| DDR-lesion(YOLO 格式) | 社区 | Ultralytics 平台 ddr-lesion |
| HACDR-Net 病灶分割配置 | 社区 | GitHub:HACDR-Net(mmsegmentation) |
§9.2 BibTeX 引用
@article{li2019diagnostic,
title = {Diagnostic Assessment of Deep Learning Algorithms for Diabetic Retinopathy Screening},
author = {Li, Tao and Gao, Yingqi and Wang, Kai and Guo, Song and Liu, Hanruo and Kang, Hong},
journal = {Information Sciences},
volume = {501},
pages = {511--522},
year = {2019},
issn = {0020-0255},
doi = {10.1016/j.ins.2019.06.011},
url = {https://www.sciencedirect.com/science/article/pii/S0020025519305377}
}
(官方 README 提供的 @article{LI2019,...} 写法亦可直接使用。)
§9.3 引用指南
使用 DDR 请在论文中引用 Li et al. (2019) 原始论文(DOI 10.1016/j.ins.2019.06.011)。若你依赖社区二次整理(Kaggle 分级 CSV、病灶分割划分、YOLO 转换脚本),建议同时注明所用镜像版本与预处理差异,以保证可复现。分级评测若剔除 grade=5,务必在方法节写明,否则与含 ungradable 的结果不可比。
§9.4 常见问题速查
| 问题 | 一句话答案 | 详见 |
|---|---|---|
| 数据集到底叫 DDR 还是 OIA-DDR? | 同一数据集,官方仓库为 nkicsl/DDR-dataset | §1.6 |
| 怎么把 zip 解压成功? | 先 cat DDR-dataset.zip.0* > DDR-dataset.zip 再 unzip |
§6.2 / 坑点 1 |
| 分级做 5 类还是 6 类? | 常用做法剔 ungradable 做 5 类,但要写明口径 | §5.2 / 坑点 5 |
| 病灶分割/检测只有多少张? | 约 757 张精标图(拆分口径以实测为准) | §3.2 / 坑点 3 |
| 病灶掩膜为什么有的 tiff 有的 png? | 长周期标注工作流所致,需统一转 PNG | 坑点 8 |
| 为何病灶检测分数特别低? | 小病灶 + 长尾 + 类间相似是公认难点 | §8.1 |
| 官方为何不给每图设备型号? | 发布时未随附设备/患者元数据 | §3.9 |
| 能直接用西方数据预训练再跑 DDR 吗? | 可以,迁移到 IDRiD/APTOS 亦常见 | §5.5 |
| 病灶检测 XML 类名是什么? | ex/he/ma/se(小写缩写) | §4.6 |
| 掩膜是 tiff 时怎么读? | 统一转单通道 PNG 二值,补全零 | 坑点 8 |
| DDR 可否商用? | MIT License,可商用(仍须遵守伦理与出处声明) | §7.4b |
| 想快速确认下对数据集? | 解压后数 .jpg 应约 13,673 张 | §6.2b |
注:FAQ 中"→"指向本文档对应小节,方便快速定位详细说明与代码。
§10 AI 使用声明卡
§10.1 本文使用的 AI 模型列表
| 模型 | 用途 |
|---|---|
| 大规模语言模型(LLM,qianfanghub 编辑部环境) | 信息检索、结构起草、代码框架撰写、多语摘要 |
| 医学编码辅助 | ICD-11/SNOMED CT 术语核对初稿 |
§10.2 AI 参与范围
AI 负责:根据 WRITER 简报与写作宪法起草全文结构、整理公开检索到的规模/标注/基准事实、生成预处理与 DataLoader 参考代码、翻译与规范化医学术语。所有数字与事实均来自公开可检索来源(见 §10.3),未由 AI 凭空生成;涉及临床判断的表述经医学编辑复核。
AI 能力边界说明:LLM 不掌握 DDR 压缩包内部逐文件内容,无法核验官方病灶拆分的精确计数;凡涉及"以实测为准"之处(病灶划分、掩膜格式、标签一致性),本文以可检索文献为依据给出区间与核对方法,最终数值需读者解压实测确认。此类不确定性已如实标注于对应小节(§4、§6),而非隐藏。
§10.3 输入来源列表
以下为本条目事实核对所依据的公开来源:
- nkicsl/DDR-dataset GitHub 仓库(官方名称、下载、引用、解压说明)— https://github.com/nkicsl/DDR-dataset
- Li et al., Information Sciences, 2019, 论文摘要(13,673/9,598/757、6 类、ACC 0.8284)— https://vufind.katalog.k.utb.cz/SummonRecord/FETCH-LOGICAL-c297t-8b52ec06ba5626d5369f0876032c0d8c1b605644942e4629c0660e53e7434df63
- 南开新闻网 OIA 系列发布报道(机构、23 省/147 家口径、与 OIA-ODIR 关系)— https://news.nankai.edu.cn/ywsd/system/2019/12/07/030036739.shtml
- Nature 眼科数据库综述表(DDR/EyePACS/IDRiD/FGADR 规模)— https://www.nature.com/articles/s41598-025-31339-w/tables/3
- IET Image Processing 论文(42 相机、45°FoV、6 类分布表)— https://ietresearch.pericles-prod.literatumonline.com/doi/10.1049/ipr2.12987
- RadFuse(PMC)DDR 概述(7 名标注者、6835/2733/4105 划分、ICDRSS)— https://pmc.ncbi.nlm.nih.gov/articles/PMC12370889/
- arXiv 2602.07301(757 张内病灶图像数、TIFF/PNG、9,598 患者)— https://arxiv.org/html/2602.07301v1
- ResearchGate Sensors 论文(原作者 mAP 9.2、Faster R-CNN、ACC 82.84%)— https://www.researchgate.net/publication/351911083
- Wiley(Cascade U-Net)论文(IDRiD/DDR/DIARETDB1 多病灶分割)— https://onlinelibrary.wiley.com/doi/full/10.1002/ima.23163
- Springer Multimedia Tools(lesion-guided attention,DDR ACC 85.93%)— https://link.springer.com/article/10.1007/s11042-026-21344-0
- DeepWiki HACDR-Net 配置(病灶像素分布、NALoss、目录结构)— https://deepwiki.com/xqh180110910537/HACDR-Net/3.1-ddr-dataset-configuration
- Ultralytics DDR-lesion 平台(4 类病灶、MIT)— https://platform.ultralytics.com/fatih/datasets/ddr-lesion
- Kaggle DDR 分级/分割二次整理(DR_grading.csv 结构)— https://www.kaggle.com/datasets/mariaherrerot/ddrdataset
- WHO ICD-11 眼科目录(9B71 编码与后组合)— WHO ICD-11 MMS 眼科页
- 二次文献(年龄/性别/42 相机/147 医院)— 学术资料整理源(ima.qq 等)参考
§10.4 人工校验表
| 内容模块 | 审核者 | 审核方式 | 审核状态 |
|---|---|---|---|
| §2 医学背景(ICD-11/SNOMED、DR 分期) | 千方病案医学编辑部 | 与 WHO ICD-11 及 SNOMED 源交叉比对 | ✅ 已通过 |
| §1 规模与 §4 分布(13,673/9,598/757、6 类数字) | 千方病案医学编辑部 | 与论文摘要及文献表核对 | ✅ 已通过 |
| §6 代码与坑点 | 千方病案医学编辑部(数据工程) | 依据官方 README 与社区实践复核 | ✅ 已通过 |
| §7 DAIMS 与偏倚 | 千方病案医学编辑部 | 逐项自评并对照已知文献 | ✅ 已通过 |
| §8 基准(作者 ACC 82.84% / mAP 9.2) | 千方病案医学编辑部 | 与原始论文摘要核对 | ✅ 已通过 |
§10.5 AI 生成章节标注
全文初稿由 LLM 依简报与宪法起草,事实条目经 §10.4 人工校验后保留;§2 医学编码、§7 偏倚/DAIMS、§6 代码的结论性表述经过医学与数据工程双审。读者若发现与官方/原文不一致处,以 §9 的原始文献与官方仓库为准。
§10.6 最后人工审核日期
2026-09-05(与 §0 审核日期一致)。
更新维护说明:本条目所描述的数据集为冻结的单版本(2019 发布)。若 DDR 后续发布新版本、官方修正病灶划分或补充设备/患者元数据,本百科将依据官方发布文件同步修订 §3 规格、§4 分布与 §7 评估,并更新审核日期。数值均标注来源与"截至"时点,读者引用前建议复核原始论文与 GitHub 仓库。
纠错与反馈:读者如发现本文档与 DDR 官方发布文件或原始论文存在出入,请以官方源为准并向千方病案医学编辑部反馈,编辑部将依 §10.4 流程复核修订。
页面状态:published(全部内容已完成审核并发布)
