2019-04-11 11:01:34 hxf19961219 阅读数 969

a.介绍
这是我最近读的一篇论文,论文来自2017年第21届国际计算机科学与工程大会(ICSEC),文中针对4种玉米叶片类型识别问题自己搭建了一个网络结构,个人觉得不错,在此分享,结构比较容易用代码实现,在此就不贴代码了。

a.数据集分布
在这里插入图片描述
b.网络架构
在这里插入图片描述
c.实验
实验分为3部分。在第一部分中,我们使用5倍交叉验证从头开始训练我们提出的网络。在每个折叠中,我们使用三个数据子集,数据增加,用于训练,一个子集用于验证。然后在剩余的数据子集上测试在验证数据上表现最佳的模型。该过程重复5次,以便每个子集用作测试数据一次。下图分别显示了5倍的模型的平均损失和平均准确度的学习曲线与训练过程期间的时期数量。
在这里插入图片描述
在实验的第二部分,我们训练了三个的网络,即ResNet50,InceptionV3和MobileNet,并将结果与我们提出的网络进行了比较。所有这三个网络都已在ImageNet数据集上预先训练加快培训进程。在训练过程开始时,每个网络中的所有参数,除了最后一个完全连接的层,其中进行了初始化,都保持固定。一旦完成了最后一个完全连接的层,我们就开始对网络进行微调以提高其准确性。在MobileNet架构上,所有层都是可训练的。另一方面,我们只允许ResNet50和Inception V3中所有层中的大约一半可以训练,因为这些网络具有非常高的容量,并且通过整个网络的微调将导致过度拟合。我们还使用了5倍交叉验证来训练和测试这些网络。下图显示在训练过程中这四种模型的验证损失和验证准确性的比较。图中绘制的数字是每个时期的5倍平均值。
在这里插入图片描述在这里插入图片描述
我们实验的第三部分是测试模型推广到其他测试集。我们需要执行此步骤的原因是因为在Plant Village数据集中存在来自不同方向的同一叶子的多个图像,因此输入图像之间存在隐藏的相关性。由于我们没有关于来自同一叶子的图像的这条信息,我们所能做的就是随机分割数据集。这可以使一片叶子的一些图像进入训练集,并且同一叶子的其他图像进入测试集。因此,我们在实验的第一部分和第二部分得到的结果可能高于真正看不见的测试数据的结果。因此,我们还从互联网上收集了每个班级的25张图像。然后,我们对这100张额外的图像测试了所有模型。我们相信这部分的结果将更准确地反映模型在现实场景中的表现,何时模型用于对从现场智能手机中拍摄的图像进行分类。
比较模型的性能:
在这里插入图片描述

在这里插入图片描述
为了测试我们模型的泛化能力,我们将每个体系结构的5个模型(每个体系结构一个)应用于从Internet检索到的100个附加图像。对5个模型的softmax概率进行平均,选择概率最高的类作为集合的预测。结果如上表所示,我们可以看到,我们提出的PlantVillage数据集模型的准确性仅略差于其他三个网络。但是,鉴于我们的模型包含的参数比MobileNet少4倍,我们模型的推理时间应该比其他网络快。我们还从混淆矩阵中看到,所有模型在来自附加图像数据集的北方叶枯病图像上表现最差。我们已经预料到这种情况会发生,因为在PlantVillage数据集中,北方叶枯病的所有图像都是在受控环境中拍摄的。也就是说,照明条件,背景颜色,每个图像中的叶子数等没有变化。因此,当模型针对来自互联网的图像进行测试时,从受控环境图像中学习的模型特征可能不是很有用,因为在这种情况下训练数据和测试数据的分布非常不同。我们相信这个问题可以通过获得在各种条件下拍摄的更多图像来解决,如在灰叶斑点图像和健康图像的情况下可以看到的,因为这两个类包含在室外场中拍摄的多个图像。
d.结论
我们提出了一种新颖的卷积神经网络架构,它将参数数量大致减少了4倍。然后,我们从PlantVillage数据集中对玉米叶片图像进行训练,将它们分为以下四类之一:普通锈病,北方叶枯病,灰斑病或健康。我们发现即使我们网络中的参数数量远远少于其他知名网络的参数数量,我们的网络性能在PlantVillage数据集上也略差一些。在这项工作中测试的所有模型的普遍性是好的(58%或更好),考虑到随机猜测将导致大约25%的准确性。我们认为如果从许多不同的条件下拍摄更多的训练图像,理想情况下,从现实的设置中,可以进一步改进模型。

2020-03-24 14:00:07 hxf19961219 阅读数 119

