首页 > 分享 > 论文分享:EfficientNetB0 网络的鸟类识别

论文分享:EfficientNetB0 网络的鸟类识别

记录本科三年级模式识别课程结课论文,实现鸟类分类识别项目。若有错误和侵权请指出。

目录

摘要

计算错误率分析

数据预处理

模型的构建

构建辅助函数

导入相关模块

加载 EfficientNetB0 模型

设置回调函数 

创建检查点回调

设置 earlystop 回调

设置 ReduceLROnPlateau 回调

训练模型

可视化

准确率曲线和损失曲线

预测测试数据

绘制分类报告

Grad-Cam 可视化

总结

摘要

在全球范围内,生物多样性保护一直是一个至关重要且紧迫的问题。全球约有 30,000 种物种面临灭绝威胁。鸟类作为生态系统的重要组成部分,其种类丰富、分布广泛,对环境变化敏感,是生态健康的重要指示器。因此,对鸟类的研究和保护 具有重要意义。随着科技的发展,传统的鸟类识别方法逐渐暴露出效率低、准确性差等问题。

本文提出了一种基于卷积神经网络(CNN)的迁移学习框架 EfficientNetB0 的鸟 类识别方法。该方法利用 CNN 自动提取鸟类的生物特征,并借助 EfficientNetB0 在计 算效率和识别精度上的优化平衡,显著提升了识别的准确性和效率。EfficientNetB0 已在多个图像识别任务中表现出色,本文详细分析了其在鸟类识别中的应用潜力, 为鸟类保护和研究提供了创新技术解决方案。

数据集包含了 525 种鸟类,其中包括 84635 张训练图像、2625 张测试图像(每种 鸟类 5 张图像)和 2625 张验证图像(每种鸟类 5 张图像)。这是一个高质量的数据集, 每张图像中仅包含一只鸟类,且通常占据图像至少 50%的像素。数据集文件大小为 2.14 GB。 此外,数据集还包含一个名为 bird.csv 的文件,其中包含 5 列数据:filepaths(图像 文件的相对路径)、labels(图像文件关联的鸟类类别名)、scientific_labels(图像的拉丁 学名)、dataset(文件路径位于哪个数据集)、class_id(图像文件的类索引值)。如下表 所示,表 1 展示了部分 bird.csv 数据。

数据集:https://www.kaggle.com/datasets/gpiosenka/100-bird-species

接着根据 bird.csv 的文件对数据集的描述,第一列 fileppaths 包含每个单独图像的文 件路径位置。第二列标签包含来自文件路径的相应图像的类标签,提取数据,将数据放 入数据框中。实现提取数据,将数据放入数据框中的程序见附录 1。 随后,我们提取了出现频率最高的 20 个鸟类标签,并如附录 2 所示进行了可视化 处理,制作了一张展示这些鸟类数量的条形图。下图3具体展示了这些鸟类的数量分布情况,随机选取了数据集中的 8 张图像进行可视化展示。

计算错误率分析

为了评估基于 CNN + EfficientNetB0 模型在鸟类识别任务中的表现,我们引入了错 误率分析(Error Rate Analysis, ERA)方法。该方法通过比较模型在不同压缩质量和数 据增强策略下的预测性能,揭示了模型在处理不同条件下图像质量变化时的鲁棒性和稳 定性。

方法:我们首先采用了错误率分析 ELA(Error Level Analysis)技术来评估数据预 处理阶段中不同 JPEG 压缩质量对鸟类图像识别精度的影响。通过对比原始图像和压缩 3数理与土木工程学院大数据系课程论文 后的图像之间的像素差异,我们能够量化不同压缩质量下图像信息的损失程度,进而分 析模型对这些损失的敏感性。

其次,我们探讨了数据增强方法(如随机旋转、水平翻转等)对模型鲁棒性的影响。 通过引入不同程度的数据增强,我们分析了模型在处理旋转、镜像等图像变换时的表现 变化,以评估模型在面对实际应用中可能遇到的不完美条件时的适应能力。相应的实现 计算错误率分析代码可以在附录 4 中找到。

