基于深度卷积神经网络的舌体胖瘦精细分类
2020-02-01温坤哲韦玉科
温坤哲,韦玉科
(广东工业大学计算机学院,广州510006)
0 引言
舌诊是中医诊断中不可或缺的一部分,医生通过对舌体的观察,对患者的病情进行鉴别。舌体图片一直在计算机舌诊系统中扮演着重要的角色,其体现的舌体胖瘦客观反映了身体的状态。
许家佗等人[1]提出了通过对舌体的正面与侧面进行图像采集及对其长度、宽度、厚度测量,并利用结果参数与舌体表面积的比值关系建立不同的参数计算方法,最后通过对大量测试样本的测试分析,建立最好的参数计算方法进行舌体胖瘦分类。卫保国等人[2]提出了通过研究曲线拟合参数与曲线形状胖瘦的关系,结合舌体的长宽比,求得舌体的胖瘦指数,从而实现了对舌体胖瘦的自动定量分析,最后并给出结合中医诊疗习惯,得出合理的舌体胖瘦的描述。张康等人[3]提出利用计算机技术对舌诊图像进行自动分割,然后对分割后的舌体进行补贴曲线拟合函数的拟合,从而分析舌体胖瘦。张康等人[4]还提出了利用计算机技术将在脸部区域提取舌体图像,将双峰高斯函数作为拟合函数用以拟合舌体边缘曲线,用BP神经网络对舌图像进行舌体正常、舌体瘦小、舌体胖大的分类。
目前,基于舌体图片对舌体胖瘦分类的研究正大力发展,其成果十分显著,但是以上研究工作主要是针对舌体正常、舌体瘦小、舌体胖大三者之间的分类展开的,并未考虑舌体胖大有齿印这一特殊类别。尽管对比传统舌体识别,本文仅增加了对舌体胖大有齿印的分类,但从中医学临床意义上,能为舌诊过程提供更精确的依据,使医生能更准确甄别患者的病情,提高舌诊的准确率,实现精准医疗。基于DenseNet[6]和基于DenseNet修改的模型[7]的研究,本文搭建了一种能胜任舌体胖瘦精细分类任务的深度卷积神经网络模型,其能对舌体图片进行舌体正常、舌体胖大、舌体胖大有齿印、舌体瘦小的分类,进一步实现计算机舌诊系统的完善。
1 本文模型
1.1 K Block
本节提出了新的模块K Block。K Block分为多个cell子层,cell1层处理输入层数据,输入数据先后经BN(Batch Normalization[8])层,relu层,尺寸为1×1、步长为1的卷积层,和BN层,relu层,尺寸为3×3、步长为1的卷积层后得到结果,之后将输入层数据与cell1层的结果作连接后作为输出;cell2层将cell1层的输出作为输入,先后经过BN层,relu层,尺寸为1×1、步长为1的卷积层,和BN层、relu层,尺寸为3×3、步长为1的卷积层后得到结果,之后将cell1层的输出与结果作连接后作为输出;cell3层将cell2层的输出作为输入,先后经过BN层,relu层,尺寸为1×1、步长为1的卷积层,和BN层,relu层,尺寸为5×5、步长为1的卷积层后得到结果,之后将cell2层的输出与结果作连接后作为输出,并以cell3层的输出作为模块输出。
在K Block的每层中,第1个卷积层的尺寸为1×1,步长为1,使用该类卷积层可以在提取的特征映射图大小不变的情况下对其输出通道进行增大,从而对输入特征进行升维,起增大输入特征维度的作用;在cell1层、cell2层中,第2个卷积层的尺寸为3×3,步长为1,该类卷积层在各个cell层中第1个卷积层的基础上扩大了感受野,提取图中较大的物体的特征和感受野内特征之间的关联性,使提取的特征更丰富;cell3层第2个卷积层的尺寸为5×5,步长为1,该类卷积层进一步扩大了感受野,在cell1层、cell2层的提取的特征的基础上提取图中更大的物体的特征和感受野内特征之间的关联性,并可进一步提取更高级的特征,对无噪的图片能取得较高的分类精度。
本节的K Block以cell3层的输出作为模块输出,由于cell3层的输出为cell2层的输出和cell3层的处理结果作向量连接之后的结果,该做法保留了模块的高级图像特征,使某些特征不会因表现不佳被误丢弃,模型也不会保存太多冗余特征而影响训练效率,该方法可以让模型取得较高的分类精度。
Dense Block作为DenseNet-121结构中的重要组成部分,第2层以输入层和第1层的输出连接之后作为输入,第3层以输入层、第1层的输出和第2层的输出连接之后作为输入……第i层以输入层和第1层的输出……第i-1层的输出连接之后作为输入。Dense Block采用残差连接,加快收敛,并防止梯度弥散。而在K Block中除cell1层外每个celli层均以第i-1层的输出数据作为输入,改进了Dense Block中以前面所有层的输出作为输入数据的做法,只保留所需要的输入数据,该做法减小了模型的输入大小,提高了模型的训练效率。
1.2 K-CNN
图1 K-CNN结构
注:图中的K代表K Block,并在图中省略了模型的所有BN层和relu层。
由于每次经过K Block的处理之后输出的维度过大,K-CNN在K Block之后分别添加了尺寸为1×1、步长为1的卷积层和尺寸为2×2、步长为2的最大池化层,实现特征的降维,减少模型的计算量,提高模型的收敛效率。
基于K Block搭建的K-CNN的结构如表1和图1所示,包括:输入层,尺寸为3×3、步长为2的卷积层,尺寸为3×3、步长为2的平均池化层和relu层,K Block,BN层,尺寸为1×1、步长为1的卷积层,尺寸为2×2、步长为2的最大池化层,K Block,BN层,尺寸为1×1、步长为1的卷积层,尺寸为2×2、步长为2的最大池化层,K Block,尺寸为7×7、步长为7的平均池化层,由128个神经元组成的全连接层和relu层,由4个神经元和relu层组成的softmax分类层。同时,该模型的损失函数为交叉熵与L2正则化相加,该函数如式(1)所示。
其中,p(x)表示标签值,q(x)表示预测值。λ表示L2范数的系数,参考文献[7]中L2正则化项系数的取值,在本节中L2正则化项系数取值为0.0001。
表1 K-CNN结构
2 实验
2.1 实验环境
本文的实验环境如下:处理器型号为Intel i7-7700HQ,主频2.8GHz,内存16G,计算机采用Windows 10,64位系统,TensorFlow采用1.4版本,Python采用3.6版本。训练过程中采用梯度下降算法作为模型训练算法。学习率为0.001,在训练过程中会发生减少。在训练过程中,各模型对舌体图片进行10个批次,每个批次600轮,共6000轮的训练,并进行1000轮测试。
2.2 实验分析
在实验数据方面,为了保证实验的客观性和准确性,本文所采用的数据图片均从广州中医药大学第一附属医院拍摄,均被缩放为224×224的JPG格式彩色图片。本文选取了拍摄质量较高的128张各类舌体图片作为实验的样本数据,每类图片32张,每张图片来自每位患者。图2为实验数据图片,(a)为舌体正常图片,(b)为舌体胖大图片,(c)为舌体胖大有齿印图片,(d)为舌体瘦小图片。
图2 实验数据图片。
本文首先对数据集以3:1划分训练集和测试集,由于训练样本和测试样本不足,本文在不影响实际舌诊临床结果的前提下,分别对训练样本和测试样本进行图片旋转等多种数据增强方式扩大样本的数据集,样本数量达到3456张,其中训练集为2592张图片,每类均648张;测试集为864张图片,每类均216张。由于本文只在理论上进行模型的可能性分析,本文只在测试集上进行验证,在训练过程中通过打乱训练集图片顺序的方式提高模型鲁棒性。
为了加快预测模型的收敛速度,并减少卷积神经网络在训练过程中梯度消失和梯度爆炸等不良现象的发生,在各个深度卷积神经网络模型对输入图像进行特征提取之前,加入BN层对输入层数据进行预处理。
表2 各模型作四折交叉验证的总体分类准确率
为了验证模型K-CNN的分类性能,本章设置了两个对比模型K-CNN(a)、K-CNN(b)。它们只改变K Block内部cell层第2个卷积层尺寸,K-CNN(a)的K Block的cell1层、cell2层、cell3层的第2个卷积层的尺寸分别为1×1、3×3、3×3,K-CNN(b)的K Block的cell1层、cell2层、cell3层的第2个卷积层的尺寸分别为3×3、3×3、3×3。
表3 各模型作四折交叉验证的各类平均分类精确率
由于本文数据集太少,没有设置验证集,但为了能更充分地利用数据集来有效地验证网络模型的性能,本文分别构建了四组K-CNN(a)、K-CNN(b)、AlexNet[9]、VGG16[10]、K-CNN模型,将数据集以四折交叉验证的需求分为训练集和测试集,分别对四组模型分别进行训练和测试,并将四组K-CNN(a)、K-CNN(b)、AlexNet、VGG16、K-CNN模型的各项测试指标取平均作为相应模型的最终指标结果,以此实现了对K-CNN(a)、K-CNN(b)、AlexNet、VGG16、K-CNN的四折交叉验证。其测试后的总体分类准确率如表2所示,在表2中,序号①表示以第1份数据作为测试集,其他作为训练集,序号②表示以第2份数据作为测试集,其他作为训练集,序号③表示以第3份数据作为测试集,其他作为训练集,序号④表示以第4份数据作为测试集,其他作为训练集。K-CNN四折交叉验证平均总体分类准确率(accuracy)为32.45%,较K-CNN(a)、K-CNN(b)、AlexNet和VGG16分别提高了1.53%、0.61%、7.56%和7.36%。表3为各模型作四折交叉验证的各类平均分类精确率,表4为各模型作四折交叉验证的各类平均召回率,表5为各模型作四折交叉验证的各类平均F1分数。
表4 各模型作四折交叉验证的各类平均召回率
表5 各模型作四折交叉验证的各类平均F1分数
相较于K-CNN(a)、K-CNN(b),K-CNN的K Block采用了变化适宜的cell层的结构对舌体特征进行提取,即K-CNN的cell1层和cell2层均先后采用尺寸为1×1、步长为1的卷积层进行特征升维和尺寸为3×3、步长为1的卷积层进行特征提取,cell3层采用尺寸为5×5的卷积层进行特征提取。K-CNN(a)主要采用了两个尺寸为1×1的卷积层组成cell1层,这导致了K-CNN(a)提取了冗余无效的特征,影响了K-CNN(a)的分类精度;K-CNN(b)的cell1层、cell2层、cell3层均采用了尺寸为1×1、尺寸3×3的卷积层,较K-CNN使用了更加固定的卷积层,这导致了前者提取的特征不如后者丰富,在图片无噪声干扰的情况下,分类准确率不如后者。
相较于AlexNet、VGG16等经典模型,K-CNN的K Block采用了以cell3层的输出即cell2层的输出和cell3层的处理结果作为模块输出,该做法保留了适量的模块的高级特征,不会因某些高级特征在训练时表现不佳被误丢弃,也不会因保存太多特征导致特征冗余,影响模型的训练效率。
3 结语
对舌体图片进行舌体胖瘦分类一直是计算机舌诊系统的重要研究课题,本文提出了一种新的深度卷积神经网络模型,成功地将舌体图片分类为舌体正常、舌体胖大、舌体胖大有齿印、舌体瘦小等四类,通过实验,与AlexNet等经典的卷积神经网络相比,说明本文提出的模型是能够胜任对舌体图片进行舌体胖瘦精细分类任务的。综上,基于深度卷积神经网络的舌体胖瘦精细分类具有较大的研究价值和丰富的应用前景,并存在巨大的发展空间。