大概五年前我第一次做视网膜血管分割,遇到的第一个问题不是模型选什么,而是该拿什么数据训练。搜了一圈,DRIVE、STARE、CHASE_DB1、REFUGE、DiaRetDB1这些名字反复出现,但没人告诉我它们之间到底有什么区别:哪个适合当训练集,哪个只能当测试集,哪个下载下来就能直接跑,哪个还要自己造掩膜,哪个甚至根本不是做血管分割的。这篇文章就把这几个数据集一次讲透,顺便把评估协议、预处理细节和选型思路一起理清楚,给正准备入坑眼底图像分析的朋友省点时间。
1. 眼底图像公开数据集:为什么会扎堆出现在血管分割任务里
视网膜血管分割这个任务,输入是一张眼底彩照,输出是每个像素属于血管还是背景,本质上就是逐像素二分类。听起来不复杂,但它对临床的意义非常大:糖尿病视网膜病变、高血压、动脉硬化都会在眼底血管上留下形态变化,比如血管迂曲、粗细不均、分叉角度异常。医生靠肉眼观察这些变化,耗时且主观,所以从很早开始,计算机辅助分析就是眼科影像研究的重点方向。
但这里有个很现实的问题——标注成本。让一个医生手工描绘一张眼底图的完整血管网络,通常需要几个小时,而且不同医生的标注结果还不完全一致。如果每个研究团队都自己标注数据,那整个领域根本跑不起来。公开数据集的出现,让所有人能在统一标准下训练模型、对比算法,这也是DRIVE、STARE这些老数据集能流行二十年的根本原因。
为什么会有这么多数据集,而不是一个统一的大数据集?因为眼底图像的数据分布实在太散了。拍摄设备不同、人群不同(成人/儿童)、疾病谱不同、图像分辨率不同,都会导致模型在一个数据集上效果好、换到另一个数据集上效果明显下降。所以这个领域慢慢形成了一个惯例:一个新方法出来,至少要在一个数据集上训练,在另一个数据集上做外部验证,才能说明它真的有泛化能力。
顺便说一句,这五个数据集虽然经常被并列提起,但它们并不完全属于同一类。DRIVE、STARE、CHASE_DB1是有逐像素血管标注的,做血管分割直接拿它们训练和测试没问题。而REFUGE的主标注是视盘和视杯,DiaRetDB1的主标注是糖尿病病变区域,它们本身并不提供血管像素级标签。很多人一开始没注意到这点,把REFUGE下载下来想做血管分割,结果发现根本没有血管标注,白折腾一场。后面我会把每个数据集的真实属性讲清楚。
2. 逐个拆解DRIVE、STARE、CHASE_DB1、REFUGE、DiaRetDB1
这五个数据集的特点差异很大,我按"真正适合血管分割"的顺序来拆,前三个是主力,后两个是经常被误用的。
2.1 DRIVE:最常被引用的基准测试集
DRIVE全称是Digital Retinal Images for Vessel Extraction,来自荷兰Utrecht大学医学中心的糖尿病视网膜病变筛查项目,2004年发布,是目前血管分割领域引用量最高的数据集,没有之一。
数据规模是40张眼底彩照,官方明确划分为训练集20张、测试集20张。拍摄设备是Canon CR5非散瞳眼底相机,45°视场角,图像尺寸约565×584像素,不同论文里有时写584×565,其实是同一个尺寸,只是宽高的定义顺序不同。这个分辨率放到今天看很低,但在2004年已经是规范的数据集了。
标注方面,训练集的每一张图提供一套手动分割的血管标注,测试集的每一张图提供两套独立的手动标注。这里有个容易忽略的细节:DRIVE的标注并不是眼科医生完成的,而是由经过训练的观察者完成的。所以这套标注的精度上限,不完全等同于临床专家水平。测试集提供两套标注的目的,是为了评估观察者之间的一致性,也给算法性能提供了一个"人标上界"的参考。
获取方式是在官网填写使用协议,获批后下载。整个压缩包解压后包含images(原始图像)、manual1和manual2(两套标注)以及mask(FOV掩膜)几个目录,结构很清晰。因为太经典,网上也有很多镜像,但我建议还是走官方渠道,至少能确认文件没被动过手脚。
实际使用中,DRIVE最适合做的事情是当主测试集。模型在它上面跑出来的AUC、准确率、灵敏度,可以直接和论文数据库里几千篇文章对比,这是其他数据集替代不了的。
2.2 STARE:小样本、病理丰富的难度担当
STARE全称是STructured Analysis of the REtina,由美国加州大学圣迭戈分校发布,比DRIVE还要早一点,2000年左右就出来了。
它只有20张眼底图像,用Topcon TRV-50眼底相机拍摄,35°视场角,图像尺寸700×605像素。这20张图里大约一半正常,一半带有明显病理,比如视网膜母细胞瘤、视网膜前膜这些严重病变。正因为病理比例高,STARE上的血管分割难度通常比DRIVE更大——病变区域的血管会和病灶混在一起,对比度不均匀,模型很容易在病灶边缘产生假阳性。
STARE每张图有两套独立的人工标注,分别来自两位标注者。常见做法是选其中一套作为ground truth,另一套也可以用来做灵敏度分析或作为训练数据扩充。但要注意,STARE官方没有像DRIVE那样给出训练/测试划分,所以你在论文里看到的"STARE result"到底怎么来的,必须自己在方法部分写清楚。有的组用10张训练10张测试,有的组用留一法交叉验证,指标结果差别不小。
另外STARE没有提供官方FOV掩膜,这是它和DRIVE、CHASE_DB1的一个明显差异。后面预处理部分我会专门讲怎么自己补一个掩膜。
2.3 CHASE_DB1:儿童眼底与两张独立标注
CHASE_DB1全称是Child Heart and Health Study in England,来自英国一项儿童心脏健康队列研究。这个背景本身就很有意思:它采集的是儿童眼底图像,视盘大小、血管粗细比例、血管走向都和成人数据有明显差异,所以天然适合做跨年龄段泛化测试。
数据集包含28张眼底图像,图像尺寸1280×960像素,比DRIVE、STARE都要大一圈。每张图同样有两套独立的人工标注,而且质量不错。这个数据集没有官方训练/测试划分,加上样本量实在太小,直接拿来训练深度学习模型很容易过拟合,所以主流用法是作为外部测试集,或者和DRIVE合并成训练集来扩充数据多样性。
获取方式比较麻烦,原项目官网已经不太稳定,经常打不开。好在GitHub上有很多镜像仓库,搜索CHASE_DB1就能找到。下载后建议核对一下文件数量和尺寸,确认不是被二压过的版本。
2.4 REFUGE:严格来说不是血管数据集
REFUGE是一个与MICCAI挑战赛相关的眼底图像数据集,由中山大学中山眼科中心等机构组织发布,共1200张眼底彩照,官方划分为训练集、验证集、测试集各400张。图像采集自两种不同设备,分辨率在1600×1600到2100×2100之间,数据量在所有眼底公开数据集里算比较大的。
但它的标注重点是视盘和视杯的分割,以及青光眼诊断标签。换句话说,它根本没有血管的像素级标注。那为什么会被列进视网膜血管分割数据集的清单里?我理解是因为很多综述在整理"眼底图像公开资源"时,会把所有眼底彩照数据集放一起列出来,久而久之大家就误以为它也是血管分割数据集了。
那它对做血管分割的人有没有价值?有,但用法不同。一是可以拿来做预训练,1200张图足够训练一个眼底图像的表征模型;二是可以用它训练视盘/视杯分割模型,帮你定位视盘区域,在做血管分割时排除掉视盘区域的干扰;三是如果要研究跨数据集适配,REFUGE可以作为一个规模更大的目标域数据源。但如果你是想找血管标注来训练分割网络,REFUGE不是你要找的东西。
2.5 DiaRetDB1:病变标注的"元老"
DiaRetDB1全称是Diabetic Retinopathy Database 1,来自芬兰库奥皮奥大学,也就是现在的东芬兰大学,主要面向糖尿病视网膜病变检测任务。
它包含89张眼底图像,分辨率1500×1152像素左右,50°视场角,其中绝大多数是不同程度的糖尿病视网膜病变,少量正常图像作为对照。标注由4位医学专家独立完成,标注内容是微动脉瘤、出血、硬渗出、软渗出这些病变区域,每个标记还带有置信度信息。
和REFUGE一样,DiaRetDB1也没有逐像素血管标注。它的价值在于:如果你研究的是DR病变检测,它是早期最经典的数据集之一;如果你做的是血管分割,它有时被用来测试模型在病变图像上的鲁棒性——因为血管分割在病变区域特别容易出错。但严格来说,它不属于血管分割的训练/测试基准。
五个数据集的基本情况可以先看这张表:
| 数据集 | 样本数 | 主要标注内容 | 图像尺寸 | 获取方式 | 血管分割适配度 |
|---|---|---|---|---|---|
| DRIVE | 40 | 血管mask + FOV掩膜 | 约565×584 | 官网申请 | 高 |
| STARE | 20 | 血管mask(2套) | 700×605 | 官网直接下载 | 高 |
| CHASE_DB1 | 28 | 血管mask(2套)+ FOV掩膜 | 1280×960 | 镜像/GitHub | 高 |
| REFUGE | 1200 | 视盘/视杯 + 青光眼标签 | 约1600×1600以上 | 官网申请 | 低(无血管标注) |
| DiaRetDB1 | 89 | 病变区域/坐标 | 1500×1152 | 邮件申请 | 低(无血管标注) |
3. 评估协议里的门道:掩膜、双标注与指标口径
很多人跑通一个模型后,报告出来的指标却和论文对不上,问题往往不在模型,而在评估协议。眼底图像血管分割这个领域,评估协议里的细节比大多数人想象中要多。
3.1 FOV掩膜:不评估背景才能拿到合理分数
眼底相机拍摄出来的照片不都是有效区域,图像四周通常有一圈黑色背景,这部分像素不包含任何视网膜信息。如果在整张图上计算准确率,黑色背景占了很大比例,而模型只要学会"把背景预测为非血管"就能获得很高的准确率,这个分数显然没有意义。
DRIVE和CHASE_DB1都提供了FOV掩膜,告诉你哪些像素属于有效的眼底区域。正规的做法是:只在FOV掩膜内部计算灵敏度、特异性、准确率和AUC,背景像素完全不参与指标计算。STARE没有官方掩膜,通常的做法是从绿色通道里用阈值分割或Otsu自动阈值把圆形眼底区域提取出来,再自己生成一个掩膜。这个掩膜的边缘如果处理不好,会影响最终指标的稳定性。
注意:如果你用了不同方式生成STARE的FOV掩膜,指标的绝对值会有微小差异,这在论文对比时不太公平。建议公开你的掩膜生成代码,这样别人能复现你的评估过程。
3.2 双标注:跨观察者一致性就是性能上限
DRIVE测试集和STARE、CHASE_DB1都有两套人工标注。这两套标注之间本身就不完全一致,在血管边缘、细小血管处经常出现一个标了另一个没标的情况。换句话说,算法的预测不可能同时和两套标注完全一致。
所以这个领域有一个不成文的参考:把其中一套标注当作金标准计算模型指标,另一套标注也当作"模型"去算同样的指标,得到的分数就是人类标注者之间的差异水平。模型的指标如果接近这个水平,就已经很好了,没必要追求无限接近100%的准确率。这一点在写论文分析结果时很有用,可以直观地说明模型性能已经逼近人工标注的上限。
3.3 常用指标:谁在高分,谁在裸泳
血管分割最常报告的指标是准确率(ACC)、灵敏度(Se)、特异性(Sp)、AUC和Dice系数。
准确率最容易虚高,因为血管像素通常只占FOV内部像素的10%左右,哪怕把所有像素都预测为非血管,准确率也有90%。所以只看准确率没有任何意义,必须结合灵敏度和特异性一起看。灵敏度衡量的是血管被找出来的比例,特异性衡量的是背景被正确排除的比例,两者此消彼长,很多方法通过调阈值就能在两者之间滑动。
AUC不依赖阈值选择,是论文里最常用来排名的指标。经典U-Net在DRIVE上的AUC通常在0.96到0.98区间,后续很多改进模型能到0.98以上;STARE由于病变更多、标注一致性更差,同模型报告出来的AUC普遍比DRIVE低一到两个百分点,这是正常现象。如果你看到某篇论文在STARE上分数比DRIVE还高,就得留意一下它的评估设置是否合理。
4. 数据加载和预处理中最容易被坑的六个细节
数据集下载好只是第一步,真正上手的时候坑特别多。我把自己踩过的、以及在开源社区里高频出现的问题集中整理一下,每个都是实操里会遇到的真问题。
4.1 文件格式与标签二值化
DRIVE的手动分割标注是GIF格式的索引图像,读出来后像素值不一定是0和1,有的地方是0和255,还有的因为压缩算法在血管边缘产生一些中间值。直接用0和1去监督训练,边缘部分会被当作错误类别,导致模型在血管边缘的预测变模糊。
正确的做法是:读取标签后先做一次二值化,比如label = (label > 127).astype(uint8),把标签统一成0和1。STARE的标注格式也类似,CHASE_DB1的标注一般直接提供二值图像,但保险起见加载后还是检查一下像素取值集合。
4.2 FOV掩膜的处理:STARE无现成掩膜
DRIVE和CHASE的掩膜是现成的,直接用就好。但掩膜也要做尺寸对齐,原始图像如果被裁剪或缩放,掩膜必须跟着做一模一样的几何变换,否则FOV区域和图像对不上,后面所有指标全是错的。
STARE需要自己生成掩膜。我的做法是:取绿色通道,做一次高斯模糊,然后用Otsu阈值分割,把最大的连通域保留下来作为FOV。生成之后做一次形态学闭运算,填掉眼底边缘可能出现的细小孔洞。这个流程能应付STARE的绝大多数图像,但对某些病变特别严重的图,视网膜边缘和背景对比度很低,阈值分割可能不准确,需要在验证时用肉眼检查一遍掩膜覆盖是否合理。
4.3 绿色通道优先
眼底彩照的三个通道里,红色通道往往过曝,血管和背景对比度低;蓝色通道受噪声影响大,视网膜细节弱;绿色通道的血管和背景对比度最高,是所有预处理流程里最稳定的选择。绝大多数血管分割模型都是只用绿色通道作为输入,或者在输入层把三通道都喂进去但让网络自己学习权重,后者需要更大的模型容量和更多训练数据。
如果做跨数据集训练,我建议统一取绿色通道进行单通道输入,这样不同数据集的色域差异对模型的影响会小很多。很多人忽略这一点,直接拿RGB图训练,换到另一个数据集后颜色分布一变,性能掉得厉害。
4.4 对比度增强与归一化
眼底图像受拍摄环境、设备差异影响,光照不均匀很常见,血管在图像边缘往往比较暗。CLAHE(对比度受限自适应直方图均衡化)几乎是这个领域的标配预处理,能显著提升血管的可见度。我常用的参数是clipLimit=2.0、tileGridSize=(8,8),效果稳定。但要注意,CLAHE会同时增强噪声,如果增强强度过大,细小血管和噪声之间的边界会变模糊,反而增加假阳性。
归一化上,最稳妥的是按数据集统计均值方差做标准化,而不是简单除以255。多个数据集混合训练时,最好在预处理阶段就把每个数据集的像素分布对齐,比如先做CLARE再统一标准化,比用原始像素值直接训练要稳定得多。
4.5 小样本的训练/测试划分
DRIVE有官方划分,直接用,不用纠结。但STARE和CHASE_DB1样本量很小,划分方式会影响最终指标,所以在论文里必须明确写清楚。
STARE的常见做法有两种,一种是随机选10张训练、10张测试,多次随机并报告平均值;另一种是留一法交叉验证,对20张图轮流做测试。这两种方式报告的指标不可直接对比,留一法训练集更大,通常分数会更高一些。CHASE_DB1没有官方划分,我个人建议如果做交叉验证,保证同一个人的两张图(如果存在)不跨训练集和测试集,避免数据泄漏。
4.6 类别不平衡处理
前面提到,FOV内部血管像素大约只占10%到12%,这是个典型的严重类别不平衡问题。如果直接拿交叉熵损失训练,模型会倾向把所有像素都预测为背景,虽然准确率高,但血管一条也找不出来。
通用的方案有三个方向。一是用Dice损失,或者BCE与Dice的组合损失,这是目前的主流做法。二是加权交叉熵,给血管像素更高的权重。三是用Focal Loss,让模型更关注那些难分的细小血管和边缘像素。我的经验是,BCE + Dice的组合在大多数场景下最稳,参数也少,调起来不费劲;如果你的模型已经很强了,再试Focal Loss说不定还能再挤一点提升,但要小心过拟合。
预处理里还有一些零碎的增强技巧,比如随机旋转、翻转、弹性变换、亮度对比度扰动。有一点值得注意:眼底图像的解剖结构有天然的方向性,视盘、黄斑的位置和血管走向都有生理规律,所以平移增强的幅度不要太大,否则会给模型引入不真实的几何分布,导致在测试集上出现奇怪的误分割。
5. 数据集选型:从任务出发,而不是从名气出发
数据集选型这件事,说到底是看你到底要解决什么问题。不同目的,选择逻辑完全不一样。
5.1 不同任务对应数据集
如果你做的是常规血管分割深度学习算法验证,我建议主数据集用DRIVE,这是领域公认的基准,跑出来的结果能和几乎所有已发表工作对比。光看DRIVE还不够,审稿人大概率会要求补充外部验证,这时CHASE_DB1和STARE就是最好的选择——样本量小,但对泛化能力的检验非常有效。
如果你做的是跨数据集泛化或域适应研究,常规设置是DRIVE作为源域,STARE或CHASE_DB1作为目标域,目标域可以用少量标注做无监督适配,或者完全零样本测试。CHASE因为是儿童眼底,和DRIVE的成人眼底差异明显,域偏移更大,测试难度也更高,更适合用来展示域适应方法的有效性。
如果你的任务和青光眼相关,REFUGE是必须用的数据集,它提供视盘和视杯的精细分割标注以及青光眼诊断标签,是目前这个子领域里数据量最大的公开资源之一。预训练也可以考虑用它的1200张图,先训练一个眼底图像的分类或重建任务,再迁移到血管分割,在小数据集上往往能带来肉眼可见的提升。
如果你的任务和DR病变检测相关,DiaRetDB1是经典选择,但今天它更适合做早期对比,或者作为多个数据集中的一个来扩充病变类型的覆盖度。实际做DR检测时,我个人还会建议补充IDRiD、DDR这些更新的数据集,它们的病变标注更细、图像质量更高。
5.2 跨数据集泛化测试建议
做血管分割研究,一个常见的误区是:在DRIVE上训练,然后在DRIVE上反复调参测试,最后只报告DRIVE的指标。这种做法问题很大,因为一旦你在某个测试集上迭代足够多次,模型很可能已经间接过拟合了测试集,指标反映的不再是真实泛化能力。
更靠谱的做法是:把DRIVE当训练集,把STARE和CHASE_DB1当真正的"未知数据"来测试,只在最后阶段跑一次。这样得到的跨数据集指标虽然比同数据集低,但它才是模型真实落地时的表现。我自己的经验是,DRIVE训练的模型直接测CHASE_DB1,AUC大概率会掉2到8个百分点,具体的下降幅度取决于模型的鲁棒性和预处理是否统一。这个下降不是模型不行,而是域差异的客观体现,写论文时不用怕暴露这个数值,反而是体现工作严谨性的加分项。
不过,正式发表时我建议还是把"同数据集指标"和"跨数据集指标"分开报告,不要混在一起比较。同数据集内看模型容量和训练策略,跨数据集看泛化能力,两者反映的是不同维度的性能。
5.3 写作与实验中的常见误区
有一个很常见的坑必须提醒:有人会把DRIVE测试集的第二套标注拿来参与训练。DRIVE测试集提供两套标注,如果拿其中一套做人标参考、另一套做训练,这本质上是把测试集的标注信息泄漏到了训练阶段。虽然这里泄漏的不是图像本身,而是标注信息,但指标会虚高,审稿人一旦发现基本是大硬伤。要做严格的对照实验,训练过程中永远只使用训练集提供的标注。
另外一个容易被忽略的问题是掩膜对齐。DRIVE的标注文件和原始图像是严格对齐的,但如果你的数据增强里包含随机旋转和裁剪,FOV掩膜、标签、原始图像必须使用完全相同的变换参数。用图像库的随机数时,最好为三张图传入同一个seed,否则旋转角度不一致,标签和图像错位,模型根本学不出有效特征。
提示:检查对齐问题有一个很笨但很有效的方法——把原始图像的绿色通道和标注做半透明叠加,肉眼扫一遍。如果血管的标注位置和图像里的血管对得上,说明管线没问题;如果边缘错位,优先检查插值方式,标签和掩膜必须用最近邻插值,用双线性插值会把标签边缘变模糊。
5.4 我的个人选择
如果现在让我重新搭一套血管分割实验,我会这样配:训练集用DRIVE的全部20张加上CHASE_DB1的全部28张,40多张图虽然还是不多,但相比单用DRIVE能增加不少血管形态多样性。外部测试用STARE和DRIVE测试集,其中DRIVE测试集作为主测试集,STARE作为泛化验证。如果任务允许,再用REFUGE做个无监督预训练,把视盘定位的辅助信息也利用起来。这套组合不会被审稿人挑"只有一个数据集"的毛病,工作量又可控。
最后再分享一个实际经验:数据集的预处理管线一旦确定,中间任何一步都不要频繁改动。我见过不少项目,模型没换,只因为换了CLAHE参数,指标就出现两三个百分点的波动,折腾半天才查到原因。先把管线的每个环节固定下来,记录清楚,然后再谈模型创新——否则你根本分不清涨点是模型带来的还是数据处理带来的。