点击左上方蓝字关注我们

【飞桨开发者说】郑博培,北京联合大学机器人学院2018级自动化专业本科生,飞桨开发者技术专家PPDE,深圳市柴火创客空间认证会员,百度大脑智能对话训练师

项目背景

研究表明,各类眼科疾病以及心脑血管疾病会对视网膜血管造成形变、出血等不同程度的影响。随着生活水平的提高,这类疾病的发病率呈现逐年增长的趋势。临床上,医疗人员能够从检眼镜采集的彩色眼底图像中提取视网膜血管,然后通过对血管形态状况的分析达到诊断这类疾病的目的

但是,由于受眼底图像采集技术的限制,图像中往往存在大量噪声,再加之视网膜血管自身结构复杂多变,使得视网膜血管的分割变得困难重重。

传统方法中依靠人工手动分割视网膜血管,不仅工作量巨大极为耗时,而且受主观因素影响严重

因此,利用计算机技术,找到一种能够快速、准确分割视网膜血管的算法,实现对眼底图像血管特征的实时提取,对辅助医疗人员诊断眼科疾病、心脑血管疾病等具有重要作用。

但是,现有的深度学习框架,如TF、pytorch等框架对初学者的门槛较高,而飞桨PaddlePaddle作为我们的国产框架,有很多基础模型库、端到端开发套件、工具组件等,对于开发者而言,能快速且高效地开发一个项目,且用PaddlePaddle开发的深度学习模型,其各方面性能要优于其他框架,因此,这里我选择使用飞桨来完成眼底血管分割这一项目。

数据集介绍及数据处理

本项目使用的数据集照片来自荷兰的糖尿病视网膜病变筛查项目。筛查人群包括400名年龄在25-90岁之间的糖尿病患者。但只有40张照片被选取,其中33张没有显示任何糖尿病视网膜病变的迹象,7张显示轻度早期糖尿病视网膜病变的迹象。

AI Studio上已经有DRIVE糖尿病人眼底血管分割数据集了,但是数据量相对较少。因此,我在处理数据时做了一些处理来增加我的训练集数据量。

原数据集里的眼底图像:

原数据集手工分好的的血管图像:

仔细看一下图片格式:

  • 眼底图像格式是.tif

  • 手工标注的血管图像格式是.gif

这里我做了图片格式的转换:

  • 把眼底图像格式转换为.jpg

  • 把手工标注的血管图像格式转换为.png


血管标签图像二值化:

如果直接将格式转换后的图像送入模型,会发现最多有256个标签,这是因为PaddleSeg采用单通道标注图片,每一种像素值代表一种类别,像素标注类别需要从0开始递增,例如0,1,2,3表示有4种类别,所以标注类别最多为256类。

但其实我们只需要找到血管的位置,因此血管就作为一个类,其背景作为另一个类别,这样总共有2个类别。下面来看一下如何使用opencv做图像二值化处理。

先来看看如何使用opencv读取图片,下面是未处理的图片0.png

使用opencv读取原图像:

# 使用opencv读取原图像
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("work/0.png") # 读取的图片路径
plt.imshow(img)
plt.show()

使用opencv将原图像转换为灰度图:

# 使用opencv读取图像
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("work/0.png") # 读取的图片路径
# 转换为灰度图
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.imshow(img_gray)
plt.show()

使用opencv将原图像转换为二值图:

# 使用opencv读取图像
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("work/0.png") # 读取的图片路径
# 转换为灰度图
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 将灰度极差的一半作为阈值
difference = (img_gray.max() - img_gray.min()) // 2
# 将图像二值化
_, img_binary = cv2.threshold(img_gray, difference, 1, cv2.THRESH_BINARY)
print("阈值:", _)
plt.imshow(img_binary)
plt.show()

将上面的代码整理一下,可以整理出如下代码:

import cv2
import matplotlib.pyplot as plt#循环灰度图片并保存
def grayImg():for x in range(200):#读取图片img = cv2.imread("FundusVessels/Annotations/{}.png".format(str(x)))img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)difference = (img_gray.max() - img_gray.min()) // 2_, img_binary = cv2.threshold(img_gray, difference, 1, cv2.THRESH_BINARY)# print("阈值:", _)#保存灰度后的新图片cv2.imwrite("FundusVessels/{}.png".format(str(x)), img_binary)plt.imshow(img_binary)plt.show()
grayImg()

