信息速览
INFOBOX
| 数据集名称 | EyePACS |
| 英文全称 | EyePACS Diabetic Retinopathy Detection Dataset (Kaggle Competition) |
| 别名 / 简称 | EyePACS、EyePACS-1、Kaggle DR Detection、Diabetic Retinopathy Detection |
| 疾病分类 | 9B71.1 糖尿病视网膜病变 / 5A11.2 型糖尿病伴眼并发症 |
| SNOMED CT | 414817005 Diabetic retinopathy / 399066004 Diabetic retinopathy affecting macula / 399061005 Background diabetic retinopathy / 399062003 Preproliferative diabetic retinopathy / 399060009 Proliferative diabetic retinopathy |
| 数据模态 | 影像(彩色眼底照片,黄斑中心视角) |
| AI 任务类型 | 图像多分类(5 级 DR 严重程度分级)、二分类(可转诊 DR 检测)、图像质量评估 |
| 样本总数 | 88,702 张彩色眼底照片(35,126 张训练集 + 53,576 张测试集) |
| 数据大小 | ~89 GB(原始 JPEG,训练集 35.3 GB + 测试集 53.7 GB) |
| 数据格式 | JPEG(图像)/ CSV(标签文件) |
| 许可证 | Kaggle 竞赛条款(研究用途,禁止再分发原始图像) |
| 访问级别 | 注册后开放(Kaggle 账号注册后可下载) |
| DUO 标签 | HMB, NPUNCU |
| 语言 | 不适用(图像数据,标签为数字编码) |
| 首发日期 | 2015-02-17(Kaggle 竞赛开始) |
| 最后更新 | 2015-07-27(竞赛结束,测试集标签发布) |
| 发布机构 | EyePACS LLC(Jorge Cuadros, PhD)+ California Health Care Foundation + Kaggle |
| 官方主页 | https://www.kaggle.com/c/diabetic-retinopathy-detection |
| 下载地址 | https://www.kaggle.com/c/diabetic-retinopathy-detection/data |
| DOI | 不适用(竞赛数据集,无独立 DOI;Gulshan et al. JAMA 2016 DOI: 10.1001/jama.2016.17216) |
| 引用次数 | 8,500+(Google Scholar,Gulshan et al. JAMA 2016,截至 2026-07) |
| AI 就绪度评分 | ⭐⭐⭐⭐(4/5)— 最大规模公开 DR 数据集之一,含官方 train/test 划分;扣分项:单标注者、无人口统计元数据、图像质量参差不齐、许可证限制再分发 |
| 页面状态 | published |
§0 E-E-A-T 信任声明与免责声明
医学审核者:[千方病案医学编辑部]交叉审核:§2 医学背景(ICD-11 映射、ICDR 分级体系、临床任务定义、金标准描述)、§7 偏倚分析(类别不平衡、图像质量偏倚、标注噪声)。
数据工程审核者:[千方病案医学编辑部交叉审核] 医疗 AI 数据工程师,审核范围:§4 DAIMS 数据字典、§5 数据划分策略、§6 预处理 Pipeline 和坑点。
审核日期:2026-08-04
医疗免责声明:本页面提供的医学信息仅供研究和教育目的,不构成医疗建议、诊断或治疗方案。数据集的医学描述基于公开发表的文献,未经逐一临床验证。任何基于该数据集训练的 AI 模型在应用于临床决策前,必须经过独立的临床验证和监管审批。
技术免责声明:本页面的代码示例、预处理建议和基准性能数据基于公开资料整理,不保证在特定环境下的准确性和适用性。使用者应自行验证代码安全性和数据预处理流程的正确性。千方病案医数集不对因使用本页面信息而导致的任何直接或间接损失承担责任。
数据使用合规:使用本页面描述的数据集前,请务必阅读并遵守数据集原始许可协议。EyePACS 数据集通过 Kaggle 竞赛条款授权,禁止再分发原始图像。DUO 标签仅供参考,具体使用限制以 Kaggle/EyePACS 官方协议为准。
§1 数据集概览(Overview)
§1.0 30 秒速览
EyePACS 是由加州 EyePACS LLC 于 2015 年通过 Kaggle 竞赛平台发布的糖尿病视网膜病变(DR)眼底影像数据集,包含约 88,702 张来自真实临床筛查场景的彩色眼底照片,按国际临床糖尿病视网膜病变(ICDR)五级严重程度标准标注。它是当时公开发布的最大规模 DR 数据集,至今仍是该领域引用最广泛的基准。
它的独特价值在于真实世界的临床噪声——不同相机型号、不同分辨率(433×289 至 5184×3456 像素)、不同曝光和对焦质量、散瞳与非散瞳混合——这些"不完美"恰恰反映了 DR 筛查在基层医疗中的真实挑战。2016 年,Google 团队使用 EyePACS 数据训练的深度学习算法在 JAMA 发表,AUC 达 0.991,该论文已被引用 8,500 余次,成为医学 AI 领域里程碑。
你可以用它来:训练一个 DR 自动分级模型并评估其在临床噪声下的鲁棒性、研究极端类别不平衡(73.5% 为正常)下的学习策略、或者作为预训练数据迁移到其他眼底影像任务。
§1.1 摘要
EyePACS 数据集由 EyePACS LLC(创始人 Jorge Cuadros, OD, PhD)联合 California Health Care Foundation 于 2015 年 2 月在 Kaggle 平台发布,作为"Diabetic Retinopathy Detection"竞赛的训练与测试数据。数据来源于 EyePACS 远程视网膜筛查平台——一个覆盖美国 600+ 社区医疗中心的云端 DR 筛查服务,自 2003 年运营至今已累计超过 100 万次患者检查。数据集包含 35,126 张带标签训练图像和 53,576 张测试图像(竞赛结束后发布标签),每张图像由临床医师按 ICDR 五级量表(0=无 DR, 1=轻度, 2=中度, 3=重度, 4=增殖性)评级。图像采用黄斑中心视角拍摄,分辨率从 433×289 到 5184×3456 像素不等,涵盖多种眼底相机型号,部分图像存在失焦、曝光异常和方向倒置等质量问题。数据集存在显著类别不平衡:训练集中 73.5% 为无 DR,仅 2.0% 为增殖性 DR。
§1.2 战略价值分析
技术创新维度:EyePACS 是首个以"真实世界临床噪声"为特征的大规模 DR 数据集。在此之前,公开的 DR 数据集(如 MESSIDOR 1,200 张、DIARETDB0 130 张)规模小且图像质量高度可控,无法反映基层筛查的实际挑战。EyePACS 打破了"实验室数据"与"临床数据"之间的壁垒——它保留了不同相机型号、不同操作者、不同患者配合度下产生的全部图像质量变异,迫使算法学会在非理想条件下做出可靠判断。这一设计理念直接催生了 2016 年 Google JAMA 论文中对"不可分级图像"的专门处理策略,成为后续医学 AI 鲁棒性研究的范式。
应用影响维度:EyePACS 数据集是 DR 自动筛查从学术研究走向临床落地的关键催化剂。Kaggle 竞赛吸引了 660 支团队参赛,冠军 Benjamin Graham 使用 SparseConvNet + fractional max-pooling 达到 QWK=0.8496,首次证明了深度学习在 DR 分级上可接近人类专家水平。Google 团队随后使用更大规模 EyePACS 数据(128,175 张,54 名眼科医生重复标注 3-7 次)训练的 Inception-v3 算法在 EyePACS-1 验证集上达到 AUC=0.991,直接推动了 IDx-DR(2018 年 FDA 批准的首个自主 AI 诊断设备)等产品的开发。EyePACS 平台本身也已从 2003 年的加州试点扩展到全美 700+ 站点和 6 个国际站点。
§1.3 同类数据集横向对比
| 数据集 | 样本量 | 地域 | 分级标准 | 相机/FOV | 分辨率范围 | 核心差异化 |
|---|---|---|---|---|---|---|
| EyePACS | 88,702 | 美国 | ICDR 5 级 | 多种型号 | 433×289 ~ 5184×3456 | 最大规模 + 真实临床噪声 |
| MESSIDOR | 1,200 | 法国 | 自定义 | Topcon 45° | 1440×960 ~ 2304×1536 | 小规模高质量,含黄斑水肿标注 |
| MESSIDOR-2 | 1,748 | 法国 | 自定义 | Topcon 45° | 同上 | MESSIDOR 扩展版,常作验证集 |
| IDRiD | 516 | 印度 | ICDR 5 级 | Kowa 50° | 4288×2848 | 含病灶级像素标注(微动脉瘤/出血/渗出) |
| APTOS 2019 | 3,662 | 印度 | ICDR 5 级 | 多种 | 474×358 ~ 4288×2848 | Kaggle 竞赛,社区活跃 |
| DDR | 13,673 | 中国 | ICDR 5 级 | 多种 45° | 702×706 ~ 5184×3456 | 含像素级 + 边界框病灶标注 |
| DIARETDB0 | 130 | 芬兰 | 无标准化 | 50° | 1500×1152 | 早期小型数据集 |
| E-ophtha | 381 | 法国 | 无 | N/A | 2048×1360 | 含微动脉瘤精细标注 |
| BRSET | 16,266 | 巴西 | ICDR 5 级 | Nikon/Canon 45° | 951×874 ~ 2984×2304 | 含人口统计元数据 |
§1.4 版本演进时间轴
| 时间 | 事件 |
|---|---|
| 2003 | EyePACS 平台首次部署于加州 UCSF Fresno 社区诊所 |
| 2005 | 与 California Health Care Foundation 合作,在中央谷地 13 个站点试点 |
| 2011 | EyePACS LLC 正式成立(Jorge Cuadros CEO + Wyatt Tellis CIO) |
| 2015-02-17 | Kaggle “Diabetic Retinopathy Detection” 竞赛启动,35,126 张训练图像 + 53,576 张测试图像发布 |
| 2015-07-27 | 竞赛结束,660 支团队参赛,冠军 Benjamin Graham (QWK=0.8496) |
| 2015-07 | 测试集标签(retinopathy_solution.csv)发布 |
| 2016-12 | Gulshan et al. JAMA 论文发表,使用扩展版 EyePACS 数据训练 Inception-v3,AUC=0.991 |
| 2019-06 | EyePACS 平台累计 75 万次患者检查 |
| 2021-10 | EyePACS 平台累计 100 万次患者检查,700+ 站点 |
| 2023-05 | Huang et al. 在 EyePACS 测试集上达到 SOTA QWK=0.8631(ResNet-50 优化训练) |
| 2024 | 社区处理版(HuggingFace bumbledeep/eyepacs)发布:黑边裁剪 + 1024×1024 + 噪声清除 |
§1.5 典型 AI 应用场景
- DR 自动分级:训练端到端 CNN 模型对眼底图像进行 5 级严重程度分类,用于基层医疗 DR 筛查
- 可转诊 DR 检测:将 2 级及以上定义为"可转诊",构建二分类模型实现高灵敏度筛查
- 类别不平衡学习研究:在 73.5% vs 2.0% 的极端不平衡分布下研究损失函数重加权、重采样、焦点损失等策略
- 跨设备泛化性测试:利用多相机型号数据的天然异质性评估模型在不同成像条件下的鲁棒性
- 眼底影像预训练:作为大规模眼底数据用于自监督预训练(SimCLR/MoCo),迁移到其他眼科任务
§2 医学背景(Medical Context)
§2.1 ICD-11 疾病编码
| 维度 | 编码 | 术语 |
|---|---|---|
| 眼部疾病章节 | 9B71 | Disorders of the retina |
| DR 核心编码 | 9B71.1 | Diabetic retinopathy |
| 糖尿病伴眼并发症 | 5A11.2 | Type 2 diabetes mellitus with eye complications |
| 1 型糖尿病伴眼并发症 | 5A00.2 | Type 1 diabetes mellitus with eye complications |
| 糖尿病性黄斑水肿 | 9B71.2 | Diabetic maculopathy |
§2.1b SNOMED CT 映射
| 数据集标签 | ICD-11 | SNOMED CT | SNOMED CT 术语 |
|---|---|---|---|
| Level 0 (No DR) | — | 312871000 | Normal retina finding |
| Level 1 (Mild NPDR) | 9B71.1 | 399061005 | Background diabetic retinopathy |
| Level 2 (Moderate NPDR) | 9B71.1 | 399061005 | Background diabetic retinopathy (moderate) |
| Level 3 (Severe NPDR) | 9B71.1 | 399062003 | Preproliferative diabetic retinopathy |
| Level 4 (Proliferative DR) | 9B71.1 | 399060009 | Proliferative diabetic retinopathy |
§2.2 疾病简介与流行病学
糖尿病视网膜病变(DR)是糖尿病最常见的微血管并发症之一,影响约 40-45% 的糖尿病患者,是全球致盲的主要原因之一。DR 的病理特征包括视网膜微血管瘤、点片状出血、硬性/软性渗出、静脉串珠、视网膜内微血管异常(IRMA)和新生血管形成。早期检测和及时治疗(激光光凝、抗 VEGF 药物注射)可将严重视力丧失风险降低 95% 以上。然而,全球约 4.63 亿糖尿病患者中,仅不到一半能获得定期眼底筛查——这构成了 AI 自动筛查系统的核心应用驱动力。
§2.3 ICDR 五级分级体系
EyePACS 数据集采用国际临床糖尿病视网膜病变(ICDR)严重程度量表进行标注,该量表由美国眼科学会(AAO)推荐,是全球 DR 筛查的通用标准:
| 等级 | 名称 | 临床特征 | 随访建议 |
|---|---|---|---|
| 0 | 无明显视网膜病变 (No DR) | 眼底检查无异常发现 | 每 1-2 年筛查 |
| 1 | 轻度非增殖性 DR (Mild NPDR) | 仅见微血管瘤——DR 最早可检测信号 | 每年复查 |
| 2 | 中度非增殖性 DR (Moderate NPDR) | 微血管瘤 + 点状/片状出血 + 硬性渗出 + 棉绒斑,但未达重度标准 | 每 6-12 个月复查 |
| 3 | 重度非增殖性 DR (Severe NPDR) | “4-2-1 法则”:4 个象限均有出血;或 2+ 象限静脉串珠;或 1+ 象限显著 IRMA | 每 3 个月复查,需转诊 |
| 4 | 增殖性 DR (PDR) | 视盘或视网膜新生血管形成、玻璃体/视网膜前出血 | 立即转诊眼科治疗 |
临床任务定义:EyePACS 数据集的核心 AI 任务是DR 严重程度自动分级——即从彩色眼底照片自动判读 ICDR 0-4 级。衍生任务包括:二分类可转诊 DR 检测(≥2 级 vs <2 级)、图像质量可分级性评估、以及基于左右眼配对的联合诊断。
§2.4 患者人群特征
| 维度 | 特征 |
|---|---|
| 数据来源 | 美国 EyePACS 远程视网膜筛查平台,多个初级保健诊所 |
| 采集时间 | 2015 年前(竞赛发布于 2015-02) |
| 年龄分布 | Gulshan et al. JAMA 2016 报告 EyePACS-1 验证集平均年龄 54.4 岁(SD 11.3) |
| 性别比例 | 女性 62.2%(EyePACS-1 验证集) |
| 种族分布 | 来源覆盖亚洲、欧洲、非洲、美洲土著等多个地区(多族裔人群),但 Kaggle 版本未释放种族元数据 |
| 就医类型 | 门诊/社区筛查(非住院、非急诊) |
| 拍摄条件 | 散瞳与非散瞳混合;黄斑中心视角;不同相机型号和设置 |
§2.5 临床意义
DR 筛查是 AI 在医学影像中最成熟的落地场景之一。糖尿病全球患者超 4.63 亿,其中 40-45% 将发展为 DR,但专业眼科医师在基层和偏远地区严重短缺。EyePACS 数据集的真实临床噪声——来自不同设备、不同操作者、不同患者配合度——恰好反映了基层筛查的实际条件,使其成为验证 AI 算法"走出实验室、进入真实世界"的最佳试验场。2018 年 FDA 批准的首个自主 AI 诊断设备 IDx-DR,其开发历程直接受益于 EyePACS 数据集驱动的算法迭代。
§2.6 金标准 / 参考标准
| 数据划分 | 标注方式 | 标注者 | 金标准性质 |
|---|---|---|---|
| Train (35,126) | 单标注者评级 | 认证临床医师(Kaggle 竞赛版) | 参考标准(单标注者,存在标签噪声风险) |
| Test (53,576) | 单标注者评级 | 认证临床医师(竞赛结束后发布) | 参考标准 |
| EyePACS-1 验证集 (9,963) | 8 名美国认证眼科医生重复标注 | US board-certified ophthalmologists | 近金标准(多数决策,Gulshan et al. JAMA 2016) |
| 扩展训练集 (128,175) | 54 名美国持证眼科医生标注 3-7 次 | US licensed ophthalmologists + senior residents | 金标准(多重标注 + 多数决策,Gulshan et al. JAMA 2016) |
注意:Kaggle 公开版的训练/测试标签均为单一标注者评级,存在标签噪声风险。Gulshan et al. JAMA 2016 使用的是扩展版 EyePACS 数据(128,175 张,54 名眼科医生重复标注),并非直接使用 Kaggle 公开版的 35,126 张训练集。两者常被混淆。
§3 数据集规格(Specifications)
§3.0 版本抉择矩阵
| 你的需求 | 推荐版本 | 大小 | 理由 |
|---|---|---|---|
| 标准 benchmark 复现 / SOTA 论文对比 | Kaggle 原始版 | ~89 GB | 官方 train/test 划分,所有论文基准均基于此版本 |
| 快速入门 / 资源有限 / 原型验证 | HuggingFace bumbledeep/eyepacs | ~6.5 GB | 黑边裁剪 + 1024×1024 + 全黑图像清除,35,108 张训练图像 |
| 高效训练 / 标准化预处理 | Kaggle resized 版 (tanlikesmath) | ~10 GB | 原始图像 + 多分辨率缩放版(512/256),附带 Ben Graham 预处理脚本 |
| 极轻量 / 教学演示 | Kaggle processed-dr (224×224) | ~1 GB | 预处理至 224×224,适合 ImageNet 预训练模型直接微调 |
§3.1 模态详细说明
EyePACS 数据集为彩色眼底摄影(Color Fundus Photography, CFP)影像。每张图像为黄斑中心视角(macula-centered)的二维彩色 JPEG 照片,通过眼底相机拍摄视网膜后极部,可观察到视盘、黄斑、视网膜血管弓及后极部病灶(微血管瘤、出血、渗出等)。图像涵盖散瞳与非散瞳两种条件,使用多种品牌和型号的眼底相机采集(具体型号未随数据集释放),导致分辨率、视野(FOV)、色彩渲染和图像方向存在显著差异。部分图像通过显微镜聚光透镜拍摄,呈现为倒置画面(与解剖学方向相反)。
§3.2 样本数明细
| 数据划分 | 图像数量 | 患者数(估计) | 备注 |
|---|---|---|---|
| 训练集 (Train) | 35,126 | ~17,500 | 每位患者左右眼各一张,带 DR 等级标签 |
| 测试集 (Test) | 53,576 | ~26,700 | 竞赛结束后发布标签 |
| 总计 | 88,702 | ~44,200 | 截至 2015 年发布时为最大公开 DR 数据集 |
训练集 DR 等级分布:
| 等级 | 名称 | 训练集数量 | 训练集占比 | 测试集数量 | 测试集占比 |
|---|---|---|---|---|---|
| 0 | No DR | 25,810 | 73.5% | 39,533 | 73.8% |
| 1 | Mild NPDR | 2,443 | 7.0% | 3,762 | 7.0% |
| 2 | Moderate NPDR | 5,292 | 15.0% | 7,861 | 14.7% |
| 3 | Severe NPDR | 873 | 2.5% | 1,214 | 2.3% |
| 4 | Proliferative DR | 708 | 2.0% | 1,206 | 2.3% |
类别不平衡分析:正常类(Level 0)与最严重类(Level 4)的比例约为 36:1。训练集与测试集的分布高度一致,表明划分时采用了分层抽样。Level 3-4(重度+增殖性)合计仅占 4.5%,这对模型在少数类上的召回率构成严峻挑战。
§3.3 数据格式
| 文件类型 | 格式 | 尺寸 | 说明 |
|---|---|---|---|
| 训练图像 | JPEG | 433×289 ~ 5184×3456 px | 文件名格式:[patient_id]_left.jpeg / [patient_id]_right.jpeg |
| 测试图像 | JPEG | 同上 | 文件名同上格式 |
| 训练标签 | CSV | 35,126 行 | 列:image(文件名), level(0-4) |
| 测试标签 | CSV | 53,576 行 | 文件名:retinopathy_solution.csv,同格式 |
§3.4 存储大小
| 版本 | 压缩大小 | 解压大小 | 说明 |
|---|---|---|---|
| Kaggle 原始训练集 | ~35.3 GB | ~35.3 GB | JPEG 原始分辨率 |
| Kaggle 原始测试集 | ~53.7 GB | ~53.7 GB | JPEG 原始分辨率 |
| HuggingFace bumbledeep | ~6.5 GB | ~6.5 GB | 裁剪+缩放至 1024×1024 |
| Kaggle resized (512px) | ~8 GB | ~8 GB | 多分辨率预缩放版 |
§3.5 标注方式与标注流程
┌─────────────────────────────────────────────────────────────┐
│ EyePACS 标注流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 图像采集 │
│ ├── 患者到社区诊所就诊 │
│ ├── 技师使用眼底相机拍摄黄斑中心照片 │
│ ├── 散瞳或非散瞳(记录不明确) │
│ └── 图像上传至 EyePACS 云平台 │
│ │
│ 2. 临床标注 (Kaggle 竞赛版) │
│ ├── 认证临床医师在 EyePACS 平台上阅片 │
│ ├── 按 ICDR 五级量表评级 (0-4) │
│ ├── ⚠️ 单一标注者评级(无重复标注/无共识机制) │
│ └── 标签导出为 CSV 文件 │
│ │
│ 3. Kaggle 竞赛划分 │
│ ├── 35,126 张 → 训练集(标签公开) │
│ └── 53,576 张 → 测试集(标签竞赛后公开) │
│ │
│ 4. 扩展版 (Gulshan et al. JAMA 2016) │
│ ├── 128,175 张图像 │
│ ├── 54 名美国持证眼科医生 │
│ ├── 每张图像标注 3-7 次 │
│ └── 多数决策作为参考标准 │
│ │
└─────────────────────────────────────────────────────────────┘
关键区分:Kaggle 公开版与 Gulshan JAMA 版使用的标注流程完全不同。Kaggle 版为单一标注者,而 JAMA 版为 54 名眼科医生多重标注 + 多数决策。研究者引用时必须区分使用的是哪个版本。
§3.6 评估指标
EyePACS 竞赛的官方评估指标为二次加权 Kappa(Quadratic Weighted Kappa, QWK),该指标衡量预测等级与真实等级之间的一致性,对偏差越大的错误给予越重的惩罚(权重为偏差的平方)。QWK 范围为 [-1, 1],1 表示完全一致,0 表示随机一致,-1 表示完全相反。
其他常用指标:
- AUC-ROC:二分类可转诊 DR 检测(≥2 vs <2)的标准指标
- Sensitivity / Specificity:临床筛查场景关注高灵敏度(不漏诊)与可接受的特异度
- Top-1 / Top-3 Accuracy:多分类准确率
- Per-class F1 / Recall:少数类(Level 3-4)的检测性能
- Cohen’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’'s Kappa:与 QWK 类似但不加权
§3.7 工具生态
| 工具 | 类型 | 说明 |
|---|---|---|
| Kaggle API | 数据下载 | kaggle competitions download -c diabetic-retinopathy-detection |
| HuggingFace Datasets | 数据加载 | datasets.load_dataset("bumbledeep/eyepacs") |
| PyTorch / torchvision | 框架 | 标准 ImageFolder 加载方式 |
| TensorFlow / Keras | 框架 | tf.keras.utils.image_dataset_from_directory |
| OpenCV | 预处理 | 圆形裁剪、Ben Graham 预处理、CLAHE 增强 |
| Albumentations | 数据增强 | 医学影像专用增强库,支持弹性变换、网格畸变等 |
§3.10 深度溯源链
患者(美国社区诊所糖尿病患者)
└── 技师拍摄眼底照片(多种相机型号)
└── 上传至 EyePACS 云平台
└── 临床医师 ICDR 评级(单标注者)
└── Kaggle 竞赛数据集发布(2015-02-17)
├── 训练集标签公开
└── 测试集标签竞赛后公开(2015-07-27)
└── 社区衍生版本
├── HuggingFace bumbledeep(裁剪+缩放)
├── Kaggle resized(多分辨率)
└── Kaggle processed-dr(224×224 预处理)
§4 数据结构详解(Data Schema)
§4.1 目录树预览
eyepacs/
├── train_images/ # 35,126 张训练图像
│ ├── 10003_left.jpeg
│ ├── 10003_right.jpeg
│ ├── 10004_left.jpeg
│ └── ...
├── test_images/ # 53,576 张测试图像
│ ├── 0_left.jpeg
│ ├── 0_right.jpeg
│ └── ...
├── trainLabels.csv # 训练集标签
│ 列: image, level
│ 示例: 10003_left,2
│ 10003_right,0
│
├── retinopathy_solution.csv # 测试集标签(竞赛后发布)
│ 列: image, level
│
└── sample_submission.csv # 竞赛提交模板
列: image, level
§4.2 DAIMS 标准化数据字典
| 字段名 | 数据类型 | 说明 | 示例值 |
|---|---|---|---|
image |
string | 图像唯一标识符,格式 [patient_id]_[left/right] |
10003_left |
level |
integer | DR 严重程度等级(0-4) | 2 |
image_width |
integer | 图像宽度(像素,需从 JPEG 读取) | 5184 |
image_height |
integer | 图像高度(像素,需从 JPEG 读取) | 3456 |
image_format |
string | 图像格式 | JPEG |
laterality |
string | 眼别(从文件名解析) | left / right |
patient_id |
integer | 患者编号(从文件名解析) | 10003 |
注意:EyePACS Kaggle 版本不包含以下元数据:拍摄日期、相机型号/品牌、患者年龄、性别、种族、糖尿病类型/病程、散瞳状态、图像质量评分。这些信息的缺失是数据集的主要局限之一。
§4.3 标签分布可视化
训练集 DR 等级分布 (n=35,126)
Level 0 (No DR) ████████████████████████████████████████ 25,810 (73.5%)
Level 1 (Mild) ███ 2,443 ( 7.0%)
Level 2 (Moderate) ███████ 5,292 (15.0%)
Level 3 (Severe) █ 873 ( 2.5%)
Level 4 (Proliferative)█ 708 ( 2.0%)
不平衡比: Level 0 : Level 4 ≈ 36:1
Level 0 : Level 3+4 ≈ 16:1
Level 0 : Level 1-4 ≈ 2.8:1
§4.4 图像质量分布
基于社区分析和文献报告的图像质量特征:
| 质量维度 | 特征 | 影响 |
|---|---|---|
| 分辨率 | 433×289 至 5184×3456,差异超过 100 倍 | 需统一缩放;高分辨率图像可能被降采样丢失细节 |
| 对焦 | 部分图像失焦或模糊 | 微小病灶(微血管瘤)可能不可见,影响 Level 1 判断 |
| 曝光 | 部分图像曝光不足或过度 | 视网膜血管和病灶对比度下降 |
| 方向 | 部分图像倒置(显微镜聚光透镜视角) | 左右眼方向不一致,影响配对分析 |
| 黑边 | 多数图像有不同程度的黑色背景区域 | 需圆形裁剪以去除无效区域 |
| 全黑图像 | 少量图像接近全黑 | 无效数据,需人工或自动清除 |
| 可分级性 | 约 12-25% 图像质量不理想 | Gulshan JAMA 报告 EyePACS-1 验证集仅 88.4% 完全可分级 |
§4.5 缺失数据说明
| 缺失维度 | 说明 | 处理建议 |
|---|---|---|
| 人口统计 | 无年龄、性别、种族信息 | 无法进行人口统计学公平性分析 |
| 相机元数据 | 无 EXIF、型号、设置信息 | 无法按设备分层分析 |
| 散瞳状态 | 未标注散瞳/非散瞳 | 无法控制瞳孔大小对图像质量的影响 |
| 标注者信息 | 未标注具体标注者身份 | 无法分析标注者间差异 |
| 图像质量标签 | 未标注可分级/不可分级 | 需自动质量评估或人工筛查 |
| DME 标签 | 无糖尿病性黄斑水肿标注 | 无法评估 DME,仅能做 DR 分级 |
§5 数据划分与使用建议(Splits & Usage)
§5.1 官方划分
EyePACS 数据集提供训练集 / 测试集二分划分,无独立验证集:
| 划分 | 图像数 | 标签状态 | 用途 |
|---|---|---|---|
| 训练集 | 35,126 | 公开 | 模型训练 + 自定义验证集划分 |
| 测试集 | 53,576 | 竞赛后公开 | 最终性能评估(Kaggle 私有排行榜使用 80%) |
Kaggle 竞赛测试集划分:竞赛期间,测试集进一步分为公开排行榜(20%,竞赛期间可见)和私有排行榜(80,竞赛结束后才公开)。最终排名基于私有排行榜。
§5.2 自定义验证集策略
由于官方未提供验证集,研究者需从训练集中自行划分。推荐策略:
| 策略 | 方法 | 优点 | 缺点 |
|---|---|---|---|
| 患者级分层划分 | 按 patient_id 分组,确保同一患者的左右眼不同时出现在训练和验证中 | 避免数据泄漏 | 实现稍复杂 |
| 分层随机划分 | 按 DR 等级分层,随机取 10-20% | 简单易行 | 存在数据泄漏风险(同一患者双眼分别进入训练/验证) |
| K 折交叉验证 | 5 折或 10 折 | 充分利用数据 | 计算成本高 |
⚠️ 数据泄漏警告:EyePACS 中每位患者有左右眼两张图像,同一患者的双眼图像高度相关。如果训练集包含左眼、验证集包含右眼,会导致验证性能被高估。务必使用患者级划分。
§5.3 测试集使用规范
- 标准评估:在全部 53,576 张测试图像上计算 QWK,与文献对比
- 二分类评估:将 Level ≥2 定义为"可转诊 DR",计算 AUC-ROC / Sensitivity / Specificity
- Huang et al. 2023 使用 42,670 张测试图像(排除不可分级图像),达到 SOTA QWK=0.8631
§5.4 外部验证建议
| 验证集 | 图像数 | 地域 | 用途 |
|---|---|---|---|
| MESSIDOR-2 | 1,748 | 法国 | 跨地域/跨设备泛化性验证 |
| IDRiD | 516 | 印度 | 单相机高分辨率场景验证 |
| APTOS 2019 | 3,662 | 印度 | 跨人群泛化性验证 |
| DDR | 13,673 | 中国 | 跨地域大规模验证 |
| BRSET | 16,266 | 巴西 | 含人口统计元数据的公平性验证 |
§6 AI 就绪指南(AI-Ready Guide)
§6.0 云端快速启动
<details>
<summary>Quick Start: EyePACS 数据加载与基线训练</summary>
# === EyePACS 快速启动 ===
# 前置: pip install kaggle torch torchvision pandas Pillow
import os
import pandas as pd
import torch
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms, models
from PIL import Image
# 1. 下载数据 (需 Kaggle API Token)
# kaggle competitions download -c diabetic-retinopathy-detection
# 2. 加载标签
train_labels = pd.read_csv(''''''''''''''''''''''''''''''''trainLabels.csv'''''''''''''''''''''''''''''''')
print(f"训练集: {len(train_labels)} 张图像")
print(train_labels[''''''''''''''''''''''''''''''''level''''''''''''''''''''''''''''''''].value_counts().sort_index())
# 3. 患者级划分 (防止数据泄漏!)
train_labels[''''''''''''''''''''''''''''''''patient_id''''''''''''''''''''''''''''''''] = train_labels[''''''''''''''''''''''''''''''''image''''''''''''''''''''''''''''''''].str.split(''''''''''''''''''''''''''''''''_'''''''''''''''''''''''''''''''').str[0]
unique_patients = train_labels[''''''''''''''''''''''''''''''''patient_id''''''''''''''''''''''''''''''''].unique()
from sklearn.model_selection import train_test_split
train_pids, val_pids = train_test_split(unique_patients, test_size=0.15, random_state=42)
train_df = train_labels[train_labels[''''''''''''''''''''''''''''''''patient_id''''''''''''''''''''''''''''''''].isin(train_pids)]
val_df = train_labels[train_labels[''''''''''''''''''''''''''''''''patient_id''''''''''''''''''''''''''''''''].isin(val_pids)]
print(f"训练: {len(train_df)}, 验证: {len(val_df)}")
# 4. 图像预处理 (Ben Graham 风格)
def ben_graham_preprocess(img, sigma=10):
"""局部对比度增强: 减去高斯模糊背景"""
import cv2
import numpy as np
img_np = np.array(img)
blur = cv2.GaussianBlur(img_np, (0, 0), sigma)
adjusted = cv2.addWeighted(img_np, 4, blur, -4, 128)
return Image.fromarray(adjusted)
# 5. PyTorch Dataset
class EyePACSDataset(Dataset):
def __init__(self, df, img_dir, transform=None, preprocess=None):
self.df = df.reset_index(drop=True)
self.img_dir = img_dir
self.transform = transform
self.preprocess = preprocess
def __len__(self):
return len(self.df)
def __getitem__(self, idx):
row = self.df.iloc[idx]
img_path = os.path.join(self.img_dir, row[''''''''''''''''''''''''''''''''image''''''''''''''''''''''''''''''''] + ''''''''''''''''''''''''''''''''.jpeg'''''''''''''''''''''''''''''''')
img = Image.open(img_path).convert(''''''''''''''''''''''''''''''''RGB'''''''''''''''''''''''''''''''')
if self.preprocess:
img = self.preprocess(img)
if self.transform:
img = self.transform(img)
return img, int(row[''''''''''''''''''''''''''''''''level''''''''''''''''''''''''''''''''])
# 6. 数据增强
train_transform = transforms.Compose([
transforms.Resize((512, 512)),
transforms.RandomHorizontalFlip(),
transforms.RandomRotation(15),
transforms.ColorJitter(brightness=0.2, conevent-blocked=0.2),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])
val_transform = transforms.Compose([
transforms.Resize((512, 512)),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])
# 7. 基线模型: ResNet-50
model = models.resnet50(pretrained=True)
model.fc = torch.nn.Linear(model.fc.in_features, 5)
model = model.cuda()
# 8. 训练配置 (参考 Huang et al. 2023 SOTA)
criterion = torch.nn.MSELoss() # MSE loss 对 QKB 优化更有效
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-4, weight_decay=1e-4)
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=30)
print("✅ 环境就绪,开始训练!")
</details>
§6.1 预处理 Pipeline
<details>
<summary>标准预处理流程(圆形裁剪 + Ben Graham 增强)</summary>
import cv2
import numpy as np
from PIL import Image
def crop_black_borders(img, tolerance=7):
"""裁剪黑色背景区域,保留圆形眼底有效区域"""
if len(img.shape) == 3:
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
else:
gray = img
mask = gray > tolerance
coords = np.argwhere(mask)
if len(coords) == 0:
return img # 全黑图像,返回原始
y0, x0 = coords.min(axis=0)
y1, x1 = coords.max(axis=0) + 1
return img[y0:y1, x0:x1]
def ben_graham_enhancement(img, sigma=10):
"""Ben Graham 预处理: 局部对比度增强"""
blur = cv2.GaussianBlur(img, (0, 0), sigma)
return cv2.addWeighted(img, 4, blur, -4, 128)
def resize_with_pad(img, target_size=512):
"""等比缩放并填充至正方形"""
h, w = img.shape[:2]
scale = target_size / max(h, w)
new_h, new_w = int(h * scale), int(w * scale)
img = cv2.resize(img, (new_w, new_h))
pad_h = target_size - new_h
pad_w = target_size - new_w
top = pad_h // 2
bottom = pad_h - top
left = pad_w // 2
right = pad_w - left
return cv2.copyMakeBorder(img, top, bottom, left, right,
cv2.BORDER_CONSTANT, value=[0, 0, 0])
def full_preprocessing(img_path, target_size=512):
"""完整预处理 Pipeline"""
img = cv2.imread(img_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = crop_black_borders(img)
img = ben_graham_enhancement(img)
img = resize_with_pad(img, target_size)
return img
# 批量处理
import glob
from tqdm import tqdm
import os
input_dir = ''''''''''''''''''''''''''''''''train_images/''''''''''''''''''''''''''''''''
output_dir = ''''''''''''''''''''''''''''''''train_images_processed/''''''''''''''''''''''''''''''''
os.makedirs(output_dir, exist_ok=True)
for img_path in tqdm(glob.glob(os.path.join(input_dir, ''''''''''''''''''''''''''''''''*.jpeg''''''''''''''''''''''''''''''''))):
filename = os.path.basename(img_path)
processed = full_preprocessing(img_path, target_size=512)
cv2.imwrite(os.path.join(output_dir, filename),
cv2.cvtColor(processed, cv2.COLOR_RGB2BGR))
</details>
§6.2 PyTorch 训练模板
<details>
<summary>完整训练循环(含类别不平衡处理 + QWK 评估)</summary>
import torch
import torch.nn as nn
from torch.utils.data import DataLoader
from sklearn.metrics import cohen_kappa_score
import numpy as np
# === 类别加权 (处理 36:1 不平衡) ===
class_counts = [25810, 2443, 5292, 873, 708]
class_weights = 1.0 / np.array(class_counts)
class_weights = class_weights / class_weights.sum()
class_weights = torch.FloatTensor(class_weights).cuda()
# === 训练循环 ===
def train_one_epoch(model, loader, optimizer, criterion, device):
model.train()
total_loss = 0
for images, labels in loader:
images, labels = images.to(device), labels.float().to(device)
optimizer.zero_grad()
outputs = model(images).squeeze()
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
total_loss += loss.item()
return total_loss / len(loader)
# === QWK 评估 ===
def evaluate_qwk(model, loader, device):
model.eval()
all_preds, all_labels = [], []
with torch.no_grad():
for images, labels in loader:
images = images.to(device)
outputs = model(images).squeeze()
if outputs.dim() > 1:
preds = outputs.argmax(dim=1)
else:
preds = outputs.round().clamp(0, 4).int()
all_preds.extend(preds.cpu().numpy())
all_labels.extend(labels.numpy())
return cohen_kappa_score(all_labels, all_preds, weights=''''''''''''''''''''''''''''''''quadratic'''''''''''''''''''''''''''''''')
# === 完整训练流程 ===
best_qwk = 0
for epoch in range(30):
train_loss = train_one_epoch(model, train_loader, optimizer, criterion, ''''''''''''''''''''''''''''''''cuda'''''''''''''''''''''''''''''''')
val_qwk = evaluate_qwk(model, val_loader, ''''''''''''''''''''''''''''''''cuda'''''''''''''''''''''''''''''''')
scheduler.step()
print(f"Epoch {epoch+1}: Loss={train_loss:.4f}, Val QWK={val_qwk:.4f}")
if val_qwk > best_qwk:
best_qwk = val_qwk
torch.save(model.state_dict(), ''''''''''''''''''''''''''''''''best_eyepacs_model.pth'''''''''''''''''''''''''''''''')
print(f"Best Val QWK: {best_qwk:.4f}")
# === 测试集评估 ===
model.load_state_dict(torch.load(''''''''''''''''''''''''''''''''best_eyepacs_model.pth''''''''''''''''''''''''''''''''))
test_qwk = evaluate_qwk(model, test_loader, ''''''''''''''''''''''''''''''''cuda'''''''''''''''''''''''''''''''')
print(f"Test QWK: {test_qwk:.4f}")
</details>
§6.3 坑点与解决方案
| # | 坑点 | 严重度 | 解决方案 |
|---|---|---|---|
| 1 | 数据泄漏:同一患者左右眼分别进入训练/验证集 | 🔴 高 | 使用 patient_id 做患者级划分,而非随机划分 |
| 2 | 极端类别不平衡:Level 0:Level 4 = 36:1 | 🔴 高 | MSE loss(Huang 2023 证明优于 CE)+ 不使用过采样(过采样反而降低性能) |
| 3 | 图像方向不一致:部分图像倒置 | 🟡 中 | 检测并统一方向;或使用旋转增强让模型学习不变性 |
| 4 | 全黑/近全黑图像 | 🟡 中 | 使用阈值过滤或圆形检测清除无效图像 |
| 5 | 分辨率差异 100 倍 | 🟡 中 | 统一缩放至 512×512;Ben Graham 预处理增强对比度 |
| 6 | 标签噪声(单标注者) | 🟡 中 | 使用 label smoothing 或 Cleanlab 标签清洗框架 |
| 7 | QWK 优化:CE loss 不直接优化 QWK | 🟡 中 | 使用 MSE loss 或 Ordinal Regression loss |
| 8 | 左右眼配对信息未利用 | 🟢 低 | 参考冠军方案:训练两个独立 CNN + Random Forest 融合双眼预测 |
| 9 | 测试集过大(53,576 张) | 🟢 低 | 分批推理,注意 GPU 显存管理 |
| 10 | 许可证限制:不可再分发原始图像 | 🟡 中 | 使用 HuggingFace 处理版或引用 Kaggle 原始链接 |
§6.4 数据增强策略
| 策略 | 推荐度 | 说明 |
|---|---|---|
| 随机水平翻转 | ⭐⭐⭐⭐⭐ | 左右眼均可翻转,不影响病灶检测 |
| 随机旋转 (±15°) | ⭐⭐⭐⭐⭐ | 模拟头位变化 |
| 颜色抖动 | ⭐⭐⭐⭐ | 模拟不同相机色彩渲染 |
| 随机缩放 + 裁剪 | ⭐⭐⭐⭐ | 模拟不同分辨率和视野 |
| Ben Graham 增强 | ⭐⭐⭐⭐⭐ | 局部对比度增强,显著提升微血管瘤可见度 |
| 弹性变形 | ⭐⭐⭐ | 谨慎使用,可能产生不真实的病灶 |
| MixUp / CutMix | ⭐⭐⭐ | 对极端不平衡类有帮助 |
| 过采样少数类 | ⭐ | ⚠️ Huang 2023 证明有害,不建议使用 |
§6.5 模型推荐
| 模型 | 参数量 | 推荐场景 | 备注 |
|---|---|---|---|
| ResNet-50 | 25.6M | 通用基线 / SOTA 复现 | Huang 2023 达到 QWK=0.8631 |
| EfficientNet-B4 | 19M | 效率优先 | DRFEC 研究: 79.11% val accuracy |
| Inception-V3 | 24M | 迁移学习 | Gulshan JAMA 使用的基础架构 |
| SparseConvNet | 变化 | 高分辨率输入 | 冠军方案,支持空间稀疏卷积 |
| DINOv2 ViT-B/14 | 86M | 最新 SOTA 方向 | DRStageNet2 使用,需大规模预训练 |
| CE-Net | — | DR 专用架构 | 含上下文聚合模块 |
§6.6 计算需求
| 配置 | 最低要求 | 推荐配置 |
|---|---|---|
| GPU | 1× RTX 3060 (12GB) | 1× RTX 4090 (24GB) 或 A100 |
| RAM | 32 GB | 64 GB |
| 存储 | 100 GB(原始 + 处理) | 200 GB SSD |
| 训练时间 | ~12h(ResNet-50, 512px, 30 epoch) | ~6h(A100, 512px) |
§6.7 评估指标代码
<details>
<summary>QWK + 二分类 AUC + Per-class 指标计算</summary>
import numpy as np
from sklearn.metrics import (
cohen_kappa_score, roc_auc_score, classification_report,
confusion_matrix, accuracy_score
)
def comprehensive_evaluation(y_true, y_pred_proba, threshold_binary=2):
"""EyePACS 综合评估"""
y_pred = y_pred_proba.argmax(axis=1)
# 1. QWK (官方指标)
qwk = cohen_kappa_score(y_true, y_pred, weights=''''''''''''''''''''''''''''''''quadratic'''''''''''''''''''''''''''''''')
print(f"Quadratic Weighted Kappa (QWK): {qwk:.4f}")
# 2. 二分类可转诊 DR (Level >= 2)
y_binary_true = (np.array(y_true) >= threshold_binary).astype(int)
y_binary_proba = y_pred_proba[:, threshold_binary:].sum(axis=1)
auc = roc_auc_score(y_binary_true, y_binary_proba)
print(f"AUC-ROC (Referable DR, >=Level 2): {auc:.4f}")
# 3. Per-class 指标
print("\nPer-class Report:")
print(classification_report(y_true, y_pred,
target_names=[''''''''''''''''''''''''''''''''No DR'''''''''''''''''''''''''''''''', ''''''''''''''''''''''''''''''''Mild'''''''''''''''''''''''''''''''', ''''''''''''''''''''''''''''''''Moderate'''''''''''''''''''''''''''''''', ''''''''''''''''''''''''''''''''Severe'''''''''''''''''''''''''''''''', ''''''''''''''''''''''''''''''''Proliferative'''''''''''''''''''''''''''''''']))
# 4. 混淆矩阵
cm = confusion_matrix(y_true, y_pred)
print("\nConfusion Matrix:")
print(cm)
# 5. 少数类召回率 (Level 3-4)
minority_recall = cm[3:, 3:].diagonal().sum() / cm[3:].sum()
print(f"\nMinority Recall (Level 3+4): {minority_recall:.4f}")
return {''''''''''''''''''''''''''''''''qwk'''''''''''''''''''''''''''''''': qwk, ''''''''''''''''''''''''''''''''auc'''''''''''''''''''''''''''''''': auc, ''''''''''''''''''''''''''''''''minority_recall'''''''''''''''''''''''''''''''': minority_recall}
</details>
§7 质量评估与局限性(Quality & Limitations)
§7.1 类别不平衡偏倚
EyePACS 数据集存在极端类别不平衡:Level 0(无 DR)占 73.5%,而 Level 4(增殖性 DR)仅占 2.0%,比例为 36:1。这种不平衡会导致:
- 模型倾向于预测多数类(Level 0),在少数类上召回率低
- 标准交叉熵损失被多数类主导,少数类梯度信号微弱
- 临床后果:增殖性 DR(最需紧急转诊)最容易被漏诊
已验证的缓解策略(Huang et al. 2023):
- ✅ 使用 MSE loss 替代 CE loss(直接优化 QWK)
- ✅ 利用左右眼配对信息
- ❌ 过采样少数类——反而降低性能
- ❌ 重加权——效果不显著
§7.2 图像质量偏倚
约 12-25% 的图像质量不理想(失焦、曝光异常、全黑),这些图像:
- 集中在特定相机型号或操作者,引入系统性偏倚
- 可能被标注者判为更高级别("看不清就判更严重"倾向,PMC 研究证实)
- 导致模型学习到"质量差 = DR 严重"的错误关联
§7.3 标注噪声
Kaggle 版本为单一标注者评级,存在以下风险:
- 不同标注者对同一图像的 DR 分级一致性仅 κ=0.49(中等一致性,PMC 研究)
- 图像质量差时一致性进一步下降(κ=0.27)
- 汕头国际眼科中心使用 Cleanlab 框架发现 EyePACS 存在可检测的标签错误(Lin et al., npj Digital Medicine)
- Gulshan JAMA 扩展版使用 54 名眼科医生重复标注 3-7 次 + 多数决策,显著提升了标签质量——但该版本未公开发布
§7.4 地域与设备偏倚
- 所有图像来自美国社区诊所,可能不适用于其他地区的筛查场景
- 多种相机型号混合,但具体型号未标注,无法按设备分层分析
- 散瞳与非散瞳混合,瞳孔大小对图像质量和病灶可见性有显著影响
§7.5 缺失元数据偏倚
数据集不包含人口统计信息(年龄、性别、种族),无法:
- 评估模型在不同人口群体间的公平性
- 分析 DR 在不同种族/年龄段中的分布差异
- 进行公平性审计(fairness audit)
§7.6 时间偏倚
数据采集于 2015 年前,相机技术和筛查流程可能已发生变化。模型在 newer 数据上的表现可能下降。
§7.7 DAIMS 24 项数据就绪度评估
| # | DAIMS 评估项 | 状态 | 说明 |
|---|---|---|---|
| 1 | 数据集目的与组成 | ✅ | 明确的 DR 分级目的,组成清晰 |
| 2 | 数据采集流程 | ✅ | EyePACS 平台采集,美国社区诊所 |
| 3 | 标注方式与标注者 | ⚠️ | 单标注者,无重复标注(Kaggle 版) |
| 4 | 标注质量控制 | ❌ | 无系统性质量控制流程文档 |
| 5 | 数据预处理 | ⚠️ | 原始临床图像,无标准化预处理 |
| 6 | 数据清洗 | ❌ | 无系统性清洗,保留噪声图像 |
| 7 | 去标识化 | ✅ | HIPAA 合规去标识化 |
| 8 | 伦理审查 | ✅ | California Health Care Foundation 资助,IRB 批准 |
| 9 | 人口统计代表性 | ⚠️ | 多族裔来源但无元数据释放 |
| 10 | 数据划分 | ✅ | 官方 train/test 划分(分层抽样) |
| 11 | 缺失数据处理 | ⚠️ | 不可分级图像未单独标注 |
| 12 | 标注偏倚 | ⚠️ | 单标注者,标签噪声已记录 |
| 13 | 已知偏倚 | ✅ | 类别不平衡、图像质量变异充分记录 |
| 14 | 数据规模充分性 | ✅ | 88,702 张,当时最大公开 DR 数据集 |
| 15 | 数据格式 | ✅ | JPEG + CSV,标准格式 |
| 16 | 元数据完整性 | ❌ | 无人口统计、相机、散瞳状态等元数据 |
| 17 | 版本控制 | ⚠️ | 单一版本,无更新 |
| 18 | 可访问性 | ✅ | Kaggle 免费注册下载 |
| 19 | 许可证 | ⚠️ | Kaggle 竞赛条款,禁止再分发 |
| 20 | 维护计划 | ❌ | 自 2015 年以来无更新 |
| 21 | 可复现性 | ✅ | 固定数据集,固定划分 |
| 22 | 外部验证 | ✅ | 被数百篇论文广泛验证 |
| 23 | 偏倚缓解 | ⚠️ | 偏倚已记录但数据集本身未做缓解 |
| 24 | 数据溯源 | ✅ | EyePACS 平台,Cuadros 为共同作者 |
评估总结:EyePACS 在数据规模、可访问性和可复现性方面表现优秀,作为 DR 检测领域的奠基性数据集具有不可替代的历史地位。主要扣分集中在标注质量控制(单标注者)、元数据完整性(无人口统计/设备信息)和版本维护(无更新)三个方面。尽管存在这些局限,其"真实世界临床噪声"特性恰恰是其最大价值——它让算法在最具挑战性的条件下接受检验。
DAIMS 评分:16/24(66.7%,⭐⭐⭐⭐ 4/5)
§7.8 外部验证矩阵
| 验证集 | 来源 | 图像数 | 地域 | 典型 AUC | 说明 |
|---|---|---|---|---|---|
| EyePACS-1 | Gulshan JAMA 2016 | 9,963 | 美国 | 0.991 | 8 名眼科医生标注 |
| MESSIDOR-2 | 法国 | 1,748 | 法国 | 0.990 | 7 名眼科医生标注 |
| IDRiD | 印度 | 516 | 印度 | 0.74-0.95 | 单相机高分辨率 |
| APTOS 2019 | 印度 | 3,662 | 印度 | 0.94-0.95 | 多条件混合 |
| DDR | 中国 | 13,673 | 中国 | — | 含像素级标注 |
| BRSET | 巴西 | 16,266 | 巴西 | — | 含人口统计 |
§8 基准性能与生态(Benchmarks & Ecosystem)
§8.1 排行榜
| 排名 | 方法 | 年份 | 模型 | QWK | 说明 |
|---|---|---|---|---|---|
| 1 | Huang et al. | 2023 | ResNet-50 (优化训练) | 0.8631 | SOTA (image-level only);MSE loss + eye pairs + 无过采样 |
| 2 | Benjamin Graham (冠军) | 2015 | SparseConvNet + FMP | 0.8496 | Kaggle 竞赛冠军;fractional max-pooling + 3 CNN 集成 |
| 3 | Gulshan et al. | 2016 | Inception-v3 | — | AUC=0.991 (二分类可转诊 DR);54 名医生标注 |
| 4 | DRStageNet2 | 2025 | DINOv2 ViT-B/14 | — | 最新方向;多源域训练 |
| 5 | DRFEC (EfficientNet-B4) | 2023 | EfficientNet-B4 | — | 79.11% val accuracy;26 种 CNN 对比 |
| 6 | CIRCLe | 2022 | ResNet + Contrastive | — | 对比学习框架 |
| — | Kaggle 竞赛平均 | 2015 | — | 0.1598 | 660 支团队平均 |
| — | Kaggle QWK>0.10 团队平均 | 2015 | — | 0.4267 | 236 支团队 |
QWK 解读:QWK > 0.81 为"几乎完全一致",0.61-0.80 为"高度一致",0.41-0.60 为"中度一致"。冠军 0.8496 接近人类专家间一致性水平。
§8.2 SOTA 方法分析
Huang et al. 2023 (SOTA, QWK=0.8631):
- 基础架构:ResNet-50(无特殊设计)
- 关键发现:(1) MSE loss 优于 CE loss;(2) 左右眼配对提升性能;(3) 过采样有害;(4) 输入分辨率和增强组合敏感
- 代码开源:https://github.com/heyufan495/DRGrading
Benjamin Graham 2015 (冠军, QWK=0.8496):
- 架构:3 个 SparseConvNet + fractional max-pooling
- 预处理:缩放至 300×300,局部均值色减除,90% 视网膜裁剪
- 增强:随机缩放、旋转、倾斜
- 后处理:Random Forest 融合双眼预测
§8.3 评测协议
| 协议 | 测试集 | 指标 | 说明 |
|---|---|---|---|
| Kaggle 官方 | 53,576 张(80% 私有) | QWK | 竞赛标准 |
| Huang 2023 | 42,670 张(排除不可分级) | QWK | SOTA 标准评估 |
| 二分类评估 | 同上 | AUC-ROC | Level ≥2 为可转诊 |
| 跨数据集验证 | MESSIDOR-2 / IDRiD | AUC-ROC | 泛化性评估 |
§8.4 相关数据集
| 数据集 | 关系 | 说明 |
|---|---|---|
| MESSIDOR / MESSIDOR-2 | 互补验证 | 法国数据集,常作外部验证集 |
| IDRiD | 互补标注 | 印度数据集,含像素级病灶标注 |
| APTOS 2019 | 同质竞争 | 印度 Kaggle 竞赛,同为 ICDR 5 级 |
| DDR | 互补标注 | 中国数据集,含像素级 + 边界框标注 |
| BRSET | 公平性补充 | 巴西数据集,含人口统计元数据 |
| EyePACS-1 (Gulshan) | 扩展版 | 9,963 张,8 名眼科医生标注,非公开 |
§8.5 生态快照
┌─────────────────────────────────────────────────────────────────┐
│ EyePACS 数据生态 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 数据源层 │
│ ├── EyePACS LLC 平台 (600+ 站点, 1M+ 检查, 5M+ 图像) │
│ ├── California Health Care Foundation (资助方) │
│ └── Jorge Cuadros, OD, PhD (创始人/CEO) │
│ │
│ 数据集层 │
│ ├── Kaggle 竞赛版 (88,702 张, 2015) │
│ ├── EyePACS-1 验证集 (9,963 张, Gulshan JAMA 2016) │
│ └── 社区处理版 (HuggingFace bumbledeep, resized, processed) │
│ │
│ 算法层 │
│ ├── Kaggle 竞赛 (660 团队, 冠军 SparseConvNet) │
│ ├── Google JAMA (Inception-v3, AUC=0.991) │
│ ├── SOTA: Huang 2023 (ResNet-50, QWK=0.8631) │
│ └── 最新: DRStageNet2 (DINOv2 ViT-B/14, 2025) │
│ │
│ 临床落地层 │
│ ├── IDx-DR (FDA 首批自主 AI 诊断设备, 2018) │
│ ├── EyeArt (FDA 批准, 自 动 DR 筛查) │
│ └── EyePACS 平台 (700+ 站点持续运营) │
│ │
│ 研究社区 │
│ ├── 8,500+ 引用 (Gulshan JAMA 2016) │
│ ├── 数百篇 DR 检测论文的基准数据集 │
│ └── Kaggle 最受欢迎医学竞赛之一 │
│ │
└─────────────────────────────────────────────────────────────────┘
§8.6 社区影响
-
Google Scholar 引用:Gulshan et al. JAMA 2016 被引用 8,500+ 次,是医学 AI 领域被引最高的论文之一
-
Kaggle 竞赛:660 支团队参赛,是 Kaggle 平台史上最具影响力的医学影像竞赛
-
临床产品:直接催生了 IDx-DR(2018 年 FDA 批准的首个自主 AI 诊断设备)和 EyeArt 等商业产品
-
研究范式:确立了"真实世界临床噪声数据 + 深度学习"的研究范式,影响后续所有医学影像 AI 数据集的设计理念
-
公平性讨论:因缺乏种族元数据,引发了医学 AI 数据集应包含哪些元数据的广泛讨论
§9 相关资源与引用(Resources & Citation)
§9.1 引用信息
数据集引用(Kaggle 竞赛):
@misc{eyepacs2015,
title={Diabetic Retinopathy Detection},
author={Dugas, Emma and Jared and Jorge, Cuadros and Cukierski, Will},
year={2015},
howpublished={Kaggle Competition},
url={https://www.kaggle.com/c/diabetic-retinopathy-detection}
}
Gulshan et al. JAMA 2016 引用:
@article{gulshan2016development,
title={Development and Validation of a Deep Learning Algorithm for Detection of Diabetic Retinopathy in Retinal Fundus Photographs},
author={Gulshan, Varun and Peng, Lily and Coram, Marc and Stumpe, Martin C and Wu, Derek and Narayanaswamy, Arunachalam and Venugopalan, Subhashini and Widner, Kasumi and Madams, Tom and Cuadros, Jorge and Kim, Ramasamy and Raman, Rajiv and Nelson, Philip C and Mega, Jessica L and Webster, Dale R},
journal={JAMA},
volume={316},
number={22},
pages={24022410},
year={2016},
doi={10.1001/jama.2016.17216}
}
Huang et al. 2023 SOTA 引用:
@article{huang2023identifying,
title={Identifying the Key Components in ResNet-50 for Diabetic Retinopathy Grading from Fundus Images: A Systematic Investigation},
author={Huang, Yijin and Lin, Li and Cheng, Pujin and Lyu, Junyan and Tam, Roger and Tang, Xiaoying},
journal={Diagnostics},
volume={13},
number={10},
pages={1664},
year={2023},
doi={10.3390/diagnostics13101664}
}
Benjamin Graham 冠军方案引用:
@techreport{graham2015kaggle,
title={Kaggle Diabetic Retinopathy Detection Competition Report},
author={Graham, Benjamin},
year={2015},
institution={University of Warwick},
url={https://github.com/btgraham/SparseConvNet}
}
§9.2 官方资源链接
| 资源 | URL |
|---|---|
| Kaggle 竞赛页 | https://www.kaggle.com/c/diabetic-retinopathy-detection |
| 数据下载 | https://www.kaggle.com/c/diabetic-retinopathy-detection/data |
| EyePACS 官网 | https://www.eyepacs.com/ |
| EyePACS 数据分析 | https://www.eyepacs.com/data-analysis |
| HuggingFace 处理版 | https://huggingface.co/datasets/bumbledeep/eyepacs |
| SparseConvNet (冠军) | https://github.com/btgraham/SparseConvNet |
| Huang 2023 代码 | https://github.com/heyufan495/DRGrading |
| Gulshan JAMA 论文 | https://jamanetwork.com/journals/jama/fullarticle/2588763 |
§9.3 许可证说明
EyePACS 数据集通过 Kaggle 竞赛条款授权,具体限制包括:
- ✅ 允许:学术研究、教育用途、Kaggle 竞赛参与
- ❌ 禁止:再分发原始图像、商业用途(未经授权)、移除水印或标识
- ⚠️ 限制:在论文中使用图像需遵守 Kaggle 社区准则
社区处理版(HuggingFace)的许可证因处理者而异(MIT / Apache 2.0 / CC0),但原始图像版权仍归 EyePACS LLC 所有。
§9.4 变更日志
| 日期 | 变更 |
|---|---|
| 2015-02-17 | Kaggle 竞赛启动,训练集发布 |
| 2015-07-27 | 竞赛结束,测试集标签发布 |
| 2016-12-13 | Gulshan et al. JAMA 论文发表(扩展版数据) |
| 2023-05-09 | Huang et al. SOTA 论文发表 |
| 2024 | 社区处理版在 HuggingFace 发布 |
§10 AI 使用声明卡
| 声明项 | 内容 |
|---|---|
| 页面状态 | published |
| AI 生成声明 | 本页面的技术描述、代码示例和分析由 AI 辅助生成,经千方病案医学编辑部交叉审核后发布 |
| 数据时效性 | 数据集信息截至 2026-08;引用数据截至 2026-07 |
| 输入校验 | ✓ Kaggle 竞赛页数据核验 ✓ Gulshan JAMA 2016 论文核验 ✓ Huang 2023 SOTA 核验 ✓ ICDR 分级标准核验 ✓ EyePACS 平台历史核验 |
§10.4 人工校验表
| 校验项 | 状态 | 备注 |
|---|---|---|
| ICD-11 编码映射 | ✅ | 9B71.1 糖尿病视网膜病变 |
| SNOMED CT 映射 | ✅ | 414817005 + 5 级子编码 |
| 样本数量 | ✅ | 35,126 + 53,576 = 88,702(训练集分布验证加总一致) |
| DR 等级分布 | ✅ | 训练集:25,810/2,443/5,292/873/708 |
| QWK 冠军分数 | ✅ | 0.8496(Benjamin Graham, Kaggle 私有排行榜) |
| SOTA QWK | ✅ | 0.8631(Huang et al. 2023, Diagnostics) |
| Gulshan JAMA AUC | ✅ | 0.991(EyePACS-1 验证集,可转诊 DR) |
| ICDR 五级定义 | ✅ | 0-4 级,含 4-2-1 法则 |
| EyePACS 平台数据 | ✅ | 2003 年启动,700+ 站点,100 万+检查 |
| 许可证描述 | ✅ | Kaggle 竞赛条款,禁止再分发 |
