APP下载

基于迁移学习的农作物病虫害检测方法研究与应用

2020-10-29余小东杨孟辑张海清唐毅谦

农业机械学报 2020年10期
关键词:农作物病害病虫害

余小东 杨孟辑 张海清 李 丹 唐毅谦 于 曦

(1.成都大学计算机学院, 成都 610106; 2.成都大学模式识别与智能信息处理四川省高校重点实验室, 成都 610106;3.成都信息工程大学软件工程学院, 成都 610225)

0 引言

农作物病虫害是农业领域面临的主要挑战之一,灾难性的作物病害加剧了粮食供应的短缺[1-2]。根据相关统计和分析,2006—2015年,全国农作物病虫害的受灾面积为4.63亿hm2到5.075亿hm2。根据全国农业技术推广服务中心的预测,2020年我国农作物病虫害的受灾面积将累计达到3亿hm2,这将造成巨大的粮食与经济损失[3]。因此,快速有效地检测农作物病虫害是采取相关防治措施及时止损的第一步。

农作物病虫害的鉴别方式与途径有多种,以前多依靠农业专家或当地植保部门。近年来随着作物病虫害专家知识库的不断完善,建立了各种农业相关网站,通过专家系统或自行检索能够得到一些防治建议。但这些方式具有一定的局限性:其一,农作物的病虫害种类繁多,如马铃薯的相关病害就超过100多种[4],而农业专家是有限的,有时很难找到相关病害领域的专家;其二,植保部门的人员有限,一些地区距离较远、交通不便,无法及时到现场对农作物病虫害进行鉴别。这些因素都容易导致病情延误,无法及时得到有效的防治建议。

随着移动网络、智能手机以及计算机技术的飞速发展,研究者选择计算机视觉技术[5]作为开发移动应用的基础来检测农作物病虫害。在计算机视觉领域,图像识别[6]是典型的应用之一,而卷积神经网络[7](Convolutional neural network, CNN)可以以像素级提取图像的特征,使CNN在图像识别领域有足够好的表现,并深受开发者青睐。

文献[8]利用数字图像处理技术,通过对彩色图像的分析识别香蕉叶斑病的症状,图像识别的平均正确率最高为94.5%,最低为13.2%。文献[9]利用支持向量机(Support vector machine, SVM)对甜菜叶片进行检测与分类,对健康、患病叶片的鉴别准确率可达97%,但是根据疾病类型和患病程度进行分类,准确率在65%到90%之间。文献[10]使用Inception v3网络对木薯5种病害进行识别,总体准确率可达93%。文献[11-12]利用深度学习检测不同作物的多种病虫害,在识别作物-疾病组合方面均能够达到99%的准确率。传统的数字图像处理方法应用广泛、处理精度高、灵活性强,但处理后的图像需要在专业人员的指导下进行观察与评估。机器学习方法所训练出的模型虽然能够自动识别作物病害,但是在模型训练之前,需要经历复杂的特征工程,同时需要专业人员的指导。深度学习方法可以将上述问题的工作量最小化,只需要专业人员对原始图像是否存在病变进行标注即可。基于这些简单的标签可以使流程实现从训练到识别的全自动化。一些研究注重实际的应用开发,如文献[13]采用标准区域图技术开发了一款iOS应用,以评估病害的严重程度,但是该应用仅适用于甜菜病害严重程度的分类,并且需要用户从预先设置的列表中选择病害类别和计算标准。文献[14]利用两种不同类型的权重对每种病害进行加权,建立了病害模型,但是并未对病害的严重程度进行划分。文献[15]通过计算病害区域的面积来评估病害严重程度,APP的操作需要用户具有一定的专业知识。

通过对以上研究方法与移动应用的总结,本文提出一种基于残差网络[16](ResNet 50)的CDCNNv2算法,并结合深度迁移学习[17]开发农作物病虫害严重程度等级划分系统(物种-病害种类-严重程度),以实现农作物病虫害的实时、全自动检测。

1 试验数据

1.1 数据集描述