网络加注意力理由:
分析:作物叶病的识别是作物病害诊断和控制的技术基础,保证了农产品的安全。快速准确地识别农作物叶片疾病是农业由待解决的问题。作物叶片病害的图像具有背景复杂,病斑面积小,病斑与背景对比度差等挑战,容易造成两者之间的混淆。另外,在实际环境中捕获的图像具有各种噪声和环境因素,例如不同的分辨率,角度,照明度等。
在这里插入图片描述

根据叶片图像特征的选择方法不同,将农作物病害的图像识别方法分为两类:基于手工的表示方法和基于深度的表示方法。目前,基于手工表示的方法已经取得了良好的识别效果。但是,它们具有一些局限性:(1)大量的图像预处理繁琐且耗时。(2)手工标记的有限特征提取容易造成图像语义鸿沟的问题。这些局限性直接导致作物病害鉴定应用缺乏准确性和速度。现如今,通常采用深度卷积神经网络,该神经网络可以提取图像的全局特征和上下文信息。然而,当前基于深层表征的研究主要集中在具有简单背景的作物病害识别上。在面对实际应用时,由于不能从复杂的背景中有效地提取斑点区域的局部特征,因此大大降低了识别精度。识别结果难以满足应用需求。

基于以上理由提出一个自注意力卷积神经网络识别作物叶片病害模型。

在这里插入图片描述
改进的注意力模块:
在这里插入图片描述
实际特征通道等于输入特征通道乘以比例系数ratio,设计不同系数取最优。网络其实也要注意一下注意力加载的位置和个数。

2020-02-15 21:56:35 bless2015 阅读数 45

卷积神经网络(Convolutional Neural Networks, CNN)

前言

卷积神经网络是深度学习模型的一种,也是一种计算框架吧,就像【人工智能学习】【六】循环神经网络一样,现在没有纯用CNN做项目的,而是基于CNN的AlxNet,VGG等模型,在后面的文章中会进行介绍。
ImageNet图像识别挑战赛(ImageNet Large Scale Visual Recognition Challenge),在2012年之前参赛模型普遍选用特征+支持向量机(Support Vector Machine,SVM)。在2012年,Alex Krizhevsky和他的导师Geoff Hinton提出的基于卷积神经网络架构的模型,以巨大的优势获得当年的ImageNet图像分类挑战赛的桂冠。
如图所示,2012年较2011年,图像分类的错误率从26%下降到16%,由此掀开了人们对卷积神经网络研究的热潮。以卷积神经网络为架构的模型在随后的ImageNet挑战赛中垄断了所有冠军。2015年,由微软亚洲研究院提出的深度残差神经网络(Deep Residual Networks,ResNet)取得了图像分类错误率3.5%的成绩,使计算机对图像的识别正确率第一次超越了人类。(这句话出自斯坦福cs231n计算机视觉课程)
在这里插入图片描述
卷积神经网络以多层感知机(Multi-layer perceptron,MPL)【人工智能学习】【三】多层感知机为基础。20世纪60年代,Hubel和Wiesel在研究猫大脑皮层中基础视觉区域的激活过程时发现,大脑对图像处理的前期,并不是对整体的鱼或老鼠进行处理,而是是基于图像简单的形状结构,例如边缘、形状等。基于这种思想,在复杂的深度神经网络中,有很多用于提取边缘形状的滤波器。
我们先考虑单个神经元节点的情况
在这里插入图片描述
H=f(i=1nxiwij+bh)H=f({\sum_{i=1}^n}x_iw_{ij}+b_h)
当用这个模型来处理图片时,对于一张1000*1000像素的图片,神经网络的隐含层节点也会很多,cs231n里举的例子是如果有1M个隐含层神经元,1M10001000=10121M*1000*1000=10^{12},则一共需要101210^{12}个参数。
在这里插入图片描述

局部感知野

卷积神经网络用局部感知野和权值共享的概念降低了神经元节点数,如下图所示
在这里插入图片描述

这样把图片的一个区域内的像素,通过矩阵运算和一个神经元节点相连,如果用10*10的局部感知单元与输入图片连接,一共1M个隐含层神经元,1M1010=1081M*10*10=10^8,参数规模已经从101210^{12}降到10810^8

权值共享

权值连接是指每个神经元节点用一个权重矩阵WW来扫描整张图片,得到一张feature map(特征图)。通过添加多个神经元节点,可以学习到多个特征图,每张特征图可以看做原图的不同通道上的表达。所以他的计算方式和之前讲到的线性回归不一样。后面会给出代理样例。

卷积神经网络结构

