OCT2017 — Kermany 视网膜 OCT 分类 AI-Ready Wikipedia

84,484 张标注 SD-OCT B 扫描,4 类视网膜病变,Kermany 2018 Cell 开源经典

来源 University of California San Diego(Shiley Eye Institute)等 5 家机构 url: https://data.mendeley.com/datasets/rscbjbr9sj/2发布时间: 2026-09-13最后更新: 2026-09-25 阅读 42
OCT2017 — Kermany 视网膜 OCT 分类 AI-Ready Wikipedia

信息速览

数据集名称OCT2017 — Kermany 视网膜 OCT 分类 AI-Ready Wikipedia
数据类型84,484 张 OCT B 扫描,4 类视网膜病变标签,约 5.81GB JPEG,患者级训练-测试划分
规模数千名受检者(官方按患者级划分,未单独披露确切人数)
接入方式University of California San Diego(Shiley Eye Institute)等 5 家机构 url: https://data.mendeley.com/datasets/rscbjbr9sj/2
AI 就绪度

数据集封面

OCT2017 — 视网膜 OCT 四分类开源基准 AI-Ready Wikipedia


INFOBOX

字段 内容
数据集名称 OCT2017(Kermany 视网膜 OCT 分类数据集)
英文全称 Labeled Optical Coherence Tomography (OCT) and Chest X-Ray Images for Classification — OCT 子集(OCT2017)
别名/简称 Kermany2018;UCSD OCT 数据集;Kermany OCT;kermany2018(Kaggle slug)
疾病分类(ICD-11) 9B75 黄斑疾患(AMD 相关 CNV 与 Drusen);9B71 视网膜病变(糖尿病黄斑水肿)
SNOMED CT 脉络膜新生血管、年龄相关性黄斑变性、糖尿病性黄斑水肿、玻璃膜疣(术语映射详见 §2.1b)
数据模态 视网膜 SD-OCT 灰度 B 扫描(断层图像)
AI 任务类型 图像分类(4 类:CNV / DME / DRUSEN / NORMAL)
样本总数 84,484 张 B 扫描(论文口径;Kaggle 托管页列 84,495 张)
数据大小 约 5.81 GB(Kaggle Version 2)
数据格式 JPEG 图像,目录名即标签
许可证 CC BY 4.0(Mendeley v2 页面标注)/CC BY-NC-SA 4.0(Kaggle 标注),官方声明仅供研究使用
访问级别 开放下载
DUO 标签 NPUNCU(非商业非营利使用,依官方 “research use only” 声明)
语言 英文(文档与标注命名)
首发日期 2018-01-06(Mendeley v2 发布)
最后更新 2018-01-06(Mendeley v2;其后另有 v3,内容以官方页为准)
发布机构 UCSD Shiley Eye Institute、California Retinal Research Foundation、Medical Center Ophthalmology Associates、上海第一人民医院、北京同仁眼科中心
官方主页 Mendeley Data v2
下载地址 Kaggle: paultimothymooney/kermany2018
DOI 10.17632/rscbjbr9sj.2(数据集);论文 DOI 10.1016/j.cell.2018.02.010(PMID: 29474911)
引用次数 4,691+(OpenAlex,截至 2026-09)
AI 就绪度评分 ⭐⭐⭐⭐(4/5)— 目录即标签、官方患者级划分可直接用 ImageFolder 读取;扣分项:无官方预处理与加载脚本、val 子集仅 32 张、图像尺寸不一且存在重复图像
页面状态 published

§0 E-E-A-T 专业保障

医学审核:[千方病案医学编辑部] 交叉审核:§2 医学背景(CNV/DME/Drusen 病理机制与 ICD-11 映射)、§7 偏倚分析。

数据工程审核:[千方病案医学编辑部交叉审核] 医疗 AI 数据工程师,审核范围:§4 DAIMS 数据字典、§5 数据划分策略、§6 预处理 Pipeline 和坑点。

审核日期:2026-09-05

医疗免责声明:本页面提供的医学信息仅供研究和教育目的,不构成医疗建议、诊断或治疗方案。数据集的医学描述基于公开发表的文献,未经逐一临床验证。任何基于该数据集训练的 AI 模型在应用于临床决策前,必须经过独立的临床验证和监管审批。

技术免责声明:本页面的代码示例、预处理建议和基准性能数据基于公开资料整理,不保证在特定环境下的准确性和适用性。使用者应自行验证代码安全性和数据预处理流程的正确性。千方病案医数集不对因使用本页面信息而导致的任何直接或间接损失承担责任。

数据使用合规:使用本页面描述的数据集前,请务必阅读并遵守数据集原始许可协议。OCT2017 通过 Mendeley Data 与 Kaggle 公开发布,官方声明仅供研究使用(“made available for use in research only”),Mendeley v2 页面标注 CC BY 4.0 而 Kaggle 标注 CC BY-NC-SA 4.0,商用前请向版权方确认。DUO 标签仅供参考,具体使用限制以数据集官方协议为准。


§1 数据集概览

§1.0 📌 30 秒速览

这是什么? OCT2017 是一份公开的视网膜 OCT(光学相干断层扫描)图像集,包含 84,484 张灰度眼底断层扫描图,每张都由眼科医生标注为四种情况之一:脉络膜新生血管(CNV)、糖尿病黄斑水肿(DME)、玻璃膜疣沉积(DRUSEN)或正常视网膜(NORMAL)。它出自 Kermany 等人 2018 年发表在《Cell》上的深度学习研究,是医学影像 AI 领域被下载和复用最多的数据集之一(Mendeley 记录显示下载量数万次,截至 2025-12)。

为什么重要? 全球每年约 3,000 万次 OCT 检查由眼科医生逐张人工判读,耗时而主观。这份数据集证明了深度学习模型在视网膜疾病分类上可以达到与人类专家相当的水平(原论文报告 96.6% 准确率),直接推动了医疗 AI 从"概念验证"走向"临床辅助诊断"的时代,也让无数没有医院资源的研究团队能够进入眼科 AI 领域。

我能用它做什么? 训练和评估视网膜病变分类模型、研究迁移学习与半监督学习在医学影像上的表现、构建医学影像教学案例。如果你是做图像分类算法的研究者,它相当于医学影像界的 ImageNet 子集——门槛低(JPEG 图像 + 目录即标签)、规模大(8 万余张)、社区基准丰富。但请注意它的许可声明仅供研究使用,且存在类别不平衡与重复图像等真实工程问题(详见 §6.5 的 8 个坑点)。

三句话总结本页的立场:这是一份数据卫生基础优秀(随机化患者 ID、患者级官方划分、均衡测试集)但工程配套为零(无加载脚本、无编码映射、无校验和)的数据集;它的 96.6% 原始基准在今天已不代表 SOTA,但其真实价值在于为后续方法提供了一条可复现的演进基线;用对划分与去重口径的前提下,它依然是你进入眼科 AI 领域性价比最高的第一步。

§1.1 技术摘要

OCT2017 由 UCSD Shiley Eye Institute 联合 4 家合作机构于 2013-07-01 至 2017-03-01 期间采集,全部使用 Heidelberg Spectralis 光谱域 OCT(SD-OCT)设备获取 B 扫描。数据集按"训练 83,484 + 测试 968(每类 242 张)"的患者级独立划分组织,训练集类别分布为 CNV 37,205 张、NORMAL 26,315 张、DME 11,348 张、DRUSEN 8,616 张。标注采用三层分级协议:医学生初标、4 名眼科医生复核、2 名 20 年以上经验的视网膜专家终审,并预留 993 张验证子集进行双人独立标注仲裁。图像以 (disease)-(randomized patient ID)-(image number).jpeg 命名,目录名即类别标签。原论文以 ResNet 类迁移学习框架在内部测试集取得 96.6% 准确率,与人类专家相当;后续社区基准将其推进到 99% 以上(arXiv:2010.12316)。数据经 Mendeley Data(DOI: 10.17632/rscbjbr9sj.2)与 Kaggle 双渠道发布,约 5.81 GB。

要点速记:

  • 规模:84,484 张灰度 B 扫描(Kaggle 页列 84,495,口径差 11 张)
  • 任务:4 分类(CNV / DME / DRUSEN / NORMAL),测试集每类 242 张完全均衡
  • 划分:按患者独立,二次划分必须按 patient_id 分组
  • 标注:三层人工标注 + 993 张双人仲裁子集
  • 获取:Mendeley(正式 DOI)或 Kaggle(最便捷),约 5.81 GB
  • 关键坑:重复图像、类别不平衡、尺寸不一、许可口径矛盾(§6.5 逐一拆解)

§1.2 战略价值

维度一:眼科 AI 的公共基准基石。 在 OCT2017 发布之前,OCT 影像研究几乎只能依赖各医院内部数据,算法之间无法横向比较。OCT2017 以 8 万余张的规模、统一设备(Spectralis)和公开的患者级测试集,首次让视网膜 OCT 分类具备了可复现的公共基准:原论文 96.6%、后续 Chetoui & Akhloufi 98.46%、Tsuji 等 99.6%、Wide ResNet-50-2 + EMA 99.69% 的阶梯,构成了医学影像分类领域少有的清晰性能演进曲线(arXiv:2010.12316 表 1)。截至 2026-09,原论文在 OpenAlex 的记录已积累 4,691+ 次引用,其中大量是直接使用该数据集的方法学论文——引用曲线八年不衰,本身就是基准地位的证明。

维度二:半监督与低标注成本研究的标准试验床。 视网膜疾病诊断的瓶颈不在图像数量而在专家标注。OCT2017 训练集中大量图像配合极小的验证子集,使其成为半监督学习(SSL)研究的理想场景:arXiv:2010.12316 显示,FixMatch 在每类仅 50 张标签下即可达到 98.14% 准确率,而每类约 2,000-4,000 张标签就能逼近全监督上限。对资源有限的团队,这份数据集同时提供了"大量无标签数据 + 可靠测试集"的完整研究闭环。

维度三:医学影像工程教学的天然教材。 数据集完整覆盖了医学影像工程的典型问题——类别不平衡(DRUSEN 仅占训练集约 10.2%)、重复图像(独立分析显示去重后仅 80,458 张唯一图像)、同患者多切片导致的划分泄漏风险、图像尺寸不统一(宽 384-1536 像素 × 高 496-512 像素)。这些问题在 §6.5 中逐一给出可操作的解法,使它成为训练医学 AI 工程师的绝佳入门数据集。

§1.3 同类数据集横向对比

数据集 规模 模态 标注类别 与 OCT2017 的差异化
OCT2017(本页) 84,484 张 B 扫描 SD-OCT 灰度 4 类(CNV/DME/DRUSEN/NORMAL) 规模最大、引用最广,单一设备,患者级划分
OCTDL 约 2,000 张(7 类) OCT 7 类视网膜病变(含罕见病如视网膜动脉阻塞仅 22 例) 类别更细、现代设备多样,适合细粒度与跨设备研究
RetinalOCT_Dataset-C8 24,000 张 OCT 8 类均匀分布 类别完全均衡,适合对不平衡敏感的模型设计
Mendeley 同仓 Chest X-Ray 子集 5,232 张胸片 X-ray 细菌性/病毒性肺炎/正常 同一论文、同一 Mendeley DOI 下的跨模态姊妹子集

注:OCTDL 与 RetinalOCT_Dataset-C8 的数字来自第三方数据集综述(Awesome-Medical-Dataset 及相关对比文章),使用前请以各自官方页面为准。

对比的 takeaway:OCT2017 的护城河是规模 + 公认基准地位(8 年积累的可比结果),后来者的差异化路线是类别更细(OCTDL 的 7 类含罕见病)、分布更均衡(C8 的均匀 8 类)或设备更多样。按"需要和谁比"选数据集:刷 OCT2017 榜单就在它上面做,证明跨设备泛化就去 OCTDL。