def compute_ela_cv(path, quality):

temp_filename = 'temp_file_name.jpeg'

SCALE = 15

orig_img = cv2.cvtColor(cv2.imread(path), cv2.COLOR_BGR2RGB)

cv2.imwrite(temp_filename, orig_img, [cv2.IMWRITE_JPEG_QUALITY, quality])

compressed_img = cv2.imread(temp_filename)

diff = SCALE * cv2.absdiff(orig_img, compressed_img)

return diff

def convert_to_ela_image(path, quality):

temp_filename = 'temp_file_name.jpeg'

image = Image.open(path).convert('RGB')

image.save(temp_filename, 'JPEG', quality=quality)

temp_image = Image.open(temp_filename)

ela_image = ImageChops.difference(image, temp_image)

extrema = ela_image.getextrema()

max_diff = max([ex[1] for ex in extrema]) if extrema else 1

scale = 255.0 / max_diff

ela_image = ImageEnhance.Brightness(ela_image).enhance(scale)

return ela_image

def random_sample(path, extension=None):

items = list(Path(path).glob(f'*.{extension}' if extension else '*'))

p = random.choice(items)

return p.as_posix()

在计算错误率分析代码中,compute_ela_cv() 函数接受一个图像路径和一个质量参 数,以给定的质量使用 JPEG 压缩压缩图像,并计算压缩后的图像与原始图像之间的绝 对差值。差值乘以一个比例因子,作为 ELA 图像返回。

convert_to_ela_image() 函数接受一个图像路径和一个质量参数,以给定的质量使用 JPEG 压缩压缩图像,计算压缩后的图像与原始图像之间的绝对差值,并返回 ELA 图像。 ELA 图像是利用原始图像和压缩图像之间的像素值差异来计算的,并进行归一化以增 强差异。

random_sample() 函数接受一个目录路径和一个可选的文件扩展名,并从该目录返 回一个具有指定扩展名 (如果提供了) 的随机文件路径。

最终,通过调用 compute_ela_cv() 函数,我们对动物图像测试数据集中随机选取的 图像生成了误差级别分析(ELA)图像。ELA 图像的生成基于质量降低和压缩水平增加 的原理,从而提高了误差的可视化程度。这些图像利用 matplotlib 库进行绘制,相应的 代码见附录 5。图 4 展示了老鹰图像在不同 JPEG 压缩质量下的 ELA 结果。

在 ELA 图像分析中,q 值代表了 JPEG 压缩质量的变化。JPEG 图像的压缩质量可 以通过调整 q 值来控制,其取值范围通常为 1 到 100。通过观察图 4 中不同压缩质量下 的 ELA 图像,我们可以看到,从 q:100 到 q:60 的压缩范围内,老鹰的基本形态保持不 变,表明不同级别的 JPEG 压缩对老鹰图像的影响相对较小,失真程度较低,从而可以 在保证质量的前提下进行有效压缩。

综上所述,ELA 图像为我们提供了一种直观的方法来分析不同 JPEG 压缩水平对动 物图像的影响,并有助于在动物图像分类任务中确定最佳的图像压缩质量。

后续实验结果表明,在较高的 JPEG 压缩质量下,模型的识别准确率显著提高,而 在低质量压缩下,准确率明显下降。此外,数据增强技术在提高模型对姿态变化较大的 图像的鲁棒性方面发挥了重要作用。

数据预处理

数据集将被划分为三个独立的部分:训练集、验证集和测试集。训练集用于深度学 习卷积神经网络(CNN)模型的训练过程,验证集则用于调整模型的参数以优化性能。 最终,测试集将用于客观评估模型的性能表现。数据集划分的具体实现细节可以在附录 6 中找到。

为了进一步提升模型的泛化能力和鲁棒性,我们将对训练数据进行数据增强处理。 数据增强(Data Augmentation)是一种在深度学习模型训练中常用的技术,它通过对原 始训练样本进行一系列随机变换,如旋转、缩放、裁剪和颜色调整等,来生成额外的训 练样本。这一过程不仅增加了数据的多样性,还有助于降低模型过拟合的风险,从而提 高模型在实际应用中的表现。数据增强的相关代码实现已在附录 7 中提供。

