朱冬琴,冯 全,*,张建华
(1.甘肃农业大学 机电工程学院,甘肃 兰州 730070; 2.中国农业科学院 农业信息研究所,北京 100081)
在农业生产领域,病害问题普遍存在,尤其是当遇到极端天气时,很容易造成病害泛滥,从而降低农产品产量和品质。作物病害防治贵在早期发现、及时施药。当前大多数病害识别都是通过人工诊断,耗时多,不能做到实时检测,所以需要研究一种能够自动识别病害的模型,可以直接应用在智能植保机器人上,实现田间全天候病害检测。目前,以深度学习为代表的人工智能技术已经广泛应用在农业领域,主要研究方向包括作物病害识别、作物生长态势监测、病斑检测和产量预测等[1],深度学习方法可以自动提取图像特征,自动进行分类,达到智能识别病害的目的。Mohanty等[2]利用PlantVillage数据集训练AlexNet和GoogLeNet,已识别38种植物病害,最高准确率达到99.35%。孙俊等[3]结合全局池化和批量归一化提出一种新的CNN模型,用该模型对14种农作物的26类病害进行识别,仅迭代3次模型准确率就可以达到90%以上。Too等[4]利用PlantVillage数据集训练VGG 16、Inception V4、ResNet-50、ResNet-101、ResNet-152和DenseNet-121网络来识别14种作物的38种病害图像,其中DenseNet-121的识别准确率达到99.75%。此外,还有很多基于真实田间环境采集的数据集训练的病害识别成果,如葡萄叶片病害识别[5]、玉米病害识别[6]、马铃薯病害识别[7]和番茄病害识别[8]。单纯的病害识别研究已经相对成熟,现有很多高准确率的病害识别模型,大多数都是基于深度卷积神经网络训练出来的。虽然它们的性能优越,但是网络参数多,结构复杂,需要很大的存储空间和计算量,如经典的Vgg16图像分类网络有1.38亿个参数,模型尺寸超过500 MB,ResNet-152有6 000万个参数,需要230 MB存储空间,此类病害识别模型只能运行在计算资源丰富的设备上或者进行云端部署。然而,农业地区有时远离连接良好的地区。在这种情况下,不需要向服务器发送数据并且可以脱机部署的边缘设备和移动客户端可能是很好的措施。此外,出于成本、尺寸和可靠性考虑,田间植保机器人只能使用资源相对较少的边缘设备,难以运行基于复杂模型训练的病害分类器。因此,压缩复杂模型使其轻量化,对于植保机器人具有重要意义。
目前在边缘/移动设备上的农业病害识别采用的主要方法是直接使用紧凑型神经网络。刘洋等[9]将MobileNet和Inception V3两种紧凑型网络用PlantVillage数据集和自建数据集进行对比训练,并将性能好的MobileNet成功部署在手机端。刘阳等[10]改进经典紧凑型网络SqueezeNet的结构,将参数内存需求和计算量分别压缩到0.62 MB和111 MFLOPs。近年来,国内外相继提出很多压缩卷积神经网络的方法,典型的策略有模型剪枝[11]、知识蒸馏[12]、量化权重[13]、紧凑型网络的设计[14-16]等。Luo等[17]通过跨过当前层,根据下一层计算的统计信息来修剪过滤器,建立了一个有效的通道选择优化函数。He等[18]提出一种新的滤波器剪枝方法,即通过几何中值(FPGM)进行滤波器剪枝,FPGM通过修剪具有冗余的过滤器来压缩CNN模型。Lin等[19]研究了一种基于特征图矩阵秩的滤波器剪枝方法,修剪具有低秩特征图的过滤器。与直接选用紧凑型网络的策略相比,模型压缩方法丰富,允许我们使用性能更为优良的大型神经网络,通过压缩存储空间和缩减计算成本,解决病害识别模型部署难的问题。修剪深度学习网络对于提高内存和资源利用率是必要的,以便更快地训练和提高准确性。本文选用Vgg16、ResNet164和DenseNet40等优秀神经网络作为病害识别模型,然后通过剪枝实现模型压缩,减少病害识别模型的参数量和计算量,以期获得比直接训练紧凑型网络更佳的识别精度。为深度学习模型提供一条途径,以便在资源有限的设备上轻松部署,实现植保机器人自动识别病害,做到实时检测,及时防治,减少病害对农作物产量的影响。
本文选取的Vgg16、ResNet164和DenseNet40经典深度卷积神经网络在作物病害识别方面被深入研究过,这些模型具有非常优良的识别性能[20-22]。
2014年,VGG实验室提出了Vgg[23]模型,经典的Vgg16网络由13个卷积层和3个全连接层组成,使用ReLU函数作为激活函数,结构简单。网络中统一使用3×3的卷积核和2×2的最大池化尺寸,与AlexNet网络相比,使用3×3的卷积核代替7×7等大尺度的卷积核,减少了参数量、节省了训练时间、增加了函数的判别能力,使网络具有更好的鲁棒性。Vgg16图像分类网络有1.38亿个参数,模型尺寸超过500 MB,是一个非常大的网络。本文使用的Vgg16模型删掉了2层全连接层,所以比经典的原始模型要小,且为了满足PlantVillage数据集中38分类病害图像的要求,对模型最后的分类层进行了修改。
由于网络层数越深,模型的特征表示能力越强,所以训练出了首次突破100层的ResNet[24]网络,它最大的特点是引入了残差模块,解决了因层数的加深而带来的训练难度大且收敛速度慢的问题。ResNet网络丢弃了Dropout机制,改用Batch Normalization加速训练。典型的ResNet-152网络有152层,6 000万个参数,需要230 MB存储空间,是一个非常深的网络。本文使用的是具有瓶颈结构的164层预激活preResNet[25]的框架,修改了模型分类层的网络结构,以适用38种农作物病害图像的分类。
DenseNet网络由Huang等[26]在2017年提出,与ResNet相比,它拥有更少的参数,旁路加强了特征重用,使用concatenate聚合不同级别的特征,具有正则化效果。DenseNet主要有Dense Block和Transition layers结构交替连接组成。在核心结构Dense Block中,当前层的输入是前面所有层输出特征图的并集,并将当前层的输出特征图传递给后续的所有层,因此,提高了各层特征图的利用率,有效解决梯度消失或者梯度爆炸的问题。Transition layers放在Dense Block之后,用来减少特征图的通道数,简化计算。本文构建了只有40层的DenseNet40网络,由3个Dense Block和2个Transition layers组成,并将网络分类层的输出修改为38分类。
模型训练的过程,即学习数据分布情况的过程。参数的更新会使各层输入数据不断地变化,网络需要不断改变来适应这种新的数据分布,导致收敛速度很慢。为解决这一问题,Ioffe等[27]提出了批归一化层(batch normalization,BN)的概念,它与卷积层一样,也属于网络层。BN层进行归一化处理,处理后的输出值如(1)式所示:
(1)
(2)
(3)
为了防止批量归一化后削弱网络的泛化性能,引入γ和β两个可学习参数:
(4)
式(4)中:zout为BN层的输出,γ和β分别是对应激活通道的缩放系数和偏移函数。
本文直接利用BN层中的γ系数作为网络瘦身的缩放因子[28],根据缩放因子γ来判断通道的重要性,剪掉冗余的参数。一般情况下,模型结构会采用卷积层+批归一化层的方式,所以每个通道会对应一个γ值,这个γ值的大小代表了通道的重要性,γ值越大意味着该通道对网络的贡献越大,γ值越小意味着卷积通道越不重要,可以剪掉。在平时的训练中,模型BN层的权重一般比零大,直接把它对应的卷积通道剪掉会对模型影响很大,所以要进行稀疏化训练,在loss函数上加上BN参数的正则化损失,使BN参数趋于零。稀疏化训练完成后,设置剪枝阈值,将低于阈值的BN参数对应的卷积通道剪掉。式(5)是加了BN正则化损失函数的目标函数:
L=∑l[f(x,W),y]+λ∑g(γ)。
(5)
式(5)中:x为训练输入;y为训练目标;W为可训练权重;第一和项为卷积神经网络的原始损失函数;g(γ)是对缩放因子的稀疏诱导惩罚函数。本文选择L1范数,即g(s)=|s|,L1范数广泛用于实现参数稀疏化的场合[28]。λ为这两个和项的平衡因子,L为稀疏训练时的损失函数。
根据重要性评价因子γ裁剪通道,它的本质是剪掉与它相连的所有输入输出关系,得到一个压缩网络。如图1所示,将值较小的缩放因子对应的通道(紫色)剪掉,即剪掉所有与它相连的分支(左侧),保留值较大的缩放因子对应的通道(蓝色)。剪掉之后,可以获得一个小而高效的网络(右侧)。
图1 剪枝原理图Fig.1 Schematic diagram of pruning
剪枝步骤如图2所示,首先选择一个复杂的大网络,从零训练得到基准模型,再对原始的大网络进行稀疏正则化训练,对稀疏正则化训练后得到的模型进行剪枝,得到压缩模型。剪枝会导致模型的准确度略有降低。可以通过微调压缩后的网络来缓解,使之恢复与基准模型接近的性能。微调是使用与训练时相同的优化设置对压缩后的网络进行重训练。
图2 剪枝流程图Fig.2 Pruning flow chart
剪枝后的模型以.pth的文件形式保存,文件中包含了迭代次数(epoch)、网络参数(state_dict)、最好的准确率(best_prec)和优化器(optimizer)参数。
本文选用实验室拍摄的PlantVillage公开数据集[29]训练模型,背景简单,共54 306张叶片图像,其中包含14种植物的12种健康叶片图像和26种病害叶片图像,将它按照80%和20%的比例[2]划分为训练集和测试集,训练集共43 445张,测试集共10 861张。图3给出了部分病害图像样本。
图3 PlantVillage数据集的部分病害图像Fig.3 Partial disease images of PlantVillage dataset
3.2.1 图像分类模型评价指标
模型识别准确率是指一批数据中模型预测正确的个数占这批数据总数的百分数,公式如下所示:
(6)
式(6)中:P为模型病害识别的准确率,T为模型预测病害类别正确的个数,F为模型预测病害类别错误的个数。
3.2.2 压缩效果指标
卷积神经网络的结构主要包括卷积层、激活层、池化层和全连接层,核心层是卷积层。卷积层在神经网络中主要用于提取图像特征。池化层用来压缩特征图,主要池化方法有平均池化和最大池化,即在池化操作时保留某一区域特定特征的平均值或最大值,它的作用是减少网络参数的同时保留有用信息。全连接层是对卷积层输出的高度抽象化的特征进行整合,然后根据特征进行分类。在卷积神经网络中,池化层没有相关的参数量,各卷积层的参数量计算见式(7)。
Pn=Co×(Kw×Kh×Ci+1)。
(7)
式(7)中:Pn为参数量,Co为输出通道数,Kw和Kh分别为卷积核的宽和高,Ci为输入通道数,+1为偏置单元bias。
全连接层的参数量计算见式(8)。
Pn=(I+1)×O。
(8)
式(8)中:Pn为参数量,I为输入神经元的个数,O为输出神经元的个数。
使用浮点运算数(floating point operations,FLOPs)衡量一个模型的复杂度,即计算量。各卷积层的FLOPs计算见式(9)。
Fn=2×H×W(Ci×K2+1)×Co。
(9)
式(9)中:Fn为计算量,Ci为输入通道数,K为卷积核大小,H和W分别为输出特征图的高和宽,Co为输出通道数。
全连接层的FLOPs计算见式(10)。
Fn=(2×I-1)×O。
(10)
式(10)中:Fn为计算量,I为输入神经元的个数,O为输出神经元的数量。
通过以上2个参数衡量压缩效果,结合准确率和模型尺寸选择出最优模型。
本文设置每个模型训练的epoch都为100,训练集的batch size为64,测试集的batch size为256,优化方法都采用随机梯度下降(SGD)。为了设置相同的剪枝阈值,设置Vgg16的初始学习率为0.001,ResNet164和DenseNet40的初始学习率为0.1,并在50%和70%的epoch时衰减为原值的1/10。开发环境为:Ubuntu 18.04 LTS 64位操作系统,Python编程语言,采用Pytorch深度学习框架和pycharm编译器。硬件环境:计算机内存64 GB,搭载Intel®Xeon(R) Silver 4110 CPU @ 2.10GHz x64处理器,GPU是英伟达的Tesla K40。
4.2.1 剪枝率对压缩模型性能的影响
为揭示剪枝率大小对模型性能的影响(微调前),图4给出了性能最稳定的DenseNet40网络设置不同剪枝率时得到的准确率变化图,可以看到剪枝率控制在10%~40%时,剪枝后模型的测试准确率不变,当剪枝率为50%时,准确率开始下降,损失了0.03%,当剪枝率为60%时,准确率损失了0.24%,当剪枝率达到70%时,准确率开始大幅度下降,损失了2.99%,而当剪枝率设为80%时,准确率骤降到30.10%。为保持与原始模型相当的性能,需将剪枝率控制在一定范围内。当修剪比率较高时,修剪可能会暂时导致一些精度损失,但可以通过剪枝网络上的后续微调过程得到很大程度的补偿。部分微调紧凑网络甚至可以达到比原始网络更高的精度。综合压缩效果和精度考虑,分别设置剪枝率为70%、80%和90%进行对比实验。
图4 剪枝率对准确率的影响Fig.4 Effect of pruning rate on accuracy
4.2.2 模型压缩前后的参数对比
使用上述3种图像识别模型在PlantVillage
数据集上分别实验。首先将这3种网络作为病害识别的原始模型,利用PlantVillage数据集进行正常训练,得到基准模型,然后对原始模型进行稀疏正则化训练,对稀疏后的模型设置不同的剪枝率进行压缩,最后对剪枝后的模型进行微调,实验结果如表1所示。实验中将所有模型的epoch都设为100个,在每一个epoch中,都会计算模型在训练集和测试集上的平均准确率和损失值,并将测试准确率最高的模型权重保存下来。
表1 病害识别模型压缩前后的参数对比
从表1中可以看出,Vgg16模型的压缩效果最明显,剪掉的冗余参数最多,Vgg16-80%剪掉了97.83%的参数和96.77%的FLOPs,参数量从14.74×106减为0.32×106,剪枝后FLOPs最小,仅有0.01×109,模型尺寸缩小为原来的1/45,最初的Vgg16模型可以修剪成一个非常小的模型,模型大小为2.6 MB,但Vgg16-80%的测试集准确率为97.46%,低于其他2个剪枝率为80%的压缩模型。ResNet164-80%的准确率为99.12%,下降了0.43百分点,剪掉的参数量和FLOPs比DenseNet40-80%多,压缩后的FLOPs比DenseNet40-80%的小,但由于原始模型比DenseNet40大,所以剪枝后的参数量大于DenseNet40-80%,且大于剪枝效果明显的Vgg16-80%。3个模型中DenseNet40的准确率最高,DenseNet40-80%的准确率达到了99.68%,高于基准模型,并且剪掉了75%的参数和65.52%的FLOPs,模型尺寸仅有2.3 MB,参数量仅有0.27×106,在3个剪枝率为80%的压缩模型中,它是最小的。DenseNet40-70%微调前测试集的准确率为96.67%,仅微调1个epoch,就可以达到99.54%,有很好的稳定性。DenseNet40可以设置剪枝率到90%,DenseNet40-90%剪掉的参数和FLOPs比DenseNet40-80%更多,最终的参数量仅有0.16×106,准确率达到99.51%,比基准模型低。综上,在PlantVillage数据集上,剪枝后表现最优的网络是DenseNet40。使用该算法压缩模型,基本不影响模型的病害识别准确率,最多的下降0.43百分点,而Vgg16和DenseNet40剪枝后的识别准确率甚至高于基准模型。实验结果表明,修剪后的3种模型需要的参数量和FLOPs要少得多,且没有显著降低原始精度。
4.2.3 微调压缩模型的训练结果
图5是剪枝率为80%、3种压缩模型微调时的准确率曲线和损失曲线,可以看出,3种压缩模型最终都趋于收敛,初始准确率都比较高,尤其是DenseNet40-80%网络,它的初始准确率达到了99.39%,损失接近于零。在3种压缩网络当中,DenseNet40-80%剪枝前后最稳定,微调1个epoch就可以恢复与原始网络相当的性能。Vgg16-80%和ResNet164-80%微调后性能也可以恢复,但是微调时准确率上升速度比较慢,大概在迭代50个周期后逐渐收敛,且它们的准确率一直低于DenseNet40-80%模型,两者的损失一直大于DenseNet40-80%模型。
图5 三种压缩模型微调时的测试准确率和损失值Fig.5 Test accuracy and loss value of 3 compression models when fine tuning parameters
4.2.4 剪枝效果
在PlantVillage数据集上训练的剪枝前和剪枝后,模型各卷积层通道数的对比中发现,网络越深,冗余的参数越多,越往深层,剪掉的通道越多。由于Vgg16剪枝后压缩比最大,本文以该模型为例展示了设置剪枝率为80%时,该模型不同卷积层在剪枝前后的通道数变化(图6)。原始的Vgg16模型越往深层通道数越多,但是被剪枝后可以看到,除了最后一层,各个卷积层的通道数比较接近,不再是越往深层通道数越多。这表明,每个卷积层中的通道起作用的仅有几层,深层卷积层中存在大量的冗余通道。从图6中也可以看出,采用本文的剪枝算法压缩病害识别模型非常有效。
图6 Vgg16网络剪枝前后的层数对比Fig.6 Comparison of layers of Vgg16 network before and after pruning
将卷积层的输出特征进行可视化,能够更加详细地反映特征提取的过程和原理,以及展示网络底层的特征信息。浅层卷积层通常会学习到一些颜色、边缘等低维特征的信息,越深的卷积层提取的特征抽象程度越高,学习到的信息与肉眼观察到的叶片图像不同,所以为了方便观察,如图7所示,本文可视化了Vgg16网络剪枝前后第一层卷积层输出的特征图。图7是剪枝前Vgg16模型卷积层1的64个输出特征图,图8是Vgg16-80%模型卷积层1的21个输出特征图。
图7 剪枝前卷积层1的特征图Fig.7 Feature maps of convolution layer 1 before pruning
图8 剪枝后卷积层1的特征图Fig.8 Feature maps of convolution layer 1 after pruning
对比可以看到,图7中多个卷积核提取的特征相似,而压缩后的图8似乎是从图7中筛选出来的,这表明本文的剪枝算法保留了对于整个病害分类网络来说贡献大的卷积通道,删除了很多冗余通道。
本文使用剪枝算法压缩病害识别模型后,模型比之前紧凑,且性能与原始性能相当甚至更好。为比较本文剪枝算法压缩病害识别模型的有效性,选择MobileNetV2、EfficientnetV2-S、ShuffleNetV2 3种紧凑型网络进行对比实验,设置相同的训练环境和相同的epoch,利用PlantVillage数据集进行从零训练,并与剪枝后的3种模型进行对比,结果如表2所示。可以看出,剪枝率设为80%时,剪枝后的3种压缩模型的参数量小于原始的3种紧凑型模型,ResNet164-80%和DenseNet40-80%模型在PlantVillage数据集上的准确率高于3种原始紧凑型模型,且高出2个多百分点。剪枝在删减掉大量冗余的参数同时,保留了大模型的优异性能,因此,压缩病害识别大模型比直接使用紧凑型网络训练的病害模型更适合在小型设备上部署。
文献[3]、[9]和[10]利用紧凑型网络在边缘/移动设备部署进行病害识别,同样使用了PlantVillage数据集训练,因此选择各文献中作者对比出的最优模型与本文剪枝后的DenseNet40-90%模型进行比较,结果如表3所示。文献[10]中改进的紧凑型网络SqueezeNet的参数量所需存储空间最小,它与剪枝后的DenseNet40-90%网络所需的参数量存储空间基本一样大,两者差0.02 MB,但是DenseNet40-90%的准确率达到99.51%,比文献[10]高出1.38百分点。文献[3]中的准确率虽然比DenseNet40-90%高出0.05百分点,但是它的参数量比DenseNet40-90%大的多。所以本文中将经典卷积神经网络进行剪枝后的模型更具有性价比,更加适合在小型设备上部署。
表3 不同方法下的模型性能比较
大型深度卷积神经网络拥有很大的参数量和计算量,很难部署到资源有限的小型设备上,降低了深度卷积神经网络的普适性和实时性。针对这一问题,本文利用BN层中的γ系数进行通道剪枝,将Vgg16、DenseNet40和ResNet164 3种病害网络进行压缩,并在PlantVillage数据集进行性能测试,得到如下结论:Vgg16、ResNet164和DenseNet40三者设置剪枝率为80%时,得到的压缩模型在PlantVillage测试集上的平均准确率分别为97.46%、99.12%和99.68%,压缩后模型精度几乎没有下降,Vgg16-80%和DenseNet40-80%剪枝后的准确率反而比之前高。其中DenseNet40的准确率最高,模型体积最小,DenseNet40-70%和DenseNet40-80%模型微调前的测试准确率分别为96.67%和31.10%,仅微调一个epoch,准确率就可以恢复到99.54%和99.39%,剪枝后可以快速收敛,有很好的稳定性。Vgg16的剪枝效果最明显,Vgg16-80%剪掉了97.83%的参数和96.77%的计算量,体积比原来小得多。所以该剪枝算法可以有效压缩卷积神经网络,在不损失性能的情况下缩小模型尺寸、减小计算量和运行时的内存占用,能够解决大型网络难以部署的问题。