§1.4 版本时间轴

日期 版本/事件 说明
2017-11-01 论文投稿 Cell 收稿(Received November 1, 2017)
2018-01-06 Mendeley Data v2 发布 “Labeled OCT and Chest X-Ray Images for Classification”,DOI: 10.17632/rscbjbr9sj.2
2018-02-22 Cell 论文见刊 Kermany et al., Cell 172(5):1122-1131.e9
2018 年 Kaggle 镜像 paultimothymooney/kermany2018(Version 2,5.81 GB,页面列 84,495 张)
其后 Mendeley v3 官方提示"务必下载最新版本",DOI: 10.17632/rscbjbr9sj.3

时间轴的三点解读:数据发布(2018-01-06)早于论文见刊(2018-02-22)约 7 周,属于 Resource 类论文常见的"数据先行"模式;Kaggle 镜像与 Mendeley v2 内容同源,但其页面统计口径(84,495)与论文口径(84,484)存在 11 张差异(坑点 7);v3 的出现提醒使用者引用时应注明具体版本号,避免跨版本混用。

§1.5 典型应用场景

  1. 视网膜疾病分类基准评测:以官方测试集(每类 242 张)报告准确率、AUC、F1,与原论文 96.6% 及社区 99%+ 基准直接对比。
  2. 迁移学习教学与原型验证:目录即标签的 ImageFolder 结构使初学者可在数十行代码内完成从下载到训练的闭环(见 §6.1)。
  3. 半监督/自监督学习研究:利用 8 万余张图像研究低标注成本下的疾病分类(FixMatch 每类 50 张标签达 98.14%,见 §8.1)。
  4. 医学影像数据工程实训:类别不平衡、重复图像、患者级划分等真实问题使它成为数据清洗与防泄漏训练的标准案例。
  5. 模型可解释性研究:原论文示范了显著性图(saliency map)高亮病灶区域的范式,数据集至今仍是 Grad-CAM 类方法在眼科的常用验证场。

选择场景时的边界提醒:它不适合直接支撑跨设备部署声明(单设备数据)、疾病严重程度分级(无分级标签)、或任何商业用途(研究专用声明);这些边界与 §7 的泛化性分析一一对应。


§2 医学背景

§2.1 ICD-11 编码映射

OCT2017 的四个类别覆盖 ICD-11 视网膜疾患章节(9B70-9B75)中的两大块:黄斑疾患(9B75)与糖尿病性视网膜病变(9B71)。同一类别在不同编码语境下可能落在不同细目(例如 CNV 既可以是湿性 AMD 的表现,也可以是特发性病变),下表按数据集标签的常见临床对应给出父级编码映射。

数据集标签 主要疾病 ICD-11 编码 ICD-11 中文名
CNV 脉络膜新生血管(多继发于湿性 AMD) 9B75(黄斑疾患;湿性 AMD 语境) 年龄相关性黄斑变性,渗出型
DME 糖尿病黄斑水肿 9B71(视网膜病变) 糖尿病视网膜病变/黄斑病变
DRUSEN 玻璃膜疣(干性 AMD 早期体征) 9B75(黄斑疾患) 年龄相关性黄斑变性,非渗出型
NORMAL 正常视网膜对照 —(健康状态无编码) —

注:ICD-11 细目编码依患者具体病因而定(如糖尿病相关黄斑水肿编码于 9B71 之下,AMD 相关病变编码于 9B75 之下);本表按数据集最常见临床语境给出父级映射,逐例编码请以 ICD-11 官方浏览器为准(ICD-10/ICD-11 对照参考)。

编码映射的工程含义:数据集标签是"影像表现层"的分类(OCT 呈现的病变形态),而 ICD-11/SNOMED 是"疾病诊断层"的编码,两层之间存在多对多关系(同一标签可对应多个编码细目)。若你的下游系统需要 ICD 编码输出,应在标签之上再加一层病因学判断(如结合患者病史),而不是直接把标签映射为唯一编码。

§2.1b SNOMED CT 术语映射

本页不逐条列写 SNOMED CT 数字编码(各版本快照可能更新),按官方概念术语给出映射关系,编码请以 SNOMED International 浏览器 检索为准:

数据集标签 SNOMED CT 概念(英文术语) 中文释义
CNV Choroidal neovascularization 脉络膜新生血管
DME Diabetic macular edema 糖尿病性黄斑水肿
DRUSEN Drusen 玻璃膜疣
NORMAL Normal retina(健康对照) 正常视网膜
关联疾病 Age-related macular degeneration 年龄相关性黄斑变性

§2.2 疾病简介与流行病学

CNV(脉络膜新生血管):视网膜色素上皮层下新生血管异常增生,渗漏与出血破坏黄斑结构,是湿性年龄相关性黄斑变性(AMD)的核心病理过程,也是 60 岁以上人群不可逆中心视力丧失的首要原因之一。OCT 图像上表现为视网膜下的新生血管膜与视网膜下/层间积液(Kermany et al. 2018)。AMD 的疾病负担随老龄化持续增长,全球 late AMD 患病率在老年人群中居高不下(Mitchell et al., 2018, The Lancet, 392:1147-1159. DOI: 10.1016/S0140-6736(18)31550-2)。数据集中的 CNV 标签以渗出性/湿性病变为主,抗 VEGF 治疗的时效性使这一类的早期识别最具临床收益。

DME(糖尿病黄斑水肿):糖尿病视网膜血管渗漏导致黄斑区视网膜增厚与囊腔样水肿,是糖尿病患者视力下降的最主要原因。OCT 是 DME 诊断与抗 VEGF 治疗随访的金标准影像手段,图像特征为视网膜层间囊样积液与中心凹形态消失。随着全球糖尿病患者基数扩大,DME 的筛查与随访需求持续上升(Clinica Baviera 患教资料)。在数据集中 DME 标签覆盖不同严重程度的黄斑受累,训练时的层间积液形态差异较大,是分类器最易与 CNV 混淆的类别之一。

DRUSEN(玻璃膜疣):视网膜色素上皮与 Bruch 膜之间的黄色代谢沉积物,是干性 AMD 的早期标志。OCT 上表现为 RPE 层下的小丘状隆起。数据集中 DRUSEN 类多为早期/中期 AMD 表现,其识别对 AMD 早期干预分层具有直接临床意义。孤立的小型玻璃膜疣与正常老化的 RPE 不规则之间存在灰度地带,这也是该类标签噪声相对集中的原因之一。

NORMAL(正常视网膜):黄斑中心凹形态保留、无视网膜内积液与玻璃膜疣沉积的对照图像,是分类器学习"疾病偏离正常"的锚点。

四类标签在 OCT 图像上的核心影像特征速查:

标签 OCT 关键影像特征 鉴别要点
CNV 视网膜下新生血管膜 + 视网膜下/层间积液,RPE 层起伏 积液位置在 RPE 下或视网膜下腔
DME 视网膜弥漫增厚 + 层间囊样积液,中心凹形态消失 积液位于视网膜层间,视网膜整体增厚
DRUSEN RPE 层上小丘状隆起沉积物,无视网膜增厚 局部 RPE 起伏但无积液
NORMAL 中心凹凹陷保留、各层连续、无积液无沉积 一切正常的解剖形态

影像特征描述依据原论文图示说明(Kermany et al. 2018);这些特征同时也是可解释性研究(显著性图、Grad-CAM)中判断模型"看对了地方"的依据。

§2.3 临床任务定义

OCT2017 对应的临床任务是筛查与分诊(screening & referral):在 OCT 检查后由 AI 系统先行判读,将疑似 CNV/DME 等需紧急干预的病例优先转诊给视网膜专科医生。原论文明确将"加速可治疗致盲眼病的诊断与转诊"作为目标——CNV 与 DME 均属"可治疗致盲眼病",及时抗 VEGF 注射可显著保住视力,因此分类器的价值在"快"与"不漏"(高敏感度)。这不是一个疾病分级(grading)或预后(prognosis)任务:标签只区分病种与正常,不含严重程度分级。

与相邻临床任务的边界:

任务类型 是否适用 原因
筛查/分诊(screening) ✅ 数据集设计目标 四分类标签直接对应转诊决策
辅助诊断(diagnosis support) ✅ 有条件适用 需配合医生复核与可解释性输出
疾病分级(grading) ❌ 不适用 无严重程度分级标签
预后预测(prognosis) ❌ 不适用 无随访与治疗结局数据
病灶分割(segmentation) ❌ 不适用 无像素级标注

一句话锚定任务语义:OCT2017 训练的是"看到这张 OCT,该不该转诊、疑似哪类病"的判断,而不是"这病有多重、预后如何"的判断——前者的输出可以直接进入分诊工作流,后者的输出需要更多标签类型与随访数据支撑。

§2.4 患者人群构成

维度 描述
来源机构 UCSD Shiley Eye Institute(美国)、California Retinal Research Foundation(美国)、Medical Center Ophthalmology Associates(美国)、上海第一人民医院(中国)、北京同仁眼科中心(中国)
采集时间 2013-07-01 至 2017-03-01
人群性质 眼科门诊/转诊人群(含疾病眼与健眼,非社区筛查人群)
年龄/性别 官方未按图像披露人口学信息(患者 ID 已随机化)
设备 Heidelberg Spectralis OCT(单一设备类型,多中心)

人群构成的两点推论值得注意:其一,转诊门诊属性意味着疾病谱中中晚期病例占比高于自然人群,用本数据集训练的模型在社区筛查场景中预期面对更多早期/轻度表现;其二,患者 ID 随机化保护了隐私,同时也永久关闭了按人口学亚组做性能审计的通道——这两点是同一设计选择的两面。

§2.5 临床价值

对眼科服务体系的现实意义在于分流效率:OCT 检查量巨大(全球每年约 3,000 万次),而视网膜专家稀缺。一个敏感度足够高的分类器可以自动将正常眼排除出紧急阅片队列,把专家注意力集中在可治疗病例上。原论文的人类专家对比实验表明,迁移学习模型在 4 分类任务上与眼科医生表现相当(96.6%),且通过显著性图提供可核查的判断依据,为"AI 预筛 + 人工复核"的人机协同流程提供了首个大规模证据。

从更长的学术时间线看,这份数据集的第二重价值是方法论沉淀池:迁移学习(2018 原论文)、注意力机制与可解释性(2019-2020)、半监督与自监督(2020-2022)、以及数据质量方法学(去重与泄漏检测,2023-2025)都曾以它为标准试验场。一个数据集能连续支撑四代方法学演进,在医学影像公开数据中并不多见。

§2.6 标注金标准对照

维度 OCT2017 的做法 性质
标注划分 病种标签(CNV/DME/DRUSEN/NORMAL),无严重程度分级 分类标签
标注方式 人工分级标注 + 专家终审 人工标注
标注者 医学生初标 → 4 名眼科医生复核 → 2 名 20+ 年视网膜专家终审 三层分级
一致性验证 993 张验证子集由 2 名专家双人独立标注并仲裁 部分子集双人阅片
参考标准 OCT 影像特征 + 临床诊断(以专家共识为最终裁决) 专家金标准

局限提示:与所有回顾性专家标注数据集一样,标签反映"标注共识"而非独立病理确诊(OCT 图像无对应组织学金标准),边界样本(如早期 AMD 与孤立 Drusen)存在固有的标签不确定性,详见坑点 7。

把金标准表与 §4.1 字段字典连起来读:数据集交付的是"影像表现级"标签,而临床工作流需要的是"诊断级"结论,两者之间的换算发生在模型之外——这正是原论文把显著性图作为关键输出的原因:让眼科医生能核查模型看到的是不是临床认定的病变特征。


§3 数据集规格

§3.0 版本抉择矩阵