以上代码可以将像素值在0-255的图像转换成0-1二值图像。最后我已经将整理好的数据集上传至AI Studio上了:

https://aistudio.baidu.com/aistudio/datasetdetail/56726

我们也可以把数据集导入PaddleX可视化地看一下:

  

生成图像列表:

PaddleSeg采用通用的文件列表方式组织训练集、验证集和测试集。在训练、评估、可视化过程前必须准备好相应的文件列表。

文件列表组织形式如下:

原始图片路径 [SEP] 标注图片路径

其中[SEP]是文件路径分割符,可以在DATASET.SEPARATOR配置项中修改, 默认为空格。文件列表的路径以数据集根目录作为相对路径起始点,DATASET.DATA_DIR即为数据集根目录。

如下图所示,左边为原图的图片路径,右边为图片对应的标注路径:

PaddleSeg的安装

PaddleSeg是基于PaddlePaddle开发的端到端图像分割开发套件,覆盖了DeepLabv3+, U-Net, ICNet, PSPNet, HRNet, Fast-SCNN等主流分割网络。通过模块化的设计,以配置化方式驱动模型组合,帮助开发者更便捷地完成从训练到部署的全流程图像分割应用。

1. 安装PaddlePaddle

版本要求:

  • PaddlePaddle >= 1.7.0

  • Python >= 3.5+

由于图像分割模型计算开销大,推荐在GPU版本的PaddlePaddle下使用PaddleSeg.

安装教程请见PaddlePaddle官网。

2. 下载PaddleSeg代码

git clone https://github.com/PaddlePaddle/PaddleSeg

3. 安装PaddleSeg依赖

通过以下命令安装python包依赖,请确保在该分支上至少执行过一次以下命令:

cd PaddleSeg
pip install -r requirements.txt

配置文件进行训练

这里我们需要使用两个文件:

  • 训练文件:PaddleSeg/pdseg/train.py

  • 训练的配置文件:

    PaddleSeg/configs/unet_optic.yaml

这里使用U-Net,大家可以尝试使用其他网络进行配置。


.yaml文件的配置:

下面是我配置的.yaml文件

# 数据集配置
DATASET:
DATA_DIR: ""
NUM_CLASSES: 2
TEST_FILE_LIST: "train_list.txt"
TRAIN_FILE_LIST: "train_list.txt"
VAL_FILE_LIST: "val_list.txt"
VIS_FILE_LIST: "train_list.txt"# 预训练模型配置
MODEL:
MODEL_NAME: "unet"
DEFAULT_NORM_TYPE: "bn"# 其他配置
TRAIN_CROP_SIZE: (565, 584)
EVAL_CROP_SIZE: (565, 584)
AUG:
AUG_METHOD: "unpadding"
FIX_RESIZE_SIZE: (565, 584)
BATCH_SIZE: 4
TRAIN:
# PRETRAINED_MODEL_DIR: "./pretrained_model/unet_bn_coco/"
MODEL_SAVE_DIR: "./saved_model/unet_optic/"
SNAPSHOT_EPOCH: 2
TEST:
TEST_MODEL: "./saved_model/unet_optic/final"
SOLVER:
NUM_EPOCHS: 10
LR: 0.001
LR_POLICY: "poly"
OPTIMIZER: "adam"

开始训练:

训练命令的格式参考:

python PaddleSeg/pdseg/train.py --cfg configs/unet_optic.yaml \
--use_gpu \
--do_eval \
--use_vdl \
--vdl_log_dir train_log \
BATCH_SIZE 4 \
SOLVER.LR 0.001

运行下面的命令即可开始训练:

!python PaddleSeg/pdseg/train.py  --cfg PaddleSeg/configs/unet_optic.yaml

下面是部分训练输出:

模型评估

模型评估的命令与训练的命令格式一致。下面是模型评估的命令:

!python PaddleSeg/pdseg/eval.py  --cfg PaddleSeg/configs/unet_optic.yaml

下面是部分输出:

由以上的输出中可以看出我们的模型效果:

[EVAL]step=1 loss=0.15743 acc=0.9396 IoU=0.7404 step/sec=2.02 | ETA 00:00:23
[EVAL]step=2 loss=0.14508 acc=0.9417 IoU=0.7482 step/sec=7.37 | ETA 00:00:06
[EVAL]#image=7 acc=0.9417 IoU=0.7482
[EVAL]Category IoU: [0.9371 0.5592]
[EVAL]Category Acc: [0.9445 0.9105]
[EVAL]Kappa:0.6865

模型导出

通过训练得到一个满足要求的模型后,如果想要将该模型接入到C++预测库或者Serving服务,我们需要通过pdseg/export_model.py来导出该模型。

该脚本的使用方法和train.py/eval.py/vis.py完全一样。下面是模型导出的命令:

!python PaddleSeg/pdseg/export_model.py --cfg PaddleSeg/configs/unet_optic.yaml TEST.TEST_MODEL ./saved_model/unet_optic/final

预测模型会导出到freeze_model目录,用于C++或者Python预测的模型配置会导出到freeze_model/deploy.yaml下

PaddleSeg Python 预测部署

在预测前,我们需要使用pip安装Python依赖包:

!pip install -r PaddleSeg/deploy/python/requirements.txt

使用以下命令进行预测:

python infer.py --conf=/path/to/deploy.yaml --input_dir=/path/to/images_directory

运行后程序会扫描input_dir 目录下所有指定格式图片,并生成预测mask和可视化的结果。

对于图片a.jpeg, 预测mask 存在a_jpeg.png 中,而可视化结果则在a_jpeg_result.png 中。

总结

前不久,安定医院在做脑科学的研究,招募志愿者,我报名且有幸被录取去安定医院做志愿者,在此期间,我了解到目前的医学生在做医学影像分析,用的也是神经网络,但毕竟是学科交叉,对医学生来说还是有一定的困难的。

因此,我在想,能不能做些什么帮助他们。回来以后,我找了很多医学影像的数据集,最后选择了这个糖尿病人的眼底血管数据集,我想把这个项目当作使用PaddleSeg研究医学影像图像分割的Hello World。

我在AI Studio上获得钻石等级,点亮8个徽章,来互关呀~

https://aistudio.baidu.com/aistudio/personalcenter/thirdview/147378

飞桨(PaddlePaddle)以百度多年的深度学习技术研究和业务应用为基础,是中国首个开源开放、技术领先、功能完备的产业级深度学习平台,包括飞桨开源平台和飞桨企业版。飞桨开源平台包含核心框架、基础模型库、端到端开发套件与工具组件,持续开源核心能力,为产业、学术、科研创新提供基础底座。飞桨企业版基于飞桨开源平台,针对企业级需求增强了相应特性,包含零门槛AI开发平台EasyDL和全功能AI开发平台BML。EasyDL主要面向中小企业,提供零门槛、预置丰富网络和模型、便捷高效的开发平台;BML是为大型企业提供的功能全面、可灵活定制和被深度集成的开发平台。

如在使用过程中有问题,可加入飞桨官方QQ群进行交流:1108045677。

如果您想详细了解更多飞桨的相关内容,请参阅以下文档。

·飞桨PaddleDetection目标检测套件项目地址·

GitHub: 

https://github.com/PaddlePaddle/PaddleDetection 

Gitee: 

https://gitee.com/paddlepaddle/PaddleDetection

·飞桨官网地址·

https://www.paddlepaddle.org.cn/

扫描二维码 | 关注我们

微信号 : PaddleOpenSource

END

精彩赛事

