项目: 使用卷积神经网络CNN进行植物叶子分类

目录

1、引言

1.1、什么是深度学习?

1.2、项目的背景

1.3、数据集的选择与其意义

2、文献回顾

3、方法论

4、数据集预处理

5、实验设置

6、结果分析

1、叶片处理结果,image_size[224,224]:

 2、测试集的模型准确率(accuracy)和损失(loss)的变换情况:

3、训练过程

 4、模型分析评价


1、引言

1.1、什么是深度学习?

        深度学习 (DL,Deep Learning) 是机器学习 (ML,Machine Learning) 领域中的一种新的研究方向, 它通过学习样本数据的内在规律和表示层次,对文字、图像和声音等数据进行解释提供了重要帮助。作为一种复杂的机器学习算法,深度学习在语音和图像识别方面的效果远远超过以前的相关技术。在搜索技术、数据挖掘、机器翻译、自然语言处理、多媒体学习、语音识别、推荐系统、个性化技术等领域,深度学习已经取得了许多成果。

1.2、项目的背景

        而近年来,深度学习技术的快速发展极大地推动了图像处理领域的研究进展。其中,植物叶片分类是一项具有挑战性且具有广泛应用前景的任务,如植物学和农业等领域。通过精确识别植物叶片的形态、硬度、颜色和纹理等特征,植物叶片分类有助于植物分类和疾病监测。本项目旨在使用卷积神经网络(CNN)算法构建植物叶片分类模型,以实现对不同种类植物叶片的准确分类。

1.3、数据集的选择与其意义

        本项目的目标是使用深度学习方法对瑞典叶子数据集(Swedish leaf dataset),该数据集包含了1125张叶片图片, 涵盖了15种不同的植物物种.  通过植物进行分类,对不同植物叶片的自动识别, 有助于我们更好地了解和监测植物物种的多样性和分布情况, 这对植物研究、生态学、评估生物多样性变化和环境监测等方面具有重要意义!

2、文献回顾

        植物叶片分类的任务已经被广泛研究。例如,Khamparia等人(2019)使用SIFT(Scale-Invariant Feature Transform)算法提取叶片图像的特征,并结合支持向量机(SVM)对九种植物进行了分类。Landi等人(2019)则采用深度卷积神经网络对15种植物的叶子进行了分类。Elharrouss等人(2020)则通过应用深度卷积神经网络成功识别了三种水果叶子,并取得了高度精确的结果。

        对于植物叶子分类任务,卷积神经网络(CNN)是一种常用且有效的方法。

3、方法论

        在本项目中,我们采用了一种基于卷积神经网络(CNN)的模型结构来进行图像分类任务。该模型的结构由多个卷积层、池化层和全连接层组成。

        首先,我们添加了一个卷积层,使用32个大小为3x3的卷积核对输入图像进行卷积操作。卷积操作可以提取图像中的局部特征。接着,我们应用了ReLU激活函数,用来引入非线性性质,增强模型的表达能力。 然后,我们添加了一个2x2的最大池化层,用于降低特征图的尺寸,减少计算量,并提取最显著的特征。

model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=X.shape[1:]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

        然后,我们重复添加了几个类似的卷积层和池化层。这些层的目的是逐渐提取图像的更高级特征。我们通过增加卷积核的数量和深度,分别为64、128和64个,来捕捉图像中更丰富的信息。

model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(128, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))