数据集存在 Mendeley 原发版与 Kaggle 镜像版两个获取渠道(同一内容、不同打包与许可标注),另有 Mendeley v3 小版本更新。选择建议如下:

你的需求 推荐版本 大小 理由
快速上手/复现社区基准 Kaggle paultimothymooney/kermany2018 Version 2 5.81 GB 单包下载、train/test/val 目录即用、社区 notebook 丰富
学术引用合规首选 Mendeley Data v2(DOI: 10.17632/rscbjbr9sj.2) 数 GB(含 CXR 子集) 有正式数据集 DOI,可直接进参考文献
需要官方最新声明 Mendeley v3(DOI: 10.17632/rscbjbr9sj.3) 同上 官方提示"务必下载最新版本"
仅需 OCT 子集且带宽受限 Kaggle 版 OCT 目录 约 5.81 GB(OCT 为主体) CXR 子集约数百 MB,OCT 占绝对主体

矩阵使用的两条纪律:无论选哪个版本,都要在实验配置里写死版本号(“Kaggle Version 2” 或 “Mendeley v2/v3”);不要混用两个渠道的文件——合并目录可能同时引入口径差异与重复图像,让坑点 2 和坑点 7 叠加。

§3.1 模态详情

数据模态为光谱域光学相干断层扫描(SD-OCT)灰度 B 扫描:一条横向扫描线上的视网膜组织反射强度剖面,纵向分辨微米级组织层次,可清晰显示 RPE 层、光感受器层与视网膜内各层结构。与眼底彩照(fundus photography)只呈现表面形态不同,OCT 是"光学切片"——它能看见层间积液、RPE 隆起等三维结构信息,这正是四分类任务在 OCT 上可行而在眼底照片上困难的根本原因。OCT 自 1991 年由 Huang 等提出(Science, 1991, 254:1178-1181)后已成为眼科检查量最大的影像模态之一。

全部图像来自 Heidelberg Spectralis 系列设备,图像为单通道灰度、PNG/JPEG 编码,宽 384-1536 像素、高 496-512 像素(不同导出设置导致宽高不固定)。每张 B 扫描是某只眼某次扫描中的一帧,同一患者同一眼可贡献多帧图像——这一属性是 §6.5 坑点 1 的泄漏风险根源。

§3.2 按子集与类别样本数

子集 CNV DME DRUSEN NORMAL 合计
训练集 train 37,205 11,348 8,616 26,315 83,484
测试集 test 242 242 242 242 968
验证目录 val(Kaggle 版附带) 8 8 8 8 32
合计(Kaggle 口径) — — — — 84,484(论文口径)/ 84,495(Kaggle 页列数)

口径说明:84,495 与 84,484 相差 11 张,源于打包边界与统计口径差异;部分文档将测试集写作 1,000 张(968 张有效 + 统计取整)。复现他人结果时请确认其使用口径。

§3.3 文件格式

项目 规格
图像编码 JPEG(Kaggle 版含部分 PNG,内容一致)
色彩空间 单通道灰度
图像尺寸 宽 384-1536 像素 × 高 496-512 像素(不统一)
标签载体 目录名(CNV/DME/DRUSEN/NORMAL)+ 文件名前缀
元数据文件 无官方 CSV;患者 ID 与序号从文件名解析
压缩包 ZIP(Mendeley 分卷;Kaggle 单包)

格式设计的含义:目录即标签让数据集获得了"零解析成本"的易用性,但也意味着标签完整性完全依赖目录结构不被改动——任何复制、同步、过滤操作都可能无意中改变类别分布。建议在项目初始化时对目录做一次"类别 × 数量"快照并入库,之后每次数据搬运后与快照比对。

§3.4 存储大小

Kaggle Version 2 整包约 5.81 GB,解压后占用略增(约 6-7 GB,含 OCT 与少量 CXR 目录);仅 OCT 子集为主体。建议预留 15 GB 磁盘空间以容纳解压、去重中间产物与缓存。存储介质优先 SSD:8 万余张小文件的随机读取对 HDD 极不友好,DataLoader 吞吐会先于 GPU 算力成为瓶颈。

§3.5 标注方式

人工分级标注。每张 B 扫描由医学生初标,经 4 名眼科医生复核,最终由 2 名拥有 20 年以上经验的视网膜专家裁决;类别标签以专家共识为最终结果。标签经文件名与目录结构传递,无单独标注文件。

与"外包众包标注"路线相比,这种"临床层级标注"的代价是速度与成本,收益是标签与临床诊断语义直接对齐——2018 年同期不少医学影像数据集仍依赖标注平台承包商,标签与临床概念之间隔着一层转译,这也是 OCT2017 标签至今被广泛信任的原因之一。

§3.6 标注者资质与一致性

终审标注者为 2 名 20 年以上执业经验的视网膜专科专家。数据集预留 993 张验证子集由 2 名专家双人独立标注用于仲裁一致性——这既是对标注质量的结构性保障,也间接说明标注存在需要仲裁的分歧空间(边界样本)。具体 Kappa 值未在公开页面披露,引用一致性数字时请以论文原文为准。

如果你需要在自己的研究中声明标注质量基线,可行的路径是:从测试集抽样 100-200 张,自行安排 2 名眼科医师独立复标,报告与你使用标签的一致率与 Kappa——这既是对数据集标注的外部抽检,也是论文方法学部分的加分项。

§3.7 采集周期

2013-07-01 至 2017-03-01,回顾性收集各合作机构眼科门诊的 OCT 检查图像。

回顾性收集意味着数据反映的是"当时临床工作流实际产生的影像":扫描参数、导出分辨率、固件版本均随各机构实践自然变化,这正是图像尺寸不统一(384-1536 像素宽)的来源。它不追求采集协议的实验级一致,而追求真实临床分布的代表性——两种设计各有取舍,理解这一点有助于解释后续若干预处理坑点的成因。

§3.8 地域覆盖

三个国家/地区的五个采集点:美国加州圣迭戈(UCSD Shiley Eye Institute、California Retinal Research Foundation、Medical Center Ophthalmology Associates)、中国上海(上海第一人民医院)、中国北京(北京同仁眼科中心)。以北美与中国门诊人群为主,不代表全球人群分布。

按机构检索线索,中国两地的采集依托广州医科大学/广州妇女儿童医疗中心团队(论文通讯机构)与上海交通大学、首都医科大学附属北京同仁医院的合作网络完成;各机构贡献的具体图像数未按机构拆分披露,因此任何"按来源机构分层"的分析都不可行。

§3.9 设备规格

项目 规格
设备 Heidelberg Spectralis OCT(Heidelberg Engineering, Germany)
模态 光谱域 OCT(SD-OCT)
图像类型 横向 B 扫描(单帧)
分辨率 图像导出宽 384-1536 × 高 496-512 像素
统一性 全数据集单一设备类型(利于算法对比,限制跨设备泛化,见 §7.3)

单一设备的双刃剑效应在此值得展开:好处是消除了设备间域移位这一最大混杂因素,使"模型架构与训练策略"的差异可以被干净地归因——这正是它成为经典基准的前提;代价是从本数据集学到的特征(层间对比度、噪声纹理、视野范围)与 Spectralis 的成像特性深度绑定,模型对"换一台设备"没有任何鲁棒性保证。使用它做方法学研究的论文,结论应限定为"在 Spectralis 型 OCT 上有效"。

§3.10 深度溯源链

Heidelberg Spectralis OCT 设备采集(2013-07 至 2017-03,5 家机构)
  → 机构影像系统导出 B 扫描帧
  → UCSD 团队筛选与三层标注(医学生 → 4 名眼科医生 → 2 名视网膜专家)
  → 患者级训练/测试划分 + 993 张双人仲裁验证子集
  → Mendeley Data v2 发布(2018-01-06,DOI: 10.17632/rscbjbr9sj.2)
  → Kaggle 镜像(paultimothymooney/kermany2018,Version 2,5.81 GB)
  → Cell 论文见刊(2018-02-22,DOI: 10.1016/j.cell.2018.02.010)

§4 数据结构

§4.0 目录树

Kaggle Version 2 解压后的目录结构(OCT 部分;CXR 子集为并列目录,结构同理):

kermany2018/                        ← 解压根目录
├── OCT2017/
│   ├── train/                      ← 训练集(83,484 张,患者级独立)
│   │   ├── CNV/                    ← 目录名即标签
│   │   │   ├── CNV-1016042-1.jpeg  ← (疾病)-(随机化患者ID)-(该患者第N张)
│   │   │   ├── CNV-1016042-2.jpeg
│   │   │   └── ...
│   │   ├── DME/                    ← 11,348 张
│   │   ├── DRUSEN/                 ← 8,616 张
│   │   └── NORMAL/                 ← 26,315 张
│   ├── test/                       ← 测试集(968 张,每类 242)
│   │   ├── CNV/
│   │   ├── DME/
│   │   ├── DRUSEN/
│   │   └── NORMAL/
│   └── val/                        ← 附带验证目录(仅 32 张,每类 8)
│       ├── CNV/
│       ├── DME/
│       ├── DRUSEN/
│       └── NORMAL/
└── chest_xray/                     ← 同仓 CXR 姊妹子集(本页不展开)
    ├── train/                      ← NORMAL / BACTERIA / VIRUS
    └── test/

目录树的两个关键读法:第一,标签不存储在任何元数据文件中,它就是目录名——任何脚本误改目录结构即等于改标签;第二,文件名三段式编码是唯一可解析的患者溯源信息,做任何划分实验前先把它解析出来。

建议把上述目录树与 tree -d | head -40 的实际输出比对一次:若你的解压结果多出 .ipynb_checkpoints 或 __MACOSX 之类的目录,在统计与训练前清理,否则 ImageFolder 会把空目录也当作类别报错。

§4.1 DAIMS 字段字典

OCT2017 无表格文件,逻辑数据模型从目录结构与文件名解析而来。以下为本数据集的 8 列字段字典(核心 6 个字段):

字段名 类型 说明 示例值 AI 用途 观测误差 信息性缺失编码 取值范围
filename string 图像文件名,含类别前缀 CNV-1016042-1.jpeg 唯一键/溯源 无 无 {CNV,DME,DRUSEN,NORMAL}-{ID}-{N}.jpeg
label string 目录名即标签 CNV 分类目标 专家共识,边界样本有分歧空间 无 CNV / DME / DRUSEN / NORMAL
patient_id string 文件名第二段,随机化患者标识 1016042 患者级分组/防泄漏划分 跨类别不可跨(患者只属一类标签集合) 无 数字串
image_number int 该患者该标签下的图像序号 1 分析同患者多帧结构 无 无 ≥1 的整数
image image 灰度 B 扫描像素矩阵 496×512 数组 模型输入 导出缩放差异 无 0-255 灰度
split string 所属划分(由目录决定) train 基准评测 社区常被二次改写 无 train / test / val

§4.2 标签分布

标签 训练集数量 训练集占比 测试集数量
CNV 37,205 44.6% 242
NORMAL 26,315 31.5% 242
DME 11,348 13.6% 242
DRUSEN 8,616 10.3% 242

训练集最众类与最稀类的比例约 4.3 : 1;测试集完全均衡(每类 242 张),因此训练时的先验不均衡不会在测试集先验中复现——这本身就是需要理解的评估设计(见坑点 3)。

这个设计还有一个常被忽略的推论:测试集的均衡先验意味着"准确率"数字里四个类别的贡献权重相同,与训练集的天然先验(44.6% CNV)不匹配。如果你的部署场景有自己的先验(如筛查门诊 NORMAL 占 70%),应按场景先验对测试集预测重新加权后再解读性能。

§4.3 关键统计

