袁培森 申成吉 徐焕良
(南京农业大学人工智能学院, 南京 210095)
菌菇是一种重要的真菌,其种类繁多,被广泛用于生物技术领域,特别是用于食品、药物化合物、酶、膳食补充剂和饲料添加剂的生产等[1-2]。全世界大约有150万种真菌[3],已被记载的菌菇及其相关物种约有13 000种[4],真菌的准确识别具有重要的实际应用价值[5]。表型组学是生物学领域近年来的研究方向之一[6],正在成为继基因分析之后生物学研究的重要内容[7]。菌类表型分类研究具有重要的生态学意义[8]。
传统真菌分类基于基因组序列,这是真菌生态学和多样性研究的重要组成部分[9]。但是,这种方法代价高,且效率较低。近年来,菌菇分类受到生物学和信息领域的广泛关注,菌菇表型的研究成为生物学领域研究热点[10-14]。
HEWITT等[10]研究了真菌活动特性和表型异质性。HIBBETT等[15]提出了真菌界的综合系统发育分类。TAYLOR等[16]将核酸变异的系统发育和种群遗传学方法用于鉴定致病真菌的种类和种群,并确定了它们在自然界中的繁殖方式。ZIELINSKI等[17]基于深度学习和词袋的机器学习方法对真菌的显微图像进行分类。HIBBETT等[14]分析了GenBank核苷酸数据库中的核糖体RNA内部转录间隔区(Internal transcribed spacer, ITS)序列,采用聚类方法开发了基于环境序列的菌类分类系统,同时指出,基于标本的方法对所有种类真菌进行分类,难度大、效率低。罗奇[18]针对卷积神经网络中存在的空间冗余问题,设计了一种降梯度卷积训练模型,有效提高了蘑菇图像分类的识别性能。PETERSEN等[13]指出,形态学确定真菌的物种边界已被证明是不充分的。上述研究均未针对菌菇的细粒度识别进行分类。GULDBERG等[19]提供了近1 500种野生菌菇种类和超过100 000幅真菌图像的数据集,该数据集为菌菇分类研究提供了数据基础。
基于图像的细粒度分类(Fine-grained classification)[20-21]比较困难,细粒度性质导致的小类间差异和大类内差异是难点,这在各种实际场景中广泛存在[22]。近年来,深度学习已成为处理表型数据的重要工具[23-25]。深度学习以端到端的方式训练深度学习网络,比传统方法更有效。采用深度学习技术可以更有效地对表型数据进行分类和识别[23,26-27]。深度学习技术为细粒度分类提供了技术支撑,极大地提升了细粒度分类的质量和效率[22,28]。
现有深度学习网络模型结构复杂、参数众多,深度学习模型的训练需要大规模的数据,这给深度学习技术模型的训练和应用带来了困难。迁移学习(Transfer learning)[29-30]成为解决该问题的新学习框架,迁移学习可避免数据标注,并大大提高了学习效果,可以在任务和分布不同的情况下对模型进行训练和测试。
本文提出基于双线性Inception-ResNet-v2网络和迁移学习的菌菇表型识别方法。利用Inception-ResNet-v2网络的图像特征提取能力,结合双线性汇合操作,同时使用迁移学习,将ImageNet数据集上预训练的特征及参数迁移到细粒度菌菇表型数据集上。
细粒度图像识别的特点是类内差异大,类间差异小。图1是4种菌菇示意图。图中同一种类菌菇形态各异,差异非常大。不同种类的菌菇却极为相似,类间差异较小。菌菇细粒度图像的这一特点使得菌菇细粒度图像的精准识别难度较大。
双线性卷积神经网络(Bilinear convolutional neural network,BCNN)[31]模型是细粒度图像识别中的新技术,它在无法区分具有细微视觉差异的类别计算方面具有较好的分类效果。
BCNN框架如图2所示,输入图像由两条卷积神经网络分别进行多次卷积和池化操作,得到两条由CNN网络分别提取出的图像特征,再将CNN网络提取出的图像特征使用bilinear pooling操作汇合到一起形成该图像的双线性特征向量,最后对该双线性特征向量使用Softmax分类器进行分类,得到识别的类别所属概率。
BCNN[31]包括2个核心概念:双线性和反向传播。
双线性(Bilinear)是指对于函数f(x,y),当固定其中一个参数x时,函数f(x,y)对另一个参数y是线性的。本文双线性模型M由4元组组成。
M=(fA,fB,Pl,C)
(1)
式中fA、fB——特征函数
Pl——池化函数C——分类函数
特征函数f的作用是将输入图像和位置映射成c×D的特征,D指深度。输出特征由每个位置上的特征通过矩阵的外积组合而来。
Bi(L,I,fA,fB)=fA(L,I)TfB(L,I)
(2)
式中L——位置和尺度
I——图像数据
Bi——双线性函数
如果两个特征函数提取出的特征维度分别为(K,M)和(K,N),则经过Bilinear双线性汇合操作后维度变成(M,N)。进一步使用求和池化来综合各个位置的特征
(3)
式中Φ(I)——全局图像特征
l——损失值
在BCNN中,由于bilinear pooling操作的特性,使得梯度计算较容易,整个网络的梯度反向传播也变得简单。如果使用A和B来分别表示两个CNN网络输出的特征,A特征的尺寸为L×M,B特征的尺寸为L×N,那么经过bilinear pooling后得到的双线性特征x=ATB的尺寸就为M×N,则两个CNN网络的梯度为
(4)
整个BCNN的梯度计算公式为
(5)
本文选取Inception-ResNet-v2[32]卷积神经网络模型作为BCNN中的特征提取网络,借助Inception-ResNet-v2网络强大的特征提取能力来提升菌菇细粒度分类效果。引入Inception-ResNet-v2之后,BCNN整体结构如图3所示。
首先对输入图像进行中心化、归一化、随机裁剪、随机水平翻转等预处理,之后经Inception-ResNet-v2网络提取特征向量,然后对提取出的特征向量和其自生的转置操作进行双线性汇合,进而得到菌菇图像各个位置的双线性特征矩阵,随后将双线性特征矩阵转换为双线性特征向量,最后Softmax层对双线性特征向量进行分类。
对于本文的菌菇多分类问题,类别标签y∈{1,2,…,C}。给定测试样本x,Softmax层预测为类别c为C的条件概率为
(6)
式中w——权重
Inception-ResNet-v2[32]网络在ImageNet大规模视觉识别挑战赛图像分类基准上取得了较好的效果,其特征提取网络的总体结构如图4所示。Inception-ResNet-v2把Inception[33]和残差网络(ResNet)[34]相结合,加入了残差块,使得参数能够通过网络中的捷径跳过一些层进行传播,解决在更深层网络结构下梯度消失等问题。Inception-ResNet-v2使超深层的网络训练成为可能,在更深层的网络结构下能够获得更好的训练效果。
Inception-ResNet-v2网络主要包括6部分:①5层卷积层、2层最大池化层和具有4个分支的Inception模块。②重复10次的具有3个分支的残差Inception模块。③连接较简单的Inception模块。④重复20次的包括两个分支的残差Inception模块。⑤具有4个分支的Inception模块。⑥重复10次的包括两个分支的残差Inception模块。最后通过一个卷积层得到输出结果。
Inception-ResNet-v2特征提取网络主要参数如表1所示,包括卷积层和最大池化层、每个残差Inception模块的合并层、卷积层、残差层和最后一个卷积层,每个卷积层后都连接批归一化层和ReLU层。输入图像尺寸为448×448×3,通过卷积层增加图像深度,最大池化层将图像维度减半,残差Inception模块维持图像维度不变,且每经过一个残差Inception模块,图像的长宽减小深度增加,最后输出图像尺寸为12×12×1 536,总参数量为54 336 736。
表1 Inception-ResNet-v2特征提取网络主要层的参数
通过Inception-ResNet-v2提取出的特征长度与宽度均为12,特征深度为1 536。对特征向量进行双线性汇合操作首先需要将三维的特征向量重塑为二维的特征向量,进而得到144×1 536的特征向量。接下来将特征向量转置得到1 536×144维的特征向量,使用原特征向量与转置后的特征向量进行矩阵外积,即双线性汇合操作,得到维度为1 536×1 536的双线性特征向量。将双线性特征向量展平为2 359 296维的一维双线性特征向量,加上符号平方根变换和L2正则化层,随后使用全连接层和式(6)的Softmax进行多分类。
迁移学习[30]用于解决网络结构较为复杂、参数量较大且训练需要大量时间的问题,菌菇细粒度迁移学习示意图如图5所示。
本文使用具有约1 419万幅图像的ImageNet数据集作为源域训练迁移学习模型,该数据集包含2万多类。通过将ImageNet数据集上预训练好的模型权重迁移到本文模型上,不仅能够降低所需的数据量,还能获得更快的训练速度和更好的收敛性能。
预训练模型从Keras预训练模型库中取得,训练过程分为2个步骤:①固定Inception-ResNet-v2网络加载在ImageNet数据集上得到的预训练参数,只允许训练最后的全连接层随机初始化的参数。②待网络收敛后,再对Inception-ResNet-v2网络的参数使用较小的学习率进行微调进行优化。
首先预训练Inception-ResNet-v2网络参数的原因在于添加的全连接层是随机初始化的,会产生较大的损失值进而产生较大的梯度。因此在全连接层收敛之后再使用较小的学习率微调(Fine-tunning)整个模型。
训练的第1阶段只更新全连接层的参数,该阶段结束后,修改学习率和学习率衰减这两个参数,最后进行所有网络层参数的微调。训练全连接层时第1阶学习率η1设置为1.0,第1阶衰减学习率λ1为1×10-8;微调所有层时第1阶学习率η2设置为1×10-3,第2阶段衰减学习率λ2设置为1×10-9;两个阶段的动量β均为0.9,批尺寸为8,迭代次数为100。
因此本文使用随机梯度下降(Stochastic gradient descent, SGD)[35]算法作为优化器。由于自适应学习率算法会根据梯度的变化自动更新学习率,从而改变希望保留的预训练特征。
硬件环境:QuadCore Intel Core i7-7700 3.60 GHz;内存48 GB; nVIDIA GeForce GTX 1060 GPU 6 GB。
软件环境:Windows 10操作系统;Python 3.7;TensorFlow 1.13.1和Keras 2.2.4。
本文采用的数据集为开源菌菇数据集Fungi[19]和个人数据集,开源菌菇数据集Fungi部分示例图像如图6所示,该数据集环境复杂,背景中有草地、林地等多种干扰物,本文共选择了14个类别,共1 343幅图像。个人数据集为自行采集,包括4个菌菇类别,共1 074幅图像。部分示例如图7所示。2个数据集样本分布如表2、3所示。
表2 本文所用的Fungi数据集样本分布
为了增加样本数量,对图像进行随机翻转、随机亮度变换、随机对比度变换预处理。归一化是为了降低几何变换对图像的影响。处理之后两个数据集的图像数量分别为4 029、3 141幅,尺寸为128×128×3。训练集、验证集和测试集按照8∶1∶1的比例分割。
表3 本文所用的个人数据集样本分布
使用准确率(Accuracy)、精度(Precision)、召回率(Recall)、F1值(F1-Score)作为评价指标评估本文算法性能。
上述指标主要针对二分类问题,而本文的多分类问题,需将各个类别的性能指标进行综合。宏平均是指所有类别的评价指标的算术平均值,由此可得宏精度、宏召回率、宏F1值。
本文方法在Fungi数据集上,训练集和验证集上的损失值与迭代次数的关系如图8所示。
由图8可以看出,训练集和验证集上的损失值随着迭代次数的增加而降低,训练集中损失值从0.64左右降低到0.04左右,验证集中损失值从0.55降低到0.4左右。
在Fungi数据集上,训练集和验证集中的识别精度与迭代次数的关系如图9所示。
从图9中可以看出,随着迭代次数的增加,训练集和验证集上的准确率逐步增大。训练集在迭代次数大于15之后趋于稳定,准确率为98%左右;验证集上的识别精度在迭代次数为18时达到最大,准确率为93%。
利用宏精度、宏召回率、宏F1值3个指标对比InceptionV3[33]和VGG[36]网络性能,其网络模型参数如表4所示。
表4 网络模型参数
试验结果如表5所示。从表5中可以看出,本文方法的宏精度达到了87.15%,宏召回率为85.71%,宏F1值为85.82%。
表5 Fungi数据集上识别结果
从试验结果来看,与其他3种方法相比,本文方法的宏精度较VGG16、VGG19和InceptionV3分别提升了2.15、1.29、2.15个百分点;宏召回率分别提升了1.59、1.59、1.58个百分点;宏F1值分别提升了2.06、2.07、2.05个百分点。
在个人数据集上的识别结果如图10所示。由图10可知,本文方法的宏精度、宏召回率和宏F1值分别为93.94%、93.33%和93.29%。
从图10中可以看出,本文方法的识别结果比InceptionV3优,但VGG网络在此数据集上的识别结果较差,宏精度、宏召回率、宏F1值都在30%以下,试验表明,本文方法在两个菌菇数据集上的细粒度分类效果较好。
为实现细粒度菌菇表型在线识别,本文在使用TensorFlow和Keras机器学习框架进行模型训练的基础上,使用Flask框架作为网页的后端服务,前端网页使用Bootstrap UI框架,将训练好的模型移植至Web端,以实现对细粒度菌菇表型的在线识别。
在线识别处理过程为:上传本地图像,网页显示要识别的菌菇图像,然后使用canvas渲染图像并将图像转换为base64编码。前端通过XMLHttpRequest对象向后端发送POST请求,将图像的base64编码传递给后端。后端使用Flask框架的request对象接收Http请求,获取后端传来的base64编码。删除base64编码的前缀,然后将编码转换回图像。将图像转换为RGB模型,使用类型文件中保存的数据集均值和方差对图像进行预处理,并将图像尺寸裁剪为128像素×128像素。使用训练好的模型进行预测,获得Top 5的结果,并用Flask框架的jsonify返回预测所属的名称的概率。前端网页显示后端传来的预测结果,查询结果示例如图11所示。
基于双线性卷积神经网络框架提出了一种基于迁移学习和Inception-ResNet-v2网络的细粒度菌菇表型识别方法。通过Inception-ResNet-v2网络提取菌菇图像特征,结合双线性汇合操作,采用迁移学习方法将ImageNet数据集上预训练的特征迁移到细粒度菌菇表型数据集上,在开源数据集和个人数据集上识别精度分别达到了87.15%和93.94%,实现了基于Flask框架的细粒度菌类表型在线识别。