本试验采用由“AI Challenger 2018”提供的农作物病虫害公开数据集,共包含36 261幅标注图像,其中训练集有31 721幅图像,验证集包含4 540幅图像。整个数据集共有10个物种(苹果、桃子、草莓、玉米、辣椒、番茄、橘子、葡萄、樱桃、马铃薯)、27种病害。按照物种-病虫害种类-严重程度划分,共有61类,以番茄叶片为例,如图1所示。

图1 番茄叶片展示Fig.1 Example for tomato leaves

1.2 图像预处理

病虫害的识别与拍摄环境有很大关系,例如光照、角度等。图像品质影响识别精度,为了使模型具有更强的泛化能力,采用数据增强技术[18],对现有图像进行随机光亮度增减、随机旋转与镜面翻转等操作。

当随机增减光亮度时,遵循公式

φ=γα+β(α∈(0.9,1.1),β∈(-10,10))

式中φ——处理后的图像

γ——原始图像

α——对比度β——光亮度

当图像进行了随机光亮度增减之后,将图像归一化到-1~1之间,随后设置中心点随机旋转一定角度,再进行镜面翻转,最后将图像统一到229像素×229像素。数据增强的结果如图2所示。

图2 数据增强结果Fig.2 Results of data augmentation

2 CDCNNv2模型

CDCNNv2模型是基于残差网络ResNet 50改进而来,按照深度学习的效果而言,识别性能会随着网络层数的加深而提高,但识别性能会在网络加深到某一个层数的时候达到饱和,此时继续加深网络层数,只会使得该网络在训练集上的表现有所减弱,称此现象为网络退化。而ResNet 50网络在训练时并非如此,其核心残差模块在网络达到最优时,可以通过恒等映射向后传输信息,理论上网络将会一直处于最优状态,ResNet 50的具体结构与原理可参照文献[16]。

2.1 深度迁移学习

为了使模型加速收敛并具有更强的泛化能力,选择使用迁移学习技术。选择合适的预训练模型是迁移学习成功的关键,最重要的一点就是预训练模型的数据集与本试验的数据集有一定的关联与相似性。例如,预训练模型的任务是苹果分类,它可能对本试验的橘子分类有帮助。

在本试验中,使用在ImageNet[19]上预训练的ResNet 50模型的权重文件。ImageNet是一个庞大的自然图像数据库,有超过1 500万幅图像与2万多个类别。迁移其权重将会对本试验的模型训练有极大帮助,使用原始的ResNet 50网络并没有达到预期效果,所以本试验保留ResNet 50的卷积部分,改变其中多层以满足并提高识别的精确度。

2.2 具体方法

在模型改进中,使用Fine-tuning策略,其主要思想是调整预训练模型的其中一层或多层以达到适应目标任务的目的。本试验保留ResNet 50模型的卷积层权重,是因为卷积层提取的是图像的通用特征(Generic features),这些特征对本试验的任务有极大帮助,其他层的具体改动步骤如下:

(1)在图像输入模型之前,在图像四周以2×2的形式填充“0”值,以便更好地提取图像边缘信息,控制特征图尺寸。

(2)将预训练模型的卷积层权重迁移到CDCNNv2模型的卷积层,让权重随着训练同步更新。

(3)在卷积层之后添加1个平均池化层,池化窗口为2×2,计算图像特征矩阵2×2区域的平均值,有利于保存图像更多的细节信息。

(4)随后使用Flatten函数将多维矩阵的输入转换为一维矩阵,以加速计算。

(5)Flatten层之后,存在2个全连接层,之间有1个Batch Normalization函数,能够加快训练同时提高精度。第1个全连接层输出维度为1 024,采用ReLU作为激活函数。为了能够适应本项目需求,最后1个全连接层输出维度为61,使用Softmax作为激活函数。

简明的网络结构图以及与ResNet 50基础模型的对比,如图3所示。

图3 CDCNNv2网络框架图Fig.3 Concise model structure of CDCNNv2

3 试验与结果分析

3.1 试验平台

