付雪婷 ,王新鑫 ,杨凡凡 ,潘 昊
(沈阳化工大学,辽宁 沈阳 110142)
花卉识别是图像识别的一种。图像识别是计算机视觉领域的重要概念之一[1]。目前深度学习的突出领域主要是在图像、音频两大方面。本研究介绍了使用不同深度学习算法对月季品种分类识别的方法[2]。该方法借助卷积神经网络(Convolutional Neural Networks, CNN)将其分为不同的类别,通过图片集训练卷积神经网络模型来提高识别不同月季品种的准确率。同时,介绍了花卉识别的背景、卷积神经网络的原理、相关研究现状以及具体实验设计,最后进行了实验分析和总结。
传统的花卉识别通常是由植物学家完成的,对于大多数人而言,当他们在这个领域的知识和经验不足时,将面临着识别花卉种类的困难[3]。世界上有超过45 万种花,我国约有3 万种花,植物学家无法记住所有的种类。普通人要想认出这些花,就必须在不同搜索引擎的帮助下,通过书籍或互联网进行单调乏味的搜索。对于以上情况,需要设计一个自动化检测和识别花卉种类的软件[4]。建立自动花卉识别的重要性突出在许多方面,比如为采摘机器人提供快速识别;满足植物爱好者识别花卉种类的需求等。花卉识别技术对花卉种类识别经验不足的人来说,不仅能够认出花卉种类,还能节省大量时间和精力。智能农业中的自动采花系统已经被研究了很多年,需要将花朵识别任务集成为系统的一部分。此外,近年来人们对花卉的需求也使其成为农业中重要的商业贸易。
市面上已有诸如形色、花伴侣、百度识图等相关的识别植物的软件,然而这类软件只能识别出花卉或植物的总名称,不能识别出其具体的种类名。比如月季是蔷薇科蔷薇属的一种植物,耐寒,中国是原产国之一,有两千多年的栽培历史,是国内52 座城市的市花。市面上没有识别月季品种的软件,常见的花卉识别软件也未提供开源算法,本研究通过深度学习算法对识别月季品种进行了相关研究与分析[5]。
传统机器学习方法的主要研究内容如下:Nilsback[5]最早提出了花卉图像分割算法,用于分离前景和背景;Chai 等[6]在Nilsback 等的基础上进行改进,提出了一种联合过滤分割算法BiCoS;Angelova等改进了之前的算法,他们先检测图像的low-level位置,接着用Propagation 算法对原始的花卉图像进行全分割。
近年来,以CNN 为基础的深度学习方法更加主流,以GoogLeNet、ResNet、Batch Normalization 等网络模型为代表[7],取得了大幅度进展。有学者采用AlexNet,用ILSVRC 数据集训练好的网络参数初始化网络层(最后一层全连接层除外),以较大的学习速率训练最后一层全连接层,以较小的学习速率微调瓶颈层;Hu 等采用GoogLeNet,先在ILSVRC 数据集上训练网络,之后替换掉最后一层全连接层,再在Oxford-102 Flower 数据集上微调网络;Wu 等采用ResNet50,先在ILSVRC 数据集上训练网络,然后以一个较小的学习速率再对所有网络层进行微调。
深度学习已初步展示了可以从植物图像中学习出具有高判别力的底层纹理特征,是解决月季品种识别的有效工具[8]。许多成功的真实世界图像识别系统需要成百上千的训练示例。无论是开发更好的学习算法,还是增加训练集的规模,都有可能提高对象分类性能。
1.3.1 图像识别
花卉识别是图像识别的一种。目前深度学习的突出领域主要是在图像、音频两大方面。花卉图像识别流程主要有图像预处理、图像分割、特征提取、特征分类[9]。现在,图像分割已被确立为图像处理中的可靠技术,使用图像处理工具可以从图像中提取重要特征。为了从图像中提取重要特征,分割提供了一种快速的解决方案。将图像数字化并将其区分为多个片段以勾勒出感兴趣的区域,这被称为图像分割[10]。图像识别将图像处理得到的图像进行特征提取和分类,目前常用的分类方法包括支持向量机、神经网络等。其中任意一种方法都可以通过计算类别标签的概率来帮助将花卉分类到各自的类别中[11]。
1.3.2 卷积神经网络
神经网络[12]是一个模仿动物神经网络行为的数学算法模型,基本单位是神经元,也称为节点。每个神经元收到输入的线性组合后,先进行简单的线性加权,然后在每个神经元上添加非线性激活函数,经过非线性变换后输出[13]。一个完整的卷积神经网络结构包含输入层、卷积层、激活层、池化层、全连接层[14]。
1)输入层是卷积神经网络各层中的底层,其功能是处理输入数据,如去除平均值,减少数据中的过度偏差,并改善训练效果。
2)卷积层是整个网络的核心层。卷积层包含一组需要学习参数的过滤器。每个过滤器与输入体积相结合,通过权重分配提取输入局部区域的局部函数,并计算由神经元构成的激活图[15]。然后,根据深度将所有滤波器的激活映射进行叠加,得到输出结果。最后,通过一系列内核权重和激活函数生成一个输出函数映射[11]。在神经网络领域广泛使用的整流线性单位被用作激活函数。其输出可以表示为以下数学方程:
式中,f表示一个激活函数,k是核,Mj是对应的一个输入,l表示网络中的层次。
3)激活层常用的激活函数是Sigmoid、ReLU 和Softmax。在卷积神经网络中一般采用ReLu 激活函数,其收敛速度更快。
4)池化层通常位于卷积层的后面。它作为一个子采样,集成了类似的功能,减少了参数的数量。最大池化层的最大值计算为特征图的每一个补丁,最大池化即取区域平均最大,如图1 所示。
图1 最大池化示意图
5)全连接层可以简单理解为一个分类器。全连接层将二维特征映射的输出转换为一维向量。所有神经元都与后续层和相邻层中的神经元完全连接,将学习的“分布式特征表示”映射到样本标签空间。
本研究选取目前比较热门的三个图像识别算法进行对照试验,分别是ResNet、GoogLeNet 及Inception V3,算法参数如表1 所示。
表1 算法参数
2.1.1 ResNet算法
由于存在梯度消失和梯度爆炸的问题,极其深的神经网络很难训练。跳跃连接(Skip connection),它可以从某一网络层获取激活,然后迅速反馈给另外一层,甚至是神经网络的更深层,可以利用跳跃连接构建能够训练深度网络的ResNet。ResNet 算法的重大创新在于增加了残差块(Residual block),不仅大大减少了模型计算量、减少了数据冗余,而且模型的训练准确率与速度得到了提升。
2.1.2 GoogLeNet 算法
GoogLeNet 作为CNN 里比较有名经典的算法,与其他CNN 相比,其增加了处理原始数据的层数,达到了22 层。其基本思想是不用人为决定使用哪个过滤器或者是否需要池化,而是通过添加参数的所有可能值,然后把这些输出连接起来,让网络自己对比不同参数的效果以确定采用哪些参数及组合。即Inception 网络的作用就是代替人们做决定,因此网络架构变得更复杂,计算量变大,但该算法表现却非常好。为了减少计算成本,Inception 网络中加入了1×1卷积。
2.1.3 Inception V3算法
Inception V3 算法在GoogLeNet 的基础上,主要进行了两方面的改造:一是引入了Factorization into small convolutions 的思想,将一个较大的二维卷积拆成两个较小的一维卷积。二是优化了Inception Module 的结构。好处是节约了参数,加快了运算速度并减轻了过拟合,非对称的卷积结构拆分可以处理更多的空间特征,增加特征多样性。
本研究中实验对象选取五种不同的月季,种类名称分别是蓝色风暴、金丝雀、自由精神、果汁阳台和红色龙沙宝石,如图2 至图6 所示。蓝色风暴是蓝紫色重瓣中型月季,金丝雀是黄色微型月季,自由精神是粉色藤本重瓣月季,果汁阳台是橙黄色微型月季,红色龙沙宝石是红色藤本月季。其中,金丝雀和果汁阳台颜色较为接近,作为颜色的对照组。
图2 蓝色风暴
图3 金丝雀
图4 自由精神
图5 果汁阳台
图6 红色龙沙宝石
实验主要用到Anaconda、Python、PyCharm 及TensorFlow等。
2.3.1 月季图像数据库的建立
本实验基于上述五个品种,收集了约1 800 张图片。在构建图像识别系统时,图像数据收集一般不是在环境中搜索对象,就是事先收集对象实例。数据集的质量很大程度上取决于收集和注释的性能。通过搜索引擎及公共社交网络中收集了这五种不同品种的月季图像,对图像集进行了人工筛查,删去了不是该品种的图像。
将图片放在“rose/dataset/train”文件夹中,在该文件夹再新建五个文件夹分别用来放不同种类的图片,把蓝色风暴的图片放入命名为“blue”的文件夹,把金丝雀的图片放入命名为“canary”的文件夹,把自由精神的图片放入命名为“free”的文件夹中,把果汁阳台的图片放入命名为“juice”的文件夹中,把红色龙沙宝石的图片放入命名为“red”的文件夹中。
安装imgaug 库,对分好类别的图片数据进行数据增强,将图片数量扩充为原来的五倍,数据集图片数量约9 000 张。在dataset 文件目录下新建val 文件夹,并按种类新建五个文件夹,将数据增强后的图片打乱随机分为训练集和测试集放入train 和val文件夹中。
2.3.2 安装训练框架
本研究采用TensorFlow+GPU 的方式对月季花卉图像进行神经网络训练,在进行神经网络训练之前需要安装显卡驱动、CUDA、配置CuDNN 以及安装第三方库tf-slim。
2.3.3 图像的预处理
为了减少训练神经网络的计算时间,提高读取数据的效率,对数据进行预处理,利用封装好的create_tf_record.py 模块将图片数据集转换为TFRecords(二进制)格式。
在训练中,应用诸如随机缩放、裁剪和翻转之类的转换,有助于网络通用化,从而获得更好的性能。将图像增强后得到的数据分为训练集和验证集。验证集用于测试模型在未知数据上的性能。为此,其不需要任何缩放或旋转变换,但需要调整大小,然后裁剪图像到适当的大小,如GoogLeNet 要求输入的数据是224*224,因此需要设置存储图片高度为224*224。
2.3.4 搭建神经网络
在上述过程的程序中,将花朵图片处理成适合神经网络输入的形式,并对处理后的图片进行标签处理,随机拆分成训练集和测试集。之后就到了深度学习模型搭建的过程。
本研究主要利用TensorFlow 官方的slim 库搭建网络。谷歌把一些最新的、最重要的大型网络已经实现好并封装在tf-slim 里面,可直接调用。tf-slim 是TensorFlow 中定义、训练和评估复杂模型的轻量级库,可实现精细化操控,可以多GPU 并行训练,快速产出。
在Python 里搭建GoogLeNet、Inception V3、ResNet 的网络结构。定义训练函数的参数,读取转换过的训练集和测试集的TFRecords 数据,利用tf.contrib.slim 定义网络模型,设置默认参数,指定损失函数和准确率,定义优化方案,设置迭代参数及模型保存参数(实保存val 准确率最高的模型)。搭建完成后对月季数据集进行训练。
此外提前新建“models”文件夹,用来保存训练模型后得到的模型。
2.3.5 测试网络模型
测试分类程序=多张图片导入+读取图片+调用模型+预测结果。首先对测试图片进行预处理,进行拉伸、缩小像素、改变纵横比、调色、加滤镜等操作,在测试程序中导入图片,调用训练好的模型进行识别,最后程序输出月季种类预测结果,如图7 至图11所示。通过测试未经训练过的新图像,可以很好地估计模型在全新图像上的性能。
图7 原图
图8 拉伸变形
图9 黑白滤镜
图10 调色
图11 缩小像素
通过运行测试验证新图像和测量准确率,不同算法对比如表2 所示,GoogLeNet 测试集的TOP-1准确率为96.36%,Inception V3 的TOP-1 准确率为97.06%,ResNet50的TOP-1准确率为96.58%。
表2 不同算法对比
通过实验结果可见,本次实验中对于月季品种识别准确率最高的算法是Inception V3,相同的数据集生成训练网络模型最小的是GoogLeNet。ResNet50生成的网络模型最大,TOP-1 准确率略低于Inception V3,但是在迭代过程中,它比其他算法更快达到了较高、较稳定的准确率,由图12 至图14 所示的准确率曲线可以明显看出此结论(横轴为迭代次数,纵轴为准确率)。
图12 GoogLeNet训练准确率
图13 Inception V3训练准确率
图14 ResNet50训练准确率
本研究采用三种不同的卷积神经网络算法进行训练,模型代码还有进一步优化的空间,使其更加适合识别月季花卉。相对于公开数据集的图片数量,文中提到的数据增强后的图片数据集数量还是较少,训练一个准确率高的模型离不开大规模的数据集。
在对新图片进行拉伸变形、加滤镜、调色、缩小像素等操作进行测试时,发现三种算法模型对加了黑白滤镜的图片识别准确率很低。对大批量黑白图片进行测试,准确率最高的是调用Inception V3 的模型,为25%。月季种类很多,本研究仅选用了五个品种。有许多月季品种的颜色、形状、花型相近,这将是识别的难点。接下来可以增加几个月季品种以训练测试其准确率,并可对比更多不同算法的训练速度和准确率。
本研究基于深度学习算法,在Python 环境中使用TensorFlow 框架搭建不同的卷积神经网络算法模型,去训练识别不同品种的月季。通过搜集网络上的有效图片,在进行数据增强后,建立了五个不同品种月季的图片数据集,人工筛查了图片以提高学习正确率。接着为数据集搭建三种卷积神经网络模型进行识别预测。将来可以继续完善,比如利用Python 搭建一个对用户友好的软件界面,可以帮助用户查询具体品种的月季,也有利于收集更多的图像丰富数据集。由于选取的品种比较少,识别的准确率高于预期,但如果是成百上千的月季品种,将无法识别过多的相似度高的月季品种,不同品种的月季有一些极为相似,在这种复杂的情况下,经验丰富的植物专家都很难快速准确地识别相似品种的月季。以后可以考虑从花苞形状、开花花型、花蕊距离、颜色等更多维度提取特征来区分、识别月季种类,进行进一步研究。