使用卷积神经网络进行花朵识别

2025年1月11日 | 阅读 8 分钟

引言

鲜花一直是人类着迷和灵感的源泉。自然世界的美丽和多样性几个世纪以来一直在艺术、文学和科学中得到赞颂。随着机器学习和计算机视觉的进步,我们现在能够自动识别和分类不同种类的花卉。在这篇文章中,我们将讨论卷积神经网络 (CNN) 在花卉识别中的应用。

什么是卷积神经网络 (CNN)?

卷积神经网络 (CNN) 是一种专门用于图像识别应用的特定类型的神经网络。它们由多个层组成,这些层协同工作以从图像中提取和学习特征。CNN 特别擅长识别图像中的模式,这使得它们非常适合对象识别、面部检测以及当然还有花卉识别等任务。

近年来,在计算机视觉领域,卷积神经网络 (CNN) 越来越受欢迎。它们是一种专门为图像识别任务设计的神经网络,但它们也可以用于其他类型的数据,例如音频和文本。

CNN 的基本设计由多个层组成,每个层都有特定的用途。通常,卷积层作为初始层。它将多个滤波器应用于输入图像以提取特征。滤波器是小的权重矩阵,它们在输入图像上滑动,每个滤波器生成一个输出,表示输入图像中特定特征的存在。

在卷积层之后,网络通常包括一个或多个池化层,这些层通过聚合相邻像素中的信息来减小输出的大小。因此,需要学习的参数更少,从而提高了网络的效率。

网络的最后一层,通常是全连接层,接收前一层的输出,并生成一个概率向量,显示输入所属的许多类别中每个类别的可能性。反向传播是一种使用损失函数相对于网络参数的梯度来更新权重的方法,以最小化损失。在训练过程中,反向传播用于调整卷积层中滤波器的权重和全连接层的权重。CNN 的优点之一是它们能够学习输入数据的分层表示,每一层学习比前一层更抽象的特征。这是因为网络早期层中的滤波器对边缘和角点等低级特征敏感,而后期层中的滤波器则

CNN 如何工作?

要使 CNN 正常工作,输入图像必须通过几个卷积层。每个卷积层应用一组滤波器到输入图像,以识别各种特征,如边缘、角点和纹理。然后,将非线性激活函数(例如修正线性单元 (Relu))应用于每个卷积层的输出,以帮助将非线性引入网络并增强其学习复杂特征的能力。

在卷积层之后,网络通常包含一个或多个全连接层,用于将输入图像分类到几个类别之一。在训练期间,使用反向传播和梯度下降来更新卷积层中滤波器的权重以及完全连接层的权重,以训练网络识别输入图像的各种特征并对其进行适当分类。

使用 CNN 进行花卉识别

花卉识别是一项具有挑战性的任务,原因在于花卉种类繁多,以及同一种类的不同个体之间外观上存在细微差异。然而,CNN 已被证明在此任务中非常有效,在多个基准数据集上取得了最先进的结果。

其中一个数据集是牛津花卉 102 数据集,其中包含 102 种不同花卉的图像。要在此数据集上训练用于花卉识别的 CNN,我们首先需要对图像进行预处理,以确保它们都具有相同的大小和格式。这很重要,因为 CNN 要求输入图像具有固定大小和通道数。图像预处理完成后,我们可以使用一种称为迁移学习的技术来训练 CNN。迁移学习涉及使用在大型数据集(例如 ImageNet)上预训练的 CNN,并针对我们的特定任务对其进行微调。其思想是,预训练的网络已经学会了识别许多对图像识别任务有用的不同特征,因此我们可以将其用作我们自己网络的起点。

为了微调用于花卉识别的预训练网络,我们需要将最终的全连接层替换为一个新的层,该新层具有与我们数据集中花卉种类数量相同的输出节点数。然后,我们可以使用一种称为随机梯度下降 (SGD) 的技术,在牛津花卉 102 数据集上训练网络。

数据集

开发花卉识别系统的第一步是收集花卉图像数据集。有许多可用于花卉识别的数据集,包括牛津花卉数据集、花卉-102 数据集和 TACoS 多标签花卉数据集。在本文中,我们将使用花卉-102 数据集,该数据集包含 102 个花卉类别,每个类别有 20 到 258 张图像,总计 8,189 张图像。