模型的构建

构建辅助函数

在开始构建模型之前,为了简化后续的模型构建过程,我们设计了一系列辅 助函数。这些辅助函数的完整代码详见于附录 8。通过使用 from import 语句,我 们从 helper_functions.py 模块中导入了以下七个辅助函数:create_tensorboard_callback、 plot_loss_curves、unzip_data、compare_historys、walk_through_dir、pred_and_plot 和 calculate_results。下面将逐一解释这些函数的作用:

1. create_tensorboard_callback 函数用于创建一个 TensorBoard 回调实例,该实例用 于记录训练过程中的日志文件。这些日志文件会被存储在包含目标目录、实验名称以及 当前日期时间的路径下。

2. plot_loss_curves 函数负责绘制训练和验证过程中的损失曲线以及准确率曲线。该 函数接收一个 TensorFlow 模型的 history 对象作为输入,并输出训练和验证过程的损失 和准确率曲线图。

3. unzip_data 函数用于解压缩指定的 zip 文件到当前工作目录。它接受 zip 文件的路 径作为输入,并将其内容解压至当前目录。

4. compare_historys 函数用于比较两个 TensorFlow 模型的 history 对象。这些对象分 别代表原始模型的训练历史和继续训练后模型的历史。该函数会绘制训练和验证的准确 率及损失曲线,并在图中标明微调的起始点。

5. walk_through_dir 函数遍历给定目录并列出其内容。该函数会输出目录中子目录 的数量、每个子目录中的文件数量以及每个子目录的名称。

6. pred_and_plot 函数导入指定路径的图像,使用训练好的模型进行预测,并绘制图 像及其预测的类别。该函数会预处理图像,然后使用模型进行预测,并在图像上显示预 测结果作为标题。

7. calculate_results 函数用于计算模型的准确率、精确度、召回率和 F1 分数。该函 数接收真实标签和预测标签作为输入,并返回一个包含这些指标的字典。

这些辅助函数为模型的构建和评估提供了必要的支持,确保了研究过程的顺利进行。

导入相关模块

在导入模块部分,代码导入了各种数据科学库,包括 TensorFlow 和 scikit-learn,并使用 effentnet 架构定义了一个神经网络模型。它还包括用于处理文件路径的系统库和用 于评估模型性能的度量。此外,它还设置了各种回调和优化器来优化训练过程。导入的 相关模块请看附录 9。

加载 EfficientNetB0 模型

EfficientNet 是由谷歌提出的一种高效卷积神经网络架构,它在多种计算机视觉任 务中展现了卓越的性能。EfficientNetB0 是该架构系列中最基础、计算成本最低的模型。 该模型采用了复合缩放(Compound Scaling)的方法,通过系统地调整网络的深度、宽度 和输入分辨率来平衡性能与效率。使用在 ImageNet 数据集上预训练的权重,可以加快 模型在新数据集上的收敛速度并提升其表现。以下代码演示了如何加载 EfficientNetB0 模型的过程。

pretrained_model = tf.keras.applications.efficientnet.EfficientNetB0(

input_shape=(224, 224, 3),

include_top=False,

weights='imagenet',

pooling='max'

)

pretrained_model.trainable = False

下载EfficientNetB0模型的预训练权重文件,网址:”https://storage.googleapis.com/kerasapplications/efficientnetb0_notop.h5” 。该文件包含了 EfficientNetB0 模型在 ImageNet 数 据集上预训练的权重,但不包括模型的顶层(即最后的全连接层)。保存到本地代码文 件目录中,文件命名为”efficientnetb0_notop.h5”。

模型的超参数设置如下: 批量大小:32 迭代次数:100 输入形状:(224,224,3) 输出层:525

设置回调函数 

创建检查点回调