讲完了一些思想后,让我们抛开上面讲的,来看CNN的结构。
卷积神经网络是一种多层次的网络结构,每一层网络结构都包含许多个相互独立的神经元节点。一个卷积神经网络一般是由一个输入层(Input)、若干卷基层(Convolutions)和池化层(Subsampling)、输出层(Output)组成,其中卷基层用于特征提取,池化层用于图像降维。
在这里插入图片描述
输入一张图片,然后经过C1层进行特征提取,S2层图片降维,图片大小降为C1时的一半。再次经过C3层特征提取,S4降维。最终将提取到的所有特征连接成一个一维向量输入到最后的全连接层,经过分类器得到最终的输出。
以LeNet-5为例,一共有7层,输入端像素为32*32。下面是经典的这张图。。
在这里插入图片描述
在这里插入图片描述

LeNet-5模型一共有7层。有三个卷基层:C1,C3,C5。
C1层有6个55大小的卷积核,可以提取到6个2828大小的特征图(feather map)。这一层可训练的参数为156个,每个滤波器为555*5个参数,加上一个bias参数,有6个滤波器。有156个参数。一共有1562828=122304个连接。
C3层包括1500权重和16个偏置,有1516个训练参数和151600个连接。
S2层和C3层之间不是全连接Lecun设计了如上图所示的连接方式,不仅减少了权重数量,而且还相互组合由C3提取特征,破坏了网络的对称性。
C5层包含120个feather map,尺寸为111*1
LeNet-5模型还包括两个下采样层S2,S4。S2包括6个特征图,特征图的每个单元与上一层222*2大小的区域连接。S2层每个单元4个参数相加,乘以一个可训练参数加一个可训练偏置作为输出,所以一共有126(1+1)=1212(6*(1+1)=12)个可训练参数。每个特征图都与C1中2*2的区域和1个偏置相连接,所以一共有5880651414=58805880(6*5*14*14=5880)个连接。同理,S4有32个可训练参数和156000个连接。
卷积层是将输出的图像与一个可训练的权重矩阵进行点乘,并将结果相加,再加一个偏置作为输出的运算。
下采样层也叫池化层,是将图片缩小规模,以降低网络的计算量,子采样层的一般公式如下:
xjl=βjldown(xjl1)+bjlx_j^l=\beta_j^ldown(x_j^{l-1})+b_j^l
down()函数是采样方式,有平均池化(就是取被池化区域像素的平均值),最大采样(就是取被池化区域像素的最大值)
全连接层是将所有提取到的特征图经过卷积操作得到一个一维向量,后面接一个【人工智能学习】【二】Softmax与分类模型来实现分类。

卷积神经网络的训练

先来看单节点的反向传播的计算,有助于理解反向传播的思想。

上面的图“激活函数”位置有点偏。。应该放到中间圆圈下面。这个图可以用下面三个公式来表示:
z=i=1nXW+bz={\sum_{i=1}^nXW+b}
a=f(z)a=f(z)
J=loss(z)J=loss(z)
设样本集
{(x1,y1)(x2,y2)(xn,yn)}xy{\{(x_1,y_1),(x_2,y_2)……(x_n,y_n)\}} (说明:x和y都是向量)
以二次损失函数为例:
loss=12(yiˊyi)2 loss = \frac{1}{2} (\acute{y^i}-y^i)^2
其中yiˊ\acute{y^i}为预测值,yiy^i为训练集样本中的真实值。
为了更新权值矩阵WW和偏置bb,需要求代价函数JJ对于权值矩阵和偏置的偏导Jw\frac{∂J}{∂w}Jb\frac{∂J}{∂b}。根据链式法则得
Jw=Jaazzw\frac{∂J}{∂w}=\frac{∂J}{∂a}\frac{∂a}{∂z}\frac{∂z}{∂w}
Jb=Jaazzb\frac{∂J}{∂b}=\frac{∂J}{∂a}\frac{∂a}{∂z}\frac{∂z}{∂b}
接着到CNN,考虑CNN有池化层局部感知,反向传播从后往前计算,是需要将每一层的feature map向上采样(尺寸要统一嘛)
上采样有mean-pooling和max-pooling,以mean-pooling为例,为了保证敏感度的总和不变,需要均摊到每一项上:
在这里插入图片描述
池化层搞定后,别忘了卷积层也有尺寸变化,反向传播计算时这个计算叫反卷积(Backwards Convolution),将残差进行映射。首先将残差矩阵padding一下(就是为了统一尺寸)。
在这里插入图片描述
在这里插入图片描述
上面试ww矩阵的反向传播,偏置b就直接链式法则计算了。

多通道

多通道输入

