基于卷积神经网络的马铃薯叶片病害识别系统

2018-02-13 11:27赵建敏芦建文
江苏农业科学 2018年24期
关键词:卷积病害服务器

赵建敏, 李 艳, 李 琦, 芦建文,2

(1.内蒙古科技大学信息工程学院,内蒙古包头 014010; 2.包钢集团公司信息服务中心,内蒙古包头 014010)

2006年多伦多大学Hinton等采用深层神经网络进行特征降维,开启了深度学习的时代[1-2]。近年来,基于卷积神经网络的深度学习已经广泛运用于图像识别领域,2012年,Hinton等采用深层网络自动提取特征,在Image Net图像集分类问题上取得了很好的结果[3]。深度学习应用于图像识别避免了人工特征提取的算法消耗,并且深度学习对输入样本的平移、缩放、扭曲保持高度不变性,训练时共享权值,降低了训练时间,大大提高了准确性[3-4]。

在国内农业图像应用领域,杨国国等基于卷积神经网络在复杂自然背景下定位和识别茶园害虫,识别率达到90%以上,取得较好的效果[5]。谭文学等设计了多层卷积神经网络,采用弹性动量的参数学习方法,通过识别果体病理图像,诊断常见病害,识别率高达95%以上[6]。张帅等搭建了8层卷积神经网络模型在Pl@antNet和自扩展叶片库上进行训练和测试,简单背景下叶片识别率均达到90%以上[7]。鲁恒等在无人机影像耕地信息提取中,利用深度神经网络提取耕地特征,达到较高的识别精度[8]。针对马铃薯早疫病识别,徐明珠等应用高谱成像技术,建立了多种特征波长的BP神经网络和支持向量机模型,识别率高达98%以上,为早疫病快速识别提供理论依据[9]。

本研究首次将分层卷积神经网络技术应用于马铃薯病害识别中,基于TensorFlow平台设计了马铃薯病害特征提取和病害识别算法,并全栈式开发了病害识别系统的服务器和前端,实现了手机端采集、上传病害图片、服务器处理推送识别结果,经测试可以满足识别和访问要求。

1 材料与方法

1.1 材料

以马铃薯病害图像为识别对象,所有原始数据均采集于内蒙古中部周边马铃薯种植区。共有4类病害图像样本 6 000 张,代表性样本见图1。4类病害图像经过预处理,得到4 000张图像作为训练样本,1 000张作验证样本,1 000张作测试样本。其中,验证样本用来检验神经网络中样本是否出现过拟合现象。验证样本与训练样本同时作为神经网络的输入,计算损失函数大小,但验证样本损失函数大小仅用来判断网络是否过拟合,而不参与网络参数调整。

为提高模型的特征学习能力和抗干扰能力,对原始图像进行随机反转、亮度和对比度调节等预处理,并将处理后的图片作为训练集,训练模型网络,预处理函数如下:

tf. image. random_ flip_ left_ right ()随机翻转。

tf.image.random_flip_left_right(distorted_image)随机亮度变换。

tf.Image.random_contrast (distorted_image) 随机对比度变换。

最后对数据做白化处理,均衡均值与方差,降低图像采样中明暗、光照差异引起的影响。

TensorBoard是TensorFlow可视化平台,模型对输入图像进行变换之后TensorBoard显示的结果见图2,从图2可以看出,变换之后的图像比原图像更加光滑并且降低图像明暗、光照差异引起的影响。

TensorFlow平台输入数据格式有图片格式、二进制格式、文本格式以及标准的TensorFlow格式。本研究采用的是二进制格式的读入。首先初始化读入数据量、类别、标签字节大小、尺寸和通道数,应用tf.FixedLengthRecordReader()函数读取固定长度的样本字节(包括label);之后用tf.decode_raw()函数进行解析。

1.2 方法

马铃薯病害图像识别系统由服务器端和前端组成。服务器端在ubuntu操作系统上基于TensorFlow计算框架,搭建了多层卷积神经网络病害识别模型;后端搭建了Mysql病害数据库,采用flask框架,异步读写数据;手机端基于vue.js开发了Web app,完成图像采集并通过rest API接口上传到服务器,并实时获取病害识别结果,总体结构见图3。

1.2.1 卷积神经网络模型设计 深度卷积神经网络模型设计包括样本预处理、神经网络搭建、模型训练及模型评估。本研究初始马铃薯病害图片样本经过预处理,整理得到6 000张病害样本图片,设计了8层CNN+Softmax神经网络模型,通过梯度下降法进行训练,在单病斑样本测试中得到了较好的准确率。TensorFlow已经广泛用于图像识别等多项机器深度学习领域,先后提出了AlexNet[10]、VGG[11]、GoogLeNet[12]、PReLU-net[13]等代表性网络结构。在TensorFlow平台上,参照Alex Krizhevsky在CIFAR-10[10]数据集上应用的深度卷积置信网络,搭建了3个卷积层、2个全连接层,网络结构见图4。在卷积层中分为卷积、池化过程,全连接层包括ReLu(Rectified Linear Units)非线性映射和dropout 2个过程,网络结构见图4。

