
大概五年前我第一次做视网膜血管分割遇到的第一个问题不是模型选什么而是该拿什么数据训练。搜了一圈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两套标注以及maskFOV掩膜几个目录结构很清晰。因为太经典网上也有很多镜像但我建议还是走官方渠道至少能确认文件没被动过手脚。实际使用中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病变检测它是早期最经典的数据集之一如果你做的是血管分割它有时被用来测试模型在病变图像上的鲁棒性——因为血管分割在病变区域特别容易出错。但严格来说它不属于血管分割的训练/测试基准。五个数据集的基本情况可以先看这张表数据集样本数主要标注内容图像尺寸获取方式血管分割适配度DRIVE40血管mask FOV掩膜约565×584官网申请高STARE20血管mask2套700×605官网直接下载高CHASE_DB128血管mask2套 FOV掩膜1280×960镜像/GitHub高REFUGE1200视盘/视杯 青光眼标签约1600×1600以上官网申请低无血管标注DiaRetDB189病变区域/坐标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对比度受限自适应直方图均衡化几乎是这个领域的标配预处理能显著提升血管的可见度。我常用的参数是clipLimit2.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_DB1AUC大概率会掉2到8个百分点具体的下降幅度取决于模型的鲁棒性和预处理是否统一。这个下降不是模型不行而是域差异的客观体现写论文时不用怕暴露这个数值反而是体现工作严谨性的加分项。不过正式发表时我建议还是把同数据集指标和跨数据集指标分开报告不要混在一起比较。同数据集内看模型容量和训练策略跨数据集看泛化能力两者反映的是不同维度的性能。5.3 写作与实验中的常见误区有一个很常见的坑必须提醒有人会把DRIVE测试集的第二套标注拿来参与训练。DRIVE测试集提供两套标注如果拿其中一套做人标参考、另一套做训练这本质上是把测试集的标注信息泄漏到了训练阶段。虽然这里泄漏的不是图像本身而是标注信息但指标会虚高审稿人一旦发现基本是大硬伤。要做严格的对照实验训练过程中永远只使用训练集提供的标注。另外一个容易被忽略的问题是掩膜对齐。DRIVE的标注文件和原始图像是严格对齐的但如果你的数据增强里包含随机旋转和裁剪FOV掩膜、标签、原始图像必须使用完全相同的变换参数。用图像库的随机数时最好为三张图传入同一个seed否则旋转角度不一致标签和图像错位模型根本学不出有效特征。提示检查对齐问题有一个很笨但很有效的方法——把原始图像的绿色通道和标注做半透明叠加肉眼扫一遍。如果血管的标注位置和图像里的血管对得上说明管线没问题如果边缘错位优先检查插值方式标签和掩膜必须用最近邻插值用双线性插值会把标签边缘变模糊。5.4 我的个人选择如果现在让我重新搭一套血管分割实验我会这样配训练集用DRIVE的全部20张加上CHASE_DB1的全部28张40多张图虽然还是不多但相比单用DRIVE能增加不少血管形态多样性。外部测试用STARE和DRIVE测试集其中DRIVE测试集作为主测试集STARE作为泛化验证。如果任务允许再用REFUGE做个无监督预训练把视盘定位的辅助信息也利用起来。这套组合不会被审稿人挑只有一个数据集的毛病工作量又可控。最后再分享一个实际经验数据集的预处理管线一旦确定中间任何一步都不要频繁改动。我见过不少项目模型没换只因为换了CLAHE参数指标就出现两三个百分点的波动折腾半天才查到原因。先把管线的每个环节固定下来记录清楚然后再谈模型创新——否则你根本分不清涨点是模型带来的还是数据处理带来的。