试验平台使用的服务器操作系统为CentOS 7,处理器为Intel Xeon E5-2650 v4 2.20 GHz,运行内存192 GB,配备NVIDIA Tesla P100 GPU。使用Python 3.6.5与Keras(2.2.4)人工神经网络库,图像预处理采用OpenCV 4.1.0 视觉库。同时使用CUDA 10.1与cuDNN 10.1深度神经网络加速库。

3.2 试验参数设置

每次训练选取的样本数量为64,共495次,进行80次迭代,使用Adam优化器,初始学习率为0.001,动量因子为0.1,当2个epoch过后,模型性能没有提升,之后学习率将降低,最低的学习率为0.000 000 1。

3.3 结果分析

为了验证CDCNNv2模型的有效性,在相同参数设置下将本模型与同样采用迁移学习技术的ResNet 50、Xception[20]、VGG16[21]、VGG19[22]、DenseNet 121[23]原始模型进行比较,试验结果见表1。

表1 对比试验结果Tab.1 Results of comparative experiments

从表1中可以看出,在相同的试验条件下,尽管CDCNNv2模型收敛时间不是最优,但是在可接受的范围内;CDCNNv2模型的平均精度为91.51%,比ResNet 50模型的平均精度高3.99个百分点,相较于其他模型也有2.78~10.93个百分点的提升。

同样,从图4中可以证明,CDCNNv2模型在大约第25次迭代就已经收敛,在所有模型中收敛速度处于前列,仅低于Xception模型。

图4 各模型精度收敛曲线Fig.4 Accuracy convergence curves of each model

从图5中可以看出,CDCNNv2模型的损失值在第25次迭代达到了稳定点,下降到了0.20左右,为最低。从损失值的收敛情况来看,CDCNNv2模型的训练效果理想。

图5 各模型损失值比较曲线Fig.5 Comparison curves of each model loss value

综合以上结果可看出,CDCNNv2模型能够很好地完成农作物病虫害等级分类的任务,具有鲁棒性与高精度,这使得此模型在农作物病虫害领域能够成为一个非常有用的咨询与预警工具。

4 模型部署与APP设计

4.1 部署工具

本文模型的部署用到了2个重要的工具:TensorFlow Serving[24]和Docker容器[25]。TensorFlow Serving是一种高性能、灵活的机器学习服务系统,用于部署机器学习或者深度学习模型,可以同时服务于多个模型,或者同一模型的不同版本,并且公开gRPC和HTTP 接口 API。Docker容器的使用能够避免与繁琐的环境配置打交道,可以将多种服务以镜像的形式挂载其中,本项目将TensorFlow Serving 挂载于Docker中,方便了模型部署。如果需要用到TensorFlow Serving挂载模型,Docker是与之配合使用的最佳选择之一。

4.2 部署方法

模型部署的环境包含操作系统Ubuntu 18、Docker 18、TensorFlow Serving。模型与它们之间的简略包含关系如图6所示,Docker容器运行在Ubuntu操作系统中,TensorFlow Serving以镜像的形式挂载于Docker容器内,模型则挂载于TensorFlow Serving中。

图6 部署工具之间的关系简图Fig.6 Diagram of relationship between deployment tools

模型的具体部署过程较为繁杂,受限于篇幅,本文只指出部署顺序并给出部分重要代码。

首先指定服务的版本号与模型的保存位置,再定义模型的输入与输出格式,核心代码如下

model_filePath = ′./my_model_resnet_v2.h5'

model = load_model(model_filePath)

export_path_base = "serving"

export_version = ′2′;

export_path=os.path.join(export_path_base,export_version)

builder=tf.compat.v1.saved_model.builder.SavedMdelBuilder(export_path)

tensor_info_input=tf.compat.v1.saved_model.utils.build_tensor_info(model.input)

tensor_info_output=tf.compat.v1.saved_model.utils.build_tensor_info(model.output)

随后,将输入与输出封装,以方便地从客户端接收相应格式的参数,简略代码如下

prediction_signature=

(

tf.compat.v1.saved_model.signature_def_utils.build_signature_def

(inputs={′images′:tensor_info_inpu},

outputs{′result′:tensor_info_output},

method_name=tf.saved_model.PREDICT_METHOD_NAME)

)