统计项 数值 备注
图像总数 84,484(论文口径) Kaggle 页列 84,495
唯一图像数 80,458 去重分析(44.33% CNV / 13.73% DME / 10.50% Drusen / 31.44% Normal),见坑点 2
训练/测试划分 83,484 / 968 按患者独立
图像尺寸范围 384-1536 × 496-512 像素 宽度差异大,见坑点 4
总大小 约 5.81 GB Kaggle Version 2
唯一患者数 官方未披露 可由文件名解析估计,见 §4.4

统计项之间的张力值得细读:名义 84,484 张对唯一 80,458 张意味着约 4.8% 的名义样本不带来新信息;而"唯一患者数未披露"意味着有效样本量(患者级)只能自行估计——粗略做法是统计 patient_id 去重数,并把"每患者帧数"的分布一并报告,让读者看到有效样本量的真实量级。

§4.4 数据层级

患者(随机化 ID,数量未官方披露)
└── 眼(左右眼在 ID 内隐含,无显式字段)
    └── 检查(采集于 2013-07 至 2017-03,无时间戳字段)
        └── B 扫描帧(1 张 JPEG = 1 行数据)

关键含义:数据的基本抽样单位是帧,不是患者。同一患者可贡献数十帧,且共享同一疾病标签。任何"按图像随机划分"的做法都会把同一患者的帧同时送入训练与测试集合,造成泄漏(坑点 1)。

以文件名 CNV-1016042-2.jpeg 为例逐段解码:CNV 是标签(目录冗余编码一遍);1016042 是随机化患者 ID——同一 ID 的所有帧来自同一患者同一疾病诊断;2 表示这是该患者在数据集中的第 2 帧图像。三段信息合起来,恰好构成患者级划分与分组交叉验证所需的全部元数据。

§4.5 缺失值与信息性缺失

图像分类数据集无表格意义上的缺失单元格。需要注意的两类"缺失"是结构性的:

缺失项 性质 处理建议
患者人口学(年龄/性别/种族) 从未采集发布 不要试图从图像推断后用于公平性结论的"原始依据";公平性分析应标注为间接推断
采集时间戳 未逐图发布(仅披露 2013-07 至 2017-03 总区间) 时间外推分析只能做区间级,不做逐年漂移分析
设备/参数元数据 未逐图发布(全数据集单一 Spectralis 类型) 跨设备泛化研究需引入外部数据集(OCTDL 等)

这张表的共同主题是**“缺失即边界”**:每一项缺失都划定了用这份数据能声明什么、不能声明什么。把它当作研究设计的负空间地图使用——在缺失项覆盖的范围内做声明,等于给审稿人递刀。


§5 划分与使用建议

§5.1 官方划分

官方按患者级独立划分训练与测试:训练 83,484 张、测试 968 张(每类 242 张),测试集患者与训练集患者不重叠。Kaggle 打包版额外附带 32 张的 val 目录(每类 8 张),规模过小,仅可作示例展示用途(见坑点 6)。

§5.2 社区惯例划分

社区实践中存在三种常见用法:直接使用官方 train/test(推荐,可复现性好);从训练集中再切出 5-10% 做本地验证(需要患者级切分);忽略官方划分自行 random_split(错误,见坑点 1)。另有研究者在去重后重新划分(80,458 张唯一图像口径),其数字与官方口径不可直接比较(见坑点 2)。

选择哪种用法取决于你的研究问题:报告与历史基准可比的方法学结果 → 严格官方划分;评估部署泛化 → 官方测试集 + 外部数据双轨;教学演示 → 官方划分 + 小子集快跑。无论哪种,划分脚本本身都应该入库并固定随机种子。

§5.3 划分策略建议(防泄漏) ✅

  1. 解析文件名第二段得到 patient_id,按 sklearn.model_selection.GroupShuffleSplit(groups=patient_id) 或等价的分组切分实现训练/验证划分;
  2. 测试集固定使用官方 test 目录不动,保证与历史基准可比;
  3. 若从训练集切验证集,先做图像内容级去重(MD5/感知哈希),再按患者分组切分;
  4. 报告结果时明确标注划分口径(官方划分/患者级重划分/图像级划分),避免与不同口径数字混排比较。

§5.4 交叉验证建议

在训练集内做 5 折分组交叉验证(GroupKFold,groups=patient_id),测试集仍留作最终评估。折间报告均值 ± 标准差而非单次最优——医学影像分类的单折波动可达 0.3-1 个百分点。

分组交叉验证的额外收益是"每患者帧数"的异质性被均匀打散:某些患者贡献数十帧,若按图像 KFold,个别"高产患者"会同时支撑起多数折的分布,折间方差被低估;按患者分组后,折间方差才反映真实的患者间变异。

§5.5 外部验证建议

内部测试集上的高分数不等于临床可用。建议按 §7.8 在外部数据集(不同设备或不同人群的 OCTDL、OCTID 等)上复评,报告相对内部性能的衰减幅度;跨设备场景(Topcon/Cirrus 采集)预期出现明显性能下降,应作为模型声明的边界条件而非隐藏项。

§5.6 常见划分误区对照

误区 后果 正确做法
ImageFolder + random_split 直接切训练集 同患者帧跨集合,验证分虚高 按 patient_id 分组切分(坑点 1)
用 32 张 val 目录做早停 对 32 张图过拟合,选择噪声化 从训练集按患者级切 5-10% 验证集(坑点 6)
把 test 加入训练后"全量重训" 与全部历史基准失去可比性 测试集只碰一次,最终评估专用
去重后仍沿用"84,484 张"表述 口径混淆,读者无法复现 报告去重后 80,458 张口径并显式声明
忽略文件名中的患者 ID 丢失防泄漏与分组交叉验证能力 解析为独立字段入库(§6.3 步骤四)

这张对照表可以直接纳入团队的 code review checklist:新人提交训练脚本时,逐行核对五条误区是否都已规避——五条全过再允许其结果进入组内周报。


§6 AI 就绪指南 ⭐

§6.0 云端快速启动

最零成本的路径是 Kaggle Notebook:在 数据集页面 点击 “New Notebook”,数据自动挂载于 /kaggle/input/kermany2018/,免下载、免申请,GPU 配额内即可跑通 §6.1 的加载与 §6.4 的训练原型。

云端起步三步:① 新建 Notebook 后在右侧面板确认输入目录已挂载 kermany2018;② Settings → Accelerator 选择 GPU(T4/P100 配额内);③ 直接运行 §6.1 的加载验证代码,确认 83484 968 的规模输出后再进入训练。首次训练建议先以 2,000 张子集跑通全流程,再放开全量——云端调试按小时计费,先验证后放量是性价比最高的顺序。

官方划分之外再做本地验证集时,务必沿用 §5.3 的患者级分组方案;Kaggle Notebook 环境每次会话重置,验证集划分脚本应写成确定性代码(固定随机种子)而非手工选图,保证跨会话可复现。

§6.1 快速上手

# 目录结构预期:data_root 下有 OCT2017/{train,test,val}/{CNV,DME,DRUSEN,NORMAL}/*.jpeg
# data_root 拼接关系:data_root + "OCT2017/train" 构成 ImageFolder 根路径
# 最小可用子集:test/ 下每类 242 张(共 968 张)可在 CPU 上完成推理验证
import pathlib
from torchvision import datasets

data_root = pathlib.Path("/kaggle/input/kermany2018/OCT2017")  # 本地部署改为解压路径
train_ds = datasets.ImageFolder(data_root / "train")            # 目录名即标签
test_ds  = datasets.ImageFolder(data_root / "test")

print(train_ds.class_to_idx)   # {'CNV': 0, 'DME': 1, 'DRUSEN': 2, 'NORMAL': 3}
print(len(train_ds), len(test_ds))  # 83484 968(Kaggle Version 2 口径)

3 行核心代码即可完成数据到模型的对接——这是该数据集 AI 就绪度达到 4/5 的主要原因:无需格式转换、无需标注文件解析。

两个上手注意事项:其一,ImageFolder 按"类名 → 整数索引"排序映射(CNV=0, DME=1, DRUSEN=2, NORMAL=3),任何自定义标签顺序都要与 class_to_idx 显式对齐,否则混淆矩阵的行列名全错;其二,Kaggle 挂载路径只读,若流程要写缓存(如去重产物),先拷贝到工作目录再操作。

§6.2 数据获取

渠道 链接 大小 条件
Kaggle(推荐) paultimothymooney/kermany2018 5.81 GB 免费 Kaggle 账号,接受页面 License(CC BY-NC-SA 4.0 标注)
Mendeley Data v2 data.mendeley.com/datasets/rscbjbr9sj/2 含 CXR 子集整包 免费下载,页面标注 CC BY 4.0 且注明 research use only
# 方式一:Kaggle CLI(先 kaggle.json 配置 API Token)
kaggle datasets download -d paultimothymooney/kermany2018 -p ./data
unzip -q ./data/kermany2018.zip -d ./data

# 方式二:Kaggle Notebook 内免下载,直接引用
# /kaggle/input/kermany2018/OCT2017/{train,test,val}/

注意:Mendeley v2 页面 License 栏标 CC BY 4.0,但数据描述明确写有 “This repository of images is made available for use in research only”,Kaggle 则标 CC BY-NC-SA 4.0。三处表述详见坑点 8。

下载环节的实操提醒:Mendeley 整包为分卷 ZIP,解压需将全部分卷置于同一目录;Kaggle 单包下载依赖 API Token 配置(~/.kaggle/kaggle.json,权限 600);国内网络环境下建议使用 Kaggle Notebook 直接挂载以绕开大文件传输,或配置镜像加速。无论哪种渠道,下载完成后先跑 §6.1 的规模断言再进训练。

§6.3 预处理全流程

步骤一:尺寸普查与统一。先统计实际尺寸分布,再决定缩放策略(不要盲目 resize 到正方形,见坑点 4):

from PIL import Image
from collections import Counter
import pathlib

sizes = Counter()
for p in pathlib.Path("data/OCT2017/train").rglob("*.jpeg"):
    sizes[Image.open(p).size] += 1          # size = (宽, 高)
print(sizes.most_common(10))

步骤二:内容级去重(坑点 2 的必要动作):

import hashlib, pathlib

def md5(p):
    return hashlib.md5(p.read_bytes()).hexdigest()

seen, dups = set(), []
for p in pathlib.Path("data/OCT2017/train").rglob("*.jpeg"):
    h = md5(p)
    if h in seen:
        dups.append(p)
    seen.add(h)
print(f"发现 {len(dups)} 张内容重复图像")   # 独立分析口径:全库约 4,000+ 张重复

步骤三:灰度转三通道 + 归一化(并入 §6.4 的 transform)。步骤四:患者级分组建立:

import re, collections

def patient_id(path):
    # 文件名格式 (disease)-(randomized patient ID)-(image number)
    m = re.match(r"(CNV|DME|DRUSEN|NORMAL)-(\d+)-(\d+)\.(jpeg|jpg|png)", path.name)
    return m.group(2) if m else None

groups = collections.defaultdict(list)
for p in pathlib.Path("data/OCT2017/train").rglob("*.jpeg"):
    groups[patient_id(p)].append(str(p))
print(f"训练集患者分组数:{len(groups)}")   # 用于 GroupShuffleSplit / GroupKFold

步骤五:类别权重计算(坑点 3 的配套动作):

import collections, torch

counts = collections.Counter(
    p.parent.name
    for p in pathlib.Path("data/OCT2017/train").rglob("*.jpeg")
)
# {'CNV': 37205, 'NORMAL': 26315, 'DME': 11348, 'DRUSEN': 8616}
order = ["CNV", "DME", "DRUSEN", "NORMAL"]
n = sum(counts.values())
class_weight = torch.tensor(
    [ (n / (len(order) * counts[c])) ** 0.5 for c in order ],  # 平方根截断防矫枉过正
    dtype=torch.float32,
)
criterion = torch.nn.CrossEntropyLoss(weight=class_weight)
print(dict(zip(order, class_weight.tolist())))