1.2.2 服务器设计 马铃薯病害应用系统分为服务器和前端2个部分,识别系统前端-后端结构见图5。服务器由服务进程、神经网络识别进程、数据库和Web服务构成,采用RESTful API接口。前端设计了基于Vue的web app,实现了手机端拍照上传,服务器端识别病害、存储信息并推送识别结果的功能。

本研究服务器的构建采用Python Web框架Flask和Nginx Web服务器。Flask是一个轻量级的Python Web框架,通过uWSGI服务网关接口可实现Nginx和Flask的交互,执行Python应用[14]。

以上传病害图片和获取识别结果为例,服务器软件设计结构和原理见图6。用户上传病害照片时,手机端通过网页地址访问服务器,采用标准RESTful接口,经过网页地址解析产生POST /pttdmap请求。本研究创建了Flask实例fapp,fapp通过路由router操作,fapp.route修饰器把修饰的函数注册为路由,转入执行Insert2tab()业务,将图片存入病害数据库。

用户获取病害识别结果时,通过网页地址访问服务器,经过解析产生GET /pttdisease请求,fapp通过路由执行Getds()业务。本研究设计了病害识别线程,该线程无识别请求时挂起,线程中开启SOCKET连接,方法如下:

pttdregsver=socket.socket(socket.AF_UNIX,socket.SOCK_STREAM)

if os.path.exists(“/usr/pttdreg.sock”):

os.unlink(“/usr/pttdreg.sock ”);

pttdregsver.bind(“/usr/pttdreg.sock ”);

pttdregsver.listen(0);

Getds()业务创建pttdregclient SOCKET,通过pttdregclient.connet(“/usr/pttdreg.sock”)连接pttdregsver[],client.send(pttdmap)将图片送到模型并启动识别模型,完成Step1。之后Step2、Step3完成识别结果存储,并响应手机的请求返回识别结果。

1.2.3 手机web app设计 为提高跨平台、可移植性,本研究手机端应用web app方式,采用MVVM框架Vue.js,它具有数据双向绑定,异步实时更新数据的功能,运行在移动端,方便快捷。客户端识别系统主要采用的技术栈有vue.js、vue-recource、vue-router,Vue.js是轻巧的可组件化MVVM库;vue-recource负责与服务器进行数据交互;vue-router完成界面跳转[15-16]。各项功能的代码完成后用webpack打包部署到Nginx服务器,供移动端访问。

2 结果与分析

2.1 特征提取及分类过程分析

在图4所示的模型结构中,图像通过输入层、卷积层、全连接层自动学习特征并送入softmax分类器,过程如下:

输入层:CNNs具有对二维图像的特征进行自主学习的特性,故在此将原始图像像素直接作为网络输入,输入大小为227×227×3,其中3表示颜色通道,表示输入为RGB图像。

卷积层C1(conv1),由48个11×11卷积核,步长为4,采用ReLu非线性映射激励,产生55×55×48个特征映射,之后输入池化层S2(pool1),经过3×3过滤器、步长为2的max pooling重叠池化,学习到27×27×48个特征。关键代码如下所示:

with tf.variable_scope(‘conv1’) as scope:

kernel=_variable_with_weight_decay(‘weights’,shape=[11,11,4,48],stddev=1e-4,wd=0.0)

对于Δt的两个解,根据实际抓取情况进行取舍,然后确定抓取位置和抓取路径。如果两个解全部符合要求,那么选择时间比较短的解;如果两个解全部不符合要求,那么将放弃对此工件的抓取同时做好漏抓记录。

conv=tf.nn.conv2d(images,kernel,[1,1,1,1],padding=‘SAME’)

biases=_variable_on_gpu(‘biases’,[48],tf.constant_initializer(0.0))

bias=tf.nn.bias_add(conv,biases)

conv1=tf.nn.relu(bias,name=scope.name)

_activation_summary(conv1)

pool1=tf.nn.max_pool(conv1,ksize=[1,3,3,1],strides=[1,2,2,1],padding=‘SAME’,name=‘pool1’)

卷积层C3过滤器大小为5×5,深度为128,移动步长为1,C3特征映射大小为27×27×128,激励函数采用Relu。池化层S4仍然采用3×3滤波器、步长为2,max pooling重叠池化,输出特征个数为13×13×128。卷积层C5过滤器大小为3×3,深度为192,移动步长为1,本层输出矩阵大小为13×13×192。池化层S6采用3×3滤波器、步长为2重叠池化,输出特征矩阵为6×6×192。