基于PaddleSeg实现眼底血管分割——助力医疗人员更高效检测视网膜疾病相关推荐

  1. 基于PaddleSeg的眼底血管分割——使用飞桨助力医学影像分析

    基于PaddleSeg的眼底血管分割--使用飞桨助力医学影像分析 一.项目背景 研究表明,各类眼科疾病以及心脑血管疾病会对视网膜血管造成形变.出血等不同程度的影响.随着生活水平的提高,这类疾病的发病率 ...

  2. tensorflow2实现unet, 完成眼底血管分割任务

    向AI转型的程序员都关注了这个号???????????? 人工智能大数据与深度学习  公众号:datayx retina-unet 该项目使用U-Net完成眼底血管分割任务, 主要包括以下内容: 视网 ...

  3. 眼底血管分割——毕业论文

    目录 博客 数据集 参考文献 项目代码 工具 博客 一些忘记是干嘛用的了 DeepL Translate: The world's most accurate translator--翻译器 Cv图像 ...

  4. 眼底血管分割(python版本)

    一.项目背景 研究表明,各类眼科疾病以及心脑血管疾病会对视网膜血管造成形变.出血等不同程度的影响.随着生活水平的提高,这类疾病的发病率呈现逐年增长的趋势.临床上,医疗人员能够从检眼镜采集的彩色眼底图像 ...

  5. 大华管理平台用户名_大华HOC智慧物流可视化联网追溯解决方案,助力物流行业更高效...

    点击上方蓝字关注"大华行业" 随着电商产业的高速发展,物流已经成为人们生活中必不可少的一环.同时,作为国民经济的重要组成部分,物流行业所涉及到的领域也越来越广. 问题凸显 对监管部 ...

  6. 基于matlab的眼底视网膜静脉血管分割仿真

    目录 1.算法概述 2.仿真效果 3.MATLAB源码 1.算法概述 随着图像数字化处理的快速发展,医学图像处理越来越受到人们的广泛关注.研究表明,人体许多全身性疾病都与眼底血管的异常有着密切的联系, ...

  7. 基于MATLAB的眼底视网膜静脉血管分割实现

    基于MATLAB的眼底视网膜静脉血管分割实现 眼底的视网膜图像对于眼科医生来说是非常重要的.其中,视网膜上血流情况可以为医生提供丰富的信息,如视网膜动脉硬化等.因此,对于眼底图像的分割和特征提取,对于 ...

  8. 【图像分割】基于计算机视觉实现视网膜图像中的血管分割附matlab代码

    1 简介 视网膜图像里的血管是可以被观察到的一类微血管,并且它是无创伤的,而其分布位置也属于深度部位[5].其分布.结构和形态特征的变化能在一定程度上反映病变的程度.而白血病.糖尿病以及高血压等疾病都 ...

  9. Unet简明代码实现眼底图像血管分割

      Unet是一种自编码器网络结构,常用于医学图像分割任务,比如眼底图像血管分割.这位大佬已经开源了非常棒的代码,但是这套代码比较复杂,我初学菜鸟硬是啃了好几天才啃下来.现在我代码进行重写,仅保留最必 ...

最新文章

  1. Jvm 系列(六):Java 服务 GC 参数调优案例
  2. 解决方案、项目、程序集、命名空间
  3. python源码用于查找指定具有相同内容的文件
  4. ubuntu 14.04使用devstack安装openstack mitaka版本
  5. Virtaulbox虚拟机添加磁盘
  6. ref是什么意思_终于有人说出A股不敢说的话:为什么股价不断下跌,大单却持续流入,你知道是什么缘由吗?...
  7. LeetCode 42. 接雨水(双指针、单调栈)
  8. 为什么Alpha多样性的输入数据会是它?
  9. MyBatis源码分析(三):MyBatis初始化(配置文件读取和解析)
  10. 东莞城院c语言上机报告,浙大城市学院c语言上机试题
  11. LeetCode每日一题——串联字符串的最大长度
  12. java 替换html代码_Java中替换HTML标签的方法代码
  13. 每天好心情——Python画一棵樱花树
  14. Mr.Xiong使用jQuery实现时钟表盘的效果
  15. windows2016服务器优化,Windows server 2016性能调优问题
  16. 如何改善毛孔粗大,学养颜心经改善毛孔粗大
  17. 新团队团队融合研讨会_行程报告:2020年软件开发人员多样性与融合研讨会
  18. 商品销售统计系统java_IMS: 基于Java实现的InventoryManagementSystem进销存管理系统
  19. ipad全系列_为iPad提供全职工作
  20. 卡尔曼滤波和粒子滤波

热门文章

  1. 项目中,你们如何进行需求评审?
  2. 无压低温烧结银:SiC芯片封装的关键材料
  3. hexo博客yilia主题添加复制代码块功能
  4. 【BYOD】自带设备 资料
  5. 企业不得不知的BYOD实施十大风险
  6. 使用describe()查看catering_sale.xls数据的基本情况,通过箱式图检测出catering_sale.xls中的异常值
  7. eNSP之IPsec 虚拟专用网配置
  8. 电脑翻译软件-大家都觉得好用的免费电脑翻译软件
  9. M1芯片MacBook通过Docker安装Kali
  10. [C语言] 平淡的日子里泛起光 初阶最后的战役