袁 慧 杜 雪 赵晗冰 宋 美
(鲁东大学数学与统计科学学院,山东 烟台 264025)
目前,视功能损害已是一个严重的全球性公共卫生问题,全世界大概有盲人4 500万,低视力者1.35亿。在我国,视力残疾状况也十分严峻:我国视力残疾人数占残疾人总数的14.86%,其中白内障病人约占46.93%,青光眼约占5.64%[1],且发病率呈逐年上升趋势。同时,我国眼科医疗资源分布不平衡,普及程度低,导致了病人早期筛查工作困难等情况,给患者的就诊和眼部疾病预防工作带来较大阻碍。如果将眼底疾病筛查与人工智能相结合,提升现有医疗资源的使用效率,将有效改善现状。因此,建立自动识别眼部疾病模型对辅助开展防盲治盲工作具有重要的意义。目前在该方面的探索已经取得了一定成果:干能强(2008)提出以MATLAB GUI作为开发工具,编写青光眼图像处理与识别系统,实现对青光眼图像的识别[2];刘振宇等(2019)利用卷积神经网络自动提取深度特征构建白内障分级模型,其识别准确率达94.84%[3];徐志京等(2021)基于R-VGGNet网络模型的识别方法提高了判别青光眼患者的准确率,可达91.7%[4];李建强等(2018)基于CNN的白内障自动分类器在四分类任务中取得了81.86%的平均准确率[5]。上述模型大多只针对单一病种的识别,如青光眼、白内障和糖尿病视网膜病变等,导致其在日常生活中的适用范围较窄,多用于中后期辅助诊断工作。
与此同时,缺少公开眼底图像数据是我国眼底影像识别工作难开展的重要原因,多数眼底影像识别系统都是研究者与医院合作建立某种眼病的数据库。本次研究使用的数据集OIA-ODIR含有多种眼底疾病数据,较好地解决了缺少公开数据问题。本文使用基于TensorFlow构建的5种眼底疾病识别模型,可有效解决眼底疾病识别模型识别种类单一化问题,更好地提高眼底疾病诊断效率。
训练和测试深度学习模型时,数据库的质量起着决定性作用,一个高质量的数据集能够提高模型训练的质量和预测准确率。本文使用的数据集是国内首个公开眼底疾病数据集OIA-ODIR,由南开大学与多家临床医院合作建立,数据集中的眼底图像都是从医院的眼底图像数据库中抽取,并由相关专业人员进行标签标注。该数据集包含眼底图像数量高达10 000多张,取样涵盖各个年龄段人群,是非常优秀的眼底数据集。在OIA-ODIR数据集中,由于“其他”类疾病中所含疾病类别复杂,对实验结果存在较强干扰,因此在模型构建过程中,会将异常疾病数据图片排除。此外,糖尿病视网膜病变和老年黄斑变性数据集类别过少,尝试对此类数据扩充,如通过随机旋转、裁剪等解决数据不平衡的问题。但在训练过程中发现模型过拟合严重,可能是这两类疾病数据扩充后重复率太高,故在模型改进过程中删除其他疾病、糖尿病视网膜病变和老年黄斑变性3类图片,利用其余的5个数据标签进行眼底图像识别分类研究。
训练使用的是公开数据集OIA-ODIR(https://github.com/nkicsl/OIA-ODIR),获取的原始数据存在背景多余、多标签疾病、样本分布不平衡等问题,若将原始数据直接用于网络训练模型,会对准确性及其他指标造成较大影响,为提高模型的准确率,因此对原始数据采取一系列的预处理。
删除了存在“镜头污点”等问题的图像并裁剪多余背景,将尺寸为2 592×1 728左右的原始图像统一为250×250分辨率大小,这样既避免了图像尺寸过大而引起的训练时间过长,又尽可能多地保留了原始图片的信息。在图像注释中,左右眼标签不同且每只眼可能含有多种眼病,导致每只眼球具有多个不同诊断关键词,因此通过诊断关键词与疾病标签之间的映射来重命名图像,完善数据集标签。最后对原始数据采取随机缩放、翻转、调整亮度等方法解决数据不平衡问题,如图1所示。通过以上预处理,构建的样本数据集分布如表1所示。
基于Keras搭建自动分类模型,建立了6个卷积层、2个池化层、1个全连接层。
目前卷积是图像处理中较流行的方法,对输入图像区域像素取加权平均值作为输出图像的像素,其中权值由卷积公式[式(1)]得到。
图1 处理数据不平衡问题的方法
表1 数据分布表
在卷积过程中,所选卷积核的大小决定了模型特征把握能力的强弱。为了保证准确率提升效率最大化,将3×3、5×5和7×7的卷积核的识别效率进行对比,最终发现5×5的卷积核的识别效率最出色。
在每个卷积层之后引入ReLU激活函数[式(2)],ReLU激活函数又称修正线性单元,是一种人工神经网络中常用的激活函数(activation function),通常指代以斜坡函数及其变种为代表的非线性函数。在本模型中,ReLU函数的“仿生物原理”可以成功激活大概50%的神经元,其优秀的梯度下降以及反向传播效率解决了梯度爆炸和梯度消失的问题,有效避免了模型过拟合。最重要的是,ReLU函数的加入使得模型计算过程得到简化,压缩了模型计算的时间,提高了整体模型学习效率。
此外,在模型卷积层后引入了Dropout层,从而降低训练结果过拟合的概率,最后使用Softmax损失函数[式(3)]辅助进行多分类。Softmax损失函数是Logistic回归模型在多分类问题上的推广,适用于多分类问题中,且类别之间互斥的场合。Softmax将多个神经元的输出,映射到(0,1)区间内,可以看成当前输出是属于各个分类的概率,从而来进行多分类。
最终该模型结构如图2所示。
图2 模型结构图
模型代码是以Keras为前端、TensorFlow为后端实现的,使用的框架是基于Ubuntu16.04(64位)+CUDA9.1+CUDNN9.0系统,采用Python为编程语言,训练过程如下。
为了使模型拥有更高的训练网络精度,将预处理后的眼底图像按batch_size=32输入自动分类模型,模型由3个模块(Block1、Block2和Block3)组成,每个模块包含两个卷积层。其中Block1、Block2、Block3的感知节点分别为32×32、64×54、128×128,输出的特征映射图转化长度分别为250,83,27。并设置卷积核大小为5×5进行特征提取,之后对输入张量进行批量归一化处理,接着加入激活函数ReLU,激活网络中的神经元。对每个模块进行最大池化,前2个模块Dropout层参数值为0.45,后4个为0.5。将池化后的输出向量传入全连接层并将特征图转化为长度为93 312的特征向量,最后使用Softmax交叉熵损失函数对模型进行五分类。为了防止训练过程中模型过拟合,选择学习率较小的Adam作为优化器,最终设置学习率为0.000 1,并根据函数计算评价指标。
对于模型评价的性能指标,采用准确率[公式(4)]、召回率[公式(5)]和精确率[公式(6)]对模型进行评估。将当前预测类别定义为正类,其他类别定义为负类,预测结果可分为以下4种情况:正类预测为正类(TP)、正类预测为负类(FN)、负类预测为负类(TN)、负类预测为正类(FP)。最终模型训练性能指标结果见表2。
表2 训练结果
本文利用首个公开眼底图像数据集OIA-ODIR,并基于深度学习构建正常、白内障、近视、青光眼和高血压5类眼病的自动识别模型,对数据不平衡等一系列问题进行数据预处理,最后,通过训练经典的CNN模型,实现多种眼病分类任务。训练后的模型可快速识别出5类眼底疾病,平均准确率为0.777 6,平均召回率为0.370 1,平均精确率为0.711 3,符合预期要求。其中,白内障和正常的眼底分类最优,准确率可高达95%左右。该模型的建立,对医生诊断和防盲治盲工作的开展具有辅助作用,对于降低眼底检查的工作成本和缓解医疗设备分布不平衡问题有实际意义。未来工作中,可以从网络融合、特征提取等算法方面进行优化,进一步提高模型分类的准确度,从而对眼病图像进行更准确快速的分类。