创建检查点回调的目的是在训练过程中保存模型的最佳权重,以便在验证集上取得 最佳性能。具体来说,代码如下:

checkpoint_path = "birds_classification_model_checkpoint"

checkpoint_callback = ModelCheckpoint(checkpoint_path,

save_weights_only=True,

monitor="val_accuracy",

save_best_only=True)

checkpoint_path: 指定检查点文件保存的路径。save_weights_only=True: 只保存模型 的权重,而不是整个模型。monitor=”val_accuracy”: 监控验证集上的准确性(val_accuracy), 以判断何时保存模型。save_best_only=True: 只保存在验证集上表现最好的模型。

设置 earlystop 回调

EarlyStopping 回调的目的是在验证损失在一段时间内不再改善时提前停止训练,防 止模型过拟合。具体来说,代码如下

early_stopping = EarlyStopping(monitor="val_loss",

patience=5,

restore_best_weights=True)

monitor=”val_loss”: 监控验证集上的损失(val_loss)。patience=5: 如果验证损失在 连续 5 个 epoch 内没有改善,就停止训练。restore_best_weights=True: 在训练结束后,恢 复模型在验证集上表现最好的权重。

设置 ReduceLROnPlateau 回调

ReduceLROnPlateau 回调的目的是在验证损失在一段时间内不再改善时减少学习 率,从而提高模型的性能。具体来说,代码如下:

reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2, patience=3, min_lr=1e-6)

monitor=’val_loss’: 监控验证集上的损失(val_loss)。factor=0.2: 当验证损失不再改 善时,将学习率减少到原来的 20patience=3: 如果验证损失在连续 3 个 epoch 内没有改 善,就减少学习率。min_lr=1e-6: 设置学习率的下限,防止学习率过低。

这些回调函数的组合可以帮助优化模型训练过程,确保在验证集上取得最佳性能, 同时防止过拟合并提高训练效率。可以查看其他文章,更加详细了解各种回调函数。

训练模型

基础模型选择:为了充分利用预训练模型在大规模数据集上学到的丰富特征表示, 我们选择了 EfficientNetB0 作为基础模型。EfficientNetB0 是一种先进的卷积神经网络 (CNN)架构,它不仅能够提升模型的性能,还能增强模型的泛化能力,非常适合作为 特征提取器。表 2 详细展示了构建的模型结构。具体的模型构建过程和代码实现可以在 附录 10 中找到。

其中类型列说明了每个层的类型,如 Dense(全连接层)、Activation(激活函数)、 Dropout(随机失活层)等。

顶层网络结构:在基础模型的输出之上,添加了几个全连接层(Dense 层)和 Dropout 层。Dense(128, activation=’relu’):第一个全连接层,有 128 个神经元,使用 ReLU 激活 函数。Dropout(0.45):第一个 Dropout 层,随机丢弃 45% 的神经元,用于减少过拟合。 Dense(256, activation=’relu’):第二个全连接层,有 256 个神经元,同样使用 ReLU 激活 函数。Dropout(0.45):第二个 Dropout 层,再次随机丢弃 45% 的神经元。

输出层:最后的输出层是一个 Dense 层,有 525 个神经元,使用 softmax 激活函数。 softmax 函数将模型的输出转换为概率分布,用于多分类问题,这里的 525 表示模型可 以预测的不同类别数量。

该模型连续训练了 27 个小时,模型保存至代码文件夹中。

模型评估

完成了模型的训练过程,接下来进行模型的评估,先对模型评估指标进行简单的介绍。测试数据集将用于评估模型的性能。要测试的指标之一是准确度,它衡量模型正确 预测的比例。其他指标如下:

精度(P):正确率(TP,正确预测)占相关结果总量的比例,即 TP 和假阳性(FP) 的总和。对于多类分类问题,P 是各类之间的平均值。以下是精度的公式。

P=TPTP+FP" role="presentation">P=TPTP+FP

召回率 (R):TP 占 TP 总量和假阴性 (FN) 的比例。对于多类分类问题,R 在所有类 别中取平均值。以下是召回率的公式。

