retina-unet
retina-unet 是一款基于卷积神经网络的开源工具,专门用于从眼底图像中自动分割视网膜血管。它通过将图像中的每个像素分类为“血管”或“非血管”,解决了传统人工标注效率低、主观性强以及自动化分析难度大的问题,为糖尿病视网膜病变等眼科疾病的辅助诊断提供关键技术支撑。
该工具非常适合医学影像领域的研究人员、AI 开发者以及生物医学工程师使用。用户可以直接利用其预训练模型进行测试,或基于提供的代码框架在自己的数据集上进行训练和微调。
retina-unet 的核心技术亮点在于采用了经典的 U-Net 架构,并针对眼底图像特性进行了深度优化。在训练前,它对数据进行了灰度转换、标准化、限制对比度自适应直方图均衡化(CLAHE)及伽马校正等一系列精细预处理。此外,通过随机截取包含视野边界的小图像块进行训练,模型学会了有效区分血管与视野边缘。在权威的 DRIVE 数据库测试中,retina-unet 取得了极高的 ROC 曲线下面积(AUC)分数,表现优于许多已发表的方法,证明了其在复杂医学图像分割任务中的卓越性能与可靠性。
使用场景
某三甲医院眼科科研团队正致力于构建糖尿病视网膜病变自动筛查系统,需要从数千张眼底照片中精准提取血管结构以量化微血管瘤等病灶。
没有 retina-unet 时
- 医生需手动勾画血管轮廓进行标注,单张图像耗时超过 20 分钟,且不同医师间的标注一致性差,难以形成高质量的金标准数据集。
- 传统图像处理算法(如阈值分割)对光照不均和噪声极度敏感,常将视神经边缘误判为血管,导致后续病灶分析出现大量假阳性。
- 缺乏端到端的深度学习方案,研究人员需自行搭建复杂的 U-Net 架构并调试超参数,模型在 DRIVE 等公开数据集上的复现难度极大,研发周期被拉长数月。
使用 retina-unet 后
- 利用预训练的卷积神经网络自动完成像素级二分类,秒级输出高精度血管掩膜,将单图处理时间压缩至毫秒级,彻底解放人力并确保标注客观统一。
- 内置的 CLAHE 对比度增强与伽马校正预处理流程,有效抑制了眼底图像的背景噪声,配合多补丁重叠预测策略,显著提升了视场边界处的识别准确率。
- 直接复用基于 DRIVE 数据库训练的最优权重模型,无需从零开始调参即可达到业界领先的 ROC 曲线下面积(AUC),让团队能立即聚焦于上层疾病诊断逻辑的开发。
retina-unet 通过提供经过验证的高精度血管分割能力,将眼科影像分析从繁琐的手工特征工程时代直接推进到自动化智能诊断阶段。
运行环境要求
- 未说明
- 非绝对必需但推荐使用(代码会自动检测并使用可用 GPU)
- 文中提及测试环境为 GeForce GTX TITAN,训练耗时约 20 小时
- 需配置后端支持 CUDA(Theano 或 TensorFlow)
未说明

快速开始
基于卷积神经网络(U-Net)的视网膜血管分割