以上处理的实际上是黑白图片(只有一个通道),一般图片具有3个通道:RGB。这里先从感性上认识,输入三通道,在第一层卷积时,就必然要处理3个通道的像素,就需要3倍于原来的feature map。这时候如果不想要多通道输出,就直接做加和了。如果输入是cc维,卷积核尺寸为kh×kwk_{h}×k_{w},为每一个通道分配一个kh×kwk_{h}×k_{w}的卷积核,卷积核就变成了kh×kw×ck_{h}×k_{w}×c大小了。
该图是两通道的例子:
在这里插入图片描述

多通道输出

在上面的例子上,最后的输出不做加和。(我觉得这里理解的不是很好)
为啥说感性上的认识呢,因为计算时,输入的变量是将三通道拉直成一维的xx进行计算的。所以里面还是有很多计算上的细节。

实现

手写实现

构造一个简单的边缘检测的例子。这个例子的数据和标签初始化如下

Y = torch.zeros(6, 7)
X[:, 2: 6] = 0
Y[:, 1] = 1
Y[:, 5] = -1
print(X)
print(Y)

tensor([[1., 1., 0., 0., 0., 0., 1., 1.],
[1., 1., 0., 0., 0., 0., 1., 1.],
[1., 1., 0., 0., 0., 0., 1., 1.],
[1., 1., 0., 0., 0., 0., 1., 1.],
[1., 1., 0., 0., 0., 0., 1., 1.],
[1., 1., 0., 0., 0., 0., 1., 1.]])
tensor([[ 0., 1., 0., 0., 0., -1., 0.],
[ 0., 1., 0., 0., 0., -1., 0.],
[ 0., 1., 0., 0., 0., -1., 0.],
[ 0., 1., 0., 0., 0., -1., 0.],
[ 0., 1., 0., 0., 0., -1., 0.],
[ 0., 1., 0., 0., 0., -1., 0.]])

定义二维互相关运算,一般使用222*2的卷积核

import torch 
import torch.nn as nn

def corr2d(X, K):
    H, W = X.shape
    h, w = K.shape
    Y = torch.zeros(H - h + 1, W - w + 1)
    for i in range(Y.shape[0]):
        for j in range(Y.shape[1]):
            Y[i, j] = (X[i: i + h, j: j + w] * K).sum()
    return Y
X = torch.tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
K = torch.tensor([[0, 1], [2, 3]])
Y = corr2d(X, K)
print(Y)

tensor([[19., 25.],
[37., 43.]])

二维卷积层

class Conv2D(nn.Module):
    def __init__(self, kernel_size):
        super(Conv2D, self).__init__()
        # 随机初始化
        self.weight = nn.Parameter(torch.randn(kernel_size))
        self.bias = nn.Parameter(torch.randn(1))

    def forward(self, x):
    	# 卷积+偏置
        return corr2d(x, self.weight) + self.bias

训练

conv2d = Conv2D(kernel_size=(1, 2))
step = 30
lr = 0.01
for i in range(step):
    Y_hat = conv2d(X)
    l = ((Y_hat - Y) ** 2).sum()
    l.backward()
    # 梯度下降
    conv2d.weight.data -= lr * conv2d.weight.grad
    conv2d.bias.data -= lr * conv2d.bias.grad
    
    # 梯度清零
    conv2d.weight.grad.zero_()
    conv2d.bias.grad.zero_()
    if (i + 1) % 5 == 0:
        print('Step %d, loss %.3f' % (i + 1, l.item()))
        
print(conv2d.weight.data)
print(conv2d.bias.data)

Step 5, loss 4.569
Step 10, loss 0.949
Step 15, loss 0.228
Step 20, loss 0.060
Step 25, loss 0.016
Step 30, loss 0.004
tensor([[ 1.0161, -1.0177]])
tensor([0.0009])

pytorch实现

卷积层的简洁实现

我们使用Pytorch中的nn.Conv2d类来实现二维卷积层,主要关注以下几个构造函数参数:

in_channels (python:int) – Number of channels in the input imag
out_channels (python:int) – Number of channels produced by the convolution
kernel_size (python:int or tuple) – Size of the convolving kernel
stride (python:int or tuple, optional) – Stride of the convolution. Default: 1
padding (python:int or tuple, optional) – Zero-padding added to both sides of the input. Default: 0
bias (bool, optional) – If True, adds a learnable bias to the output. Default: True

X = torch.rand(4, 2, 3, 5)
print(X.shape)

conv2d = nn.Conv2d(in_channels=2, out_channels=3, kernel_size=(3, 5), stride=1, padding=(1, 2))
Y = conv2d(X)
print('Y.shape: ', Y.shape)
print('weight.shape: ', conv2d.weight.shape)
print('bias.shape: ', conv2d.bias.shape)

torch.Size([4, 2, 3, 5])
Y.shape: torch.Size([4, 3, 3, 5])
weight.shape: torch.Size([3, 2, 3, 5])
bias.shape: torch.Size([3])

