相关电子技术论文

相关标签

基于OCT的眼底积液自动检测

发布时间:2019-12-03 13:38

  摘要

  视网膜中眼底积液的存在不仅可能会影响到患者的治愈,还会干预到患者手术后进一步的临床治疗,而眼底积液的及时检测,也有利于其它疾病的早期发现。光学相关断层成像技术(Optical Coherence tomography, OCT),由于其非接触性、非破坏性、极高的探测灵敏度与噪声抑制能力成为常见的无损检测成像技术,而眼科疾病的诊断就是其主要应用领域之一。医生可以通过观察视网膜层的OCT图像对患者的病情做出判断。

  眼底积液根据其不同的形态和所处的位置具有不同的类型,而本文所研究的就是采用深度学习的方法检测OCT图像上的三种眼底积液相关疾病:黄斑囊样水肿、视网膜下液、视网膜色素上皮脱离。数据集有约1000张OCT图片,每一类330张左右。YOLO算法是常见的深度学习目标检测算法,它基于一个24层的卷积神经网络,算法简单且可以实时处理。Tensorflow作为目前最流行的深度学习框架,支持常见的神经网络,比如YOLO算法用到的卷积神经网络,而且Tensorflow还具有高度的灵活性。所以本课题选用了Tensorflow框架,Python编程实现YOLO算法,从而实现眼底积液的自动检测。最终积液类型判断的准确率高达92%,定位效果也在可接受的程度内。

  关键词:医学影像处理,眼底积液,OCT,YOLO

  前言

  视网膜中积液的检测对于眼科疾病的诊断具有重要意义。视网膜中积液的存在会对患者的健康造成多种影响,不仅会影响到患者的视力,也会对临床治疗造成不利。而积液的正确诊断不仅有利于医生对眼科疾病的治疗,还有利于其它疾病的早一步发现,比如糖尿病。

  随着大数据、云存储、GPU等的快速发展,深度学习,作为机器学习的一个分支,已经广泛应用在各个在领域。而随着GPU运算性能的不断提升,以及研究者们提出越来越多的新颖算法,将深度学习应用在医学影像领域已经成为可能。就视网膜积液检测这一研究课题,目前国内外已经取得了一些研究成果。采用的方法主要有传统图像处理算法和深度学习算法。近几年由于深度学习的迅速兴起,深度学习的应用飞速增长,并且效果也具有显著地提升。相比于传统算法,有着端对端以及准确率更高等优势。当前采用图像分割的深度学习方法已经能分割出视网膜的十层结构,并检测出其中的积液位置。

  本文所采用的就是一种常见的深度学习目标检测算法——YOLO,它将图片进行尺寸调整后,送入卷积神经网络得到特征图,最后通过非最大值抑制算法得到最终输出边界框的坐标和类概率。它具有运算速度快、泛化能力强、能看到全局信息等诸多特点。

  第一章 绪论

  1.1研究背景

  1.1.1眼底积液

  通常我们把人的视网膜划分为10层[1],也就是11个表面。图1所示为视网膜各个表面在OCT图像上的示意图。

  当视网膜毛细血管内皮的结构遭到破坏,血管内的液体和大分子就会向外泄露,液体积聚就会形成视网膜水肿。积液的存在不仅会影响到患者的视力,也会对临床治疗造成不利。而积液的正确诊断不仅有利于医生对眼科疾病的治疗,还有利于其它疾病的早一步发现,比如糖尿病。[2]

  眼底积液根据其形态和所处视网膜位置的不同可以分为多种。本文所研究的分别是黄斑囊样水肿(cystoid macular edema, CME)、视网膜下液 (subretinal fluid,SRF)、视网膜色素上皮脱离(pigment epithelial detachment, PED)。

  CME发生在第1表层和第7表层。由于黄斑区的Henlen纤维是放射状排列的,所以聚集在改成的积液具有多囊状的形态,通常中央的囊较大,周围围绕着一些小囊。

  1.1.2 光学相关断层成像技术

  近些年来,随着CT设备、扫描技术以及成像软件等的不断发展也技术革新,出现了许多的新的CT技术,光学相关断层成像技术,也就是OCT技术就是其中的一种。OCT技术主要采用光学干涉原理成像,可以分为时域OCT和频域OCT两类。目前时域OCT发展较为成熟。

  OCT[4,5]常用在眼科疾病的诊断当中,它使得医生可以不再使用从前的检眼镜当场观察患者的眼睛,而是通过摄像的方式观察处理后的图像诊断病情。OCT成像技术有着许多优点,比如高分辨率、高安全性以及快速等。当前OCT成像技术已经在眼科疾病的诸多领域应用,比如本文研究的囊样水肿、视网膜色素上皮分离、视网膜下液,另外还有视网膜分支动脉阻塞、黄斑裂孔等[6,7]。本文使用的OCT图像三维OCT扫描仪得到,该扫描仪是Topcon公司的,在XZY方向上成像范围分别是6、6、1.68cm,这三个方向的像素个数分别是480、512、64个。

  1.2 研究现状

  当前眼底积液的检测方法主要分为两类,一是基于传统图像处理算法的检测,另一种是基于深度学习方法的检测。而这对视网膜中积液的检测,这两种方法都多是基于视网膜层分割实现的。论文[8,9]实现了基于OCT图像的视网膜内积液、视网膜下液和视网膜色素上皮脱离三种积液的同步分割和检测。也有一些研究者研究了特定一种积液或广义上的积液的检测[10,11]

  目前阅读到的最新的研究有美国中佛罗里达大学Dustin Morley等人用深度学习方法实现的视网膜三种积液的同步检测和量化[12]。他们先是对OCT图像做了平滑和调整尺寸等预处理,然后采用旋转和扭曲等的数据增强方法,再是送入卷积神经网络训练模型,最后采用了以图分割算法(graph-cut algorithm)为核心的多种方法进行后处理。取得了很好的效果。值得注意的是,该论文也证明了不需要很精确的视网膜层分割就可以检测出积液

  另外[2]用全卷积网络实现了基于OCT图像的视网膜层和积液的分割。在该文中,他们将分割问题视作对每一个像素的分类问题处理,采用了一个新的网络模型,命名为RelayNet。DeConvnet和Unet对RelayNet的产生起了很大的启发作用。在该文中作者将他们的算法与传统的图像处理算法和其它一些分割算法做了比较,在多个评价指标中他们的算法都位于前列。

  1.3 研究内容

  本文的研究内容是采用深度学习的方法对OCT图像上的三种积液进行检测。输入一张OCT图像,输出一个边界框和标签。如图3所示

  第二章 实验原理

  2.1深度学习算法——YOLO

  2.1.1 算法简介

  YOLO是一种端对端的,实时的目标检测算法。它不同于用分类器做目标检测的算法,它将目标检测视作一个回归问题,直接从图片的每个像素预测边界框的坐标和类概率。[13]

  YOLO有以下的优点:

  1)速度非常快

  在没有进行批处理的情况下,基础版本的YOLO在Titan X GPU上能达到45 fps的速度,而一个快速版本甚至能达到高于150fps的速度。

  2)能够看到全局信息

  比起Fast RCNN算法,YOLO将背景判断为目标的错误少了一半多。

  3)泛化能力强

  YOLO算法具有高度的概括能力,因此训练出啦的模型能应用到更多的领域。

  然而,YOLO算法也存在一下的问题:

  1)更多的定位错误

  2)难以识别小物体,尤其是密集的物体,比如一群小鸟

  3)召回率低

  2.1.2 检测原理

  图4为YOLO算法的系统检测原理图,输入一张图片,调整尺寸后输出到卷积神经网络中,再将输出的结果做非最大值抑制得到最终的边界框以及预测概率。

  1)预处理

  算法本身的预处理十分简单,只做了尺寸的调整,将输入的图片调整为448*448的尺寸,以便神经网络进行处理。

  论文中在训练部分提到了为了避免过拟合,作者使用了广泛的数据增强,比如曝光率和饱和度的改变等,这也可视作预处理,不过不是必要的。

  2)卷积神经网络

  如图6所示,卷积神经网络将图像分为S*S个栅格,每个栅格负责预测B个边界框,每个边界框输出五个参数,其中四个边界框的坐标x,y,w,h,另一个是置信度(confidence),而每一个栅格还负责预测每一类的条件类概率。因此边界框输出的张量(tensor),尺寸为S*S*(5*B+C),C是预测目标类的个数。

  其中,四个坐标的含义分别是边界框中心的坐标和边界框的宽和高,这四个值都是针对每一个栅格归一化后的数值。

  IOU是预测的边界框与金标准的交并比。只有当目标的中心落在栅格中时,栅格才负责检测该物体,此时的置信度就等于交并比,若目标中心不在栅格中,则置信度  其中 λcoord=5,λnoobj=0.5,这样设置的原因是为了降低当栅格不存在目标时,置信度为0对损失函数的梯度的影响。表示第i个栅格中的第j个边界框是否负责预测,这个变量是一个布尔值,取1或0。此外,当目标存在于栅格中,一个栅格预测B个边界框,其中哪个边界框负责预测目标的判断标准是交并比(IOU)——IOU最大的边界框负责预测。

  损失函数的优化器选择的是动量优化器(momentum optimizer),它模拟的是物体运动时的惯性,即权重更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。这样一来,可以在一定程度上增加稳定性,从而学习地更快,并且还有一定摆脱局部最优的能力。它将梯度下降的公式更新:

  其中,ρ即momentum,表示要在多大程度上保留原来的更新方向,这个值在0-1之间,在训练开始时,由于梯度可能会很大,所以初始值一般选为0.5;当梯度不那么大时,改为0.9。ηη是学习率,即当前batch的梯度多大程度上影响最终更新方向。

  3)非最大值抑制

  在测试时,我们将每一类的条件类概率与边界框输出的置信度相乘:

  它为我们提供了每个框特定类别的置信度分数。这些分数表现了该类出现在框中的概率以及预测框拟合目标的程度。

  然后对每一类的置信度分数依次执行非最大值抑制:

  ① 先将低于阈值0.2的那些分数置零

  ② 然后将该类剩下的分数从高到低排序

  ③ 找出那些和具有最高分数的边界框(姑且叫做目标边界框)IOU大于0.5的边界框的置信度分数,将他们置零

  ④ 接着找出具有次高分数的边界框,重复第三、四步直到目标边界框的分数为0

  ⑤ 对下一类的置信度分数执行前面的步骤,直到所有类都执行完

  最后对于每一个边界框,将除了最高分数外的其它分数都置零,在测试图片上

  画出那些具有非零分数的边界框与标签。

  2.1.3 算法的提升

  在YOLOv1之后,作者又接连提出了YOLOv2,YOLOv3[14,15]。在精确度和快速性等多个方面都有了一定的提升。由于本文所采用的仍然是YOLOv1,所以这里仅简单介绍一下作者采用的部分改进措施:

  1) 批标准化(Batch Normalization)

  这个措施主要是防止过拟合,免去了其它形式的正则化需求,比如dropout。

  2) 固定框(anchor box)的采用

  不再由图片像素直接预测边界框的坐标,而是借鉴了faster RCNN提出的区域建议网络,选用了anchor box,一系列固定尺寸的框,每一个栅格都预测这些anchor box,尺寸方面只做细微的调整。

  3)多尺度训练

  每进行10批的更新,网络就会随机选择一些新的尺寸的图片进行训练,使得训练出的模型能够适应更多尺寸的图片。

  4)新的网络结构

  YOLOv2采用了darknet19,而YOLOv3采用了darknet53。

  5)多个尺寸预测

  YOLOv3借鉴了特征金字塔网络(feature pyramid networks)的概念,在卷积网络的多个层进行预测,从而能够得到更为细化的特征。

  2.2 深度学习框架——Tensorflow

  Tensorflow是谷歌公司提出的开源深度学习框架,是目前最为流行的。它支持常用的神经网络如卷积神经网络(convolutional neural network,CNN),循环神经网络(recurrent neural network,RNN),具有高度的灵活性、可移植性,并且支持多种语言

  尽管YOLO的作者提供了源代码,但源代码使用的C语言,深度学习框架选用的作者提出的darknet,不太利于源码的阅读和调试,对之后算法进一步的改进也不方便,所以还是选用了tensorflow深度学习框架,并采用python语言进行编程。

  Tensorflow的设计理念没有选用传统常见的命令式编程,而是采用了符号式编程。先创建图(graph),然后创建对话(session),在对话中运行图。

  图是由节点和边界构成的,每一个节点都是一个运算,变量可以视作特殊的运算,然后由依赖关系把这些节点连接起来就构成了一张数据流图。图只能在会话中执行。

  2.3 评价指标

  本节介绍本文将要用到的一些深度学习评价指标。

  1)精确度(precision)

  精确度是识别出来的图片中,识别对的图片所占的比例

  Precision = true positive/(true positive + false positive)

  2)召回率(recall)

  召回率是正确识别的目标个数与测试集中目标总个数的比例。

  Recall=true positive/(true positive +false negative)

  3)准确度(accuracy)

  准确率是所有测试图片中识别对的图片的个数比例。

  Accuracy = (true positive +true negative)/total examples

  说明:true、false 表示目标检测的正确性。positive、negative表示预测结果的内容是阴性还是阳性的。比如要检测囊样水肿,如果检测一张视网膜下液的图片并判断为囊样水肿就是false positive,如果将其判断为视网膜下液就是 true negative。

  第三章 实验过程

  实验步骤可以分为准备训练集、训练模型和测试三个部分

  3.1 数据集准备

  根据YOLO的要求,数据集采用Pascal VOC数据集的格式,文件树可见下图

  原始数据为约一千张视网膜层OCT图像,png格式,大小不一。图像根据患病情况主要分为三类:囊样水肿、视网膜下液、视网膜色素上皮脱离。分别330张左右。其中存在个别图像上显示有多种疾病,并且疾病部位较密集,一律按照主要疾病判断。

  Annotations文件夹中存放标注文件,为.xml格式,采用ImageLabel软件手动标注。

  JPEGImages存放着原始OCT图像,按照标准数据集要求应该选用.jpg格式,但是不进行格式转换也没有影响,这里没有进行数据转换。

  ImageSets下面是一些文本文件,用来分配训练数据集、测试数据集、验证数据集等。这里采用训练测试7:3的通用比例。文本文件中存放着对应数据集的图像名称(不含后缀)。

  3.2 模型训练

  在训练模型之前,还需要生成一个文本文件,存储着训练数据集中图片的绝对路径。

  训练模型的代码采用Python编写,在Ubuntu系统下运行,并选用了Tensorflow深度学习框架来搭建模型,选用了openCV开源库来处理图片。代码主要分为以下四个模块:

  1)utils模块

  这个模块主要用于读取参数文件。

  参数文件中定义了用于训练的各种参数,如模型的路径、批处理大小、线程数等。其中训练的初始学习率定义为0.00001,动量优化器参数moment设为0.9,预训练模型选用了yolo_tiny.ckpt,批处理大小为16,5线程。

  2)dataset

  这个模块主要用于读取训练集的图片,并进行多线程的批处理。

  3)net

  这个模块定义了网络架构以及IOU、loss等计算函数。

  4)solver

  这个模块主要用于连接以上的各个模块,构建图,并创建对话运行图,输出训练过程的相关信息并保存训练过程中产生的权重文件。

  在训练过程中,选用了tensorboard使得训练过程可视化。

  另外值得注意的是,在论文中作者提到了他们为了避免过拟合,在训练中采用了数据增强和dropout等方式,本文没有选用。

  3.3 测试模型

  测试代码首先是读取图片,进行尺寸变换到448*448。然后读取已经训练好的模型预测得到边界框的坐标和目标类,采用openCV处理图片绘制边界框和标签。最终在根目录中得到带有边界框的图片。

  第四章 结果分析

  4.1 分类结果评估

  问题主要出现在视网膜下液和视网膜色素上皮脱离。通过观察结果发现,对于呈现卵圆形的SRF,由于和PED在形态上十分相似,区别只在于所处的层次上,该检测系统把该类SRF都判定成了PED

  个人认为这种情况可以通过增大数据集,主要是增大该类SRF的OCT图像解决。

  4.2 定位结果评估

  定位结果可以用平均IOU来评价,但由于本文所采用的金标准为笔者的手动标注, 非专业人士,随意性较大,所以这里只做定性分析。

  根据对结果的观察,三类目标都能够很好的定位,只有个别图片出现了定位在背景的情况。

  结论与展望

  本文采用YOLO算法进行基于OCT图像的眼底积液自动检测。取得了较好的效果。

  在目标分类上,准确率高达92%。问题主要出现在个别SRF与PED的混淆上面,具体原因在结果分析中已经提过;在目标定位上,大多数测试图片都能准确定位到积液位置,但是可能由于金标准制作的不专业性,以及算法本身的特质,个别图片虽然能够正确指明积液类型,但是无法正确定位,出现了定位在背景以及边界框为横线的情况。

  对于该任务的进一步研究有以下几点想法:

  1)基于YOLOv1改进

  恰如论文中提到的,作者采用了数据增强、dropout等方法来防止过拟合。而由于本文作者编程水平有限,没有采纳。在后续阶段的学习中可以进一步完善这点。

  此外,进一步阅读相关论文,寻找合适的预处理、后处理方法,试着改善效果。

  2)尝试YOLO的后续版本

  YOLO的提出者已经陆续提出了YOLOv2、YOLOv3等新的版本,在性能上有了很大提高,已经弥补了YOLOv1出现的定位错误,小物体无法识别等缺陷。因此可以尝试YOLO的后续算法。事实上,在写本篇论文阶段,作者已经尝试过了YOLOv3,在定位的准确度方面的确有了较大提升,但同时也出现了大物体无法识别的情况,这可能和anchor box的设置有关,还有待进一步探究。

毕业论文:http://www.3lunwen.com/jsj/dzjs/5391.html

上一篇:基于lda的文本情感分析

下一篇:没有了

     移动版:基于OCT的眼底积液自动检测

本文标签:
最新论文