何 前, 郭峰林, 王哲豪, 李雅琴
(武汉轻工大学数学与计算机学院, 武汉 430048)
近年来,随着葡萄种植规模的不断扩大,各类葡萄病害也严重影响着其质量和产量.传统的病害分类主要依靠种植者经验或人工查阅图谱等手段, 效率和准确性低下, 故深度学习和图像处理等计算机技术用于农业生产中的病害分类识别已成为研究热点[1-3].Rashid等[4]利用YOLOv5图像分割技术对马铃薯植物早枯萎病和晚疫病图像进行识别, 准确率高达99.75%; Zhu等[5]利用小波变换对病害图像进行降噪处理, 然后采用最大类间方差法对病害区域进行分割, 提取病害周长和面积等特征, 进而通过图像分析和反向传播神经网络进行葡萄叶部病害识别, 并建立了检测系统; Liu等[6]利用数据增强技术扩充数据集, 通过多维特征提取和引入密集连接策略等方法建立一个新的卷积神经网络模型识别葡萄叶部病虫害, 最终准确率达97.22%; 何欣等[7]等提出了一种基于多尺度残差神经网络的葡萄叶片识别方法, 利用Mask R-CNN提取葡萄叶片图像病害特征, 引入多尺度卷积改变ResNet底层对不同尺度特征的响应, 提高了识别准确率; Mohammadpoor等[8]首先对病害区域做标记, 然后利用模糊均值聚类算法对每片叶片病害区域进行高亮显示,并通过支持向量机区分感染叶片和健康叶片, 最后利用K折交叉验证(K-fold)方法进行验证, 准确率达98.6%; Adeel等[9]构建了一个葡萄叶片疾病自动分割和识别系统, 首先增强病害叶片的局部对比度, 通过LAB颜色变换选出像素信息的最佳通道并设为阈值函数, 然后采用典型相关分析方法提取病害特征, 准确率达92.0 %; Kolhalkar等[10]提出基于直方图分析的机电一体化系统检测葡萄叶片的健康状况, 及时提醒果农葡萄主要病害的发生, 实现了农药的经济利用; Kaur等[11]通过迁移学习重新训练EfficientNet B7深度框架, 利用逻辑回归技术对迁移学习后所收集的特征进行下采样, 再使用分类器对病害进行分类, 分类准确率达98.7%; 苏婷婷等[12]运用深度迁移学方法识别花生叶部病害, 识别准确率达95.3%.上述方法虽然在一定程度上提高了农作物病害分类的准确率, 但是利用图像处理技术进行病虫害分类时须提取农作物的病害特征信息, 故分类准确率会受到病害图像的复杂背景和病害区域大小等多种因素的影响; 而基于卷积神经网络的农作物病害分类算法中大多选择较成熟的分类算法或融合其他算法, 增加了卷积神经网络的参数量和计算量, 导致计算时间长、迭代次数多及分类效率低等问题, 同时在分类小样本图像时易出现难收敛和过拟合现象.AlexNet算法[13]结构简单, 算法易于实现,且参数少和计算量低, 但在处理高像素的彩色图像时易出现过拟合、分类准确率低以及泛化能力差等问题.本文拟基于改进的AlexNet算法对葡萄病害进行分类,首先利用图像预处理技术消除数据集的复杂背景,在传统AlexNet算法的第三个卷积层和第四个卷积层后分别添加池化层以降低参数量,同时在全连接层后添加随机失活层并优化选择最佳丢弃概率,以期提高算法的分类准确率和泛化能力.
AlexNet算法的网络结构如图1所示.AlexNet算法由5个卷积层、3个池化层和3个全连接层构成, 结构简单且能快速提取病害图像的特征信息.传统的AlexNet算法[13]在训练过程中将网络置于2个GPU上同时运行, 利用GPU的并行计算加速网络的训练和提高准确率.由于GPU计算速度较快,所以输入数据可使用更高像素的彩色图像,便于病害特征信息的提取.然而,彩色图像比单通道灰度图像更复杂,还会受复杂背景等因素的影响,故须进一步对算法网络进行改进,提高算法的泛化能力.
1) 预处理图像.图像预处理的主要目的是消除图像中的无关信息, 恢复有用的信息,增强有关信息的可检测性和最大限度地简化数据, 从而增强病害特征提取、匹配和识别的可靠性.将收集到的葡萄叶部图像大小统一缩小为256×256像素, 去除图像的复杂背景, 以便在实验中更好地提取病害特征信息,经过处理后的4种葡萄叶部图像如图2所示.
图2 预处理后的4种葡萄叶部图像Fig.2 Pretreatment of four grape leaf images
2) 增加池化层.AlexNet算法中有3个池化层,分别位于第一个卷积层、第二个卷积层和第五个卷积层的后面.池化层即子采样层, 其主要目的是缩小参数矩阵的尺寸,从而减少网络参数的数量.池化方式主要有最大池化和平均池化, 前者选取图像区域的最大值作为该区域池化后的值, 后者则计算图像区域的均值作为该区域池化后的值.由于最大池化可以减少冗余信息,提升训练速度,所以本文选择最大池化方式,在第三个卷积层和第四个卷积层后都增设池化层, 并通过实验验证其可行性,以有效提高算法的鲁棒性.
3) 修改激活函数.AlexNet算法中一般使用ReLU激活函数
f(x)=max{0,x}
(1)
解决梯度消失的问题, 从而加快收敛速度.然而,训练时却容易出现神经元“死亡现象”, 导致神经元或许不再会被任何数据激活, 同时网络将无法执行反向传播和学习, 且ReLU函数不会对数据做幅度压缩, 所以数据的幅度会随算法层数的增加而不断扩张.为了解决上述问题, 本文选用Leaky ReLU函数
f(x)=max{ax,x}
(2)
替换ReLU函数,其中a为固定斜率. 当x≤0时, Leaky ReLU函数可以进行反向传播, 从而解决ReLU函数出现的神经元“死亡现象”, 并且能够解决梯度消失的问题.
4) 增设随机失活层.为了避免AlexNet算法出现过拟合现象, 在全连接层添加随机失活层.通常设置神经元的随机丢弃概率为[0.1,0.5], 随机减少的无关特征数据亦因丢弃概率不同而改变.本文通过实验优化选择该算法随机丢弃的最佳参数值, 使得AlexNet算法具有更好的泛化性能.随机失活层的工作原理如图3所示, 其中空心圆表示神经元, 实心圆表示已随机丢弃的神经元.
图3 随机失活层的工作原理示意图Fig.3 Working principle of dropout layer
5) 局部响应归一化.由于Leaky ReLU激活函数的值域无固定区间, 故对Leaky ReLU所得结果进行归一化处理:
(3)
6) 损失函数.本文实验为一个四分类问题, 故选择的损失函数为分类交叉熵函数
(4)
其中s为样本数,m为分类数.分类交叉熵函数结合输出层的激活函数可加快深度学习的训练速度, 并且能使得到的结果更简洁.
7) 优化算法.选择RMSprop优化算法, 采用指数加权平均保证各维度导数都在同一个数量级, 有效避免学习率越来越低的问题, 从而能够自适应地调节学习率.
本文算法训练和测试实验环境均在Windows10操作系统下, 搭载Intel(R)Core(TM)i5-5200U CPU@2.20 GHz 4核处理器, 内存为12 GB.采用Python3.7和TensorFlow框架进行训练.
葡萄叶部病害图像数据集来源于Plant Village公开数据集[14].葡萄叶片实验样本主要有4类常见的图像, 共4 063幅, 其中黑腐病1 180幅,埃斯卡病1 384幅,褐斑病1 076幅,健康423幅.实验中统一采用“*.jpg”格式,大小一致缩小为256×256像素, 再将数据集按4∶1划分为训练集和测试集.
现以葡萄叶部黑腐病图像为正类, 埃斯卡病、褐斑病和健康图像为负类进行评价.若实际为黑腐病的图像被正确判定为黑腐病的总数量为NTP, 实际为黑腐病的图像被错误判定为其他3种类别的总数量为NFN, 实际为其他3种类别的图像被错误判定为黑腐病的总数量为NFP, 实际为其他3种类别的图像被正确判定为其类别的总数量为NTN, 则分类准确率
(5)
然而, 在实验样本不均衡的情况下, 仅使用分类准确率还不足以判断算法的性能, 故计算精确率
(6)
以表示对正类样本结果的预测准确程度.对于原样本, 实际为正类样本且被准确预测为正类样本的情况可用召回率R表示,
(7)
本文结合精确率和召回率, 利用F1分数值
(8)
进行评价.精确率、召回率和F1值越高, 算法的分类准确率越高且算法性能越好.
此外, 利用混淆矩阵评估算法的优劣, 以便更直观地显示每一类图像被正确或错误分类的数量.
实验中输入数据均为256×256像素的彩色图像, 迭代6次, 每轮训练的样本数为33个, 优化算法为RMSprop, 学习率为0.000 1.
将4类葡萄叶部图像置于AlexNet网络进行训练和测试, 每一次迭代的损失值和准确率如图4所示.由图4可见: AlexNet算法在测试集上对葡萄病害分类的准确率为81.1%, 损失值为39.3%, 且网络拟合效果不佳, 其主要原因是输入数据为彩色图像, RGB三通道提取病害特征的难度高于灰度图像单通道.故须在训练集上进行算法改进, 再利用测试集验证改进后算法的性能.
图4 AlexNet算法在训练集和测试集的损失值(a)和准确率(b)Fig.4 Loss (a) and accuracy (b) of AlexNet algorithm in training set and test set
表1 池化层层数对算法性能的影响
其他参数设置不变的情况下, 仅增加池化层的层数,测试结果如表1所示.由表1可见: 当池化层数为5层时, 算法对葡萄叶部病害分类准确率最高, 损失值最低.故本文优化选择池化层数为5层.
其他参数设置保持不变,设置池化层数为5层, 仅改变全连接层层数, 测试结果如表2所示.由表2可见:当全连接层的层数为2层时, 算法的分类准确率最高, 损失值最低.故本文优化选择全连接层为2层.
表2 全连接层层数对算法性能的影响
表3 全连接层上不同丢弃概率对算法性能的影响
表4 不同激活函数对算法性能的影响
表5 改进前后AlexNet算法的分类性能对比
保持其他参数不变, 不同丢弃概率下的测试结果如表3所示.由表3可见: 丢弃概率设置为0.1时, 算法的分类准确率最高, 而损失值并非最低, 这是因ReLU激活函数存在的神经元“死亡现象”所致.故在第一个全连接层处添加随机失活层, 丢弃概率设为0.1, 进一步探究不同激活函数对算法性能的影响, 结果如表4所示.
由表4可见: 选择Leaky ReLU激活函数时算法的分类准确率最高, 损失值最低.故本文优化选择激活函数为Leaky ReLU函数.
通过增加池化层层数、改变全连接层层数、设置丢弃概率以及修改激活函数等操作所得本文算法与传统AlexNet算法在测试集上的分类结果如表5所示.由表5可见: 改进后AlexNet算法对葡萄叶部图像的分类准确率达99.1%, 较传统AlexNet算法高18.0%,损失值低32.7%, 算法的分类性能大幅提升.
利用混淆矩阵对测试集中813幅4类葡萄叶部图像进行分类, 结果如图5所示.由图5可见: 由于实验所用的葡萄叶片图像已经处理去除了背景干扰, 埃斯卡病与另外两种病害特征区别较大, 所以埃斯卡病和健康葡萄叶片图像的分类准确率都高达100%; 而黑腐病和褐斑病病斑特征的形状类似, 所以出现3幅黑腐病图像被误分类为褐斑病, 4幅褐斑病图像被误分类为黑腐病.
改进前后AlexNet算法在测试集上的精确率、召回率及F1值如表6所示.由表6可见: 改进后AlexNet算法的各项指标均高于传统AlexNet算法, 算法泛化能力更优, 能够更好地提取病害特征, 可对不同类型的葡萄叶片图像进行准确分类.
表6 改进前后AlexNet算法在测试集上的各项评价结果
图5 混淆矩阵下4类葡萄叶片图像的分类结果Fig.5 Image classification results of 4 grape leaves under confusion matrix
本文根据葡萄叶部病害图像分类的需求建立了葡萄叶片图像数据集,包括黑腐病、埃斯卡病和褐斑病3种葡萄叶部病害以及健康葡萄叶片图像, 并基于AlexNet算法进行改进建模,最终分类准确率达99.1%.然而,葡萄病害种类繁多,下一步将收集更多种类的葡萄病害数据,构建出更完美的模型完善算法用于分类更多的病害,同时尝试将算法推广到其他农作物的病害分类,为种植者提供一定的技术支持.