§6.4 PyTorch DataLoader 完整代码

import pathlib, re, hashlib
import torch
from torch.utils.data import DataLoader, Dataset
from torchvision import transforms
from PIL import Image

class OCT2017Dataset(Dataset):
    """患者级分组感知的 OCT2017 数据集。
    预期目录:data_root/OCT2017/{train,test}/{CNV,DME,DRUSEN,NORMAL}/*.jpeg
    """
    CLASSES = ("CNV", "DME", "DRUSEN", "NORMAL")
    PAT = re.compile(r"(CNV|DME|DRUSEN|NORMAL)-(\d+)-(\d+)\.(jpeg|jpg|png)", re.I)

    def __init__(self, root: str, transform=None):
        self.transform = transform
        self.samples, self.patient_ids = [], []
        for path in sorted(pathlib.Path(root).rglob("*.jp*g")):
            m = self.PAT.match(path.name)
            if m:
                label = self.CLASSES.index(m.group(1).upper())
                self.samples.append((str(path), label))
                self.patient_ids.append(m.group(2))   # 供分组交叉验证使用

    def __len__(self):
        return len(self.samples)

    def __getitem__(self, idx):
        path, label = self.samples[idx]
        img = Image.open(path).convert("L")            # 源为灰度图
        if self.transform:
            img = self.transform(img)
        return img, label

# 灰度图先缩放后转 3 通道再按 ImageNet 统计量归一化(适配预训练骨干)
train_tf = transforms.Compose([
    transforms.Resize(512),                             # 短边缩放,保持纵横比(见坑点 4)
    transforms.RandomCrop((448, 448)),
    transforms.RandomHorizontalFlip(),                  # OCT 横向翻转基本安全(见 §6.6)
    transforms.Grayscale(num_output_channels=3),        # 见坑点 5
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),
])
eval_tf = transforms.Compose([
    transforms.Resize(512),
    transforms.CenterCrop((448, 448)),
    transforms.Grayscale(num_output_channels=3),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),
])

data_root = pathlib.Path("data/OCT2017")
train_ds = OCT2017Dataset(data_root / "train", transform=train_tf)
test_ds  = OCT2017Dataset(data_root / "test",  transform=eval_tf)

train_loader = DataLoader(train_ds, batch_size=64, shuffle=True,
                          num_workers=8, pin_memory=True, drop_last=True)
test_loader  = DataLoader(test_ds, batch_size=128, shuffle=False,
                          num_workers=4, pin_memory=True)

print(f"train={len(train_ds)}, test={len(test_ds)}")   # 83484 968

配套的最小训练循环(与上面 DataLoader 对接即完整可运行,放入 <details> 便于折叠阅读):

<details>
<summary>展开查看完整训练循环(ResNet-50 迁移学习 + 类权重)</summary>

import torch
from torch import nn
from torchvision import models

device = "cuda" if torch.cuda.is_available() else "cpu"
model = models.resnet50(weights=models.ResNet50_Weights.IMAGENET1K_V2)
model.fc = nn.Linear(model.fc.in_features, 4)          # 4 类输出头
model = model.to(device)

# 类权重来自 §6.3 步骤五(DRUSEN 最稀,权重最高)
criterion = nn.CrossEntropyLoss(weight=class_weight.to(device))
optimizer = torch.optim.AdamW(model.parameters(), lr=3e-4, weight_decay=1e-4)
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=10)

for epoch in range(10):
    model.train()
    running = 0.0
    for x, y in train_loader:                          # shuffle=True 已在 DataLoader 设置
        x, y = x.to(device, non_blocking=True), y.to(device, non_blocking=True)
        optimizer.zero_grad(set_to_none=True)
        loss = criterion(model(x), y)
        loss.backward()
        optimizer.step()
        running += loss.item() * x.size(0)
    scheduler.step()
    print(f"epoch {epoch}: train_loss={running / len(train_ds):.4f}")

# 测试集只在训练全部结束后碰一次
model.eval()
correct = total = 0
with torch.no_grad():
    for x, y in test_loader:
        x, y = x.to(device), y.to(device)
        pred = model(x).argmax(dim=1)
        correct += (pred == y).sum().item()
        total += y.size(0)
print(f"test_accuracy={correct / total:.4f}")

</details>

训练循环要点:学习率 3e-4 配 AdamW 是迁移学习的稳健起点;类权重解决多数类主导(坑点 3);测试准确率只在最后计算一次,训练过程中任何对 test 的窥视都会污染模型选择。

§6.5 坑点清单(8 个真实失败模式)

以下 8 个坑点全部来自该数据集的可查证事实:官方页面描述、独立复现论文与 2025 年的数据质量验证研究,覆盖从数据获取到结果发布全链路的真实失败模式。每个坑点给出从"立即可用"到"研究级"的三档解法。

⚠️ 坑点 1:ImageFolder + random_split 破坏患者级隔离(分类:数据泄漏)

问题:同一患者的数十帧 B 扫描共享同一标签与相似形态,若按图像随机划分训练/验证集,同患者的帧会同时出现在两侧,模型"背人"而非"学病",验证分数虚高。官方 train/test 本身按患者划分,但任何人从 train 内再切验证集时若不按患者分组,即重新引入泄漏。
症状:验证准确率与官方测试准确率出现 1 个百分点以上的落差;模型在个别患者上"全对"、换一批患者后骤降。
解决:

  1. 简单方法:用正则从文件名解析 patient_id,任何二次划分前先按患者分组。
  2. 进阶方法:sklearn.model_selection.GroupShuffleSplit(groups=patient_ids) 切训练/验证;交叉验证用 GroupKFold(代码见 §6.3 步骤四)。
  3. SOTA 方法:先内容级去重(MD5 + 感知哈希双通道),再按患者分组切分,并把划分脚本与随机种子一并入库,保证可复现。
    参考:官方数据描述 “The OCT Images are split into a training set and a testing set of independent patients”(Mendeley Data);arXiv:2010.12316 明确采用 patient-wise split 复现。

⚠️ 坑点 2:数据集含数千张重复图像,去重前后基准不可比(分类:评估误用)

问题:独立分析显示去重后全库仅 80,458 张唯一图像(约 4,000+ 张重复/近重复),内容级重复可能同时落在训练与测试集合,直接推高表面性能;IEEE 2025 的一项验证研究显示污染口径下模型可达 99-100%,清洗后同类模型为 95-96%。
症状:模型准确率"好到可疑"(99-100%);对测试集逐图检查发现某些图像在训练集中有逐字节相同或几乎相同的副本。
解决:

  1. 简单方法:对全库做 MD5 去重(§6.3 步骤二),重复帧保留一帧。
  2. 进阶方法:MD5 之外追加感知哈希(pHash)捕捉轻微重压缩的近重复;先去重再按患者划分。
  3. SOTA 方法:报告两套数字——官方口径(可与其他论文对比)与去重清洗口径(反映真实泛化),并在论文中显式声明口径。
    参考:IEEE: Verification of Retina Disease Classification Results on a Public OCT Dataset;去重口径 80,458 张与四类占比见 §4.3。

⚠️ 坑点 3:类别不平衡——DRUSEN 只占训练集 10.3%(分类:偏倚陷阱)

问题:训练集 CNV 37,205 / NORMAL 26,315 / DME 11,348 / DRUSEN 8,616,最众类与最稀类比约 4.3:1。无处理时模型偏向多数类,DRUSEN 召回率最低,而 DRUSEN 恰是 AMD 早期筛查的关键信号。
症状:宏平均 F1 显著低于准确率;混淆矩阵中 DRUSEN 行大量被误判为 NORMAL 或 CNV。
解决:

  1. 简单方法:DataLoader 使用 WeightedRandomSampler 按类频率倒数采样。
  2. 进阶方法:交叉熵中设置类权重 weight = 1/sqrt(class_count)(平方根截断可防止矫枉过正),配合标签平滑。
  3. SOTA 方法:Focal Loss(γ=2)或类平衡二元交叉熵;报告宏平均指标与每类召回率作为主要结果,准确率退居次要。
    参考:训练分布见 Kaggle 数据页与 §4.2;不平衡处理为医学影像分类常规配置。

⚠️ 坑点 4:图像宽 384-1536 像素不等,直接 resize 到正方形破坏结构(分类:预处理陷阱)

问题:不同导出设置造成宽度差异悬殊(384-1536),高度相对稳定(496-512)。Resize((224, 224)) 这类强制正方形缩放会非均匀压扁视网膜层,改变层间厚度比例——而层厚恰是 DME/Drusen 的核心特征。
症状:小宽度图像的分类错误率异常偏高;可视化输入图发现视网膜层被拉伸变形;同一模型对原始尺寸不同的图像表现不稳定。
解决:

  1. 简单方法:transforms.Resize(512)(只给短边),保持纵横比后 CenterCrop。
  2. 进阶方法:等比缩放到目标短边后随机裁剪训练、中心裁剪评估(§6.4 代码即此方案)。
  3. SOTA 方法:按比例填充(letterbox padding)保留全部视野,配合掩码注意力或分隔线感知的数据增强;超宽图像可裁剪为两段并测试时集成。
    参考:尺寸范围 384-1536 × 496-512 见 Kaggle 数据页。

⚠️ 坑点 5:灰度源图与 ImageNet 归一化的适配细节(分类:预处理陷阱)

问题:源图是单通道灰度,主流预训练骨干(ResNet/EfficientNet/ViT)按 3 通道 RGB 设计;且 ImageNet 归一化统计量并非 OCT 分布的最优值。误用单通道张量喂三通道模型会直接报错;而不当归一化会拖慢收敛、降低最终精度。
症状:expected input [...] to have 3 channels, but got 1 channels instead 运行时报错;或训练前期损失下降异常缓慢。
解决:

  1. 简单方法:transforms.Grayscale(num_output_channels=3) 复制三通道(§6.4 已内置)。
  2. 进阶方法:先在本地统计训练集像素均值/标准差,替换 ImageNet 统计量做归一化。
  3. SOTA 方法:把第一层卷积改造成单通道输入(权重按通道求和或均值初始化),避免复制带来的冗余参数;或直接采用灰度原生预训练(如 RETFound 类眼科预训练权重)。
    参考:arXiv:2010.12316 中 “Since the images are monochrome we duplicate the channel three times”。

⚠️ 坑点 6:val 目录只有 32 张,不能承担早停与模型选择(分类:评估误用)

问题:Kaggle 打包版附带 val 目录(每类 8 张、共 32 张),统计功效近乎为零。用它做早停或超参选择,等于在噪声上做决策,选出的"最优"模型只是对这 32 张图过拟合。
症状:以 val 为准的早停导致训练极早中断、欠拟合;不同随机种子下"最优 epoch"剧烈漂移;val 准确率长期 100% 无区分度。
解决:

  1. 简单方法:忽略 val 目录,从训练集按患者级分组切出 5-10% 作为本地验证集。
  2. 进阶方法:GroupKFold 5 折交叉验证做超参选择,选定后再全量重训,官方 test 只碰一次。
  3. SOTA 方法:固定测试集只用于最终报告,训练管线全程不接触;所有模型选择决策记录在实验跟踪系统中(见 §6.10)。
    参考:val/test 每类 8/242 张的口径见 arXiv:2010.12316(“Test and validation are balanced, there are 8 and 242 images per class respectively”)。

⚠️ 坑点 7:规模口径差异(84,495 vs 84,484;968 vs 1,000)导致复现偏差(分类:工程陷阱)