池化层的简洁实现

我们使用Pytorch中的nn.MaxPool2d实现最大池化层,关注以下构造函数参数:

kernel_size – the size of the window to take a max over
stride – the stride of the window. Default value is kernel_size
padding – implicit zero padding to be added on both sides

X = torch.arange(32, dtype=torch.float32).view(1, 2, 4, 4)
pool2d = nn.MaxPool2d(kernel_size=3, padding=1, stride=(2, 1))
Y = pool2d(X)
print(X)
print(Y)

tensor([[[[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[12., 13., 14., 15.]],
[[16., 17., 18., 19.],
[20., 21., 22., 23.],
[24., 25., 26., 27.],
[28., 29., 30., 31.]]]])
tensor([[[[ 5., 6., 7., 7.],
[13., 14., 15., 15.]],
[[21., 22., 23., 23.],
[29., 30., 31., 31.]]]])

2019-08-21 15:47:16 j_starry 阅读数 214

这篇文章主要是作者们在互联网上搜索了一些图片,并使用图像增强方法进行处理,增加了数据集的数量,做了一个自己的数据集。使用caffenet使用微调,并最后比较了在每一类上的准确率。都是很基础的方法,本文数据集是不公开的。(只能参考一下参数,实验方法等,而在算法上没什么创新)

 

摘要:本文提出了一种利用深度卷积网络建立基于叶片图像分类的植物病害识别模型的新方法。采用新颖的培训方法和方法,方便快捷地在实践中推行系统。这种被开发出来的模型能够识别出13种不同类型的植物疾病,包括健康的叶子,并有能力将植物叶子与其周围环境区分开来。据我们所知,这种植物病害识别方法是首次提出的。本文从采集图像建立数据库开始,通过农业专家的评估,全面描述了实现该疾病识别模型所需的所有重要步骤。利用伯克利视觉学习中心开发的深度学习框架Caffe进行CNN深度训练。所开发模型的实验结果在91% ~ 98%之间达到了精度,对于单独的类测试,平均达到96.3%。

1 Introduction

……

本文介绍的方法是一种利用深卷积神经网络检测植物病害的新方法。开发模型的先进性和新颖性在于其简单性;健康的树叶和背景图片与其他类别保持一致,通过使用深度cnn,人们可以区分生病的树叶和健康的树叶,或者健康的树叶和环境。

本文的其余部分组织如下:第2节介绍相关工作,第3节介绍方法,第4节介绍取得的成果和相关讨论,最后是第5节持有的结论。

2 Related Work

……

本研究在深入学习技术的发展及其在实践中的应用的推动下,探索了植物病害识别的深度学习方法。对最先进的文献进行了广泛的研究,但没有发现任何证据表明,研究人员探索了通过图像识别植物疾病的深度学习方法。我们利用深度CNN进行识别的方法如下。

3 Materials and Methods

详细介绍了利用深度CNN建立植物病害识别模型的全过程。这个完整的过程被分成以下几个子部分中每一个必要的阶段,从使用深度神经网络收集图像进行分类处理开始。

3.1数据集。从训练阶段到评价识别算法的性能,目标识别研究的各个阶段都需要合适的数据集。为数据集收集的所有图像都是从互联网上下载的,通过疾病和植物名称在不同的来源上搜索,这些来源来自不同的语言,如拉丁语、英语、德语、塞尔维亚语和匈牙利语。所有图片被分成15个不同的类。十三个类别代表了植物病害,这些病害可以从叶子上直观地判断出来。

为了区分健康叶和疾病叶,在数据集中又添加了一个类。它只包含健康叶子的图片。一个数据集中具有背景的额外的类有助于使分类更准确,因此,可以训练深层神经网络来区分树叶和周围环境。背景图片取自斯坦福大学的背景数据集。

在这个阶段中,所有来自不同来源的重复图像都将被该过程开发的python脚本删除。脚本通过比较图片的元数据来将重复的删除:名字,大小,和日期。自动删除以后,图片将被专家们多次评估。

下一步是用增强图像来丰富数据集。本研究的主要目的是训练网络,使其具备区别于其他网络的特征。因此,当使用更多的增强图像时,网络学习适当特性的机会就增加了。最后,创建了一个包含30880张用于培训的图像和2589张用于验证的图像的数据库。对增强过程的描述在章节3.3中。

表1显示了所有的疾病,以及作为疾病分类模型的训练和验证数据集的每个类的原始图像和增强图像的数量。

3.2图像预处理和标签。图片是从互联网上下载的,具有不同的分辨率和质量。为了获得更好的特征提取,我们对作为深度神经网络分类器数据集的最终图像进行预处理,以获得一致性。此外,图像预处理的过程包括手工裁剪所有图像,在叶子周围做一个正方形,以突出感兴趣的区域(植物叶子)。在数据集图像采集阶段,分辨率较小、尺寸小于500px的图像不被认为是数据集的有效图像。此外,只有感兴趣的区域分辨率更高的图像才被标记为数据集的合格候选。这样,就确保了图像包含了学习特征所需的所有信息。该数据集使用的图像大小为256×256,以减少训练时间,训练时使用python和OpenCV框架[33]自动计算。

许多资源可以通过互联网搜索找到,但它们的相关性往往是不可靠的。为了确认数据集中类的准确性,农业专家们最初通过文字搜索对叶子图片进行了研究,并给这些图片贴上了疾病的首字母缩写。众所周知,对训练和验证数据集使用精确分类的图像非常重要。只有这样,才能建立一个合适和可靠的检测模型。在这一阶段,从数据集中删除第3.1节中描述的采集和分组图像到类的初始迭代后留下的重复图像。

3.3增强的过程。应用增强的主要目的是增加数据集,对图像进行轻微的失真,从而减少训练阶段的过拟合。在机器学习和统计学中,当统计模型描述随机噪声或错误而不是潜在关系[34]时,就会出现过拟合。图像增强包含几种转换技术之一,包括仿射转换、透视转换和简单的图像旋转。使用仿射变换来表示平移和旋转[35],其中原始图像中的所有平行线在输出图像中仍然是平行的。要找到一个变换矩阵,需要在输出图像的相应位置加上原图像中的三点。透视变换需要a3×3变换矩阵。即使在转型之后,直线仍然是直线。在增强过程中,采用了简单的图像旋转,以及不同轴对称度的旋转。

在增强过程中应用的变换如图2所示,其中第一行表示通过对单个图像应用仿射变换得到的结果图像;第二行是通过对输入图像的透视变换得到的图像,而最右行是对输入图像含义的可视化。增加的过程是为了适应需要而选择的,自然环境中的叶子在视觉角度上是不同的。

在这一阶段,为了自动化数据集中大量图像的增强过程,使用OpenCV库[36]在c++中开发了特定的应用程序,可以在运行时更改转换参数,提高了灵活性。

3.4神经网络的训练。提出了利用3.1节描述的数据集训练深度卷积神经网络建立图像分类模型。有几个著名的最先进的深度学习框架,如theano[37]和Lua、Torch7[38]的机器学习库。此外,还有Caffe,这是一个开源的深度学习框架,由bvlc[39]开发,其中包含了预先训练好的CaffeNet模型。为了本研究,我们使用了这个框架,以及一组平均大数据集(ImageNet[40])的权值。

Caffe框架既适合于研究实验,也适合于行业部署。框架的核心是C++,并提供命令行、Python和matlab接口。Caffe与cudnn库的集成加速了Caffe模型的开发[41,42]。CaffeNet是一个深度CNN,它有多个层,可以从输入图像[43]逐步计算特性。具体来说,该网络包括8个学习层、5个卷积层和3个全连接层[44]。

CaffeNet体系结构被认为是一个起点,但是修改和调整了它来支持15个类别(类)。最后一层进行了修改,并将softmax层的输出参数化,以满足本研究的要求。

卷积层是卷积神经网络的基本组成部分。该层的参数由一组可学习内核组成,这些内核具有较小的接收域,但可以扩展到整个输入体的深度。

……

CNN和ReLUs的训练速度要快好几倍。该方法适用于所有卷积和全连接层的输出。

尽管有输出,但不需要对输入进行归一化;它是在第一次和第二次卷积之后应用的,因为它降低了top-1和top-5的错误率。在CNN中,隐藏层中的神经元被分割成“特征图”。与特征图有关神经元具有相同的权重和偏差。然后与特征图有关神经元搜索相同的特征。这些神经元是独特的,因为它们在较低的层连接到不同的神经元。因此,对于第一个隐藏层,特征图中的神经元将与输入图像中的不同区域相关联。该隐层被分割成特征图,特征图中的每个神经元在不同的位置寻找相同的特征。基本上,特征图是在图像上应用卷积的结果。每个层的特征被不同的块战数处理啊,这些可视化的特征展示了特征图中最强的激活部分,从第一个卷积层开始,特征从单个像素到简单的线条,再到第5个卷积层,在这里显示学习到的特征,如形状和叶子的某些部分(图3)。

CNNs的另一个重要层是池化层,它是非线性下采样的一种形式。池化操作给出了平移不变性[48]的形式;它依赖于输入的每个深度切片,并在空间上调整其大小。重叠池化有利于减少过度拟合

重叠池化:alexnet中提出和使用。
  相对于传统的no-overlapping pooling,采用Overlapping Pooling不仅可以提升预测精度,同时一定程度上可以减缓过拟合。
  相比于正常池化(步长s=2,窗口z=2) 重叠池化(步长s=2,窗口z=3) 可以减少top-1, top-5分别为0.4% 和0.3%;重叠池化可以避免过拟合。)