卷积核、池化核、步长大小的选取,整体的预测模型参数(包括学习率、学习策略)均是通过试验得到最佳。卷积核尺寸根据图像明显特征所占像素大小确定,奇数尺寸的滤波器能获取到更好的中心,故特征卷积核设为奇数。重叠池化能够在一定程度上防止过拟合[12]降低识别错误率,故采用重叠池化。全连接层采用的ReLu激活函数,其优点为梯度不饱和、计算速度快;梯度计算公式为(1),在反向传播过程中减轻了梯度弥散问题,神经网络前几层的参数也可以很快地更新。正向传播过程中ReLu函数仅须要设置阈值,加快了正向传播的计算速度,可以极大地加快收敛速度,dropout的设置是为了防止过拟合。

本研究采用多项式逻辑回归(也称为Softmax回归)方法进行分类,Softmax回归在网络的输出层上计算归一化的预测值和标签的交叉熵,模型的目标函数是求交叉熵损失和所有权重衰减项的和。使用cross_entropy计算交叉熵,然后计算一个batch运算后的平均值,tf.add_to_ collection计算总损失。本研究模型使用标准的梯度下降算法来训练模型。

梯度下降法的迭代公式为

(1)

2.2 模型特性分析

模型评估使用测试集样本来评估训练模型的预测性能。为了得到可靠稳定的模型及对模型性能进行无偏估计,使用交叉验证的方法,也就是对分类器进行训练后利用测试集来测试训练得到的模型,以此来作为评价分类器的性能指标。

本研究搭建的神经网络学习速率设置为0.01。训练过程中得到的损失函数随迭代次数变而变化的曲线、正确率随着迭代次数变而变化的曲线见图7、图8。

从图7可以看出,随着迭代次数增加,损失函数值越来越小,几乎接近于0,说明函数拟合越来越好。训练样本识别精度到93%时基本收敛。训练在服务器上进行,CPU采用Intel i7 4核、单GPU GTX980、4 G显存,训练用时不到1 h。用测试集样本测试训练好的模型,测试集样本1 000个,测试时间为1.97 s,简单背景、单病斑图像测试准确率达到86%,其与迭代次数关系见图8。

从表1可以看出,炭疽病和早疫病相互误判率较高,灰霉病和晚疫病相互误判率次之,炭疽病被误判成早疫病的比率也较高,表明本研究模型针对上述病斑的特征提取效果有待进一步提高。笔者所在课题组尝试增加CNN层数,由于样本数量受限,当增加到6层CNN时出现过拟合现象。通过对比,在当前条件下设置3个卷积层的网络取得的识别效果相对较好。

表1 病害分类测试准确率统计

2.3 手机端应用软件测试

手机端app应用界面见图9。身份验证触发POST请求,从后台获取token,通过验证后进入系统。病害识别界面有拍摄病害图像、上传图片功能,执行POST函数将手机病害图像上传到后台服务器,点击获取通过get请求将获取识别结果显示在客户端。

3 结论与讨论

本研究设计了8层CNN+softmax分层卷积神经网络模型,对于简单背景单一病斑识别率达到86%。但是,由于病害图像的特殊性,局部和全局取样对识别效果影响很大,以191农资人上传的呼伦贝尔某地区马铃薯叶片病害图为例,系统识别为炭疽病;若采用局部取样,将病斑单独取样,系统识别为早疫病,差异很大(图10)。

针对这一问题可采用CNN物体检测方法,Gishick等在基于神经网络的物体检测领域进行了深入研究[17],笔者所在课题组正在尝试采用R-CNN[17]算法和Fast R-CNN[18],即Regions with Convolution Neural Network Features和快速R-CNN算法予以改进。

此外,马铃薯病害种类多、分布分散,叶片、茎、块茎等部位均有病害症状,病害除本研究列出的早疫病、晚疫病、灰霉病、炭疽病,还包括小叶病、青枯病、叶斑病、病毒,块茎部位癌肿、根腐、黑痣、疮痂病等,笔者所在课题组正在不断搜集整理病害图片样本,制作样本库,为模型设计提供数据支撑。

本研究搭建的Nginx Web服务器,应用flask框架开发后台服务,基于Vue.js开发手机端APP,实现采集、上传、识别功能,满足了系统要求,为相关应用提供了完整全栈式解决方案。

猜你喜欢
卷积病害服务器
早春养羊需防六大病害
小麦常见三种病害咋防治
基于3D-Winograd的快速卷积算法设计及FPGA实现
葡萄病害周年防治历
果树休眠期咋防病害
通信控制服务器(CCS)维护终端的设计与实现
从滤波器理解卷积
基于傅里叶域卷积表示的目标跟踪算法
中国服务器市场份额出炉
得形忘意的服务器标准