builder.add_meta_graph_and_variables

(K.get_session(),

[tf.saved_model.SERVING],

signature_def_map={′predict_images′:prediction_signature,})

builder.save()

下一步启动在线服务,在这一步中使用Docker容器,具体操作步骤如下

Docker run -p port1 -p port2

-mount type = blind, source = THE SOURCE TO MOUNT, target = THE DESTINATION TO MOUNT

-t tensorflow/serving

--model_config_file=/model/models.config

‘port 1’为主机端口,可以根据需要修改,而‘port 2’为固定端口,不能修改。使用配置文件并通过Docker挂载可以实现多个模型的部署,只需要在配置文件中表明各个模型的路径与名称。

4.3 Android端数据发送与接收

Android端的数据收发并不复杂,由以下几个步骤组成:

(1)将接收到的图像进行64位编码。

(2)创建一个新的Request Body实例,包含信息格式、编码类型与字符编码。

(3)请求服务器连接,使用.URL获取服务器IP地址,.post将封装信息发送给服务器。

(4)在定义接收的数据格式之后,通过Response实例接收数据信息。

具体流程如图7所示。

图7 APP调用服务器简明流程Fig.7 Simplify process of APP calling server

4.4 APP功能开发与简介

在4.3节中,模型的部署与调用已经实现,围绕于此设计了如图8所示的配套功能。

图8 APP功能示意图Fig.8 Application function diagram

各功能模块如下:

(1)用户管理:允许用户权限内的操作,如改变昵称、密码、邮箱、电话等。

(2)检测:允许用户拍照、上传和裁剪图像,在几秒内获取诊断结果,并获得防治建议与药物推荐。

(3)百科全书:允许用户搜索查询农作物相关信息。

(4)社区:允许用户在社区中交流农作物相关信息,同时开发专家系统,以便向专家寻求帮助。

(5)商城:后期将为第三方卖家提供平台售卖农作物相关产品,检测模块中的药物推荐可以跳转到相关商家的销售页面。

检测模块是该APP的核心功能,使用苹果-黑星病-严重的图像进行测试,具体结果如图9所示。从图9中可以看到,返回的结果包含了病虫害的严重程度,病虫害的描述,检测的可靠性,防治建议与推荐的药物等。

图9 检测功能界面Fig.9 Interface of detection results

4.5 APP准确性测试

为了验证APP的识别准确性,共进行了200次验证测试,每验证一次将结果记录在日志文件中,如图10所示。可以看出每次测试的结果获取时间都在0.5 s以内。随后表2中列出了测试的具体结果(苹果黑星病包含了一般与严重两种程度,其他病害类似)。从表2中可以看出,本文APP具有一定的鲁棒性和实用性。

5 结论

(1)针对农作物病虫害严重程度分类模型分类精度不够高的问题,结合深度迁移学习提出了一种改进型ResNet 50模型——CDCNNv2,在精度上较ResNet 50原始模型提升了3.99个百分点。

(2)在同样的试验条件下,与Xception、VGG16、VGG19、DenseNet 121原始模型进行了对比试验,本文提出的CDCNNv2模型的精度提高了2.78~10.93个百分点,同时其损失值最低。因此,该模型具有更好的鲁棒性与可靠性,其综合性能更优。

(3)基于CDCNNv2模型开发了一款实时在线农作物病虫害等级识别APP,该APP除了提供识别结果外,还实现了防治建议、药物推荐等一系列配套功能。经过200次的实际测试,每次测试结果返回耗时在0.5 s以内,测试最终结果表明APP具有鲁棒性与实用性,可以为农业病虫害检测提供思路与方案。

猜你喜欢

农作物病害病虫害
高温干旱持续 农作物亟须“防护伞”
俄发现保护农作物新方法
夏季农作物如何防热害
早春养羊需防六大病害
小麦常见三种病害咋防治
春季葡萄苗病虫害咋样防治
厉害了!农作物“喝”上环保酵素
夏季玉米主要病虫害有哪些
三招搞定花卉病虫害
葡萄病害周年防治历