问题:Kaggle 页列 84,495 张而论文口径 84,484 张;测试集存在 968(每类 242×4)与 1,000(取整口径)两种说法。不同口径的第三方预处理包默认归一化、尺寸策略也各不相同,直接叠加会造成复现结果的系统性偏移。
症状:照抄他人代码却得到相差 0.5-2 个百分点的结果;检查发现对方"测试集"实际是从 train 混入的自切集合或包含了 val 目录。
解决:

  1. 简单方法:加载数据后立即断言 len(test_ds) == 968 且 len(train_ds) == 83484(Kaggle Version 2 口径)。
  2. 进阶方法:在实验配置中显式记录数据版本(Mendeley v2 / Kaggle Version 2)、文件总数与划分口径。
  3. SOTA 方法:数据清单入库——对全部图像生成 MD5 清单并与团队共享,任何口径差异都能逐文件定位。
    参考:Kaggle 数据页(84,495 张);Kermany et al. 2018(84,484 张)。

⚠️ 坑点 8:许可标注三处矛盾,商用与再分发前必须核实(分类:工程陷阱)

问题:Mendeley v2 页面 License 栏标 CC BY 4.0,数据描述却写 “made available for use in research only”;Kaggle 镜像标 CC BY-NC-SA 4.0。三者约束强度不同,直接决定能否商用、能否再分发衍生数据集。
症状:团队按 CC BY 4.0 把模型/数据集成进商业产品,收到版权方质疑;或论文投稿时被要求澄清数据许可。
解决:

  1. 简单方法:研究用途下按最严格口径执行——非商业、署名、相同方式共享(即 CC BY-NC-SA 4.0 等效行为)。
  2. 进阶方法:商用或再分发前向版权方(Mendeley 记录的贡献者:Kermany/Kang Zhang/Goldbaum 及 UCSD)书面确认许可范围并留存凭证。
  3. SOTA 方法:在模型卡与仓库 LICENSE 文件中显式记录"训练数据许可 + 决策依据 + 确认时间",实现合规可审计。
    参考:Mendeley v2 页面(CC BY 4.0 + research only);Kaggle 数据页(CC BY-NC-SA 4.0)。

§6.6 数据增强清单

增强策略的判别标准只有一条:模拟"临床上真实会发生的影像变异"(扫查位置、固视偏差、设备增益),而不是无差别的几何/光度扰动。

增强 判定 说明
水平翻转 ✅ 安全 视网膜左右向结构对称性可接受,社区通行做法
随机裁剪(等比缩放后) ✅ 安全 模拟扫查位置偏移,提升鲁棒性
轻度旋转(±10°) ✅ 安全 模拟固视偏差
亮度/对比度小幅度扰动 ✅ 安全 模拟设备增益差异
垂直翻转 ❌ 危险 破坏"视网膜在上/RPE 在下"的解剖方向性
大角度旋转(>30°) ❌ 危险 同上,改变解剖先验
大幅高斯噪声/极端对比度 ❌ 危险 可能抹掉积液等弱对比病灶特征
上下灰度反转 ❌ 危险 OCT 反射率语义不可倒置

增强策略的选择逻辑只有一条:改变解剖先验的增强都是错的。OCT 的层状结构、上下方向、灰度语义构成了模型的先验知识,垂直翻转与大角度旋转直接违反这些先验,哪怕离线验证分数没有立刻恶化,也会在分布外数据上放大失效风险。判断一个增强是否安全,先问"这张图翻转/旋转/变色之后,在临床上还可能出现吗"。

§6.7 模型推荐

模型 适用场景 参考表现 备注
ResNet-50 基线/教学首选 社区报告约 97-99% 区间 迁移学习收敛快,参数量适中
Wide ResNet-50-2 + EMA 冲击基准 99.69%(arXiv:2010.12316 复现口径) 半监督研究同款骨干
EfficientNet-B0/B3 资源受限部署 与 ResNet-50 相当 参数量小,适合边缘端
ViT-B/16 大规模预训练研究 需充分正则 数据量 8 万余张可用但需强增强
FixMatch/MixMatch(SSL) 低标注成本研究 每类 50 张标签达 98.14%(arXiv:2010.12316) 利用训练集无标注部分

§6.8 硬件需求

配置 GPU 显存 批大小(448×448 输入) 单 epoch 时间参考
消费级(RTX 3060 12GB) 12 GB 16-24(ResNet-50) 1-2 小时(83,484 张)
工作站(A5000 24GB) 24 GB 48-64(ResNet-50) 30-60 分钟
云端(V100/A100) 16-40 GB 64-128 15-40 分钟
Kaggle Notebook(T4/P100) 16 GB 32-48 1-2 小时,注意每周 GPU 配额

显存估算经验式:批大小 × 图像分辨率² × 骨干参数量决定激活与梯度占用。若 448×448 输入在 12 GB 卡上 OOM,优先序为:降批大小 → 梯度累积(等效批大小不变)→ 降输入到 384 → 混合精度(torch.autocast + GradScaler)。83,484 张训练图的 I/O 压力也值得注意——把解压目录放到 SSD 上能显著提高 DataLoader 吞吐(HDD 上 num_workers=8 也会饿死 GPU)。

§6.9 评估指标代码

import torch
from sklearn.metrics import classification_report, confusion_matrix
import numpy as np

@torch.no_grad()
def evaluate(model, loader, device="cuda"):
    model.eval()
    ys, ps = [], []
    for x, y in loader:
        x = x.to(device, non_blocking=True)
        pred = model(x).argmax(dim=1).cpu().numpy()
        ys.append(y.numpy()); ps.append(pred)
    y_true, y_pred = np.concatenate(ys), np.concatenate(ps)
    # 输出每类 precision/recall/F1 与宏平均(不平衡数据的正确打开方式)
    print(classification_report(y_true, y_pred, target_names=["CNV","DME","DRUSEN","NORMAL"], digits=4))
    print(confusion_matrix(y_true, y_pred))
    return y_true, y_pred

评估纪律:主报宏平均 F1 与每类召回率(尤其 DRUSEN 召回),准确率仅作参考;测试集只在最终评估时使用一次。

为何如此强调每类召回率:在筛查场景中,DRUSEN 召回率对应"早期 AMD 有多少被漏掉",其临床代价远高于把一张 NORMAL 误判为 DME(多转诊一例的代价)。把这一权衡写进评估指标的选择理由里,是医学影像论文与普通 CV 论文的重要区别。

筛查场景还应报告 AUC 与高敏感度工作点的表现——分诊系统的价值恰恰体现在"宁可多转诊、不可漏病例":

from sklearn.metrics import roc_auc_score

@torch.no_grad()
def collect_probs(model, loader, device="cuda"):
    model.eval()
    ys, ps = [], []
    for x, y in loader:
        prob = torch.softmax(model(x.to(device)), dim=1).cpu().numpy()
        ps.append(prob); ys.append(y.numpy())
    return np.concatenate(ys), np.concatenate(ps)

y_true, y_prob = collect_probs(model, test_loader)
# one-vs-rest 宏平均 AUC
auc = roc_auc_score(y_true, y_prob, multi_class="ovr", average="macro")
print(f"macro AUC = {auc:.4f}")

§6.10 MLOps 笔记

  • 数据版本化:将解压后图像清单(MD5 + 路径 + 标签 + 患者 ID)提交为版本化 artifact,训练配置中记录其哈希;口径差异(坑点 7)因此可审计。
  • 划分快照:患者级划分结果(患者 ID → 折号)存为固定文件,禁止运行时随机重划。
  • 实验跟踪:记录数据口径、增强策略、类权重、随机种子与最终测试分数的对应关系;任何 99.5% 以上的结果优先怀疑泄漏(坑点 1/2)。
  • 模型注册:上线模型绑定其训练数据版本与测试口径,外部验证(§7.8)结果一并入卡。
  • 监控基线:将训练集图像尺寸分布与灰度均值/方差存为基线,线上输入分布做 PSI/KS 检验,偏移超阈值即触发人工抽检(衔接 §7.6 漂移分析)。
  • 失败样本回流:建立"标签可疑 vs 模型失败"双通道误判登记(衔接 §7.2),为下一轮外部数据集扩充提供标注重点。
  • 再生产流程:把"下载 → 去重 → 分组 → 训练 → 评测"固化为一条可一键重跑的管线脚本,新成员或新环境接入时只需改 data_root 与设备配置。

§7 质量评估与局限性

§7.1 已知偏倚

偏倚类型 描述 严重程度 缓解建议
类别不平衡 训练集 DRUSEN 仅 8,616 张(10.3%),CNV 37,205 张(44.6%) 高 加权采样/类权重/Focal Loss(坑点 3)
转诊偏倚 样本来自眼科专科门诊而非社区筛查,疾病谱偏重 中 外部验证时引入筛查人群数据
重复图像偏倚 去重后仅 80,458 张唯一图像,有效样本量低于名义值 高 内容级去重后重训与重评(坑点 2)
单设备偏倚 全部为 Heidelberg Spectralis 采集,跨设备泛化未知 高 用 OCTDL 等多设备数据集做外部验证
标签边界模糊 早期 AMD 与孤立 Drusen、轻度 DME 的判读存在观察者间差异 中 每类召回率监控 + 分歧样本复核
时间覆盖窄 采集集中在 2013-2017,早期 Spectralis 导出协议 低 关注近年设备导出的域适配

六类偏倚中,类别不平衡、重复图像、单设备三项对研究结论的影响最直接:前两项决定你报告的数字是否可信(对应坑点 2、3),第三项决定你的模型能声明到什么范围(对应 §7.3)。建议在开题/立项文档中就把这三项写进已知局限,而不是等审稿人指出。

§7.2 标注质量

三层标注协议(医学生 → 4 名眼科医生 → 2 名资深视网膜专家)在 2018 年的公开数据集中属于顶配设计,993 张双人独立仲裁子集提供了结构化质检。但公开渠道未披露具体 Kappa 值与仲裁分歧率,且标签最终反映专家共识而非独立病理确诊。经验上,边界样本(早期 AMD vs Drusen、轻微 DME)是主要噪声来源;在你的模型误差分析中,应把误判样本先按"标签可疑"与"模型失败"两类人工归因。

标签噪声自查三步(接入自己的训练流程):

  1. Confident Learning 快筛:用 cleanlab 以交叉验证预测概率找出"标签-特征矛盾"候选帧,人工复核前 200 张即可估计噪声率量级;
  2. 类间边界体检:重点抽查 DRUSEN↔NORMAL 与 DRUSEN↔CNV 两个边界对,它们贡献了绝大多数可解释的标签分歧;
  3. 同患者一致性检查:同一患者帧通常标签一致,若同 ID 帧出现标签分歧(不同目录下同 ID),几乎必然有一侧是噪声。

§7.3 泛化性

目标场景 失效风险 证据/机制
同设备(Spectralis)新患者 低-中 官方测试集即此场景,社区基准稳定在 96-99%+
跨设备(Topcon/Cirrus/国产设备) 高 单设备训练无域适配机制;层厚与噪声特性随设备变化
社区筛查人群 中 训练分布来自转诊门诊,疾病先验与轻症占比不同
其他人种/地域人群 中-高 采集点集中于美中两地门诊;公平性指标未随数据发布
时间外推(2017 之后) 中 无逐图时间戳,无法做逐年漂移分析,只能区间级假设

综合判读:OCT2017 上的 99% 不是"临床可用"的证明,而是"同分布基准饱和"的信号。任何部署声明都应落在"同设备、转诊门诊、四分类分诊辅助"的范围内;越出这个范围,性能衰减幅度必须由你自己的外部验证数据说话。

§7.4 伦理与合规

数据经随机化患者 ID 处理,不含姓名、生日等直接标识符,也未发布人口学元数据,公开层面无 PHI。原始采集应已获得机构审查与知情同意(论文发表流程内),但数据集页面未随附独立伦理文件,复用者如需发表涉及人类受试者的研究,应遵循本机构伦理委员会要求。使用限制方面,官方声明仅供研究使用(详见坑点 8)。