R=TPTP+FN" role="presentation">R=TPTP+FN

F1 分数:准确率和召回率的调和平均值。对于多类分类问题,F1 在所有类别中取 平均值。以下是 F1 分数的公式。

F1=2×TP×FPTP+FP" role="presentation">F1=2×TP×FPTP+FP

计算模型的准确率:

results = model.evaluate(test_images, verbose=0)

print("Test Loss:{:.5f}".format(results[0]))

print("Test Accuracy:{:.2f}%".format(results[1] * 100))

结果:Test Loss: 0.56063 Test Accuracy: 83.17%

可视化

准确率曲线和损失曲线

仅仅依靠观察准确率的结果无法清楚直接观察模型性能,需要经过可视化过程。可 视化准确率曲线(Accuracy Curve)显示了模型在训练和验证过程中的分类准确率随着 epoch 数量的变化情况。在深度学习中,评估模型训练过程表现的另外一种常见方法是 可视化损失曲线。这些曲线通常显示了模型在训练过程中损失函数的变化情况,可以帮 助分析模型的收敛情况以及是否存在过拟合或欠拟合问题。因此,我绘制了两幅图如图 6 所示,分别是准确率曲线和损失曲线,相关的实现绘制准确率曲线和损失曲线代码见 附录 11。

观察图 6 可以清楚直观看出,在 0 至 20 个 epoch 期间,模型的准确率迅速上升,同 时损失迅速下降,使得模型的准确率达到了 0.8,可见模型性能良好。随后,从 20 至 80 个 epoch 期间,准确率持续缓慢上升并逐渐趋于稳定,同时损失呈相反方向缓慢下升并 逐渐趋于稳定。

预测测试数据

接着,我们使用所训练的 EfficientNetB0 模型对测试数据进行了预测。附录 12 中展 示了相关代码,测试结果图像如图 7 所示。令人欣喜的是,模型对测试数据的预测结果 全部正确,验证了其在鸟类识别任务中的高效性和准确性。

总的来说,在鸟类识别任务中,EfficientNetB0 通过其优异的特征提取能力和模型 学习能力,能够有效地识别不同种类的鸟类图像。其在训练过程中表现出色,能够快速 收敛并达到较高的准确率。此外,EfficientNetB0 的设计考虑了模型的轻量化和高效性, 使其在处理大规模图像数据时能够保持较低的计算资源消耗和模型复杂度。

绘制分类报告

分类报告是评估图像分类模型性能的重要工具,它总结了模型的关键性能指标,包 括精确度、召回率、F1 分数以及整体准确率。这些指标为模型的优势和劣势提供了快 速评估,并且通常按类别细分,以便于分析模型在不同类别上的表现。报告通常以表格 形式呈现,每行代表一个类别,列显示各种性能指标。此外,报告还包括支持度(特定 类别的测试样本数量)以及所有类别的性能指标的宏观和微观平均值,这些数据有助于 更全面地理解模型的性能。

表 3 是我们的模型在测试集上的分类报告。从报告中可以看出,模型在大多数类别 上都有较高的精确度和召回率,表明模型具有良好的分类能力。然而,也存在一些类别, 如 ABBOTTS BOOBY,其精确度和召回率较低,这可能是由于这些类别的样本在训练 集中不足或者模型难以区分这些类别。整体而言,模型的准确率为 87.27%,宏观平均 F1 分数为 87.08%,显示出模型在整体上具有良好的性能,但在某些特定类别上仍有改 进空间。运行代码以及运行结果图见附录 13。

Grad-Cam 可视化

Grad-CAM(Gradient-weighted Class Activation Mapping)是一种流行的可视化技术, 用于解释深度学习模型在图像分类中的决策过程。它提供了一种直观的方式来观察模型 在做出预测时关注的图像区域,从而增加了模型预测的可解释性。Grad-CAM 是对原始 CAM 技术的改进,适用于任何以卷积神经网络(CNN)为基础的模型。