此外,在前两个完全连接的层中使用了一个dropout层[49]。但与标准的[50]结构的神经网络相比,dropout的缺点是训练时间缩短了2-3倍。贝叶斯优化实验也证明了ReLUs和dropout具有协同效应,这意味着当它们一起使用[51]时是有利的。

CNNs的进步是由于它们能够学习丰富的中级图像表示,而不是使用手工设计的低层图像特征再通过其他图像分类方法来分类[52]。

图4显示了深度网络中每个卷积层和池化层的输出。输出图像在每张图像的右下角都标有相应层的名称。

3.5执行测试。测量人工神经网络性能的常用方法是将数据分离到训练集和测试集,然后在训练集上训练一个神经网络,并使用测试集进行预测。因此,由于测试集的原始输出值和我们预测的模型输出值是已知的,因此我们的预测精度可以计算出来。训练时使用30880张图像,使用2589张图像进行测试。

在测试时,使用10折交叉验证来评估预测模型。交叉验证过程在每1000次训练迭代之后重复一次。测试的总体估计结果用图形表示为top-1,以测试top类(具有最高概率的类)是否与目标标签相同。top5的错误率是用来测试目标标签是否是前5名预测之一,即是否是概率最高的5个预测之一。每个标记类用于验证测试的图像数量如表1所示。第4节分别给出了完整数据集和每个类的测试结果。

