滕 皓,陆慧娟+,朱海天,朱文杰
(1.中国计量大学 信息工程学院,浙江 杭州 310018;2.中国计量大学 经济管理学院,浙江 杭州 310018)
目前,基于深度学习的目标检测在医学影像具有广泛的应用,主要包括乳腺癌图像分类[1]、肺结节检测[2]、肺炎检测等。针对医学影像目标检测的改进方法具有多向性,如增加网络的深度提升网络的表征能力,或者改进训练策略、损失函数等。
目标检测是一个多任务算法,容易导致某项任务主导模型训练的情况,多任务权重需要得到调整。一种边界框损失函数K-L损失函数[3]被提出,用于学习更为精准的检测框位置。Michelle Guo等[4]提出的动态任务优先排序算法,其思想来源于课程学习。将多个任务基于难度系数进行排序,从而使得较简易的任务优先被执行,并且随时间调整该难度系数。DFNet[5]被提出,动态设置各个类别之间损失函数的权值,原因是背景与目标像素个数会有区别,而背景像素过多会使得背景对模型训练影响更大,从而导致精度降低。Kang Zhao等[6]改进了Focal Loss进而提出动态损失函数,该动态损失函数保持Focal Loss的精度并且加快了模型训练的收敛。
本文将Faster R-CNN以及R-FCN算法应用于肺炎目标检测,提出了抑制增长损失函数,损失函数的每一项权值被自适应地调整,使得损失函数数值随step增大的项得到增强,损失函数数值随step减小的项不变,同时根据课程学习[7]自适应地调整不同任务的优先次序。肺炎图像存在检测框模糊以及图像通道数单一的缺陷,这些缺陷易导致模型训练较难收敛,因此提出抑制增长损失函数。在保证训练负荷不增加的情况下,使得二阶段检测器的平均精度得到有效的提升。
二阶段检测算法包括RPN(region proposal network)生成proposal阶段以及针对proposal定位和分类阶段。Faster R-CNN[8]是经典的二阶段检测算法,由Shaoqing Ren等提出,在它之前已经出现了R-CNN以及Fast R-CNN,前者不可以端到端地进行训练,而后者由于Selective Search算法过于耗时而被改进。综上所述,Shaoqing Ren等改进了前两个算法提出了Faster R-CNN,既提升了精度又提高了效率。
基于Faster R-CNN,结合FCN[9](fully convolutional network),将全连接层替换为全卷积层,引入了位置敏感得分图,如图1所示,在肺炎图像经过卷积神经网络提取的特征图中,将感兴趣区域划分成了3×3,由于肺炎图像只包含肺炎病灶和背景类,从而得到2×3×3大小的位置敏感得分图,再经过池化层产生两维的置信度,最终得到分类结果。
图1 R-FCN主要结构框架
在深度学习中,损失函数起到求解和评估模型的作用。本文的损失函数包括目标边界框回归损失以及分类损失。回归损失函数采用Smooth L1 Loss,该损失函数如式(1)所示,Smooth L1 Loss在x较小时梯度也会较小;而在x很大的时候梯度的绝对值也不会大于1,不会因为梯度过大而造成训练失败
(1)
分类损失函数采用交叉熵(cross entropy loss)损失函数,该损失函数如式(2)所示。在式(2)中,p表示预测概率,p*取值为1或者0。交叉熵能够衡量两个不同概率分布的差异程度。交叉熵的值越小,模型预测效果就越好。神经网络的输出经softmax进行处理,再通过交叉熵来计算损失
L(p,p*)=-log[pp*+(1-p)(1-p*)]
(2)
由于肺炎图像的通道单一,图像信息没有三通道图像丰富,因而在模型的训练过程中,模型的收敛容易受到噪声[10]的影响,从而导致每个step的损失函数值不可能严格下降,而是波动下降最终会导致预测的结果产生较大的波动。
假定RPN阶段的分类和回归损失函数值分别为RPN_CLS、RPN_BOX,第二阶段的损失函数值为R-CNN_CLS、R-CNN_BOX。改进前本文所应用的算法损失函数曲线如图2所示,选择模型训练的前50个step,在图中可以看到对于Faster R-CNN,在前约12个step的时间段,其R-CNN_CLS损失函数值随着step增加而增加,极易导致训练的失败;对于Faster R-CNN和R-FCN,其R-CNN_BOX损失函数值波动过大且没有明显的降低趋势,容易导致训练不收敛的情况发生。因此,需要设计抑制增长损失函数,减小损失函数的波动幅度从而达到优化训练的目的。
图2 Faster R-CNN以及R-FCN损失函数数值随step变化曲线
依据前文所述,需要提出一种损失函数设计策略:当损失函数值增大时,说明此时的样本训练较为困难,需要增大它的训练强度、抑制该损失函数值的增长;当损失函数值减小时,说明此时的样本训练较为容易,其训练强度可以维持不变、可以不抑制其增长。当损失函数的权重变化时,反向传播时的损失函数值随即变化,得到相应神经网络的参数也会相应改变,从而使得网络参数得到优化。
由于二阶段目标检测算法的损失函数权重全设置成1,而且所有类型的损失函数权重都相等,不具有自适应调节的功能,极易导致训练没有侧重于关键的问题、训练困难的样本,因此本文提出抑制增长损失函数算法,该算法详细描述如下:
(1)在模型的训练过程中,记录每个step的损失函数值,记第i个step的损失函数数值为φi。
(2)在训练的第1个step,由于不存在前一个step的损失函数值,因此第1个step的损失函数权重退化为原始值,即相等的4个1;在训练的第2个step开始,计算第i个损失函数数值与第i-1个step的损失函数数值的差值,记为x,即为x=φi-φi-1。本文提出的策略为:当x减小时,该项损失函数的权值仍置为1;而当x增大时,该项损失函数的权值由式(3)确定
(3)
式中:x代表相邻两个step的损失函数的差值,α、β、r均为正实数、正常数,通过设置r的值可以调节该损失函数抑制增长的程度,r值越大,抑制增长的程度越深。式(3)的微分函数如式(4)所示
(4)
在本文中,α=β=e且r>0。当x≥0,式(3)将变形为ψ(x)=ln(rx+e),式(3)的微分函数将变形为式(5)所示。当x=0,得ψ(0)=1,此时的情况退化为原损失函数;当x<0时,得到ψ(x)=1,权重值为1,尽管值同样为1,但是其含义与前文叙述情况不同,此时情况下由于损失函数值有所减小,可以不抑制损失函数的增长;当x>0时,因为r>0,该权值式(3)的微分函数即式(5),其数值恒大于0,使得权值随着x增大而单调增加,当ψ(0)=1,使得ψ(x)恒大于ψ(0),即ψ(x)恒大于1,含义就是:当相邻两个step的损失函数差值变大且损失函数值增加时,权值随x增大而增加,因为该权重函数的微分函数值随x增加而减小,从而使得权重函数的变化曲率随着x增加而减小,权重变化不剧烈,不会对模型造成训练的失败,因此该权重函数符合设计的初衷
(5)
激活函数的主要作用是引入非线性,加强线性模型的表达和分类能力。本文在ResNet的浅层网络中将ReLU激活函数替换为Mish[11]激活函数,该激活函数如式(6)所示。由于ReLU在x<0部分梯度为0,从而导致负输出的梯度变为0使得信息丢失,因此该神经元可能再不起到激活的作用。由于肺炎图像具有通道单一、病灶边界模糊的特点,对于信息的丢失问题将变得更加敏感,从而引入一种更为平滑的激活函数,其在x<0时允许信息更好地深入神经网络、减少信息的丢失,从而得到更高的精度和更强的泛化能力
Mish=x*tanh(ln(1+ex))
(6)
肺炎图像中语义信息较少,纹理信息较多,需要使用深度卷积网络提取更多的语义特征。由于在识别肺炎病灶时较难分辨边界,使得标记检测框时的坐标非常粗糙,例如图3中标注的检测框以下部分,很可能被计算机识别成肺炎病灶,从而导致模型在训练的过程中损失函数值波动较大。
实验被执行于北美放射学会(radiological society of north America,RSNA)发布的肺炎数据集,首先需将XML文档中的坐标信息提取,由于该文档中包含重复病人的多个病灶,需将其去重,并且去除该数据集中不包含病灶的图像,得到该数据集中包含病灶的6012张患者的X射线图像,最终将其转化为训练可以采用的VOC格式。如图3所示,两个不同的边界框被用来标注每个图像。对于本文的肺炎目标检测任务,数据集被随机分为训练集(4810张图像)和测试集(1202张图像)。训练集和测试集之间没有重叠。每幅图像的尺寸为1024×1024像素,格式为JPG。
图3 带有标签的肺炎图像
本文实验的基础网络采用ResNet[12],它是在ImageNet数据集上预训练的模型,运用了迁移学习的技巧。深度网络可以提取图像更为抽象且语义性更强的特征,被用于预测图像的类别。本文的实验采用PyTorch框架实现的代码,实验被执行在GTX 1070显卡,内存为8 G的计算机上,保存每个Epoch的训练模型。
在实验训练过程中,植入抑制增长损失函数以及Mish激活函数,每个step只增加计算权值的时间开销,使用随机梯度下降(stochastic gradient descent)对结果模型进行微调。针对Faster R-CNN:初始学习率设置为1e-4,batch size值为4。针对R-FCN:初始学习率设置为1e-3,batch size值为4。由于本文数据集的训练集包含4810张图片,在训练模型的过程中,为了折中训练规模和效率,本文采用了水平翻转的数据增强(data augmentation),将图片数量增加到了9620张。
本文基于Faster R-CNN和R-FCN训练所得到的Precision-Recall曲线如图4所示。对于目标检测,通常使用平均精度(average precision)作为衡量模型优劣的指标。目标检测中的分类和定位任务都需要评估,图像分类问题中使用的标准度量不能直接应用于目标检测问题。由于本文所用数据集类别只包含一类,即是否含有肺炎病灶,所以不需要计算所有类别AP的平均值,即mAP(mean average precision)。计算细节具体分为3步,具体如下:①计算精确率(Precision)以及查全率(Recall);②绘制P-R曲线(Precision-Recall Curve);③计算AP值。
图4 算法改进前后的P-R曲线
从图4的P-R曲线可以看出,对于Faster R-CNN,在查全率大于约0.02时,取固定的精确率可以看到改进的Faster R-CNN查全率得到增大,改进的Faster R-CNN平均精度曲线的位置几乎位于原始算法的右上方;对于R-FCN,可以看到,任取一个范围内查全率数值,改进的R-FCN的精确率都高于原始R-FCN的精确率,在查全率约为0.1左右此现象更为明显,只在查全率约为0.69左右时,改进的R-FCN的精确率与原始算法的精确率大致相等,改进的R-FCN平均精度曲线的位置几乎位于原始算法的右上方。综上所述,从P-R曲线可以验证提出的抑制增长损失函数效果明显。
为了验证平均精度的提升与损失函数值的有效降低相关,在训练的过程中,记录每个step的损失函数的数值,该数值是加权以前的各项损失函数数值,而加权以后的损失函数数值被反向传播优化神经网络参数。对比改进前后损失函数数值的总和,总和是指第一阶段的损失函数RPN_CLS、RPN_BOX以及第二阶段的损失函数R-CNN_CLS、R-CNN_BOX的数值相加结果。损失函数数值总和曲线如图5所示,取前50个step损失函数数值总和为例,在图5(a)中,针对Faster R-CNN,可以看到,在前10个step的时间段内,改进的算法的损失函数曲线基本都在原始算法下方,说明损失函数数值得到有效降低;在图5(b)中,针对R-FCN,在第5个step左右,原始算法的损失函数数值具有明显增大的现象,而改进的算法的损失函数得到了较为平稳的降低。总的来说,该损失函数曲线验证了引入抑制增长损失函数可以更有效地降低损失函数数值,从而获得更高的平均精度。
图5 算法改进前后的损失函数总和曲线
在训练的过程中,保存每个Epoch的训练模型参数,测试时对于保存的模型依次检测精度,最终取最高精度值。交并比取0.5所得到的平均精度以及测试时间见表1,从表中可以看到,对于Faster R-CNN,在检测时间增加了4.2 s的情况下,算法改进后平均精度相较原始算法增加了3.8%;对于R-FCN,在检测时间增加不多的情况下,算法改进后平均精度相较于原始算法得到了2.8%的提升。在改进前,R-FCN算法的平均精度相较于Faster R-CNN算法增加7%,在改进以后,R-FCN算法的平均精度相较于Faster R-CNN算法增加6%。以上实验说明了提出的抑制增长损失函数对二阶段模型具有改进作用。
表1 抑制增长损失函数在两个算法的测试结果
为了进一步验证抑制增长损失函数以及引入的Mish激活函数的有效性,执行消融实验,交并比取0.5所得到的平均精度见表2,在表中√代表运用该方法,×代表不运用该方法。
表2 算法的消融实验结果对比
从表2中可以看到,对于Faster R-CNN和R-FCN,后者较于前者基础平均精度高7%,只采用Mish激活函数的算法平均精度分别可以提升2.4%和1.1%,只采用抑制增长损失函数的算法平均精度分别可以提升2.6%和2.4%,同时采用Mish激活函数和抑制增长损失函数的算法平均精度分别可以提升3.8%和2.8%,说明不论是Mish激活函数的替换还是提出的抑制增长损失函数的植入,都对模型具有改进作用,而且当两者同时被应用时,模型的精度将得到更大的提升。总的来说,R-FCN较于Faster R-CNN的平均精度提升了6%。实验的数据展示Mish激活函数和提出的抑制增长损失函数都对应用在Faster R-CNN和R-FCN的肺炎目标检测有改进作用。
同时采用抑制增长损失函数以及Mish激活函数的算法平均精度走势图如图6所示,在图6(a)中可以看到对于Faster R-CNN,从第3个Epoch开始,改进的Faster R-CNN的平均精度曲线几乎都在原始算法曲线的上方;在图6(b)中可以看到对于R-FCN,从第4个Epoch开始,改进的R-FCN的平均精度曲线于第6个Epoch低于原始算法的曲线,其它时刻的平均精度曲线都高于原始算法的曲线,该平均精度走势图验证了提出的抑制增长损失函数的有效性。
图6 改进算法与原始算法平均精度走势
为了更进一步验证本文提出的抑制增长损失函数的有效性,本文将实验同时执行于ResNet-50以及ResNet-101,通过增加网络层数验证提出方法的有效性。基于ResNet-50和ResNet-101的算法检测结果见表3,可以看到,网络层数由50层增加到101层,对于4种不同的情况,即改进前后的Faster R-CNN和改进前后的R-FCN,除了改进的R-FCN,平均精度都有所提升,说明网络层数的增加使得算法能够提取更具有表达能力的特征,从而增强图像的语义信息,得到更为精确的结果、更高的精度。对于Faster R-CNN,基于ResNet-50,改进的算法相较于原始算法提升了3.8%;基于ResNet-101,改进的算法相较于原始算法提升了3.4%。对于R-FCN,同时采用抑制增长损失函数以及Mish激活函数两种方法并且基于ResNet-50的算法平均精度与基于ResNet-101的原始算法的平均精度相等,说明提出的方法可以使得基于网络层数较少预训练模型的算法与基于网络层数较多预训练模型的算法的平均精度相当,验证了前文所述两个方法的有效性。
表3 基于不同预训练网络的算法平均精度对比
选取不同肺炎图像的检测结果如图7所示,检测的结果显示,针对检测框的回归问题具有有效的改进,对于Faster R-CNN,明显地可以看到检测框面积变得更接近于真实值;对于R-FCN,存在一些图像的检测结果边界框基本接近于真实值。
图7 算法改进前后的检测结果对比
医学影像的识别与检测是计算机视觉的热点问题。本文将二阶段目标检测算法应用于肺炎目标检测,由于肺炎图像存在通道单一、图像信息不丰富的缺陷,而且其病灶的边界框标注较为模糊,引起损失函数波动较大收敛减慢的情况,提出了抑制增长损失函数,并且将ReLU替换为Mish激活函数,在保证算法训练负荷不增加的情况下使得模型精度得到有效提升。抑制增长损失函数的植入使得Faster R-CNN和R-FCN的平均精度AP得到3.8%和2.8%的提升。由于肺炎目标检测的基础精度较低,未来将提出更多自适应权值的算法,使得二阶段肺炎检测精度得到进一步提升。