设计者的想法还是比较简单的,参见下图8。这里我们简单看下Image Classification任务,首先网络进行正向传播,得到特征层 AAA" role="presentation">AAA(一般指的是最后一个卷积层的输出)和网络预测值 yyy" role="presentation">yyy(注意,这里指的是softmax激活之前的数值)。假设我们想看下网络针对Tiger Cat这个类别的感兴趣区域,假设网络针对Tiger Cat类别的预测值为 yyc" role="presentation">yyc。接着对 yyc" role="presentation">yyc 进行反向传播,能够得到反传回特征层 AA´" role="presentation">AA´ 的梯度信息 A′" role="presentation">A′。通过计算得到针对特征层 AAA" role="presentation">AAA 每个通道的重要程度,然后进行加权求和通过ReLU就行了,最终得到的结果即是Grad-CAM。
 

Grad-CAM 的工作原理是基于梯度信息来识别模型在预测时最为关注的图像区域。 具体而言,它通过计算最后一个卷积层中特征图与目标类别梯度之间的加权相关性,生 成一个热力图,该热力图突出了模型在做出分类决策时重点考虑的图像部分。这个过程 首先确定每个特征图通道对预测类别的贡献程度,然后通过加权求和这些通道,生成一 个综合的特征图,进而形成热力图。

Grad-CAM 的可视化代码已在附录 14 中提供。通过 Grad-CAM 生成的热力图,我 们可以更深入地理解模型是如何对图像进行分类的。下图 9 展示了 Grad-CAM 可视化的 一些示例结果,其中每个热力图都揭示了模型在识别特定鸟类时关注的图像区域。

总结

本研究探讨了基于 EfficientNetB0 网络的鸟类识别技术,它融合了深度学习与生物 特征识别的最新成果,旨在提升鸟类保护和生态学研究的效率与精确度。本研究选择 EfficientNetB0 作为基础模型,在鸟类识别任务中展现了其卓越的性能。EfficientNetB0 因其高效与高精度的平衡而著称,为解决传统方法效率低和准确性不足的挑战提供了创 新方案。

在模型构建环节,本文详细描述了 EfficientNetB0 的结构及其在鸟类识别中的应用。 通过数据预处理、回调函数的设定以及训练过程的优化,模型在训练和评估阶段均表现 出良好的性能。特别是在模型评估环节,通过准确率曲线、损失曲线以及详尽的分类报 告,读者可以全面了解模型在不同鸟类数据集上的分类准确性和效率。

值得一提的是,本文还引入了 Grad-CAM 技术,通过可视化模型的注意力区域,深 入分析了模型决策的依据,进一步增强了论文的解释性和可视化效果。这种技术不仅有 助于理解模型的内部工作机制,还能验证模型是否基于合理的视觉证据进行决策,为鸟 类保护和生态监测提供了新的研究视角和方法。

综上所述,本研究不仅在技术层面上深入探讨了深度学习在鸟类保护中的应用,而 且在方法论和实证研究方面为相关领域提供了具有前瞻性和推动力的研究成果。通过结 合现代深度学习技术与生物多样性保护的实际需求,本研究为未来更广泛的生态系统监 测和保护工作提供了新的技术支持和方法指导。

相关知识

鸟类的社交网络,研究揭示了鸟类如何识别和转发新闻
最新最全论文合集——基于机器学习/深度学习的情绪识别
NVIDIA Jetson 月度项目:通过声音识别鸟类
动物所在鸟类声音识别研究中取得新进展
识别鸟类的软件有哪些 可以识别鸟类的app合集
科学网—鸟类种内声音识别研究获新进展
常见鸟类识别指南.pptx
《自然:神经科学》论文:动物视觉系统里的RNN能加速物体识别
基于YOLOv5s网络模型的牛只日常行为识别与统计研究
在线识别鸟类

网址: 论文分享:EfficientNetB0 网络的鸟类识别 https://m.mcbbbk.com/newsview656835.html

所属分类:萌宠日常
上一篇: 基于深度学习的鸟类物种智能识别的
下一篇: 肆十二/YOLOV5