本仓库包含用于分割视网膜眼底图像中血管的卷积神经网络实现。这是一个二分类任务:神经网络预测眼底图像中的每个像素是否为血管。
该神经网络结构基于U-Net架构,相关描述见这篇论文。
该神经网络在DRIVE数据库上的性能测试表明,其ROC曲线下面积指标优于目前已发表的其他方法。此外,在STARE数据集上,该方法也表现出优异的性能。
方法
在训练之前,对DRIVE训练数据集中的20张图像进行以下预处理:
- 灰度化
- 标准化
- 对比度受限自适应直方图均衡化(CLAHE)
- Gamma校正
神经网络的训练是在预处理后完整图像的子图像(补丁)上进行的。每个补丁的尺寸为48×48像素,其中心点随机选取于整张图像内。同时,也会选择部分或完全位于视野外(FOV)的补丁,以便让网络学会如何区分视野边界与血管。
通过从DRIVE训练集的20张图像中每张随机抽取9,500个补丁,共得到190,000个补丁。尽管这些补丁存在重叠——即不同补丁可能包含原始图像的同一区域——但并未进行额外的数据增强。数据集中前90%用于训练(171,000个补丁),后10%用于验证(19,000个补丁)。
神经网络架构源自U-Net架构(参见论文)。损失函数采用交叉熵,优化方法为随机梯度下降。每个卷积层后的激活函数为ReLU,并在连续两个卷积层之间使用0.2的丢弃率(Dropout)。
训练共进行150个epoch,每次使用32个补丁作为小批量。在GeForce GTX TITAN GPU上运行,整个训练过程大约持续20小时。
DRIVE数据库上的结果
测试使用DRIVE测试数据集中的20张图像,并以金标准作为真实标签。仅考虑属于视野(FOV)范围内的像素。视野区域由DRIVE数据库附带的掩码标识。
为了提升性能,每个像素的血管概率是通过对多次预测结果取平均值获得的。在每张测试图像中,按高度和宽度方向每隔5个像素提取一组连续且部分重叠的补丁。随后,对于每个像素,其血管概率即为覆盖该像素的所有预测补丁中概率的平均值。
./test文件夹中报告的结果对应于验证损失最小的已训练模型。该文件夹包含:
- 模型:
test_model.png神经网络结构示意图test_architecture.json模型的JSON格式描述test_best_weights.h5验证损失最小的模型权重,存储为HDF5文件test_last_weights.h5最终第150个epoch时的模型权重,存储为HDF5文件test_configuration.txt实验参数配置
- 实验结果:
performances.txt测试结果摘要,包括混淆矩阵Precision_recall.png精确率-召回率曲线及其对应的AUC值ROC.pngROC曲线及其对应的AUC值all_*.pngDRIVE测试数据集的20张预处理后的原始图像、真实标签及预测结果sample_input_*.png预处理后训练图像的40个补丁样本及其对应的真实标签test_Original_GroundTruth_Prediction*.png从上至下依次为预处理后的原始图像、真实标签和预测结果。在预测图像中,每个像素显示的是预测的血管概率,未应用任何阈值。
下表将本方法与其他近期技术进行了比较,这些方法均已在DRIVE数据集上公布了其ROC曲线下面积(AUC ROC)指标。
| 方法 | AUC ROC on DRIVE |
|---|---|
| Soares等 [1] | .9614 |
| Azzopardi等. [2] | .9614 |
| Osareh等 [3] | .9650 |
| Roychowdhury等. [4] | .9670 |
| Fraz等. [5] | .9747 |
| Qiaoliang等. [6] | .9738 |
| Melinscak等. [7] | .9749 |
| Liskowski等.^ [8] | .9790 |
| 本方法 | .9790 |
^ 不同的视野定义
在DRIVE数据集上运行实验
代码使用Python编写,可通过以下步骤在DRIVE数据集上复现该实验。
先决条件
神经网络基于Keras库开发,安装可参考Keras官方仓库。
本代码已在Keras 1.1.0版本上测试完成,后端可选择Theano或TensorFlow。为避免维度不匹配问题,需在~/.keras/keras.json配置文件中设置"image_dim_ordering": "th"。若该文件不存在,可自行创建。更多细节请参阅Keras文档。
所需依赖如下:
- numpy >= 1.11.1
- PIL >=1.1.7
- opencv >=2.4.10
- h5py >=2.6.0
- ConfigParser >=3.5.0b2
- scikit-learn >= 0.17.1
此外,您还需要DRIVE数据集,可在下一节中了解其免费下载方式。
训练
首先,你需要 DRIVE 数据库。我们无法在此提供数据,但你可以从官方 网站 下载 DRIVE 数据库。将图像解压到一个文件夹中,并将其命名为“DRIVE”,例如。该文件夹的目录结构应如下所示:
DRIVE
│
└───test
| ├───1st_manual
| └───2nd_manual
| └───images
| └───mask
│
└───training
├───1st_manual
└───images
└───mask
有关数据的详细说明,请参阅 DRIVE 官方网站。
为便于训练和测试,建议分别创建用于真值、掩码和图像的 HDF5 数据集。
在根目录下,只需运行以下命令:
python prepare_datasets_DRIVE.py
训练和测试用的 HDF5 数据集将被创建在 ./DRIVE_datasets_training_testing/ 文件夹中。
注意:如果你为 DRIVE 文件夹指定了不同的名称,则需要在 prepare_datasets_DRIVE.py 文件中进行相应修改。
接下来可以配置实验。所有设置均可在 configuration.txt 文件中指定,文件按以下部分组织:
[数据路径]
仅当您修改了 prepare_datasets_DRIVE.py 文件时,才需更改这些路径。
[实验名称]
为实验选择一个名称,系统将创建同名文件夹,用于存储所有结果及训练好的神经网络。
[数据属性]
网络是在原始完整图像的子图像(补丁)上进行训练的,请在此处指定补丁的尺寸。
[训练设置]
您可以在此处指定:
- N_subimgs:从原始完整图像中随机提取的补丁总数。此数值必须是 20 的倍数,因为每个原始训练图像都会提取相同数量的补丁。
- inside_FOV:选择是否仅在 FOV 内部完全选取补丁。如果同时选取包含掩码的补丁,神经网络也能正确学习如何排除 FOV 边缘区域。不过,这样会需要更多的补丁用于训练。
- N_epochs:训练轮数。
- batch_size:小批量大小。
- nohup:训练过程中的标准输出会被重定向并保存到日志文件中。
完成所有参数配置后,即可通过以下命令开始训练神经网络:
python run_training.py
如果有可用的 GPU,程序将自动使用 GPU 进行计算。
以下文件将保存在与实验同名的文件夹中:
- 模型架构(json)
- 模型结构图(png)
- 配置文件副本
- 最后一 epoch 的模型权重(HDF5)
- 验证损失最低的最优 epoch 的模型权重(HDF5)
- 训练补丁及其对应真值的示例图片(png)
评估训练好的模型
训练好的模型将在 DRIVE 测试数据集上进行评估,该数据集包含 20 张图像,与训练集数量相同。
测试参数可在 configuration.txt 文件的 [测试设置] 部分再次调整,具体说明如下:
[测试设置]
- best_last:选择用于测试数据集预测的模型:best 表示训练过程中验证损失最低的模型;last 表示最后一个 epoch 的模型。
- full_images_to_test:用于测试的完整图像数量,最多 20 张。
- N_group_visual:选择保存的图片中每行显示的图像数量。
- average_mode:如果为真,则每个像素的血管概率预测值将通过对覆盖同一像素的多个重叠补丁的预测概率取平均值得到。
- stride_height:仅在 average_mode 为 True 时有效。表示重叠补丁沿高度方向的步长,步长越小,生成的补丁数量越多。
- stride_width:与 stride_height 相同。
- nohup:预测过程中的标准输出会被重定向并保存到日志文件中。
其中,[实验名称] 必须填写您要测试的实验名称,而 [数据路径] 则需填写测试数据集的路径。此时,[训练设置] 部分会被忽略。
运行测试的命令如下:
python run_testing.py
如果有可用的 GPU,程序将自动使用 GPU 进行计算。
以下文件将保存在与实验同名的文件夹中:
- ROC 曲线(png)
- 精确率-召回率曲线(png)
- 所有测试预处理图像的图片(png)
- 所有对应分割真值的图片(png)
- 所有对应分割预测结果的图片(png)
- 一张或多张包含(从上到下):原始预处理图像、真值、预测结果的图片
- 性能报告
所有结果仅针对属于 FOV 区域的像素,这些像素由 DRIVE 数据库中包含的掩码所选定。
STARE 数据库上的结果
该神经网络也在另一个常用数据集 STARE 上进行了测试。神经网络与使用 DRIVE 数据集的实验中所用的完全相同,但由于两个数据集之间的差异,代码和方法上仍需进行一些修改。
STARE 数据集包含 20 张视网膜眼底图像,由两位不同的观察者提供了两组手动分割标注,其中第一组被视为真实标签。与 DRIVE 数据集不同的是,STARE 没有标准的训练集和测试集划分,因此实验采用了“留一法”进行。训练-测试循环重复了 20 次:每次迭代都会从训练集中排除一张图像,并将其用于测试。
预处理步骤与 DRIVE 数据集相同,从构成训练集的 19 张图像中,每张图像随机提取 9500 个 48×48 像素的补丁。在补丁提取过程中,FOV 外部区域也被纳入考虑。这些补丁中,90%(162450 个)用于训练,10%(18050 个)用于验证。训练参数(如 epoch 数、批大小等)与 DRIVE 实验中的设置一致。
每次测试都针对从训练集中单独留出的一张图像进行。与 DRIVE 数据集类似,每个像素的血管概率是通过对多个重叠补丁取平均得到的,这些补丁在宽度和高度方向上的步长均为 5 像素。仅 FOV 内的像素会被计入。由于 STARE 数据集没有提供掩码,本次通过在原始图像上应用颜色阈值来确定 FOV。
下表展示了在 20 次不同训练中,以指定图像作为测试时所获得的 AUC ROC 结果。
| STARE 图像 | AUC ROC |
|---|---|
| im0239.ppm | .9751 |
| im0324.ppm | .9661 |
| im0139.ppm | .9845 |
| im0082.ppm | .9929 |
| im0240.ppm | .9832 |
| im0003.ppm | .9856 |
| im0319.ppm | .9702 |
| im0163.ppm | .9952 |
| im0077.ppm | .9925 |
| im0162.ppm | .9913 |
| im0081.ppm | .9930 |
| im0291.ppm | .9635 |
| im0005.ppm | .9703 |
| im0235.ppm | .9912 |
| im0004.ppm | .9732 |
| im0044.ppm | .9883 |
| im0001.ppm | .9709 |
| im0002.ppm | .9588 |
| im0236.ppm | .9893 |
| im0255.ppm | .9819 |
平均值:.9805 ± .0113
文件夹 ./STARE_results 包含所有预测结果。每张图像从上到下依次显示 STARE 数据集的预处理后原始图像、真实标签以及对应的预测结果。在预测图像中,每个像素显示的是预测的血管概率,未应用任何阈值。
下表将本方法与其他近期技术在 STARE 数据集上的 AUC ROC 性能进行了比较。
| 方法 | STARE 上的 AUC ROC |
|---|---|
| Soares 等人 [1] | .9671 |
| Azzopardi 等人 [2] | .9563 |
| Roychowdhury 等人 [4] | .9688 |
| Fraz 等人 [5] | .9768 |
| Qiaoliang 等人 [6] | .9879 |
| Liskowski 等人^ [8] | .9930 |
| 本方法 | .9805 |
^ 不同的 FOV 定义
参考文献
[1] Soares 等人,“基于二维 Gabor 小波和监督分类的视网膜血管分割”,《IEEE 医学成像汇刊》,第 25 卷,第 9 期,第 1214–1222 页,2006 年。
[2] Azzopardi 等人,“可训练的 cosfire 滤波器用于血管勾勒及其在视网膜图像中的应用”,《医学图像分析》,第 19 卷,第 1 期,第 46–57 页,2015 年。
[3] Osareh 等人,“视网膜彩色图像中的自动血管分割”,《伊朗科学技术期刊 B:工程》,第 33 卷,第 B2 期,第 191–206 页,2009 年。
[4] Roychowdhury 等人,“通过主要血管提取和子图像分类实现眼底图像的血管分割”,《IEEE 生物医学与健康信息学杂志》,第 19 卷,第 3 期,第 1118–1128 页,2015 年。
[5] Fraz 等人,“应用于视网膜血管分割的集成分类方法”,《IEEE 生物医学工程汇刊》,第 59 卷,第 9 期,第 2538–2548 页,2012 年。
[6] Qiaoliang 等人,“用于视网膜图像血管分割的跨模态学习方法”,《IEEE 医学成像汇刊》,第 35 卷,第 1 期,第 109–118 页,2016 年。
[7] Melinscak 等人,“利用深度神经网络进行视网膜血管分割”,《第 10 届国际计算机视觉理论与应用会议(VISIGRAPP 2015)论文集》(2015 年),第 577–582 页。
[8] Liskowski 等人,“利用深度神经网络分割视网膜血管”,《IEEE 医学成像汇刊》,PP 卷,第 99 期,第 1–1 页,2016 年。
致谢
本研究得到了欧盟玛丽居里初始培训网络(ITN)“视网膜血管建模、测量与诊断”(REVAMMAD)项目的支持,项目编号为 316990。
许可证
本项目采用 MIT 许可证授权。
版权所有 © 2016 Daniele Cortinovis, Orobix Srl (www.orobix.com)。
常见问题
相似工具推荐
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
ML-For-Beginners
ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。
ragflow
RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。
PaddleOCR
PaddleOCR 是一款基于百度飞桨框架开发的高性能开源光学字符识别工具包。它的核心能力是将图片、PDF 等文档中的文字提取出来,转换成计算机可读取的结构化数据,让机器真正“看懂”图文内容。 面对海量纸质或电子文档,PaddleOCR 解决了人工录入效率低、数字化成本高的问题。尤其在人工智能领域,它扮演着连接图像与大型语言模型(LLM)的桥梁角色,能将视觉信息直接转化为文本输入,助力智能问答、文档分析等应用场景落地。 PaddleOCR 适合开发者、算法研究人员以及有文档自动化需求的普通用户。其技术优势十分明显:不仅支持全球 100 多种语言的识别,还能在 Windows、Linux、macOS 等多个系统上运行,并灵活适配 CPU、GPU、NPU 等各类硬件。作为一个轻量级且社区活跃的开源项目,PaddleOCR 既能满足快速集成的需求,也能支撑前沿的视觉语言研究,是处理文字识别任务的理想选择。
tesseract
Tesseract 是一款历史悠久且备受推崇的开源光学字符识别(OCR)引擎,最初由惠普实验室开发,后由 Google 维护,目前由全球社区共同贡献。它的核心功能是将图片中的文字转化为可编辑、可搜索的文本数据,有效解决了从扫描件、照片或 PDF 文档中提取文字信息的难题,是数字化归档和信息自动化的重要基础工具。 在技术层面,Tesseract 展现了强大的适应能力。从版本 4 开始,它引入了基于长短期记忆网络(LSTM)的神经网络 OCR 引擎,显著提升了行识别的准确率;同时,为了兼顾旧有需求,它依然支持传统的字符模式识别引擎。Tesseract 原生支持 UTF-8 编码,开箱即用即可识别超过 100 种语言,并兼容 PNG、JPEG、TIFF 等多种常见图像格式。输出方面,它灵活支持纯文本、hOCR、PDF、TSV 等多种格式,方便后续数据处理。 Tesseract 主要面向开发者、研究人员以及需要构建文档处理流程的企业用户。由于它本身是一个命令行工具和库(libtesseract),不包含图形用户界面(GUI),因此最适合具备一定编程能力的技术人员集成到自动化脚本或应用程序中