model.add(Conv2D(128, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

        在卷积层和池化层之后,我们添加了一个Flatten层,将3D的特征图转换为1D的特征向量。这样做的目的是为了将图像的特征表示转换为适合全连接层处理的形式。

        接下来,我们添加了两个全连接层。第一个全连接层包含128个神经元,并使用ReLU激活函数。这一层的作用是进一步提取图像特征并进行非线性映射。第二个全连接层包含64个神经元,并使用softmax激活函数。它将生成一个包含64个类别的概率分布,表示输入图像属于每个类别的可能性。

model.add(Flatten())  # this converts our 3D feature maps to 1D feature vectors
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dense(64))
model.add(Activation('softmax'))

        模型的损失函数采用稀疏分类交叉熵,这是因为我们的标签是整数形式的类别标签。优化器采用Adam,是一种常用的优化算法,用于自适应地调整学习率以提高训练效果。

        为了增加数据的多样性和泛化能力,我们使用了图像数据生成器(ImageDataGenerator)。通过设置不同的参数,如图像旋转、剪切、缩放和水平翻转等,生成器可以在训练过程中对图像进行实时的数据增强。这有助于提高模型的鲁棒性和泛化能力。

from keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(
      rotation_range=20,  # 图像旋转
      shear_range=0.2,  # 剪切
      zoom_range=0.2,  # 缩放
      horizontal_flip=True,  # 水平翻转
)
datagen.fit(x_train)
generated_data = datagen.flow(x_train, y_train, batch_size=32)

        在训练过程中,我们使用生成器生成的增强数据作为训练数据,并进行了50轮的训练。同时,我们使用20%的数据作为验证集,用于评估模型在未见过的数据。

4、数据集预处理

        在数据预处理阶段,我们首先设置了数据集路径和定义了类别标签。然后,我们遍历每个类别的图像数据,将其转换为灰度图像,并调整大小以统一输入尺寸。我们将处理后的图像和对应的类别标签添加到训练数据列表中。接着,我们对训练数据进行洗牌,以增加训练效果。最后,我们提取特征和标签,并将它们转换为numpy数组。最终,我们使用train_test_split函数将数据集划分为训练集和测试集,以备模型训练使用。

        在数据增强阶段,我们使用Keras中的ImageDataGenerator来生成增强的图像数据。我们设置了一些参数,包括旋转范围、剪切范围、缩放范围和水平翻转,以增加数据的多样性和泛化能力。然后,我们通过调用datagen.fit(x_train)来适应训练数据,以便在训练过程中应用数据增强。最后,我们使用datagen.flow函数生成批量的增强数据,每个批量包含32个图像和对应的标签,以供模型训练使用。

5、实验设置

硬件软件环境: 硬件未指定, 软件使用Python, OpenCV, Keras, TensorFlow

数据预处理: 读取图像数据集, 灰度处理, 图像显示, 图像尺寸调整, 数据增强.

数据准备: 创建训练数据集, 对数据集进行洗牌.

模型构建: 构建卷积神经网络模型, 添加卷积层和池化层, 添加全连接层, 编译模型.

模型训练: 准备训练数据, 设置训练轮数, 评估指标.

结构分析和展示: 分析指标曲线.

6、结果分析

1、叶片处理结果,image_size[224,224]:

 2、测试集的模型准确率(accuracy)和损失(loss)的变换情况:

3、训练过程

Epoch 1/50
29/29 [==============================] - 3s 85ms/step - loss: 4.3830 - accuracy: 0.1644 - val_loss: 1.7105 - val_accuracy: 0.4311
Epoch 2/50
29/29 [==============================] - 2s 78ms/step - loss: 1.5380 - accuracy: 0.4533 - val_loss: 0.8895 - val_accuracy: 0.6667
Epoch 3/50
29/29 [==============================] - 2s 81ms/step - loss: 1.1314 - accuracy: 0.6233 - val_loss: 0.6525 - val_accuracy: 0.7733
Epoch 4/50
29/29 [==============================] - 2s 77ms/step - loss: 0.8908 - accuracy: 0.6811 - val_loss: 0.5505 - val_accuracy: 0.8133
Epoch 5/50
29/29 [==============================] - 2s 79ms/step - loss: 0.8611 - accuracy: 0.6889 - val_loss: 0.4788 - val_accuracy: 0.8089
Epoch 6/50
29/29 [==============================] - 2s 82ms/step - loss: 0.6180 - accuracy: 0.7867 - val_loss: 0.3086 - val_accuracy: 0.8978
Epoch 7/50
29/29 [==============================] - 2s 80ms/step - loss: 0.4578 - accuracy: 0.8333 - val_loss: 0.2222 - val_accuracy: 0.9244
Epoch 8/50
29/29 [==============================] - 2s 79ms/step - loss: 0.4701 - accuracy: 0.8511 - val_loss: 0.5856 - val_accuracy: 0.7733
Epoch 9/50
29/29 [==============================] - 2s 79ms/step - loss: 0.4856 - accuracy: 0.8422 - val_loss: 0.1706 - val_accuracy: 0.9422
Epoch 10/50
29/29 [==============================] - 2s 80ms/step - loss: 0.4570 - accuracy: 0.8400 - val_loss: 0.5481 - val_accuracy: 0.8311
Epoch 11/50
29/29 [==============================] - 2s 79ms/step - loss: 0.3741 - accuracy: 0.8667 - val_loss: 0.1624 - val_accuracy: 0.9378
Epoch 12/50
29/29 [==============================] - 2s 82ms/step - loss: 0.3623 - accuracy: 0.8733 - val_loss: 0.2120 - val_accuracy: 0.9200
Epoch 13/50
29/29 [==============================] - 2s 78ms/step - loss: 0.2585 - accuracy: 0.9033 - val_loss: 0.3312 - val_accuracy: 0.8844
Epoch 14/50
29/29 [==============================] - 2s 79ms/step - loss: 0.2534 - accuracy: 0.9167 - val_loss: 0.4305 - val_accuracy: 0.8578
Epoch 15/50
29/29 [==============================] - 2s 79ms/step - loss: 0.3276 - accuracy: 0.8778 - val_loss: 0.4584 - val_accuracy: 0.8533
Epoch 16/50
29/29 [==============================] - 2s 80ms/step - loss: 0.2830 - accuracy: 0.8911 - val_loss: 0.3428 - val_accuracy: 0.8844
Epoch 17/50
29/29 [==============================] - 2s 82ms/step - loss: 0.3680 - accuracy: 0.8600 - val_loss: 0.2914 - val_accuracy: 0.8844
Epoch 18/50
29/29 [==============================] - 2s 78ms/step - loss: 0.2078 - accuracy: 0.9278 - val_loss: 0.3698 - val_accuracy: 0.8933
Epoch 19/50
29/29 [==============================] - 2s 80ms/step - loss: 0.1781 - accuracy: 0.9322 - val_loss: 0.2645 - val_accuracy: 0.8889
Epoch 20/50
29/29 [==============================] - 2s 80ms/step - loss: 0.2052 - accuracy: 0.9267 - val_loss: 0.1321 - val_accuracy: 0.9556
Epoch 21/50
29/29 [==============================] - 2s 83ms/step - loss: 0.1729 - accuracy: 0.9433 - val_loss: 0.1993 - val_accuracy: 0.9422
Epoch 22/50
29/29 [==============================] - 2s 83ms/step - loss: 0.1456 - accuracy: 0.9444 - val_loss: 0.2035 - val_accuracy: 0.9289
Epoch 23/50
29/29 [==============================] - 2s 82ms/step - loss: 0.1234 - accuracy: 0.9556 - val_loss: 0.4267 - val_accuracy: 0.8933
Epoch 24/50
29/29 [==============================] - 2s 84ms/step - loss: 0.2661 - accuracy: 0.9133 - val_loss: 0.1252 - val_accuracy: 0.9511
Epoch 25/50
29/29 [==============================] - 2s 81ms/step - loss: 0.3133 - accuracy: 0.8822 - val_loss: 0.2806 - val_accuracy: 0.9111
Epoch 26/50
29/29 [==============================] - 2s 80ms/step - loss: 0.1471 - accuracy: 0.9444 - val_loss: 0.2445 - val_accuracy: 0.9289
Epoch 27/50
29/29 [==============================] - 2s 81ms/step - loss: 0.1558 - accuracy: 0.9433 - val_loss: 0.4494 - val_accuracy: 0.8533
Epoch 28/50
29/29 [==============================] - 2s 79ms/step - loss: 0.2011 - accuracy: 0.9378 - val_loss: 0.1414 - val_accuracy: 0.9467
Epoch 29/50
29/29 [==============================] - 2s 80ms/step - loss: 0.1824 - accuracy: 0.9333 - val_loss: 0.2054 - val_accuracy: 0.9200
Epoch 30/50
29/29 [==============================] - 2s 79ms/step - loss: 0.1106 - accuracy: 0.9600 - val_loss: 0.1882 - val_accuracy: 0.9511
Epoch 31/50
29/29 [==============================] - 2s 80ms/step - loss: 0.1133 - accuracy: 0.9544 - val_loss: 0.2032 - val_accuracy: 0.9511
Epoch 32/50
29/29 [==============================] - 2s 81ms/step - loss: 0.1324 - accuracy: 0.9522 - val_loss: 0.1032 - val_accuracy: 0.9467
Epoch 33/50
29/29 [==============================] - 2s 80ms/step - loss: 0.3362 - accuracy: 0.8733 - val_loss: 0.5771 - val_accuracy: 0.8400
Epoch 34/50
29/29 [==============================] - 2s 82ms/step - loss: 0.2409 - accuracy: 0.9089 - val_loss: 0.1221 - val_accuracy: 0.9644
Epoch 35/50
29/29 [==============================] - 2s 80ms/step - loss: 0.1160 - accuracy: 0.9600 - val_loss: 0.3829 - val_accuracy: 0.8800
Epoch 36/50
29/29 [==============================] - 2s 79ms/step - loss: 0.1392 - accuracy: 0.9589 - val_loss: 0.4001 - val_accuracy: 0.8844
Epoch 37/50
29/29 [==============================] - 2s 79ms/step - loss: 0.1175 - accuracy: 0.9556 - val_loss: 0.1767 - val_accuracy: 0.9556
Epoch 38/50
29/29 [==============================] - 2s 81ms/step - loss: 0.1708 - accuracy: 0.9411 - val_loss: 0.1781 - val_accuracy: 0.9511
Epoch 39/50
29/29 [==============================] - 2s 80ms/step - loss: 0.1120 - accuracy: 0.9544 - val_loss: 0.1408 - val_accuracy: 0.9600
Epoch 40/50
29/29 [==============================] - 2s 79ms/step - loss: 0.1018 - accuracy: 0.9644 - val_loss: 0.1782 - val_accuracy: 0.9467
Epoch 41/50
29/29 [==============================] - 2s 80ms/step - loss: 0.0857 - accuracy: 0.9656 - val_loss: 0.1023 - val_accuracy: 0.9689
Epoch 42/50
29/29 [==============================] - 2s 81ms/step - loss: 0.0687 - accuracy: 0.9767 - val_loss: 0.5150 - val_accuracy: 0.8711
Epoch 43/50
29/29 [==============================] - 2s 81ms/step - loss: 0.1106 - accuracy: 0.9578 - val_loss: 0.1332 - val_accuracy: 0.9644
Epoch 44/50
29/29 [==============================] - 2s 79ms/step - loss: 0.1058 - accuracy: 0.9522 - val_loss: 0.2262 - val_accuracy: 0.9422
Epoch 45/50
29/29 [==============================] - 2s 79ms/step - loss: 0.1035 - accuracy: 0.9656 - val_loss: 0.2113 - val_accuracy: 0.9289
Epoch 46/50
29/29 [==============================] - 2s 80ms/step - loss: 0.1080 - accuracy: 0.9622 - val_loss: 0.2219 - val_accuracy: 0.9556
Epoch 47/50
29/29 [==============================] - 2s 81ms/step - loss: 0.1140 - accuracy: 0.9556 - val_loss: 0.3011 - val_accuracy: 0.9422
Epoch 48/50
29/29 [==============================] - 2s 81ms/step - loss: 0.0706 - accuracy: 0.9767 - val_loss: 0.0671 - val_accuracy: 0.9778
Epoch 49/50
29/29 [==============================] - 2s 80ms/step - loss: 0.0898 - accuracy: 0.9700 - val_loss: 0.0959 - val_accuracy: 0.9689
Epoch 50/50
29/29 [==============================] - 2s 78ms/step - loss: 0.0671 - accuracy: 0.9767 - val_loss: 0.0788 - val_accuracy: 0.9778

 4、模型分析评价

        对于数据集数据较少时,通过数据增强来增加数据集的大小和多样性显得极为重要,训练集精度accuracy和测试集精度val_accuracy都来到0.97附近,缺失值loss慢慢降低到0.06附近,意味着这个模型可以很准确地进行数据预测,并且几乎能够正确识别所有的样本,相对第一个模型效果有显著提升。

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值