给使用者的落地清单:在论文的数据可用性声明中注明"Mendeley Data v2(DOI: 10.17632/rscbjbr9sj.2),研究用途";若期刊要求提供伦理批件号,向本机构伦理委员会申请"使用公开去标识数据集"的备案而非原始采集批件;任何二次分发(打包镜像、清洗版)都建议先取得版权方许可。

§7.5 公平性

数据集不发布年龄、性别、种族等人口学字段,无法直接做亚组性能审计;且 84,484 张图像的源人群集中在美中两国转诊门诊。若你的应用面向不同人群,公平性结论必须来自你自己在外部数据上的分层评测,而非本数据集本身。这是所有"匿名化影像数据集"的共同局限,不是该数据集独有缺陷,但必须在模型卡中如实声明。

§7.6 数据漂移

采集期 2013-2017,无逐图时间戳,漂移分析只能做粗粒度假设。现实中真正的漂移风险来自设备与软件升级:Spectralis 固件与导出协议在 2017 年后持续演进,新一代设备图像的分辨率、噪声与视野范围均有变化。部署建议:监控输入图像尺寸分布与灰度统计的偏移(PSI/KS 检验),并保留人工抽检队列。

实操上可设三道防线:入口端对每批输入做尺寸与灰度统计并与训练基线比对;模型端对高置信度误判样本(预测概率 >0.95 但被复核推翻)单独登记;流程端为每季度安排一次人工盲抽复检(每类 50 张),把漂移发现的窗口从"性能报警"提前到"分布报警"。

§7.7 DAIMS 24 项数据质量检查

# 检查项 状态 说明
1 宽格式 ⚠️ 目录即标签,需自行展开为(路径, 标签, 患者 ID)表格
2 唯一标识 ⚠️ 文件名含患者 ID 与序号,但无患者级元数据表
3 特殊字符 ✅ 命名规范 ASCII,无空格与特殊符号
4 重复行 ❌ 存在约 4,000+ 张重复/近重复图像(去重后 80,458 张唯一)
5 缺失编码 ✅ 图像数据无表格缺失值问题
6 标签标识 ✅ 目录名 + 文件名前缀双通道标签,清晰无歧义
7 罕见类分组 ⚠️ DRUSEN 8,616 张为少数类,官方未提供分层说明
8 偏倚评估 ⚠️ 官方未系统发布偏倚分析;三层标注与仲裁子集部分缓解
9 数据字典 ✅ 文件名编码规则即字典,规则简单完备
10 信息性缺失解释 ✅ 无缺失值,不适用场景明确
11 设备记录 ✅ 单一 Spectralis 设备类型,官方明确披露
12 共线性 ✅ 不适用(图像模态无特征共线性问题)
13 编码映射 ⚠️ 无官方 ICD-11/SNOMED 映射文件,需自行维护(见 §2.1)
14 时间戳处理 ⚠️ 无逐图时间戳,仅有 2013-07 至 2017-03 总区间
15 划分建议 ✅ 官方提供患者级 train/test 划分
16 泄漏讨论 ⚠️ 官方声明按患者划分,但 README 未警示二次划分泄漏,社区常踩坑
17 标签分布 ✅ 四类分布明确披露(83,484 = 37,205+11,348+8,616+26,315)
18 测量偏倚 ⚠️ 单设备多中心,设备间变异不可评估
19 外部验证建议 ✅ 可对接 OCTDL/OCTID 等外部数据集(见 §7.8)
20 版本记录 ⚠️ Mendeley v2/v3 与 Kaggle Version 2 口径存在差异(84,495 vs 84,484)
21 预处理脚本 ❌ 官方未提供任何加载/预处理脚本,需社区方案
22 合规要求 ⚠️ License 标注不一致(CC BY 4.0 / CC BY-NC-SA 4.0 / research only)
23 多模态对齐 ✅ 单模态数据集,不存在对齐问题
24 去标识化 ✅ 患者 ID 随机化,无 PHI,无人口学元数据

DAIMS 评分:15.5 / 24

评分解读:✅ 11 项、⚠️ 9 项、❌ 2 项。基础卫生(命名、标签、去标识化、官方划分)表现优秀,这使它成为最容易上手的教学数据集;失分集中在"开箱即用的工程配套"(无预处理脚本、无编码映射、无时间戳)与"数据本身的隐性质量"(重复图像、口径差异、许可矛盾)两类。两项 ❌(重复图像、无官方脚本)都是可以自行补救的工程问题,不是数据不可用。

对你意味着什么:把 OCT2017 当作"高质量但需要自装安全带的车辆"——直接可用,但开工前必须完成三件事:内容级去重(坑点 2)、患者级划分脚本(坑点 1)、数据口径断言(坑点 7)。完成这三件事后,它的数据质量足以支撑论文级研究;跳过它们,你得到的 99% 分数大概率是幻觉。

§7.8 外部验证矩阵

外部数据集/场景 来源机构 评估任务 性能指标 相对内部变化 关键发现
Ravelli 清洗版 OCT(去污染对照) 独立验证研究(IEEE 2025) 4 分类 95-96% 相对污染口径(99-100%)下降约 4 个百分点 数据泄漏而非模型能力造就了接近满分的表现
同官方划分下的 SSL 复现(arXiv:2010.12316,preprint) 独立研究团队 4 分类 全监督 99.69% 高于原论文 96.6% 约 3 个百分点 现代骨干 + EMA + 充分调参可显著超越 2018 年基线
每类 50 张标签的半监督场景 同上 4 分类 FixMatch 98.14% 标签量降至 0.24% 时仅降约 1.5 个百分点 标注成本可压缩两个数量级

注:跨设备(Topcon/Cirrus 等)外部验证在公开文献中尚无与官方测试集口径严格对齐的结果,本表仅收录有明确出处支撑的条目;arXiv 条目为预印本,引用时请注意其同行评审状态。

矩阵的读法与用途:前两行回答"这个数据集的数字能信多少"(泄漏贡献约 4 个百分点的水分),第三行回答"标注成本的下限在哪里"(SSL 路线)。若你的研究引入了新的外部验证结果,建议按本表格式追加并保持口径列的完整性——口径缺失的外部结果比没有外部结果更误导。


§8 基准性能与生态

§8.1 排行榜

以下数字来自不同研究,数值不可直接比较:测试口径(官方 test / 自切验证)、预处理(尺寸、归一化)、训练配置(增强、类权重)各不相同;部分研究还在扩展版本(如 5 类)上报告。比较前请读原文口径。

排名 模型 性能 年份 关键技术 完整引用 代码
1 Wide ResNet-50-2 + EMA 99.69% 2020 全监督调参 + EMA 权重平均 arXiv:2010.12316, “Matching the Clinical Reality: Accurate OCT-Based Diagnosis From Few Labels”, 2020. 链接 GitHub
2 Tsuji 等报告模型 99.6% 2020 迁移学习调优 Tsuji et al., 2020(口径见 arXiv:2010.12316 表 1 转引) —
3 Chetoui & Akhloufi 98.46% 2020 深度集成 Chetoui & Akhloufi, 2020(口径见 arXiv:2010.12316 表 1 转引) —
4 FixMatch(每类 50 标签) 98.14% 2020 半监督一致性正则 arXiv:2010.12316, 2020. 链接 GitHub
5 VGG19(迁移学习) 99.48% 2021 迁移学习 + 超参搜索 BMC Bioinformatics, 2021. DOI: 10.1186/s12859-021-04001-1 —
6 ResNet-50 97.83% — 迁移学习 OALib 论文. 链接 —
7 原论文迁移学习模型 96.6% 2018 ImageNet 迁移学习 Kermany DS, et al., 2018, Cell 172(5):1122-1131.e9. DOI: 10.1016/j.cell.2018.02.010 —
参考 污染口径对照 99-100% 2025 未清洗数据上的虚高 IEEE, “Verification of Retina Disease Classification Results on a Public OCT Dataset”, 2025. 链接 —

读表三原则:第一,看口径列而非只看百分数——同一模型在官方 test 与自切验证上可以差 1 个百分点以上;第二,注意 FixMatch 的 98.14% 只用了每类 50 张标签,其"数据效率"含义与全监督的 99.48% 完全不同;第三,"参考"行的 99-100% 是泄漏条件下的产物,列入本表是作为质量对照组而非成绩。

§8.2 SOTA 总结与选型建议

官方测试集在该口径下已趋近饱和(99%+),继续刷榜的信息价值有限。更有价值的研究方向:跨设备/跨人群外部验证(真实泛化)、低标注成本(SSL,见 FixMatch 路线)、标签噪声鲁棒性(对坑点 7 的边界样本建模)、以及去重口径下的诚实基准重评(IEEE 2025 路线)。工程选型上,ResNet-50 级别骨干 + 患者级划分 + 每类召回率监控已能覆盖绝大多数应用需求。

按研究目的的选型速查:

你的目标 建议路径 对应章节
复现/进入榜单 ResNet-50 迁移学习 + 类权重 + 患者级划分 §6.3-§6.4
低标注成本研究 FixMatch/MixMatch + Wide ResNet-50-2 §6.7、§8.1
部署向研究 EfficientNet 系 + 外部验证矩阵先行设计 §6.7、§7.8
数据质量方法学 去重 + 口径声明 + 泄漏检测对照 坑点 1/2/7

按目标选路径后,先读对应的坑点与质量章节再动手——这张表的每一行都对应 §6.5/§7 中至少一个可执行的检查动作,直接照做即可。

§8.3 评测协议

标准协议:官方 train 训练(可按患者级切本地验证)、官方 test 968 张报告一次;主指标宏平均 F1 + 每类召回率,辅以准确率与混淆矩阵;固定随机种子并报告多次运行均值 ± 标准差。任何偏离(自切测试、加入 val、去重)都必须在结果表口径列显式声明。

协议之外的三个附加建议:报告训练曲线而非只报终点(泄漏或欠拟合在曲线形态上一目了然);保存测试集逐图预测(逐图分数表是误差分析与数据质量审计的原材料);所有评测脚本与配置文件随论文/仓库公开,让别人能用同一口径复验你的数字。

数据集 模态 规模 适用场景
OCTDL OCT 7 类,含罕见病 细粒度分类、跨设备验证
RetinalOCT_Dataset-C8 OCT 24,000 张 8 类均衡 不平衡鲁棒方法对照
同仓 Chest X-Ray 子集 胸片 肺炎 3 分类 跨模态迁移与泛化研究
EyePACS/Kaggle DR 眼底彩照 约 88,702 张 糖尿病视网膜病变分级(同团队 Cell 论文另一条线)

组合使用建议:以 OCT2017 为主训练基准时,把 OCTDL 作为跨设备外部验证的首选目标、RetinalOCT_Dataset-C8 作为类别均衡对照组;同一 Mendeley DOI 下的 CXR 子集则适合做"同一框架跨模态迁移"的方法学对照——四者组合可以覆盖从基准评测到外部验证的完整证据链。

§8.5 关键论文 Top 5

  1. Kermany DS, Goldbaum M, Cai W, et al. Identifying Medical Diagnoses and Treatable Diseases by Image-Based Deep Learning. Cell, 2018, 172(5):1122-1131.e9. DOI: 10.1016/j.cell.2018.02.010 — 数据集出处与首篇基准(96.6%),确立迁移学习 + 显著性图的医学影像范式。
  2. Huang D, et al. Optical Coherence Tomography. Science, 1991, 254:1178-1181. DOI: 10.1126/science.1957169 — OCT 成像技术奠基论文,理解数据模态的物理源头。
  3. Mitchell P, Liew G, Gopinath B, Wong TY. Age-related macular degeneration. The Lancet, 2018, 392:1147-1159. DOI: 10.1016/S0140-6736(18)31550-2 — AMD 疾病负担综述,理解 CNV/DRUSEN 的临床语境。
  4. “Matching the Clinical Reality: Accurate OCT-Based Diagnosis From Few Labels”. arXiv:2010.12316, 2020 — 半监督路线代表工作,FixMatch 每类 50 标签达 98.14%。
  5. “Verification of Retina Disease Classification Results on a Public OCT Dataset”. IEEE, 2025 — 数据泄漏定量验证:污染口径 99-100% vs 清洗后 95-96%。

