柴文光,李嘉怡
广东工业大学 计算机学院,广州 510006
现今深度学习和神经网络已经广泛应用在各领域中,如遥感图像识别、视频监控、医学图像检测等。由于大多数医学图像数据集存在着样本数量少、样本获取成本高、人工标注成本高以及类别严重不均等问题,而深度卷积神经网络模型需要大量带有标注的训练样本来保证其最终性能,所以普通的深度卷积网络很难直接应用于与医学图像相关的视觉任务中。因此,将深度学习的方法应用在医学图像检测时,需要对数据本身或神经网络本身进行一定程度的处理,以弥补因医学图像数据本身的缺点而造成的问题[1-4]。张驰名提出一种ChestXNet细粒度诊断网络,通过引入通道间的注意力机制模块,和双路并行的全局最大-平均池化结构来优化神经网络[5]。张凯等人提出使用生成对抗网络来增强医学数据样本的数量,通过提高训练样本数量以达到提高网络精度的目的[6]。冯毅博等人提出一种深度可分离稠密网络DWSDenseNet,使用了2 905例COVID-19胸部X线平片影像作为实验数据集进行二分类检测实验[7]。然而,以上文献忽略了一个重要的问题,即在进行多分类的医学图像检测任务时,如何解决数据集中类别分布不平衡的情况。
在处理实际应用问题时,所能收集到的数据集往往出现类别不平衡的情况。数据集中大多数的样本会集中分布在头部前几种类别中,而剩下的少量样本则零散分布在尾部更多的类别中,其分布接近“二八定律”。这就是计算机视觉中经典的“长尾”问题(long-tail),如图1所示。
图1 “长尾”问题中的数据分布的坐标轴示意图Fig.1 Axis diagrams of data distribution in“long tail”problem
解决“长尾”问题的主流方法是“重采样”(re-sampling)和“重加权”(re-weight)。重采样是指改变数据被特征提取器采样的频率;而重加权是指对每一类数据的损失函数进行加权。
本文以covid-chestxray-dataset数据集作为研究对象,针对数据集中出现的长尾问题,提出结合两种不同权重对损失函数进行重加权,通过改进损失函数,以实现反向抵消神经网络在训练时出现的过拟合现象。本文使用CLAHE算法[8]对原始样本图像进行预处理,并将ResNext50作为分类检测的特征提取网络。经实验表明,在应用新的改进方法后,网络在测试集中的准确度、精确率、召回率和F1值四项评估标准中均有一定程度的提高。
损失函数的计算具有灵活性和方便性,可以更好地适应不同数据中图像特征的变化趋势。因此,多数研究和实验都使用重加权作为长尾问题的主要解决方法之一[9-10]。通过对损失函数进行重加权,可以增加尾部分类损失在总损失中所占的比例,同时降低头部分类损失函数在总损失函数中所占的比例,使网络在训练过程中对尾部类别能够更加地关注,从而反向抵消了神经网络在学习数据集时因长尾分布而导致的头部类别过拟合问题。
Lin等人提出了焦点损失算法(focal loss)[11],该损失函数是交叉熵损失(cross entropy error function)的一种变形。通过对在交叉熵损失函数中加入两个权重参数,来平衡每类样本的重要性,也可理解为一种困难样本挖掘。Chen等人的研究和实验也证明了将焦点损失运用在目标检测模型的区域提案网络(region proposal network,RPN)中,可以解决因为类不平衡造成的过拟合问题[12]。Cui等人则提出,可以通过使用有效样本数量(effective number of sample)的定义来求出每一类数据在总数据集中的有效样本期望数量,并根据该期望得到重加权的权重值[13]。以上文献的研究和实验结果皆能证明重加权方法在解决类不平衡“长尾”问题的有效性。
ResNext[14]是一种特殊的残差网络,它属于ResNet网络[15]和Inception网络[16]的结合体,其网络块结构是由简化后Inception结构块加上ResNet中的跳层捷径(short-cut)构成,可以在减少神经网络超参数的同时,保证网络的性能。其结构如图2所示。网络的设计脱离了通过加深和加宽网络层次来提升网络性能的固定思维模式,增加了具有相同拓扑结构的路径数量,以简单、可扩展的方式利用拆分-转换-合并策略进行分组卷积[17]。ResNext网络在各类计算机视觉任务的应用中,都呈现出了显著的效果。
图2 ResNext网络结构块示意图Fig.2 Block of ResNext network
为适应多分类胸部X光图像的病症检测任务,本文使用ResNext50作为特征提取网络,利用重加权方法改进交叉熵损失函数,并使用CLAHE算法进行图像预处理。
为解决模型因数据长尾分布而造成的过拟合问题,本文提出引入重加权来优化原有的损失函数。使用两种不同的权值计算方法来得出两种权重,并将这两种权重进行线性组合,再用新权重值来为损失函数进行加权。
一般而言,对交叉熵损失函数进行重加权的通用公式如下:
假设该神经网络的输入为样本x,其中N是网络最后一层输出的向量的长度,即样本中的类别数目,zj、zi是指输出向量的第j和i个值,weight为对损失函数进行重加权的权重,该权重向量长度等于N。重加权中每一类损失的权重数值,是根据该类别样本在数据集中所占的比例而设定的,赋予样本数量过多的类别较小的权重,反之则赋予较大权重。因此,根据重加权的原理,本文提出第一种权重设定方法如下:
其中,Ni为数据集中第i类的样本数目,ai为第i类样本的权重值,n为样本中类别的数目,a=[a1,a2,…,an]。虽然需要给样本数少的类别赋予较大权重,但权重也不宜过大,否则神经网络在训练时同样会倾向权重过大的类别。由logn X函数的单调性质可知,当底数n大于1时,该函数是个单调递增函数,且X值越大时,函数的走向也趋于平缓。因此,选用lnX函数来计算权重值。
第二种权值的计算方法是通过有效样本数量的定义得出,文献[13]中有其具体推断过程。该权重的计算公式为:
其中,bi为第i类样本的权重值,ni为第i类样本的样本数量,根据文献[12]的参数设定Ω=0.99。将该权重应用在损失函数的公式为:
其中,b=[b1,b2,…,bn]。
公式(2)所得的权重a是利用每类样本数在总样本数中所占的比例来计算的,计算方式较为简单粗暴,可以有效提升模型的准确度,但鲁棒性不强。公式(4)中得出的权重b,是通过有效样本数量所计算而来,能更好地反向消除模型训练时对头部数据的过拟合问题,虽然在准确度的提高上不及前一种权重,但使用该权重时模型鲁棒性更好。两种加权方式各有优劣,因此,将a、b两种权重进行线性组合。改进后的交叉熵损失函数如下:
其中,λ和μ为平衡参数,在本文实验中取λ=0.65,μ=1。
同时,通过第3.4节的对比实验也能证明,使用本文提出的损失函数比起其他损失函数,在covid-chestxraydataset数据集上的四项实验评估值都会更好。这证实了本文改进的损失函数更适用于多分类X光胸照检测任务。
Wang等人证明了神经网络运用在X光胸照病症检测上的可行性,同时提出了COVID-Net网络[18]。该网络模型是在普通神经网络模型的基础上增加了深度分离卷积层(depthwise convolution,DWConv)。文献实验结果表明VGG16和ResNet50等常规神经网络在X光胸照上的病症检测性能不及COVID-Net。
衡量一个神经网络模型的性能,除了观察它应用在具体任务上的准确度外,还有网络的参数量及计算量,它们是衡量神经网络计算开销的重要指标。计算量即浮点计算数(floating point operations,FLOPs),公式为:
其中,H、W和Ci分别为神经网络输入的三个维度,即特征图片的长、宽和通道数,Kw n为模型中第n层卷积网络中卷积核的宽度,Co为网络最后输出的特征图片通道数。现假设网络输入是256×256的3通道图片,本文通过计算得出了Vgg16、Resnet50、COVID-Net和ResNext50的参数数量和计算量,如表1所示。从中能得知ResNext50参数量最少,而计算量也偏少。
表1 网络的Params值和Flops值Table 1 Params and Flops value of networks
接下来,本文分别对COVID-Net和ResNext50的模型准确度进行实验,以文献[18]中对X光胸照进行病症检测并将图像进行三分类的任务作为目标,得出两个网络检测的准确度,如表2所示。ResNext50在减少了网络的参数量和计算量的同时,能拥有与COVID-Net相近的性能。综上所述,选择ResNext50作为该模型的特征提取网络。
表2 网络在相同任务下的准确度对比。Table 2 Comparison of networks’accuracy under same task
CLAHE算法又名限制对比度自适应直方图均衡(contrast limited adaptive histogram equalization)[19],使用该方法对X光图像进行处理,能够突出图像的内部细节,抑制噪声,并且更好地保存X光图像中的病灶信息[7]。算法的实施步骤如下:
(1)将图像拆分为R、G、B三个图层并转化成3张单通道图像,分别将这三个图像切分为多个等大不重叠的图像方块。
(2)计算每个图像方块的灰度直方图:
其中,AVG(N)表示灰度级的平均像素数,Nx和Ny分别表示X轴方向和Y轴方向的像素数,Ng是图像块中灰度级的数量。
(3)设定一个灰度级像素数的截取系数M,并计算截取阈值Nk。
求出截取阈值后,将截取到的像素总数平均分配到每个灰度级的像素数上。
(4)对每个图像方块的直方图进行均衡化。
从covid-chestxray-dataset数据集中随机选取两张图片数据,分别对其使用CLAHE算法进行预处理,结果如图3。其中,左侧是X光胸照的原图,右侧是该图像通过CLAHE算法进行图像预处理后的结果,可见其内部光暗对比更加明显,细节也更为突出。
图3 用CLAHE算法对胸部X光图像进行增强Fig.3 Enhancing chest X-ray image with CLAHE algorithm
本实验是在Linux系统中进行的,系统的Ubuntu版本号为18.04,代码在Anconda中搭建的python3.6环境中进行编写,算法模型统一使用pytorch框架构造。程序的运行使用了1块内存为12 GB的GPU。
数据集本身具有类别样本分布不平衡的情况,不止训练集,这种不平衡的分布也同样出现在测试集中。由于数据集的长尾分布可能会导致模型在训练阶段出现过拟合头部类别的情况,如果只用准确度这一个指标来进行衡量,则无法全面地评估模型的性能。因此,本文使用了四种度量指标来评估所提模型的性能,分别是准确度(Accuracy)、精确率(Precision rate)、召回率(Recall rate)以及F1值(F1-measure)。如表3所示,是一个混淆矩阵。
表3 混淆矩阵Table 3 Confusion matrix
四种度量指标的区别和计算方法分别为:
(1)准确率,即所有预测正确的样本占总样本的比重:
(2)精确率,又称为查准率,用来表示预测准确的样本占所有预测为正的样本的比例:
(3)召回率,又称查全率。它以实际的样本为判断依据,计算实际为正例的样本中,被预测正确的正例占总实际正例样本的比例:
(4)F1值,通过精确率和召回率联合计算得来。当测试集的分布存在特殊情况的前提下,单独用精确率或者召回率不能很好地评估一个算法模型的性能优劣,需要用到F1值来衡量模型性能:
本文使用的数据集是github上的开源数据集covidchestxray-dataset,该数据集的样本分布具有典型的长尾分布的特性。本次实验前,出于对训练集和测试集的划分考虑,首先剔除原数据集中样本小于5的类别。其次,为了更好地构造一个长尾分布的数据集,使数据分布符合“二八定律”,选择从Kaggle竞赛的RSNA pneumonia的数据集中随机划分30张normal类别的样本进入训练集中。最终得到用于实验的共15个类别的数据集,并按照每类样本总数的7∶3比例划分成训练集和测试集。由于数据集中图片大小不一致,统一使用拉伸或压缩的方式,将图片尺寸调整为256×256。训练集的类别样本数目分布如表4所示。
表4 训练集的类别样本数目分布Table 4 Distribution of class samples of training set
本文设计了8项实验,通过实验结果对比表现来评估该模型的性能,以及重加权方法应用在不平衡医学图像数据集中的有效性。
实验结果如表5所示。其中“+a”表示检测模型使用的是公式(3)中经过重加权的损失函数,“+b”表示检测模型使用的是公式(5)中的损失函数,“+a+b”表示检测模型使用的是公式(6)中损失函数。从该表可以得出,经过重加权后的分类检测网络,其四项分类评估指标均有一定程度的提高。
表5 每一项实验的准确度、精确率、召回率与F1值Table5 Accuracy,Precisionrate,Recallrateand F1-measureofeachexperiment %
实验③、实验④和实验⑧在测试集中最后100个epoch中的准确率变化如图4所示,所有epoch中的准确率变化如图5所示。可以看出实验③的测试准确率虽然比实验④高,但稳定性较弱,准确率动荡严重,而实验④的测试准确率虽然较前者抵,但呈现了一种稳步上升的状态。而实验⑧的测试准确率趋势结合了前两者的优点,在准确率达到较高值的同时,准确率的收敛较为平缓,稳定性较高。
图4 实验③、④和⑧在最后100个epochs中的准确率变化Fig.4 Changesinaccuracyofexperiments③,④ and⑧ inlast100epochs
图5 实验③、④和⑧在所有epochs中的准确率变化Fig.5 Changesinaccuracyofexperiment③,④and⑧inallepochs
同时,为了进一步证明该方法的先进性,本文将其与焦点损失算法[11]、LDAMloss算法[20]和Seesawloss算法[21]在同样的环境下进行实验对比,这三种损失函数的实验结果分别对应表5中实验⑤、实验⑥和实验⑦。通过在covid-chestxray-dataset数据集上进行多分类检测实验,对比这其四项实验评估值的结果。
实验⑤和实验⑧进行对照,能有效证实本文提出的重加权方法比文献[11]中提出的焦点损失算法更适用于多分类X光胸照检测任务上。实验⑤中,使用焦点损失算法后的模型,其精确率、召回率和F1值对比实验②中的数据分别提高了6.88个百分点、7.33个百分点和7.55个百分点,证明焦点损失能在一定程度上解决因长尾分布而产生的过拟合问题,但其准确度并不高,甚至还有下降趋势。结合文献[11]和文献[12]进行分析,文献中使用焦点损失算法能有效提高模型性能,可能的原因之一,是因为文献中所使用的的实验数据集虽然都存在类别不平衡的长尾分布问题,但每一类样本数量都是充足的。而本文所使用的covid-chestxray-dataset数据集不仅存在长尾分布的问题,还存在尾部类别样本数量过少的情况。焦点损失算法不适用于小样本数据中。对比实验①、实验⑥和实验⑧的结果可以看出,使用LDAMLoss能将神经网络模型的召回率和F1值分别提高9.48个百分点和2.6个百分点,但准确度和精确率并没有得到提高。而实验⑦在程序多次运行的过程中出现了损失函数无法收敛的情况,导致最后实验结果相当不理想。结合文献[20]分析,可能的原因有两个。一是医学图像数据集的类别量与数据量相较自然图像数据集有较大的差异;二是本文使用的网络模型的深度不够,SeesawLoss函数并不适于该模型。由交叉熵损失函数的改进变形得来的损失函数更适用于该网络模型以及胸部X光图像的检测分类任务。
最后,由实验⑧可证明,本文所提出的重加权方法可以改进网络在多分类X光胸照病症检测的任务效果,论文模型可行且有效。
本文使用深度学习的方法,实现了在多类别不平衡X光图像数据集上进行病症检测。针对数据集中样本数据出现长尾分布的问题,该模型使用对损失函数进行重加权的方法来反向抵消因数据类不平衡长尾分布对检测模型所造成的影响。实验模型以ResNext50作为检测网络,并使用CLAHE算法对数据集图像进行预处理。通过8项实验相对比说明,证实了本文提出的重加权对处理长尾问题确实可行且有效,且对比其他损失函数效果更好。
论文实验结果受限于数据集的样本数量。要做到将各项评估数值数值进一步提高,使模型能够更好地适应多类别X光胸照病症检测任务,仍然需要在神经网络训练阶段投入更多的数据。如何在有限的数据中使模型性能可以得到更好的提升,这是以后研究的重点。