花卉-102 数据集分为三个部分:训练集、验证集和测试集。训练集包含 6,149 张图像,验证集包含 1,020 张图像,测试集包含 2,020 张图像。该数据集可从 http://www.robots.ox.ac.uk/~vgg/data/flowers/102/index.html 下载。

CNN 架构

用于花卉识别的 CNN 架构由多个层组成,包括卷积层、池化层和全连接层。卷积层的目的是提取输入图像的特征。池化层减少了卷积层输出的维度,从而降低了网络的计算复杂度。全连接层将输入图像分类到其中一个花卉类别中。

用于花卉识别的架构基于 VGG16 架构,这是一种用于图像识别任务的流行 CNN 架构。VGG16 架构由 13 个卷积层、5 个池化层和 3 个全连接层组成。

网络的输入是尺寸为 224x224x3 的 RGB 图像。前两个卷积层各有 64 个滤波器,核大小为 3x3,步长为 1。接下来的两个卷积层各有 128 个滤波器,核大小为 3x3,步长为 1。接下来的三个卷积层各有 256 个滤波器,核大小为 3x3,步长为 1。接下来的三个卷积层各有 512 个滤波器,核大小为 3x3,步长为 1。最后三个卷积层各有 512 个滤波器,核大小为 3x3,步长为 1。池化层出现在前两个卷积层之后,然后是每对后续的两个卷积层。池化大小为 2x2,步长为 2,池化级别为最大池化层。三个全连接层分别有 4096、4096 和 1024 个单元。最后一个全连接层的输出通过 softmax 激活函数,给出每个花卉类别的概率。

训练过程

训练过程涉及将训练数据输入 CNN,并调整网络权重以最小化损失函数。用于花卉识别的损失函数是分类交叉熵损失函数,这在多类分类问题中常用。

训练过程包括以下步骤

  • 数据预处理:训练过程的第一步是预处理数据。这包括将图像调整为固定大小(在本例中为 224x224),将像素值归一化到 0 到 1 之间,并通过随机应用旋转、翻转和缩放等变换来增强数据。
  • 初始化权重:然后必须初始化网络权重。在大多数情况下,使用均值为 0,标准差为 0.1 的正态分布来设置权重。
  • 前向传播:下一步是进行一次前向扫描网络。将输入图像输入网络,并使用网络当前权重计算每一层的输出。最后一层的输出是花卉类别的概率分布。
  • 计算损失:下一步是计算损失函数。分类交叉熵损失函数用于衡量预测概率分布与真实概率分布之间的差异。真实概率分布是花卉类别标签的独热编码。
  • 反向传播:接下来的动作是在网络中进行反向运行。使用微积分的链式法则计算损失函数相对于网络权重的梯度。在接下来的阶段,使用梯度更新网络的权重。
  • 更新权重:借助随机梯度下降等优化方法,更新网络权重 (SGD)。SGD 更新准则为
    w = w - learning_rate * gradient
    其中 w 是权重,learning_rate 是控制更新步长的超参数,gradient 是损失函数相对于权重的梯度。
  • 重复:重复上述步骤固定次数的 epoch,或者直到验证集上的性能停止提高。

结果

在对 Flower-102 数据集进行 50 个 epoch 的 CNN 训练后,评估了测试集上的性能。模型的准确率为 86.1%,这比基于人类专家知识的传统花卉识别方法有了显著改进。

结果和结论

通过这种方法,我们可以在牛津花卉 102 数据集上实现非常高的准确性。例如,最近一项研究使用带有 ResNet-50 架构和迁移学习的 CNN,其精度为 98.23%。

总之,CNN 是花卉识别的强大工具,已在多个基准数据集上取得了最先进的结果。通过使用迁移学习,我们可以利用已经学会识别许多有用特征的预训练网络,并针对我们的特定任务进行微调。我们使用 Flower-102 数据集和 VGG16 架构来训练 CNN 以识别花卉图像。结果表明,CNN 能够比基于人类专家知识的传统花卉识别方法获得显著更高的准确率。CNN 学习了与花卉识别相关的特征,并且这些特征可以转移到其他图像识别任务。