五篇文献构成一条完整的证据链:Huang 1991 解释数据从哪里来(OCT 物理成像),Kermany 2018 解释数据为什么重要(首个专家级基准),Mitchell 2018 解释标签的临床含义(AMD 疾病负担),arXiv 2010.12316 展示方法学的天花板(SSL 与现代骨干),IEEE 2025 划定数字的边界(泄漏与去重口径)。按此顺序阅读,可以在一个下午内建立对该数据集的完整认知。

§8.6 社区活跃度

截至 2026-09:论文 OpenAlex 记录 4,691+ 次引用且逐年递增(2024 年 658 次、2025 年 647 次,OpenAlex 口径);Kaggle 数据页长期位居医学影像热门榜,衍生 notebook 数以百计;Mendeley 记录下载 68,667 次、浏览 209,892 次(截至 2025-12,PlumX)。发表 8 年后仍是眼科 AI 论文的标准对比数据集。

社区讨论的焦点也在迁移:2018-2020 年的常见问题是"怎么把准确率刷过 97%“,2023 年之后的高频话题转向"数据泄漏有多严重”“去重后真实性能是多少”“跨设备如何评估”——这与方法学界对医学影像基准质量的反思同步,也印证了 §6.5 与 §7 把数据质量问题放在性能数字之前讨论的必要性。

§8.7 生态快照

资源 类型 链接 状态(截至 2026-09) 推荐理由
Kaggle 数据页 数据托管 paultimothymooney/kermany2018 活跃 最便捷获取渠道 + 社区 notebook
Mendeley Data v2 数据托管(官方) rscbjbr9sj/2 活跃(有 v3) 正式 DOI,学术引用首选
SSL 复现仓库 代码 oct-diagn-semi-supervised 可用 FixMatch/MixMatch 全套实现
Awesome Medical Dataset 资源索引 OCT2017 条目 维护中 快速定位同类 OCT 数据集

生态使用的优先序建议:数据获取走 Kaggle(快)+ 引用走 Mendeley(正式);代码参考先看 SSL 复现仓库(划分与口径最严谨);找同类数据集做外部验证时从 Awesome 索引切入。避免依赖任何第三方"清洗版/增强版"镜像——除非其发布了完整的处理脚本与 MD5 清单,否则口径不可审计。


§9 相关资源与引用

本节收录 OCT2017 的官方入口、社区资源与完整引用信息。使用优先级:官方资源(§9.1)永远优先于社区资源(§9.2);引用时按 §9.4 的指南区分"论文引用"与"数据引用"两种场景。

§9.1 官方资源

§9.2 社区资源

§9.3 BibTeX 完整引用

@article{kermany2018identifying,
  title   = {Identifying Medical Diagnoses and Treatable Diseases by Image-Based Deep Learning},
  author  = {Kermany, Daniel S. and Goldbaum, Michael and Cai, Wenjia and
             Valentim, Carolina C. S. and Liang, Huiying and Baxter, Sally L. and
             McKeown, Alex and Yang, Ge and Wu, Xiaokang and Yan, Fangbing and
             Dong, Justin and Prasadha, Made K. and Pei, Jacqueline and
             Ting, Magdalena Y. L. and Zhu, Jie and Li, Christina and
             Hewett, Sierra and Dong, Jason and Ziyar, Ian and Shi, Alexander and
             Zhang, Runze and Zheng, Lianghong and Hou, Rui and Shi, William and
             Fu, Xin and Duan, Yaou and Huu, Viet A. N. and Wen, Cindy and
             Zhang, Edward D. and Zhang, Charlotte L. and Li, Oulan and
             Wang, Xiaobo and Singer, Michael A. and Sun, Xiaodong and
             Xu, Jie and Tafreshi, Ali and Lewis, M. Anthony and
             Xia, Huimin and Zhang, Kang},
  journal = {Cell},
  volume  = {172},
  number  = {5},
  pages   = {1122--1131.e9},
  year    = {2018},
  doi     = {10.1016/j.cell.2018.02.010},
  pmid    = {29474911}
}

@data{rscbjbr9sj_2018,
  title  = {Labeled Optical Coherence Tomography (OCT) and Chest X-Ray Images for Classification},
  author = {Kermany, Daniel and Zhang, Kang and Goldbaum, Michael},
  year   = {2018},
  doi    = {10.17632/rscbjbr9sj.2},
  url    = {https://data.mendeley.com/datasets/rscbjbr9sj/2},
  note   = {Mendeley Data, v2}
}

§9.4 引用指南

  • 论文研究成果 → 引用 kermany2018identifying(Cell 论文)
  • 直接使用数据文件 → 同时引用 rscbjbr9sj_2018(数据集 DOI),符合 Mendeley 官方 “How to cite this data” 要求:Kermany D, Goldbaum M, Cai W et al. Identifying Medical Diagnoses and Treatable Diseases by Image-Based Deep Learning. Cell. 2018; 172(5):1122-1131. doi:10.1016/j.cell.2018.02.010
  • 使用 Kaggle 下载渠道时在数据可用性声明中注明 Kaggle Version 2 口径与获取日期

§9.5 数据使用前置检查单

开工前逐项确认(勾选完成后再进入训练):

  1. 已阅读 Mendeley v2 页面的官方描述与许可声明,确认用途落在研究范围;
  2. 已固定数据版本(Mendeley v2 或 Kaggle Version 2)并记录获取日期;
  3. 已运行 §6.3 的去重与患者分组脚本,产出 MD5 清单与分组表;
  4. 已在训练配置中写入规模断言(train 83,484 / test 968);
  5. 已确认测试集访问策略(只碰一次),并在实验跟踪系统中登记;
  6. 已按 §4.5 明确公平性结论的数据边界,不基于本数据集发布人口学亚组声明。

§10 AI 使用声明卡

§10.1 本页创作使用的 AI 模型

模型 用途
大语言模型(CodeBuddy 写作代理) 资料检索辅助、结构化撰写、代码示例生成

代码示例均参照官方 PyTorch/sklearn/scikit-learn 文档 API 编写并经逻辑审查,但未在本页制作环境中逐一执行;使用前请以你本地的依赖版本验证(尤其 torchvision 的权重枚举名在不同大版本间有差异)。

§10.2 AI 参与范围

AI 负责初稿生成、代码示例撰写与交叉校对;全部事实性内容(规模数字、划分口径、基准成绩、许可信息)均以检索到的公开来源为依据逐条落实;编辑方针、章节结构与质量标准由千方病案医学编辑部制定。

分工边界说明:AI 不对事实的真实性背书——每个关键数字都要求带来源链接,检索不到的字段一律省略而非推测;读者如发现数字与官方页面不一致,请以 Mendeley/Kaggle 官方页的最新口径为准并向我们反馈。

§10.3 输入来源列表

  1. Kermany DS, et al., 2018, Cell 172(5):1122-1131.e9. DOI: 10.1016/j.cell.2018.02.010
  2. ScienceDirect 论文页:https://www.sciencedirect.com/science/article/pii/S0092867418301545
  3. Cell.com 论文官方全文页:https://www.cell.com/cell/fulltext/S0092-8674(18)30154-5
  4. Mendeley Data v2 数据页:https://data.mendeley.com/datasets/rscbjbr9sj/2
  5. Mendeley v2 文件页(License 信息):https://data.mendeley.com/v1/datasets/rscbjbr9sj/2/files
  6. PlumX 指标页(下载/浏览量、v3 信息):https://plu.mx/plum/a/?doi=10.17632/rscbjbr9sj
  7. Kaggle 数据页(规模、大小、License):https://www.kaggle.com/datasets/paultimothymooney/kermany2018
  8. arXiv:2010.12316(SSL 基线与口径表):https://ar5iv.arxiv.org/html/2010.12316
  9. BMC Bioinformatics, 2021. DOI: 10.1186/s12859-021-04001-1(迁移学习基准)
  10. OALib 论文(ResNet50 97.83%):https://www.oalib.com/paper/6894268
  11. IEEE 2025 泄漏验证论文:https://ieeexplore.ieee.org/document/11207650
  12. OpenAlex/journalshub 引用统计:https://journalshub.online/paper/W2788633781
  13. Awesome-Medical-Dataset OCT2017 条目:https://github.com/pomelo-song/Awesome-Medical-Dataset/blob/main/resources/OCT2017.md
  14. Huang D, et al., 1991, Science 254:1178-1181. DOI: 10.1126/science.1957169
  15. Mitchell P, et al., 2018, The Lancet 392:1147-1159. DOI: 10.1016/S0140-6736(18)31550-2

来源使用的优先序说明:事实性数字(规模、划分、分布)以 1、4、5、7 四个一手来源为准;基准数字以 8、9、11 为准并逐条保留口径说明;背景知识(OCT 技术、AMD 流行病学)以 14、15 为准。三个第三方综述/聚合站(12、13 及相关对比文章)只用于线索发现,不直接支撑关键数字。

§10.4 人工校验记录

内容模块 审核者 审核方式 审核状态
规模数字与划分口径(§1、§3、§4) 千方病案医学编辑部 逐条对照 Kaggle/Mendeley/论文检索快照 ✅ 已通过
医学背景与编码映射(§2) 千方病案医学编辑部 对照 ICD-11 章节结构与检索文献复核 ✅ 已通过
代码示例(§6.1-§6.4、§6.9) 千方病案医学编辑部 逻辑审查 + API 用法核对 ✅ 已通过
坑点与质量评估(§6.5、§7) 千方病案医学编辑部 对照 IEEE 2025/arXiv:2010.12316 原始口径 ✅ 已通过
基准排行榜(§8.1) 千方病案医学编辑部 逐条核对出处链接与口径声明 ✅ 已通过

校验方式说明:审核采用"关键数字逐条回溯来源链接"的方式执行——每个规模/性能/日期数字都必须能在 §10.3 列表的对应来源中找到原文支撑;无法回溯的数字已在编辑阶段删除。若读者发现任何数字与官方页面不一致,请以官方页为准并通过页面反馈渠道告知我们。

§10.5 AI 生成章节标注

本页各章节由 AI 生成初稿,经人工按 §10.4 方式审核修订后发布;不存在未经审核的 AI 生成内容。

§10.6 最后人工审核日期

2026-09-05(与 §0 审核声明一致)

页面状态:published(全部内容已完成审核并发布)


相关数据集导航

以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:

  • rfmid — 共享标签:医学影像 / 图像分类 / 眼科影像
  • brset — 共享标签:医学影像 / 图像分类 / 眼科影像
  • octdl — 共享标签:医学影像 / 图像分类 / 眼科影像
  • odir — 共享标签:医学影像 / 图像分类 / 眼科影像
  • oimhs — 共享标签:医学影像 / 图像分类 / 眼科影像
  • cardiac-implantable-device-cxr — 共享标签:医学影像 / 图像分类
  • chest-x-ray-segmentation — 共享标签:医学影像 / 图像分类
  • palm — 共享标签:医学影像 / 图像分类 / 眼科影像
  • sics-155 — 共享标签:医学影像 / 图像分类 / 眼科影像
  • echonet-lvh — 共享标签:医学影像 / 图像分类

导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

返回 AI-Ready 数据集