3.6.Fine-Tuning。微调是通过对过程或功能进行小的修改来提高或优化结果,从而提高过程或功能的有效性或效率。原始的caffeNet模型的分类功能是通过softmax计算imagenet中1000个类的概率来分类的。微调的学习实验需要一些学习,但它们仍然比从零开始学习[53]快得多。为了开始微调过程,删除了这个softmax分类器,如第3.4节所述,并进行了说明,然后随机初始化值。利用3.1节所述数据集中的数据,采用反向传播算法对新的softmax分类器进行从无到有的训练。这个数据集有15个不同的类别[43]。由于本研究使用的数据与ImageNet (ILSVRC-2012[54])相比较小,对微调隐藏层[55]使用较低的初始学习率限制了过度拟合。顶层的学习率设置为10的,而其他7个学习层的学习率设置为0.1。反向传播算法运行了100,000次迭代。微调过程是隐层参数和超参数不断变化的过程。通过参数的实验调整,得到了最适合植物病害检测的模型。第四节给出了模型微调的结果,并进行了进一步的解释。

3.7设备。采用单台PC机对描述的植物病害检测模型进行了全过程的训练和测试。在图形处理单元(GPU)模式下对fcns进行训练。每一次训练都要花大约8个小时在这台机器上。

4. Results and Discussion 

本节给出的结果与整个包含原始图像和增强图像的数据库的训练有关。众所周知,卷积网络能够在更大的数据集上学习特征,因此只包含原始图像的,所以不研究只在原始测试集上训练的结果。经过网络参数的微调,经过100次训练,总体精度达到96.3%(没有微调的结果是95.8%)即使在第30次训练迭代后,仍然可以以极低的损失获得高精度的结果,但在第60次迭代后,均衡器的不精确性和损耗仍然保持在较高的精度。图5中的绿线显示了通过训练迭代,网络在验证测试集上的成功。每经过10000次训练迭代,就会得到该模型的快照。图中的蓝线代表训练阶段的损失。通过训练时的迭代,损失是迅速减小的。

经过100,000次迭代,Top-1的成功率为96.3%,top-5的成功率为99.99%,分别如图6和图7所示。

此外,训练的模型分别在每个类上单独测试。对来自验证集的每个图像执行测试。展示的结果是为了强调每个类中有多少图像是准确预测的。图8显示了训练模型下分别预测每个类的结果。类号遵循表1中的枚举。

从图8显示的结果来看,值得注意的是,对于训练数据集中图像数量较少的类来说,训练模型的准确率较低,更具体的类是桃子、白粉病、苹果、白粉病和葡萄枯萎病。对桃树的白粉病检测精度为91.11%,而对背景图片的检测精度上升到了98.21%。模型对背景图像的预测精度高,能可以很好地分离植物叶片和周围环境。

