信息速览
早产儿视网膜病变(Retinopathy of Prematurity,ROP)是新生儿重症监护里少数「查得勤就能防住失明」的病。它的机制很清楚:早产儿视网膜血管没长完,出生后氧环境剧变,血管异常增生,一路发展到视网膜脱离。但只要在窗口期内按时筛查、及时干预,绝大多数患儿可以保住视力。问题在于筛查本身:要反复拍、要专业判读、要在资源有限的新生儿病房里排班。
这个数据集就是那套「反复拍」的产物。捷克俄斯特拉发大学医院从 2010 年代起做常规 ROP 筛查,攒下 188 名新生儿的六千余张眼底图,2022 年以 CC0 放到 Kaggle 上,2024 年在 Scientific Data 上发了数据描述论文。它不大,但它把三件事同时做对了:完全开放、带完整人口学、带 plus 病变标注。这三件事凑齐的早产儿眼底库,全球没几个。
一屏速览。 下面这张表把关键参数一次给全,后续各节展开时不再重复罗列。
| 维度 | 内容 |
|---|---|
| 原名 | Retinal Image Dataset of Infants and Retinopathy of Prematurity |
| 规模 | 6,004 张图像 / 188 名新生儿 |
| 性别构成 | 94 女 / 94 男(图像数约 3.08k : 2.92k) |
| 胎龄 | 均值 33 周(SD 5),最小 23 周,最大 41 周(13 人) |
| 出生体重 | 均值 2,017 g(SD 1,024),480–4,080 g |
| 矫正胎龄 | 最早 30 周,最晚 113 周 |
| 设备 | Clarity RetCam 3 / Natus RetCam Envision / Phoenix ICON |
| 分辨率 | 640×480 / 1440×1080 / 1240×1240 |
| 标注 | 两名眼科专家独立判读,约 4% 需第三方共识 |
| 标签 | 诊断码(ROP 分期 + 其他后极部疾病)、plus 形态 |
| 格式 | jpg(+ xlsx/csv 元数据表) |
| 体量 | 约 8.0 GB(含三份目录副本) |
| 许可 | CC0 1.0(公有领域,可商用,无需署名) |
| 获取 | Kaggle 直下,无需注册申请(需 Kaggle 账号) |
| 论文 | Scientific Data 11, 814 (2024),doi:10.1038/s41597-024-03409-7 |
§1 速览:它到底是什么
1.1 一句话
它是一份完全开放的早产儿眼底筛查档案——188 个孩子的六千余张图,每张都带着这个孩子出生时的胎龄、体重,拍这张图时的矫正胎龄,以及当时的诊断结论。
1.2 为什么它不是普通的「眼底图数据集」
成人眼底数据集(DRIVE、MESSIDOR、ODIR 那一类)解决的问题是「糖尿病视网膜病变分级」「血管分割」。它们的难点在标注一致性,图像本身质量不错——成年人会配合,能注视,能保持不动。
早产儿眼底是完全不同的场景。作者在论文里写得很直白:「婴儿患者不配合,很难只拍到好图」。这句话背后是具体的操作困难:
| 困难 | 表现 | 对数据的影响 |
|---|---|---|
| 不配合 | 哭闹、扭动、闭眼 | 运动模糊、偏位、部分视野缺失 |
| 眼球小 | 需开睑器撑开眼睑 | 边缘可能有器械阴影或压痕 |
| 需散瞳 | 检查前滴散瞳药 | 瞳孔大小不一,影响进光量 |
| 视网膜未发育 | 血管尚未长到周边,对比度低 | 分界线、嵴等关键结构不清晰 |
| 病变在周边 | 后极部视野拍不到 | 完整分期信息天然缺失 |
所以这个数据集的「难」不在标注,在图像本身的分布。作者的处理方式是保留一部分低质量图,理由是「为了数据多样性」——这句话值得认真读:它意味着这个库刻意不做质量筛选,反映的是真实筛查场景,而不是理想条件下的样本。对研究「模型在真实噪声下能否工作」的人来说这是优点;对只想刷高准确率的人来说这是麻烦。
1.3 三十秒决策卡
| 你的处境 | 它能帮你什么 |
|---|---|
| 要做 ROP 筛查的 AI 辅助判读,但拿不到 iROP 这类需申请的数据 | 这是目前门槛最低的开放替代,CC0 直下 |
| 要研究「不同相机的图像能不能混训」 | 三台设备、三种分辨率,天然的多中心替代品 |
| 要研究 plus 病变(血管扩张迂曲)的自动识别 | 有 PF 标签(0 正常 / 2 plus),虽然 pre-plus 缺失 |
| 要做小儿眼底的图像增强、去模糊 | 有一批真实的低质量图,配作者开源的增强方法 |
| 要教住院医认识 ROP 的眼底表现 | 按患者/序列分目录,适合做病例串讲 |
| 要做病灶(出血等)的分割 | 用作者开源的 ReLeSeT 生成候选,再人工修正 |
| 要写一篇「用公开数据做 ROP 检测」的论文 | 引用链清晰,有对应的 Scientific Data 论文兜底 |
1.4 不适合谁:五条明确边界
要全视网膜视野的,它给不了。 三台相机都是广角但非全视网膜:RetCam 3 与 RetCam Envision 是 130°,Phoenix ICON 是 100°。拍的是后极部到中周部,周边拍不到。而 ROP 最早的征象——分界线与嵴——恰恰常在中周部与周边。所以严格说,这个库不足以支撑「完整 ROP 分期」的任务,只能支撑「后极部病变与 plus 判定」。
要 pre-plus 的,它一张都没有。 论文明确写「the pre-plus form is not observed in the dataset」。而临床上 pre-plus 是治疗决策的关键分界(从「继续观察」翻到「准备干预」)。做三分类(normal / pre-plus / plus)的研究用它,中间那一类会是空的。这不是数据缺失,是这批病例里真的没出现。
要像素级分割金标准的,它没提供。 标签是图像级/序列级的诊断码与 plus 判定。论文里做分割评测时,是在 80 张图(RetCam 3 取 30、RetCam Envision 取 30、Phoenix ICON 取 20)上让两名专家手工标、取平均作 ground truth,这批标注没有随数据集一起发布。
要大规模深度的,它只有 188 人。 相比成人眼底动辄十万张,这个体量做自监督预训练远远不够。它的定位是「小而全的精选集」,不是「大数据集」。真要大数据,得组合 iROP(不开放)、SUNDROP(需申请)、以及各国的筛查登记。
要纵向随访轨迹的,它只覆盖筛查期。 140 名患者有多个序列(多次检查),但序列跨度是筛查窗口(矫正胎龄 30 到 40 周为主,最长到 113 周)。想看「从出生到学龄」的长期结局,这里没有。
§2 数据构成与规格
2.1 三层组织方式
同一批图像在包里放了三份,用三种目录结构组织。这不是三份不同数据,理解这一点能省掉一次错误的合并。
| 目录 | 组织方式 | 适合什么 |
|---|---|---|
images/ |
患者编号/序列号/图像文件 | 人工浏览、病例串讲、按患者切分 |
images_stack/ |
全部图像平铺一层 | 批量脚本、DataLoader 直接扫 |
images_stack_without_captions/ |
平铺,且抹掉相机角标文字 | 怕角标泄漏元信息的训练场景 |
第三份的存在说明了一件小事:相机自动在图像角落烧录了亮度、日期一类信息。作者用黑色矩形覆盖了这些角标——理由是相机本身已把眼底外围置黑,覆盖不改变眼底区域。这个细节值得留意:如果你用平铺版做训练,模型可能从角标文字里「偷」到与标签相关的线索(不同设备角标样式不同,而设备与诊断又不是独立的)。
2.2 命名即标签:一个文件名十段
这是整个数据集最实用的设计。文件名格式:
患者编号_性别_胎龄_出生体重_矫正胎龄_诊断码_plus形态_设备_序列号_图像号.jpg
论文给的例子:
001_F_GA41_BW2905_PA44_DG2_PF0_RC3_S01_1.jpg
逐段拆开:
| 段 | 值 | 含义 |
|---|---|---|
001 |
患者编号 | 纯整数,不可回溯 |
F |
性别 | 女(M 为男) |
GA41 |
胎龄 | 41 周 |
BW2905 |
出生体重 | 2,905 克 |
PA44 |
矫正胎龄 | 44 周 |
DG2 |
诊断码 | 出血(hemorrhage),正常后极部 |
PF0 |
plus 形态 | 0 = 正常 |
RC3 |
设备 | Clarity RetCam 3 |
S01 |
序列号 | 第 1 次检查 |
1 |
图像号 | 该序列第 1 张 |
这种「把元数据编进文件名」的做法有真实的好处:不用读 xlsx、不用 join 表,一条 ls 加一个正则就能把整个数据集切分完。
import re, os
from collections import Counter, defaultdict
PAT = re.compile(
r'^(?P<pid>\d+)_(?P<sex>[MF])_GA(?P<ga>\d+)_BW(?P<bw>\d+)'
r'_PA(?P<pa>\d+)_DG(?P<dg>\d+)_PF(?P<pf>\d+)'
r'_(?P<dev>[A-Z0-9]+)_S(?P<series>\d+)_(?P<img>\d+)\.jpg$'
)
rows = []
for fn in os.listdir("images_stack"):
m = PAT.match(fn)
if m:
rows.append(m.groupdict())
print("图像数:", len(rows))
print("患者数:", len({r['pid'] for r in rows}))
print("设备分布:", Counter(r['dev'] for r in rows))
print("plus 分布:", Counter(r['pf'] for r in rows))
代价也很清楚:改名就丢标签。如果你要把图导进 DICOM 或别的命名体系,务必先把这张表落到数据库里,再改名。
2.3 患者级人口学
论文给的分布,是理解这个库适用边界的第二把钥匙。
| 变量 | 统计量 | 值 |
|---|---|---|
| 患者数 | 合计 | 188 |
| 性别 | 女 / 男 | 94 / 94 |
| 图像按性别 | 女 / 男 | 3,081 / 2,923 |
| 胎龄 | 均值 ± SD | 33 ± 5 周 |
| 胎龄 | 最小 / 最大 | 23 周 / 41 周 |
| 胎龄 41 周 | 人数 | 13 |
| 出生体重 | 均值 ± SD | 2,017 ± 1,024 g |
| 出生体重 | 最小 / 最大 | 480 g / 4,080 g |
| 矫正胎龄 | 最早检查 | 30 周 |
| 矫正胎龄 | 最晚记录 | 113 周 |
两处值得注意。
第一,患者数在性别上完全平衡(94/94),但图像数不平衡(约 3.08k 对 2.92k)。 这不是抽样设计的结果,是自然发生的:女性患儿平均每次检查拍得更多一点。做按图像计的分类任务时,这个 5% 的偏斜会进入损失函数。
第二,胎龄最大到 41 周、出生体重最大到四千余克。 这说明入组不严格限定「早产」——按论文的筛查方案,胎龄 <32 周或体重 <1500 g 是常规入组,但临床状态不稳定的较大婴儿也会被纳入(如需要氧疗的呼吸窘迫综合征患儿)。这个细节解释了为什么库里有足月儿:他们的 ROP 风险来自氧疗等后天因素,而不是早产。
2.4 诊断码:序列级而非图像级
这是全文最容易被误读的地方,值得单开一节。
论文的 DG 字段覆盖的类别包括:正常后极部、ROP 第 1/2/3 期、ROP 4A/4B/5、plus 病变、以及若干其他后极部疾病(出血、玻璃体混浊、脉络膜视网膜病变等)。4A、4B、5 三期在数据集中没有任何图像——不是错误,是这批病例里没进展到那个阶段。
关键点在标签粒度:
同一个患者的不同序列可以有不同诊断码(诊断随时间变化)。因此论文 Table 10 里按诊断统计的患者数不能相加,加起来会大于 188。
这句话的实际含义:
| 你以为 | 实际 |
|---|---|
| 188 个患者,按诊断分成若干互斥的组 | 188 个患者,每个序列一个诊断,患者可跨组 |
| 按患者统计各类别的人数,加起来等于 188 | 加起来大于 188,因为有人被重复计数 |
| 图像级标签独立 | 图像继承其序列的标签,同序列内完全一致 |
对做机器学习的人,这一条直接决定了切分方式——见 §5.2。
2.5 设备:三台相机,三种分辨率
论文 Section「Device Description」把三台机器的参数讲得很细,这张表是核对图像规格的底本:
| 设备 | 代码 | 分辨率 | 视野 | 论文点出的特点 |
|---|---|---|---|---|
| Clarity RetCam 3 | RC3 |
640 × 480 | 130°(用对应镜头) | 广角小儿专用、可拍短片段、外置卤素光源 100–6000 lux、电动手动对焦 |
| Natus RetCam Envision | RE |
1440 × 1080 | 130°(单镜头) | 分辨率是 RetCam 3 的 2.25 倍、双可拆镜头(130° 与竖拍)、双向 DICOM 自动上传 |
| Phoenix ICON | ICON |
1240 × 1240 | 100° | 环形直接照明、手持件比 RetCam 3 小 30%、瞳孔 5.6 mm 即可拍、可实时变焦 |
分辨率跨度是 2.25 倍(长边 640 → 1440),而且长宽比都不一样(4:3 / 4:3 / 1:1)。这意味着:
- 不能简单 resize 后混训。 640×480 的图放大到 1440×1080 只是插值放大,不会凭空出现细节;反而让模型在两个分布上学到「清晰度 = 设备」这个伪相关。
- 有研究价值。 三台设备覆盖了小儿眼底相机的三个世代,正好可以研究「跨设备迁移」——这在真实部署里是刚需,因为基层医院买不起最新的机器。
- 一台设备对应一个患者全程。 论文写「All series for one patient were done with the same device」,所以设备与患者是嵌套关系,不是一个可以自由交叉的因子。做「设备不变、患者变」的消融要小心。
2.6 序列:一行数据的真实单位
「序列」是同一患者同一天、同一次检查的一组图像。它的存在理由,论文讲得很实在:
序列号看起来冗余,因为可以用矫正胎龄识别。但一周内可能做两次检查,矫正胎龄相同,所以必须额外加序列号字段。
每个序列内部:
- 矫正胎龄相同(同一天检查)
- 设备相同(同一台机器)
- 诊断码相同(同一份判读结论)
- 图像数不等(取决于这次检查拍了几张、单眼还是双眼)
140 名患者有多个序列,其余只查过一次。这个「多次检查」的比例(约四分之三)是这个库的隐藏价值:它带纵向信息,虽然跨度只覆盖筛查窗口。
2.7 一条记录逐行解剖
把 §2.2 的例子完整读一遍,看每一段如何共同构成一个「临床时刻」:
001_F_GA41_BW2905_PA44_DG2_PF0_RC3_S01_1.jpg
| 读法 | 信息 | 临床含义 |
|---|---|---|
患者 001,女 |
性别 | 女婴,胎龄 41 周出生(足月),体重 2,905 g(正常范围) |
GA41 / BW2905 |
足月、正常体重 | 不是典型早产儿——她的 ROP 风险来自出生后的氧疗等临床因素 |
PA44 |
矫正胎龄 44 周 | 出生后约 3 周做的检查 |
DG2 |
诊断码 2 | 出血,后极部其余正常 |
PF0 |
plus 0 | 血管形态正常,无扩张迂曲 |
RC3 |
Clarity RetCam 3 | 640×480,这批图分辨率最低一档 |
S01 / 1 |
第 1 次检查第 1 张 | 这是她筛查轨迹的起点 |
这一段解剖说明了一个容易被忽略的事实:这个数据集里「早产儿」和「ROP 患者」不是同一个集合。有足月儿(因为氧疗被纳入筛查)、有早产儿但眼底正常、也有早产儿发展成 ROP。做队列描述时这三类要分开。
2.8 与同类 ROP 数据集的定位差异
论文 Table 2 综述了国际上的同类资源,这张对照表是判断「该不该用它」的直接依据:
| 数据集 | 来源 | 规模 | 开放性 | 有无 plus 标注 |
|---|---|---|---|---|
| 本数据集 | 捷克俄斯特拉发 | 六千余图 / 188 人 | CC0 完全开放 | 有(PF0/PF2) |
| iROP(USA-iROP) | 美国 | 5,561 图 | 不开放 | 有 |
| USA-1 | 美国 | 77 图 | 不开放 | 有(plus/pre-plus/normal 三档) |
| USA-4 | 美国 | 248 眼 / 67 人 | 不开放 | 有 |
| 德国 ROP 登记 | 德国 | 90 人 | 无图像 | — |
| 韩国 NHI 队列 | 韩国 | 181,582 人 | 无图像 | — |
| e-ROP | 美国多中心 | 胎龄 22–35 周、体重 <1251 g | 需申请 | 有 |
| SUNDROP | 斯坦福 | 远程筛查网络 | 需申请 | 有 |
结论很清楚:能拿到的里面它最大,大的里面只有它能拿到。 这不是说它质量最好——iROP 的标注体系更成熟、病例更多——而是说在「零门槛 + 带临床元数据 + 带 plus 标签」这个交集上,它目前是唯一选项。
§3 影像来源层:谁被拍、怎么拍
3.1 入组规则
论文写得很具体:筛查对象是胎龄 <32 周或出生体重 <1500 g 的新生儿;但「depending on their current clinical condition」,临床状态不稳定的较大婴儿也会纳入——论文举的例子是需要氧疗的患儿,如呼吸窘迫综合征(RDS)。
这解释了 §2.3 里那两个「异常」值:胎龄 41 周、体重四千余克。他们不是数据错误,是筛查方案本身的宽容度。
筛查节奏:每两周一次,直到全视网膜血管化完成——论文说这通常发生在矫正胎龄 40 周。间隔可按临床情况缩短。这个节奏决定了序列的时间结构:一个从 28 周出生的孩子,可能被拍 6 到 8 次。
3.2 一次检查的完整动作
理解拍摄流程,才能理解图像里那些「瑕疵」从哪来:
- 散瞳:检查前滴散瞳药,人工散瞳(artificial mydriasis)。瞳孔大小因此不完全一致,直接影响进光量与成像亮度。
- 开睑:用开睑器撑开眼睑。器械可能进入视野边缘。
- 体位:患儿仰卧,医师俯身操作。
- 拍摄:先用间接检眼镜做临床检查,再用数字成像系统拍后极部。广角镜头贴角膜拍摄。
- 多次尝试:因为患儿不配合,一次检查往往拍多张,好的留下、坏的也可能留下。
这五步解释了数据集里的四类「噪声」:瞳孔大小不一导致的亮度差异、器械阴影、运动模糊、以及同一序列内图像质量的巨大波动。
3.3 为什么保留低质量图
作者的取舍值得单独说:
部分低质量图像被删除,但另一部分(即使质量较差)保留在数据集中,以维持数据的多样性。
这句话背后的判断是:真实筛查场景中,坏图是常态,不是例外。一个只在好图上训练的模型,部署到病房里会立刻失效——因为病房里拍出来的就是这些坏图。
对使用者的实际含义是双向的:
- 如果你的目标是发论文刷指标,先按质量分层评测,否则好图和坏图混在一起,指标的意义会模糊;
- 如果你的目标是做能上线的系统,那这批坏图是必需品,不要筛掉——它们是分布的一部分。
§4 标注体系层:两个人判、第三个人裁
4.1 双人独立 + 第三方共识
论文原话:
两名眼科专家独立完成诊断与 plus 形态判定;结果不同的病例经讨论,与第三名专家达成共识。只有约 4% 的病例需要第三方意见。
这个流程在小规模数据集里算标准配置。它的意义和局限都值得说清。
意义:4% 的分歧率是一个可量化的标注难度指标。它告诉你「ROP 分期 + plus 判定」这件事在专家之间的可重复性相当高(96% 一致),比很多影像任务好。
局限:没有报告 kappa 或 ICC。4% 是「最终需要第三方」的比例,不是「初始不一致率」——两者可能不同(如果两名专家先讨论再决定是否找第三方,初始不一致率会被讨论掩盖)。这一点在论文里没写清。
4.2 plus 形态:三档变两档
plus 病是 ROP 的危险征象:后极部视网膜血管异常扩张与迂曲。临床分三档:normal、pre-plus、plus。
数据集的 PF 字段取值是 0、1、2:
| PF | 含义 | 数据集中是否存在 |
|---|---|---|
| 0 | 正常(normal) | 有 |
| 1 | 数据集里未被使用(pre-plus) | 无 |
| 2 | 非正常(plus) | 有(2 例患者) |
论文明确写 pre-plus 未观察到。而 plus 只有 2 名患者——这也是论文自己点出的一个容易被误读的点:
两名观察到非正常 plus 形态(PF2)的患者,最初被判为正常(PF0),所以这两名患者在 PF0 和 PF2 里各计一次。
也就是说,PF 的取值在患者层面不是互斥的。按 PF 分组统计人数时,这两名患者会被数两次。做「plus 检测」的二分类模型时,这意味着正样本极少(2 人),类别极度不平衡。
4.3 诊断码的类别结构
论文 Table 10 给出每个诊断码对应的患者数、序列数与图像数。有条件的原则:不能相加(§2.4)。
从数据处理角度,这个表最实用的读法是「哪些类别图像多、哪些类别图像少」。论文自己说了:
生理性(正常)图像与其余图像的比例在某些角度看并不理想。
这句话是委婉的。对分类任务来说,正常类占大头、各病理类零散,意味着:
- 直接做多分类会严重偏向正常类;
- 「正常 vs 非正常」的二分类更稳,且论文明确说这本身就有临床价值——能筛掉正常人,剩下的就都值得看;
- ROP 4A/4B/5 三类图像数为零,任何声称「做五期分类」的工作都不可能是用这个库做的。
4.4 案例:DG2 + PF0 的那张足月儿眼底图
用 001_F_GA41_BW2905_PA44_DG2_PF0_RC3_S01_1.jpg 走一遍标签的完整含义,这是理解这套标注体系最快的路径(后文 §5、§7 会反复回到它):
第一层,诊断。 DG2 是「出血,其余正常」。出血是 ROP 之外的后极部表现,常见于早产儿视网膜——血管脆弱、压力波动。它不是 ROP 的分期,是一条独立的病理发现。
第二层,plus。 PF0 表示血管形态正常。这一条与 DG2 不冲突:有出血不等于有 plus。两者是独立的判读维度。
第三层,时间。 PA44 是矫正胎龄 44 周。按论文的筛查终止条件(约 40 周全血管化),这个孩子已经超过常规筛查窗口——她之所以还在被查,说明临床上有别的原因(足月 + 氧疗 + 出血)。
第四层,设备。 RC3 意味着 640×480。如果要做病灶分割,这张图的可分割性远低于 ICON 的 1240×1240。同一份标注,在不同设备上的「可学习性」完全不同。
结论。 这一张图说明:这个数据集的标签不是一个标签,是四个正交维度(诊断、plus、时相、设备)。做实验设计时,任何一个维度没控制住,结论都会有歧义。
后文 §5.4 会回到 §4.4 的案例讲病灶分割的定位,§7.3 会用同一个案例的性别段核对论文的一处数字笔误,§9.2 的解析脚本也以它为自检样例。
§5 任务与评测层:能做什么、怎么切分
5.1 四类可行任务
按数据能支撑的程度排序:
| 任务 | 输入 | 输出 | 数据充分性 |
|---|---|---|---|
| 正常 vs 非正常(二分类) | 单图 | 0/1 | 充分,论文自己推荐 |
| plus 检测(PF0 vs PF2) | 单图 | 0/2 | 不充分,正样本仅 2 人 |
| 诊断码多分类 | 单图 | DG 各类 | 中等,类别极不平衡 |
| 病灶分割 | 单图 | 掩膜 | 需自标或用 ReLeSeT 生成 |
| 跨设备迁移 | 设备 A 训练、B 测试 | — | 充分,三台设备正好 |
论文自己点出的用法是第一个:「如果我们能识别健康患者,剩下的就可以当作有病」。这句话看着像取巧,实际是很务实的临床逻辑——筛查的第一目标是不漏,第二目标才是分类准确性。
5.2 切分:为什么必须按患者
这是用这个数据集最容易犯的错,值得单独强调。
同一患者有多个序列,同一序列有多张图,同一序列内所有图共享诊断码。如果按图像随机切 8:2:
训练集可能包含 001 号患者的 S01 序列的第 1、3、5 张
测试集可能包含 001 号患者的 S01 序列的第 2、4 张
这两组图的眼底几乎一样(同一天、同一台设备、同一次检查)。模型在训练集见过这个眼底,在测试集再认出来毫不费力。指标会虚高,而且虚高的幅度不可估计。
正确的做法是三级 group 切分,从粗到细:
import pandas as pd
from sklearn.model_selection import GroupKFold
df = pd.DataFrame(rows)
df["pid"] = df["pid"].astype(int)
df["series"] = df["pid"].astype(str) + "_S" + df["series"]
#--按患者切分:保证同一患者的所有序列、所有图落在同一侧
gkf = GroupKFold(n_splits=5)
for tr, te in gkf.split(df, groups=df["pid"]):
assert set(df.iloc[tr]["pid"]) & set(df.iloc[te]["pid"]) == set()
如果研究目标是「同一患者不同时间的泛化」(比如预测下一次检查会不会恶化),才按序列切:
#--按序列切分:允许同一患者跨侧,但同一序列不跨
gkf = GroupKFold(n_splits=5)
for tr, te in gkf.split(df, groups=df["series"]):
assert set(df.iloc[tr]["series"]) & set(df.iloc[te]["series"]) == set()
两种切法的指标不能放在一起比。论文里没给基准划分,所以任何「在这个数据集上达到 X%」的说法,都必须说明切法。
5.3 跨设备:一个天然的消融实验
三台设备覆盖了小儿眼底相机的三个世代,分辨率从 640×480 到 1440×1080。这给了三种实验设计:
| 设计 | 训练 | 测试 | 回答什么问题 |
|---|---|---|---|
| 同设备 | RC3 | RC3 | 上限性能(同分布) |
| 跨设备 | RC3 | ICON | 换机器还能用吗 |
| 混合 | RC3 + ICON | RE | 多设备混训是否提升泛化 |
第三种最有实际价值:基层医院用的是旧机器(RC3 一代),三甲用的是新机器。一个只在 ICON 上训练的模型,部署到基层就是跨设备场景。
论文自己的分割评测就做了这个比较,并给了一个具体的结论:Clarity RetCam 3 的图在特异度、MSE、相关系数与 Sørensen-Dice 上略好,而只有敏感度是 Phoenix ICON 更好。这个结论的方向值得记:分辨率高不等于分割好——ICON 是 1240×1240,比 RC3 的 640×480 高得多,但分割指标反而略低。可能的原因是 ICON 的环形照明让病灶边界对比度更强但内部灰度更不均匀,活动轮廓模型在这种分布上更难收敛。
5.4 病灶分割:ReLeSeT 的用法
论文配套发布了一个 Matlab 工具 ReLeSeT(Retinal Lesion Segmentation Tool),流程三步:
- 预处理:分离红、绿通道,自适应直方图均衡,双边滤波(bilateral filter)
- 分割:无边缘活动轮廓模型(active contour without edges),400 次迭代
- 特征:对分割出的掩膜计算几何特征(面积、周长、圆度等)与灰度特征
为什么用双边滤波而不是中值滤波,论文给了数据:在 MSE、相关系数、Sørensen-Dice 三个指标上双边滤波都更好,且在验证集与测试集上表现一致。
为什么是 400 次迭代,论文也说了:这是「分割性能、计算时间、病灶形态多样性」之间的折中。小病灶少迭代就够,大病灶需要更多。选 400 是对大病灶的保险。
把这个工具放到 §4.4 的案例上看:那张 640×480 的图(RC3)上,DG2 标注的是一个出血点,ReLeSeT 的作用就是把那个点勾出来并算出面积——它是「追踪某个具体病灶随时间的变化」,不是「把全图的病灶都找出来」。这个定位要看清:它做的是单病灶的交互式分割,不是全图自动分割。论文自己写「physicians are standardly focused on tracking specific lesions」——临床上医生看的是某一个具体的出血点有没有变大,不是全图的病灶总面积。这个设计与临床工作流是对齐的。
5.5 图像增强:五种方法及其适用条件
论文 Technical Validation 一节用 Python 3.9 + OpenCV 4.6.0 实现了五种增强方法,每种对应一个具体问题:
| 方法 | 解决什么 | 代价 |
|---|---|---|
| Gamma 校正 | 整体过暗/过亮(深色皮肤患儿更常见) | 全局调整,局部对比度不变 |
| 平均亮度归一化 | 不同设备/散瞳程度导致的亮度差异 | 需要设定阈值 b_min |
| 固定宽高比裁剪 | 去除黑边、统一输入尺寸 | 损失视野边缘 |
| CLAHE | 局部对比度低(血管、病灶不清晰) | 噪声也被放大 |
| 通道分离 | 绿通道对血管/出血对比度最高 | 丢色彩信息 |
作者还给了高斯平滑加权叠加这一招,参数是 α=5、β=−5、γ=128。这个组合的效果是「颜色失真但结构显著增强」——适合给人看,不适合直接喂给依赖色彩统计的模型。
一个实用建议:如果做的是 plus 检测(看血管扩张迂曲),绿通道 + CLAHE 是最直接的组合;如果做病灶分割,双边滤波(ReLeSeT 用的)比 CLAHE 更合适,因为 CLAHE 会放大噪点,干扰活动轮廓的收敛。
§6 与库内条目的关系
库内眼科与儿科影像条目可以分成三条线,这个数据集处在「儿科 + 眼底 + 筛查」的交点上。
| 条目 | 关系 |
|---|---|
deepdrid、odir、messidor 一类成人糖网库 |
任务相近(眼底病变分级),场景完全不同(成人 vs 新生儿、配合 vs 不配合) |
oct2017、octdl、kermany 一类 OCT 库 |
成像原理不同(断层 vs 表面照),不能互换 |
idrid、drive、stare 一类血管分割库 |
都是成人眼底的血管分割金标准;本数据集无像素级标注,做血管分割要另找标注源 |
neo 类新生儿影像条目 |
模态不同(超声/监护),但人群重叠 |
检索路径建议:想找「小儿眼底」→ 这一篇;想找「眼底血管分割金标准」→ DRIVE/STARE/IDRiD;想找「ROP 分期大库」→ 目前公开库里没有,只能靠这份数据集加申请制资源组合。
§7 质量评估与局限性
7.0 读这一节之前需要知道的一件事
这个数据集不应当用「大数据集」的标准来评价。按 ImageNet 式的直觉,188 个患者、六千余张图是「太小了」。但这种评价框架在这里是错位的,原因有三:
第一,ROP 筛查本身是个小样本问题。 一个中等规模 NICU 一年筛查的新生儿就是一两百人。要凑到「十万张」,需要几十家医院合作十年——这也是为什么 iROP 这类大库至今不开放。
第二,这个库的价值不在规模,在「标签完整度」。 每一张图都带胎龄、体重、矫正胎龄、诊断、plus、设备。同样这批图,如果只有图像没有元数据,对 ROP 研究的价值会掉一个数量级——因为 ROP 的风险模型本质上是「人口学 + 影像」的联合模型。
第三,它的不可替代性在「可及性」。 iROP 有 5,561 张图,比它少不了多少,但不开放。SUNDROP 也要申请。在「今天就能下载、明天就能跑实验」这个维度上,它是目前唯一选项。
所以正确的评价框架是:给定它的规模上限,它在标签、开放性、文档完整度上做到了什么程度。
7.1 DAIMS 五维评分
| 维度 | 评分 | 依据 |
|---|---|---|
| Data Collection(采集) | ★★★☆☆ | 真实临床筛查数据、单一中心、连续入组;扣分项:单中心、无多设备交叉验证设计、采集时间跨度未披露 |
| Annotation(标注) | ★★★★☆ | 两名专家独立 + 第三方共识(4%)、双维度(诊断 + plus)、序列级一致性维护;扣分项:未报告 kappa/ICC、pre-plus 缺失、4A/4B/5 无样本 |
| Intrinsic Quality(内在质量) | ★★★☆☆ | 图像为 jpg、无压缩参数披露、三台设备分辨率差异大;扣分项:低质量图保留但未标注质量等级 |
| Metadata(元数据) | ★★★★★ | 胎龄、体重、矫正胎龄、诊断、plus、设备、序列、图像号八维齐全,且编进文件名;xlsx + csv 双份;这是它最强的一项 |
| Standardization(标准化) | ★★★☆☆ | 命名规则清晰、目录结构合理;扣分项:非 BIDS/DICOM 标准格式、无官方数据字典 schema 文件、无官方划分 |
四项里 Metadata 是五星,这不是凑数——把八个维度同时编进文件名,同时给 xlsx 与 csv,还保留三种目录组织方式,这个工程量在小型数据集里不常见。
7.2 逐条局限
| 局限 | 具体表现 | 后果 |
|---|---|---|
| 单中心 | 捷克俄斯特拉发一家医院 | 人群、设备、筛查方案都单一,外推性未知 |
| pre-plus 缺失 | PF 只用了 0 与 2 | 三分类研究无法进行 |
| plus 正样本极少 | 仅 2 名患者 | plus 检测模型无法可靠训练 |
| ROP 4/5 期无图 | 4A/4B/5 图像数为零 | 无法做五期分类,重症识别缺样本 |
| 视野局限 | 100–130°,非全视网膜 | 周边病变(最早期的分界线/嵴)拍不到 |
| 无像素级标注 | 只有图像级/序列级标签 | 分割任务需自建金标准 |
| 无官方划分 | 未给 train/val/test | 各文献指标不可直接比较 |
| 低质量图混入 | 刻意保留以维持多样性 | 不做质量分层会低估真实难度 |
| 采集时段未披露 | 论文未给起止年份 | 无法判断设备演进对图像分布的影响 |
| 患者/图像性别计数不一致 | 正文一处写 96 女,表格与图像数为 94 | 引用时要指明以哪个为准 |
7.3 一个具体的、可核对的内部不一致
论文在描述患者构成时出现两处数字:
- 「Briefly, there are 6,004 images from 188 patients, 96 female and 94 male subjects, recalculated to 3,081 images from female patients and 2,923 from male patients.」(原文照录)
- 后文「The dataset contains images from 188 patients - 94 male and 94 female patients.」
96 + 94 = 190 ≠ 188,而 94 + 94 = 188。所以前者是笔误,后者与总数自洽。图像数两侧相加恰好等于总量,也是自洽的。
回到 §4.4 的案例:那张图的文件名里 F 写的是女,若按 96 女 94 男的算法,库里应有 190 名患者,与 188 对不上,也与每张图只有一个性别段的编码方式对不上。所以这类不一致在小数据集论文里并不罕见,处理原则是:用能与总数自洽的那个,并在引用时注明。这也提醒一件事——infant_retinal_database_info.xlsx 是可以自己统计的,遇到数字疑问直接数表,比争论哪句话对更快。
7.4 隐私与伦理边界
论文的声明是:完全匿名,任何人(包括患者本人)都无法将图像与数据对应到具体患者。图像角标已被覆盖,患者编号是纯整数。
但有一个技术层面的保留值得写出来:眼底血管形态具有生物识别性。已有研究证明视网膜血管模式可用于个体识别。所以「匿名」在这里的含义是「无法通过常规信息关联」,不是「在生物特征意义上不可识别」。对于 188 人这个规模的库,实际风险很低,但在伦理审查层面应当知情。
数据集本身由医院按机构与伦理规范采集,论文未提及单独的知情同意豁免细节——这一点在二次使用(尤其是商用,CC0 允许)时值得向使用方说明。
§8 版本与生态
8.1 版本节奏
Kaggle 上的四个版本:
| 版本 | 日期 | 说明 |
|---|---|---|
| v1 | 2022-11-02 | 首发 |
| v2 | 2024-05-24 | 论文正式发表前后的更新 |
| v3 | 2024-07-23 | 与论文定稿同步 |
| v4 | 2025-06-25 | 最近一次更新 |
论文给出的数据发布日是 2023-04-04,并写明「可能的数据库更新总会附带发布日期」。这说明作者把「更新」当作常规操作,而不是一次性发布。
对使用者的实际含义:记录你用的是哪个版本。Kaggle 的下载 URL 带版本号,可以锁定;但如果你只记了「Kaggle 上的那个数据集」,半年后重跑可能对不上。
8.2 三处分发点
同一份数据放在三个地方,各有用途:
| 位置 | 用途 | 备注 |
|---|---|---|
| Kaggle | 主分发点,带版本管理与讨论区 | 需 Kaggle 账号(免费) |
| Figshare | 学术存档,带 DOI | 引用时更规范 |
| GitHub | 代码(增强方法 + ReLeSeT) | 不放图像 |
这个三分布局是小型学术数据集的典型做法:Kaggle 拿流量、Figshare 拿可引用性、GitHub 放代码。三者互补,没有冗余冲突。
8.3 它为什么存在,靠什么持续
需求侧的空洞:ROP 筛查是「该做但没人愿做」的活。它需要反复检查、需要专科判读、需要在 NICU 里排时间。全球每年有大量早产儿,而能做 ROP 筛查的眼科医生严重不足——在中等收入国家尤其明显。远程筛查(telemedicine)是公认的解法,而远程筛查的前提是「有人工智能辅助判读」。要做 AI,就得有开放数据;而开放的 ROP 数据长期不存在,因为病历敏感、患儿是未成年人、标注成本高。
这个数据集填的就是这个洞。 它不追求成为最大的库,而是成为「第一个能让人马上开始做实验的库」。
供给侧的三个条件:
- 有一家愿意公开的医院。 俄斯特拉发大学医院眼科做了十几年筛查,愿意把影像拿出来——这在儿科影像领域不常见,未成年人数据的公开门槛远高于成人。
- 有一组跨学科的人。 作者名单里有眼科医生(Timkovič、Kolarčík、Maršolková)、计算机学院的研究者(Nowaková、Hasal、Snášel)、生物医学工程(Kubíček、Augustynek、Varyšová)。这种组合是小型医学数据集的典型配置:临床方提供数据与判读,工程方做整理与工具。
- 选了 CC0。 这是最关键的一步。CC BY 已经足够开放,但 CC0 把「署名」这个最后的摩擦也去掉了。代价是放弃了署名权带来的学术可见度;收益是任何人(包括商业公司)都能无门槛使用,扩散速度最快。
它不可替代的部分:同时满足「CC0 + 完整人口学 + plus 标注 + 三设备」的早产儿眼底库,目前只有它。任何一项放宽,都能找到替代;四项同时要,没有。
那它靠什么持续? 这个问题在小型数据集上比大型库更尖锐,因为它没有专门的工程团队、没有年度经费、也没有「不更新就断供」的下游依赖。答案有三条:
一是更新成本低。 数据是在常规筛查里顺带积累的,医院不停诊就一直在产生新图像。作者要做的只是定期导出、编码文件名、上传。这种「边际成本接近零」的维护模式,是它能持续的前提。
二是学术激励成立。 数据集本身有 Scientific Data 论文可引,配套工具(ReLeSeT、增强方法)各有会议论文,形成一条小型的成果链。对高校团队来说,维护它有明确的产出回报。
三是许可不构成负担。 CC0 之后,作者不再需要回应「能不能商用」「要不要签协议」这类请求——这正是很多数据集在发布两三年后停更的真实原因:维护者被咨询淹没。放弃署名权换来的,是维护工作的可持续。
三种可能的失效情形:
- 若 iROP 或某个更大规模的多中心库转为开放,它的「唯一可及选项」地位会立刻消失;
- 若 ROP 筛查的临床路径被新技术改写(例如广域 OCT 或 AI 直接床旁判读成为标准),这个数据集的任务定义会过时;
- 若 Kaggle 的分发策略变化(账号门槛、商用条款),CC0 的承诺虽然不会失效,但实际可及性会受影响——这也是为什么 Figshare 的副本很重要。
8.4 生态位:上游与下游
上游:它是 NICU 筛查流程的副产品。任何做新生儿信息化的团队,理论上都能产出类似的库——这也是它可能被复制的原因。
下游:它被用在三类工作里。
| 下游类型 | 典型用法 | 代表工作 |
|---|---|---|
| 分类模型 | 正常 vs 异常、plus 检测 | 论文引用的多项 ROP 检测研究 |
| 分割与增强 | 病灶分割、图像增强方法对比 | 作者自己的两篇 INCoS 论文 |
| 教学 | 病例库、住院医培训 | 论文明确提到「educators」用途 |
第三类容易被忽略,但论文里专门写了「Such a division is a user-oriented solution enabling, e.g., educators, quick orientation in the database」——按患者/序列分目录就是为了教学。这是一个「数据集设计考虑教学场景」的少见例子。
§9 使用指引
9.1 三种角色的最短路径
做筛查 AI 的(想尽快出结果):下载 images_stack → 用 §2.2 的正则解析文件名 → 做「正常 vs 非正常」二分类 → GroupKFold 按患者切分 → 报告时说明切法。这条路一周能跑通。
做跨设备研究的(关心部署):先看 dev 字段的分布 → 按设备做 GroupKFold → 训练 RC3、测试 ICON,再反过来 → 对比退化幅度。论文 §5.3 的分割对比是这个思路的现成模板。
做教学的(要给人看):用 images/ 目录,按患者编号走。一个患者一个文件夹,文件夹里按序列分子目录,序列号就是检查次序。给住院医讲「这个孩子从正常到出现 plus 用了三周」,直接按 S01、S02、S03 顺序放图即可。
9.2 一段能跑的最小管线
下面这段代码把「解析文件名 → 建表 → 按患者切分 → 统计每类样本量」串起来,是任何实验的起点:
import os, re
import pandas as pd
from sklearn.model_selection import GroupKFold
PAT = re.compile(
r'^(?P<pid>\d+)_(?P<sex>[MF])_GA(?P<ga>\d+)_BW(?P<bw>\d+)'
r'_PA(?P<pa>\d+)_DG(?P<dg>\d+)_PF(?P<pf>\d+)'
r'_(?P<dev>[A-Z0-9]+)_S(?P<series>\d+)_(?P<img>\d+)\.jpg$'
)
def build_table(root: str) -> pd.DataFrame:
rows = []
for fn in os.listdir(root):
m = PAT.match(fn)
if not m:
continue
r = m.groupdict()
for k in ("pid", "ga", "bw", "pa", "dg", "pf", "series", "img"):
r[k] = int(r[k])
r["file"] = os.path.join(root, fn)
r["sid"] = f"{r['pid']}-S{r['series']:02d}"
rows.append(r)
return pd.DataFrame(rows)
df = build_table("images_stack")
print(df.shape) # 期望 (6004, 12)
print("患者", df.pid.nunique(), "序列", df.sid.nunique())
#--完整性自检:论文的四个数
assert df.pid.nunique() == 188
assert len(df) == 6004
assert (df.sex == "F").sum() == 3081
assert (df.sex == "M").sum() == 2923
#--按患者切分(唯一正确的默认切法)
for i, (tr, te) in enumerate(GroupKFold(5).split(df, groups=df.pid)):
print(f"fold {i}: train {len(tr)} / test {len(te)}")
四个断言是有意加的:它们对上了论文的四个数,说明文件解析没问题。任何一条不过,先检查是不是下错了版本,再检查正则。
9.3 放进 AI 流程时的三个注意点
第一,别把它当预训练语料。 六千余张图的规模做自监督预训练远远不够,且同一患者的图高度相似,会放大有效样本的冗余。它适合做下游微调与评测,不适合做预训练。
第二,别用随机的 train/test split。 §5.2 讲过了,这里再强调一次:同一序列的图几乎相同,随机切分会造成严重泄漏。这是用这个库最常见的错误,而且错了不会报错,只会得到漂亮但无意义的指标。
第三,别忽略设备字段。 如果训练集里 RC3 占多数、测试集里 ICON 占多数(随机切分很容易这样),模型会同时学到「设备 → 标签」的伪相关。按设备做分层统计是必要的。
§10 AI 使用声明
| 项 | 内容 |
|---|---|
| 性质 | 真实临床筛查影像,非合成、非增强生成 |
| 用途(推荐) | 筛查辅助判读、跨设备迁移、图像增强、教学 |
| 不建议用途 | 直接临床决策、作为唯一训练源做五期 ROP 分类、自监督预训练语料 |
| 标注来源 | 两名眼科专家独立判读 + 第三方共识(约 4%) |
| 伦理 | 完全匿名;眼底血管具生物识别性,二次使用应知情 |
| 许可 | CC0 1.0,可商用、可再分发、无需署名(学术写作仍建议引用) |
| 引用 | Timkovič J, Nowaková J, Kubíček J, et al. Sci Data 11, 814 (2024). doi:10.1038/s41597-024-03409-7 |
| 版本 | Kaggle v4(2025-06-25);记录版本号是复现的前提 |
| 状态 | 活跃(作者声明会持续更新并附发布日期) |
| 案例参照 | 全文以 001_F_GA41_BW2905_PA44_DG2_PF0_RC3_S01_1.jpg 为贯穿样例(§4.4 解剖、§5.4 分割定位、§7.3 数字核对、§9.2 脚本自检) |
常见误读(避坑清单)
| 常见说法 | 实际情况 | 证据 |
|---|---|---|
| 「这个数据集有 96 名女性患者」 | 论文正文一处笔误;正式数字是 94 女 94 男 | 论文同时给出「188 patients - 94 male and 94 female」,96+94=190≠188 |
| 「按诊断码统计,加起来是 188 人」 | 不能相加,同一患者不同序列可诊断不同 | 论文原话「the number of patients in Table 10 can not be summed」 |
| 「可以做三分类:normal / pre-plus / plus」 | pre-plus 未出现,PF 只用了 0 与 2 | 论文「the pre-plus form is not observed in the dataset」 |
| 「能做 ROP 五期分类」 | 4A/4B/5 三期图像数为零 | 论文「ROP 4 A, 4B and 5 are not observed in the dataset」 |
| 「有多少张图就有多少个独立样本」 | 188 人、约 400 个序列;同序列内图像高度相似 | 序列定义见论文 Dataset parameters 一节 |
| 「随机切分 train/test 没问题」 | 会严重泄漏,必须按患者或按序列切 | 同序列共享诊断码、同设备、同一天 |
| 「Kaggle 写着 non-commercial,不能商用」 | 许可正文是 CC0,不限制商业用途;那句是描述文字 | 论文写「available under CC0 licensing at Figshare, Kaggle, and GitHub」 |
| 「三个目录加起来是 18,000 张图」 | 三份是同一批图的三种组织方式 | 论文「The set of identical images is stored in three different root folders」 |
| 「分辨率高所以 ICON 的图更好分割」 | 论文数据显示 RC3 在多数分割指标上略优 | 论文 Technical Validation 表 7 的对比结论 |
| 「8 GB 全是图像」 | 三份副本各占一份,唯一图像约 2 GB 量级 | Kaggle API 报告 7,974,013,608 字节,含三份副本 |
FAQ
问:这个数据集和 iROP 有什么区别?
答:iROP(美国)规模相近(约 5,561 张)但不对外开放;本数据集 CC0 完全开放。两者标注体系不同:iROP 的 plus 分三档(normal/pre-plus/plus),本数据集只有两档(pre-plus 缺失)。
问:能做早产儿 vs 足月儿的对比研究吗?
答:能。胎龄字段直接给,且库里有胎龄 41 周的足月儿(13 人)。但要注意足月儿入组的原因是氧疗等临床因素,不是随机样本,不能当「正常足月对照」用。
问:为什么 plus 只有 2 个患者?
答:因为 plus 是 ROP 里相对少见的征象,且只在 ROP 诊断下出现。论文说得很清楚:「the plus form is a symptom that can occur in any ROP stage but only in connection with ROP diagnosis, so the number of occurrences is not high」。
问:图像里能看到 ROP 的分界线(demarcation line)吗?
答:多数不能。分界线常在中周部到周边,而这批图是后极部视野(100–130°)。能看到的多是后极部的出血、血管形态、以及部分中周部结构。
问:能用它做血管分割吗?
答:技术上可以,但没有金标准。成年人眼底有 DRIVE/STARE/CHASE_DB1 等像素级标注库,本数据集没有。作者另一篇论文(Hasal 等,INCoS 2023)用 U-Net + VGG-16 做过血管分割,但那篇的标注是从哪儿来的、是否公开,需要查原文。
问:数据集的图像是什么时候拍的?
答:论文未披露起止年份,只说「首版发布 2023-04-04」,Kaggle 首发 2022-11-02。从设备构成看(RC3 是老机型、Envision 与 ICON 是后续机型),采集跨越了设备换代的时段。
问:能用它训练一个能直接上临床的模型吗?
答:不能。188 人、单中心、无外部验证队列,任何模型在这个规模上都无法证明泛化性。它可以作为原型验证与论文基线,不能作为临床部署的依据。
问:为什么保留低质量图像?
答:作者的判断是「婴儿患者不配合,很难只拍到好图」,所以保留部分低质量图以反映真实分布。对做部署的人来说这是好事,对刷指标的人来说是噪声。
术语表
| 术语 | 解释 |
|---|---|
| ROP(Retinopathy of Prematurity) | 早产儿视网膜病变,未成熟视网膜血管异常增生导致的疾病,可致盲 |
| 矫正胎龄(PA, postconceptional age) | 胎龄 + 出生后实足周数;也叫经后年龄(postmenstrual age) |
| 胎龄(GA, gestational age) | 出生时的孕周数 |
| plus 病(plus disease) | 后极部视网膜血管异常扩张与迂曲,是 ROP 恶化的危险征象 |
| pre-plus | plus 的前期状态,介于正常与 plus 之间;本数据集未收录 |
| 分界线 / 嵴(demarcation line / ridge) | ROP 最早期的视网膜表现,位于血管化区与无血管区交界,多在周边 |
| 序列(series) | 同一次检查产生的一组图像,同患者、同天、同设备、同诊断码 |
| 后极部(posterior pole) | 视网膜中央区域,含视盘与黄斑,广角相机的主要成像区 |
| 开睑器 | 撑开眼睑的器械,ROP 检查必需(患儿不会主动睁眼) |
| 人工散瞳(artificial mydriasis) | 用滴眼液扩大瞳孔,ROP 检查前的准备步骤 |
| 活动轮廓模型(active contour) | 一种基于能量最小化的图像分割方法,ReLeSeT 用它分割病灶 |
| 双边滤波(bilateral filter) | 保边去噪的滤波方法,ReLeSeT 用它做预处理 |
| CLAHE | 限制对比度的自适应直方图均衡,增强局部对比度 |
| RC3 / RE / ICON | 三台相机的代码:Clarity RetCam 3、Natus RetCam Envision、Phoenix ICON |
| DG / PF | 诊断码(diagnosis code)与 plus 形态(plus form)字段 |
| CC0 | Creative Commons 公有领域贡献,放弃全部权利,不要求署名 |
| NICU | 新生儿重症监护病房 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 可否自行复算 |
|---|---|---|---|
| 图像总数 | 六千余 | 论文摘要 + Kaggle 描述 | 可,数文件 |
| 患者数 | 188 | 论文 | 可,数唯一 pid |
| 女 / 男 | 94 / 94 | 论文 | 可 |
| 女性图像 / 男性图像 | 3,081 / 2,923 | 论文 | 可 |
| 胎龄均值 | 33 周 | 论文 | 可 |
| 胎龄范围 | 23–41 周 | 论文 | 可 |
| 出生体重均值 | 2,017 g | 论文 | 可 |
| 出生体重范围 | 480 g 至四千余克 | 论文 | 可 |
| 矫正胎龄范围 | 30–113 周 | 论文 | 可 |
| 多次检查的患者数 | 140 | 论文 | 可,数序列 |
| 需第三方裁定的比例 | 约 4% | 论文 | 不可(未给原始分歧记录) |
| plus 患者数 | 2 | 论文 | 可 |
| 数据集体量 | 约 8.0 GB | Kaggle API | 可 |
| 分辨率 | 640×480 / 1440×1080 / 1240×1240 | 论文设备一节 | 可,读图像尺寸 |
附录 B:文件与目录清单
| 路径/文件 | 内容 |
|---|---|
images/ |
按 患者编号/序列号/ 组织的图像 |
images_stack/ |
平铺的全部图像 |
images_stack_without_captions/ |
平铺、无角标文字的图像 |
infant_retinal_database_info.xlsx |
患者信息汇总(含字段说明) |
infant_retinal_database_info.csv |
患者信息(无字段说明,纯数据) |
附录 C:外部资源对照
| 资源 | 类型 | 与本文的关系 |
|---|---|---|
| iROP(Imaging and Informatics in ROP) | 美国多中心影像库 | 规模相近,不开放 |
| SUNDROP(Stanford University Network for Diagnosis of ROP) | 远程筛查数据集 | 需申请 |
| e-ROP | 美国多中心前瞻研究 | 入组胎龄 22–35 周、体重 <1251 g |
| 德国 ROP 登记 | 登记库 | 90 人,无图像 |
| DeepROP(中国成都) | 模型工作 | 自带数据集,未公开 |
| ReLeSeT | Matlab 工具 | 本文配套的病灶分割工具 |
| Image_enhancement_retinopathy_of_prematurity | Python 代码 | 本文配套的图像增强实现 |
附录 D:一张图的完整信息流
以 001_F_GA41_BW2905_PA44_DG2_PF0_RC3_S01_1.jpg 为例,看信息在系统里怎么走:
NICU 筛查排班
↓ 患者 001 到了检查日
滴散瞳药 → 开睑 → 医师用 RetCam 3 拍摄
↓ 相机自动烧录角标(亮度、日期)
原始 jpg(含角标)
↓ 覆盖角标黑矩形
清洗后 jpg
↓ 编码元数据到文件名
001_F_GA41_BW2905_PA44_DG2_PF0_RC3_S01_1.jpg
↓ 复制三份 + 不同目录组织
images/ images_stack/ images_stack_without_captions/
↓ 上传
Kaggle v1 → v2 → v3 → v4
↓ 下载 + 正则解析
DataFrame(6004 行 × 12 列)
↓ GroupKFold(groups=pid)
可用的训练/评测切分
这条链上有三个地方会丢信息:角标覆盖(丢掉拍摄参数)、文件名编码(丢掉未编码的字段)、三份副本(可能被误当三份数据)。三处都有对策,但都需要知道。
附录 E:环境与依赖
跑通本文所有代码只需要标准数据栈:
pip install pandas scikit-learn pillow opencv-python
如果要复现 ReLeSeT 的分割流程,需要 Matlab(ReLeSeT 是 .m 与打包的 .exe);如果想在 Python 里做等价实现,用 scikit-image 的 active_contour 或 morphsnakes,但要自己实现「无边缘」版本的 C-V 模型能量项。
如果要读 DICOM(本数据集不是 DICOM,但用同一批病例做临床管线对接时可能需要),加 pydicom。
附录 F:三个可以直接开跑的实验设计
实验一:正常 vs 非正常二分类。
标签:dg == 正常类 为 0,其余为 1。切分:GroupKFold 按 pid。评测:AUC + 敏感度(优先,因为筛查要「不漏」)+ 按设备分层的 AUC。预期:同设备 AUC 高,跨设备下降。
实验二:跨设备迁移。
训练 RC3 → 测试 ICON,再训练 ICON → 测试 RC3。看退化幅度。加一个「混训」对照组(RC3+ICON 一起训,测 RE)。这个设计直接回答「基层旧机器上训的模型能不能给新机器用」。
实验三:图像增强的增益。
在同一划分下,比较「原图」与「绿通道 + CLAHE」两种输入的模型性能。控制变量:同一网络、同一超参、同一划分。论文的 Technical Validation 给了增强方法的实现,可以直接搬。
三个实验的共同前提是:按患者切分。这一点在任何实验里都不能省。
另外,三个实验都建议先拿 §4.4 那张案例图做一次手工验证:把它的文件名解析出来,看 dg、pf、dev、pa 四个字段是否与论文描述一致。这一步能在一分钟内确认整条解析链没写错。
编辑说明
本篇数字分三层来源:作者在 Kaggle 数据集页面上的官方描述(规模、文件结构、命名规则、许可、引用格式);Scientific Data 论文 doi:10.1038/s41597-024-03409-7(人口学统计、设备参数、标注流程、技术验证结果);以及 Kaggle 数据集 API 的元信息(版本历史、体量、下载量、标签)。核验时间 2026-10-26。
凡属「逐图统计可复算」的数字,附录 A 已标注「可」。凡属论文叙述性的(分歧率 4%、低质量图保留策略),标注「不可」,因为这些依赖未公开的原始记录。
已知的内部不一致:患者性别计数(正文 96 女 vs 表格 94 女),已在 §7.3 与避坑清单中存照,按与总数自洽的 94/94 采用。
未做的核验:未下载全量图像做逐图尺寸与色彩统计;未复现 ReLeSeT 的分割指标;未核对 Figshare 侧版本的 DOI 与 Kaggle v4 是否内容一致;论文引用的 iROP、SUNDROP 等对比数据集当前的可申请状态未逐一核实。
许可以 Kaggle 页面与论文表述为准(CC0)。Kaggle 描述里「free-for-non-commercional usage」一句与 CC0 冲突,按 CC0 文本执行,已在 FAQ 与避坑清单中说明。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- hvdropdb — 共享标签:医学影像 / 眼科影像 / 图像分类 / 医学图像分割 / 儿科
- corn-nerve — 共享标签:医学影像 / 眼科影像 / 图像分类 / 医学图像分割 / 评测基准
- fpus23 — 共享标签:医学影像 / 图像分类 / 医学图像分割 / 儿科 / 评测基准
- cataract-1k — 共享标签:医学影像 / 眼科影像 / 图像分类 / 医学图像分割 / 评测基准
- origa-light — 共享标签:医学影像 / 眼科影像 / 图像分类 / 医学图像分割 / 评测基准
- riga — 共享标签:医学影像 / 眼科影像 / 图像分类 / 医学图像分割 / 评测基准
- stare — 共享标签:医学影像 / 眼科影像 / 图像分类 / 医学图像分割 / 评测基准
- octa-25k — 共享标签:医学影像 / 眼科影像 / 图像分类 / 医学图像分割 / 评测基准
- oimhs — 共享标签:医学影像 / 眼科影像 / 图像分类 / 医学图像分割
- tn3k — 共享标签:医学影像 / 图像分类 / 医学图像分割 / 评测基准
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