根据良好的实践原则,所取得的成果应与其他成果进行比较。考虑到本研究开发了自己的图像数据库,到目前为止还没有人使用过。此外,由于没有人在科学文献中使用深度学习来识别植物疾病,因此不可能将其与其他例子进行比较。然而,经过广泛的研究,深度学习技术在模式识别、图像处理和目标检测方面显示出了更好的效果。卷积神经网络[56]在众多的比赛中获胜也证明了这一点。目前,有一种商业化的解决方案——Leafsnap[57],它利用视觉识别来识别特定的植物,尤其是它们的叶子图像。但是,由于本文提出的网络是对植物病害进行分类,而不是对植物的种类进行分类,所以Leafsnap并没有被用来比较所取得的结果。最后,将我们的检测结果与其他从叶片图像中检测疾病的方法进行比较,可以说我们的方法提供了更好的结果[23,24,26,27]。

5. Conclusions 

植物病害的自动或计算机视觉检测与分类方法很多,但这方面的研究还很缺乏。此外,目前市场上还没有商业解决方案,只有那些基于图像的植物物种识别解决方案。本文提出了一种利用深度学习方法对植物病害进行自动分类和检测的新方法。所建立的模型能够检测到叶片的存在,并能够区分健康的叶片和13种不同的疾病,可以进行视觉诊断。描述了从采集用于训练和验证的图像到图像预处理和增强,最后进行深度训练和微调的完整过程。为了检查新创建模型的性能,进行了不同的测试。

建立了新的植物病害图像数据库,其中包含3000多幅从可用的互联网资源中获取的原始图像,并使用适当的转换将其扩展到30000多幅。实验结果表明,在单独的等级测试中,测试精度在91% ~ 98%之间。经训练模型的最终总精度为96.3%。微调并没有显示出整体精度的显著变化,但增强过程有更大的影响,以达到令人满意的结果。

据我们所知,目前所提出的方法在植物病害识别领域还没有被开发出来,使用这种精确的技术也没有与相关结果进行比较。与第二节中所使用和介绍的其他技术相比,特别是考虑到所介绍的研究中有更多的类别时,取得了可比较甚至更好的结果。

本研究的一项扩展将是利用不同的微调和增强技术来收集图像,以丰富数据库和提高模型的准确性。

未来工作的主要目标是开发一个完整的系统,由包含训练模型的服务器端组件和用于智能移动设备的应用程序组成,该应用程序具有基于手机摄像头捕获的叶子图像显示水果、蔬菜和其他植物中识别的疾病等功能。这款应用程序将为农民提供帮助(无论他们的经验水平如何),帮助他们快速有效地识别植物疾病,并帮助他们在使用化学杀虫剂时做出决策。

此外,未来的工作将包括通过训练该模型在更广阔的陆地区域进行植物病害识别,结合无人机捕捉到的果园和葡萄园的航拍照片,以及卷积神经网络用于目标检测,从而推广该模型的使用。通过扩展这项研究,作者在可持续发展方面取得了巨大的影响,影响了未来几代人的粮食质量。

2018-01-08 11:03:00 weixin_34161083 阅读数 81
本文来自AI新媒体量子位(QbitAI)

今天要讲的是个背景遥远的故事。

封存数世纪的植物标本可能包含人类还未发现的新物种,但由于目前还未实现完全数字化,人工鉴别归类植物标本不仅成本高,而且速度慢。

现在,用深度学习算法可以识别植物标本的扫描图片,并判断它是否为还未被记录的新物种。

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

这项成果的研究人员来自哥斯达黎加技术研究所和法国农业发展国际研究中心。昨天,Erick Mata-Montero与Pierre Bonnet等人在学术期刊《BMC Evolutionary Biology》发表了题为《Going deeper in the automated identification of Herbarium specimens》论文。

这是研究人员首次尝试用深度学习解决植物的分类问题。

世界上约有3000个标本博物馆,包含了约3.5亿个标本,其中仅有一小部分实现了数字化。

640?wx_fmt=gif&wxfrom=5&wx_lazy=1

 数字化的植物标本打开了研究人员从世界各地收集标本的新世界

研究人员在26万张标本扫描图像上训练了一种新算法,教算法理解物种分类,之后将训练结果与专家的判定做对比。这个训练图像集中包含了1000多个物种,算法的准确度达到了80%。

还有个意外惊喜。研究人员发现,在法国标本图像上训练的算法,拿到巴西也有效。这种迁移学习的技能避免了很多重复训练。

因为植物标本和新鲜植物看起来差别很大,目前,该算法还无法鉴别新鲜植物的种类。“看来植物学家暂时还不会失业。”外媒Tech Crunch调侃。

最后,附论文链接:

https://bmcevolbiol.biomedcentral.com/articles/10.1186/s12862-017-1014-z

—— ——

本文作者:安妮 
原文发布时间:2017-08-12
没有更多推荐了,返回首页