【深度学习】“复杂场景下基于深度学习的卷积神经网络在鸟类多类别识别中的模型设计与性能优化研究”(下)
大家好 我是寸铁👊
【深度学习】“复杂场景下基于深度学习的卷积神经网络在鸟类多类别识别中的模型设计与性能优化研究”(下)✨
喜欢的小伙伴可以点点关注 💝
前言
***本次【深度学习】"复杂场景下基于深度学习的卷积神经网络在鸟类多类别识别中的模型设计与性能优化研究"分为
上、中、下
三个部分,后续持续更新,感兴趣的朋友可以继续关注~***
代码无偿,记得进入网站fork一下谢谢!
全部源代码地址:
github.com/Joyflower/Brid_CCN/tree/master/
随着科技的进步和深度学习技术的广泛应用,卷积神经网络(CNN)作为一种强大的图像识别工具,在复杂环境中的应用日益引起关注。特别是在鸟类多类别识别这一领域,CNN展现出了巨大的潜力和应用前景。然而,面对复杂场景下的挑战,如光照变化、背景噪声和鸟类姿态的多样性,如何设计和优化CNN模型以提高识别的准确性和鲁棒性仍然是一个重要的研究课题。
本研究旨在探索基于深度学习的卷积神经网络在鸟类多类别识别中的应用潜力,通过深入分析模型设计和性能优化的方法,以应对复杂环境带来的挑战。通过系统的实验验证和性能评估,本研究试图为解决实际应用中的识别难题提供创新的解决方案和理论支持。
模型测试
模型测试流程图
图35 模型测试图
由上图35所示:主进程结束后,子进程负责对模型进行测试。先编写鸟类分类报告,并将分类报告写入到
Excel
文件中。绘制出条件好的正确识别除的鸟类数量的柱状图和趋势图。
启动子进程
具体实现如下:
在完成了上述模型训练部分后,接着继续完成模型测试,调用子进程执行模型测试脚本对训练好的模型进行测试。调用subprocess.run()
函数用于执行指定的命令,并等待其完成。它接受一个列表作为参数,列表的第一个元素是要执行的命令,后续元素是该命令的参数。
参数列表["python", "Brid_Test_9.py", "--file_path", file_path]
:
"python"
:这是要执行的命令。在这里,表示运行 Python 解释器。
"Brid_Test_9.py"
:是要执行的 Python 脚本文件名。
"--file_path"
:是 Brid_Test_9.py 脚本的命令行参数,表示文件路径或者文件相关的信息。
file_path
:是一个变量,包含了要传递给 Brid_Test_9.py 脚本的实际文件路径或文件相关信息。
当这段代码被执行时,Python 解释器会启动一个新的进程来执行 Brid_Test_9.py 脚本。Brid_Test_9.py 脚本在执行时可以使用 --file_path 参数来获取 file_path 变量的值,以便在其内部处理或操作相关文件。如下图36所示:
图36 主进程结束,启动子进程
解析主进程文件路径
进入到子进程中执行子进程测试程序:
先创建了一个
ArgumentParser
对象
parser
,用于解析命令行参数。
向
ArgumentParser
对象中添加命令行参数的定义。
"--file_path"
是命令行参数的名字,这里表示用户可以通过 --file_path 选项来指定文件路径。
再调用
parse_args()
方法解析命令行参数,并将其存储在 args 对象中。一旦 args 对象被赋值,你可以通过
args.file_path
访问 --file_path 参数的值。
在绘制图像或进行其他操作时,可以使用 args.file_path 的值作为保存图像的路径。例如,可以将绘制的图像保存到用户指定的路径中。如下图37所示:
图37 解析主进程保存文件路径入参
图片编号映射
- 首先,调用
glob.glob()
函数根据通配符模式返回所有符合条件的文件路径列表。读取'test/*/*.jpg'
即test
文件夹下的所有子文件夹中查找所有以.jpg
结尾的文件。定义imgs_path
变量,用于保存所有符合条件的图像文件的路径列表。
- 接着,继续遍历
imgs_path
中的每个文件路径 img_p。img_p.split('\\')[1]
将路径按照反斜杠\
分割,取第二部分,这通常是标签的名称。split('.')[1]
又将该部分按照点.
分割,取第二部分,通常是文件扩展名(如 jpg),这里实际上是获取图像的标签名称。
- 然后,定义
all_labels_name
列表存储了所有图像的标签名称。使用np.unique()
函数用于获取数组中的唯一值,并返回已排序的唯一值数组。用labels_names
变量保存了所有图像标签名称的唯一值列表,即去重后的结果。 之后,使用字典推导式,将每个标签名称映射为一个唯一的整数序号。调用enumerate(labels_names)
遍历labels_names
列表并同时获取每个元素的索引 i 和元素值name
。
- 创建
label_to_index
是一个字典,将标签名称作为键,索引作为值。使用字典推导式,创建了一个将索引号映射回标签名称的字典。label_to_index.items()
返回label_to_index
字典中所有键值对的视图。(v, k)
表示将字典中的键值对颠倒,即原来的值作为键,原来的键作为值。index_to_label
是一个字典,将索引作为键,对应的标签名称作为值。如下图38所示:
图38 图片编号映射
加载预测模型
然后,定义了图像的高度和宽度,通常用于指定输入模型的图像大小。在这里,图像被假设为正方形,高度和宽度均为
256
像素。
tf.keras.models.load_model()
是
TensorFlow 的 Keras API
提供的函数,用于从磁盘加载已经训练好的模型。
"models/best_model.h5.keras"
是模型文件的路径,假设模型保存为
HDF5
格式(.h5 文件),并且包含在文件名中标识了其类型(.keras 可能是为了指示文件的具体用途或来源)。
model
变量将加载后的模型对象存储在其中,可以使用该对象进行后续的预测或特征提取等操作。如下图39所示:
图39 加载模型
遍历预测集
- 先初始化
true_labels
和pred_labels
空列表,用于存储每张图像的真实标签和模型预测的标签。再将count
初始化为0
,用于统计识别的图片数量。使用for path in imgs_path
循环遍历每个图像文件的路径。接着,使用Keras
的load_img
函数加载图像,并将图像大小调整为(img_height, img_width)
。
- 再使用
img_to_array
将加载的图像转换为NumPy
数组。调用expand_dims
将数组在第一个维度上扩展,使其变为形状(1, img_height, img_width, channels)
,其中channels
取决于图像的通道数。
- 接着,对图像数据进行归一化,将像素值缩放到
[0, 1]
之间,这是深度学习模型输入的常见要求。使用model.predict(data)
使用预加载的深度学习模型对归一化后的图像进行预测,返回预测结果。调用np.argmax(result)
找到预测结果中概率最高的类别对应的索引,即预测的类别。
- 再用
labels_names[pred_class]
根据预测的类别索引,从之前创建的labels_names
数组中获取对应的标签名称pred
。path.split('\\')[1]
分割路径字符串,并取第二部分,通常是图像文件所在的子文件夹名称,这里假设作为真实标签。split('.')[1]
再次分割该部分字符串,获取真实标签的具体名称,通常是文件扩展名之前的部分。初始化true_labels
和pred_labels
列表分别存储每张图像的真实标签和预测标签。如下图40所示:
图40 循环遍历预测图片识别结果
编写分类报告
- 初始化
true_labels
和pred_labels
分别是存储真实标签和预测标签的Python
列表。这里通过np.array()
将它们转换为NumPy
数组,以便后续的数据分析和处理。再使用classification_report
函数生成并打印分类报告。这份报告会显示模型在每个类别上的精确度、召回率、F1 值
等评估指标。参数target_names
是类别的名称列表,用于报告的标签注释。
- 接着,调用
classification_report
函数,设置output_dict=True
以获取一个字典格式的分类报告。这种格式更便于后续的程序化处理和分析。使用Pandas
将字典格式的分类报告report
转换为DataFrame
格式。这使得报告可以更方便地进行数据操作和分析。.transpose()
是对DataFrame
的操作,将行和列进行转置,使得指标(如精确度、召回率等)作为列名。
- 最后,将转换为
DataFrame
的分类报告report_df
写入到 Excel 文件中,文件名为"classification_report.xlsx"
,工作表名称为"Test Report"
。如下图41所示:
图41 编写分类报告
- 接着,初始化
true_labels
是一个数组或列表,存储了真实的标签值。labels_names
是一个包含所有可能标签的列表或集合。{label: np.count_nonzero(true_labels == label) for label in labels_names} 使用了字典推导式,遍历 labels_names 中的每个标签 label。 np.count_nonzero(true_labels == label)
计算了在true_labels
中值等于 label 的元素数量。
- 因此,
true_counts
是一个字典,键是每个标签label
,值是该标签在true_labels
中出现的次数。 同样地,再初始化pred_labels
是一个数组或列表,存储了预测的标签值,与 true_labels 类似。同样,labels_names
是包含所有可能标签的列表或集合。{label: np.count_nonzero(pred_labels == label) for label in labels_names} 使用字典推导式,遍历 labels_names 中的每个标签 label。np.count_nonzero(pred_labels == label)
计算了在pred_labels
中值等于 label 的元素数量。
- 因此,
pred_counts
是一个字典,键是每个标签 label,值是该标签在pred_labels
中出现的次数。 用于统计并记录真实标签和预测标签中各个类别的出现次数,以便后续的分析和可视化。如下图42所示:
图42 统计真实标签和预测标签各个类别的出现次数
绘制预测图像
在经过上面对预测数据和真实数据的处理后,通过处理后的真实数据集
true_counts
、预测数据集
pred_counts
进行预测图像的绘制和数据可视化。
根据输入的参数args.file_path
,绘制并保存两种图表,并输出一条消息。
先进行柱状图的绘制:如果 args.file_path 存在,则创建一个大小为10x5
的新画布,绘制两组柱状图,分别代表
真实标签 (True)
和
预测标签 (Predicted)
的计数情况。柱状图使用蓝色和红色表示,分别对应真实和预测标签的数据。图例显示在图表中。然后将图表保存为名为
'Predicted_Labels.png'
的文件,并显示出来。如下图43所示:
图43 绘制预测柱状图
接着,创建另一个大小为
10x5
的新画布,绘制折线图。折线图展示了
真实标签 (True) 和预测标签 (Predicted)
的趋势。真实标签使用蓝色实线,预测标签使用红色虚线。图例显示在图表中,并且启用了网格线。最后,将该图表保存为名为
'Predicted_Trends.png'
的文件,并显示出来。最后,输出一条消息,显示预测识别成功的鸟类图片的数量。如下图44所示:
图44 绘制预测走势图
实验结果
训练模型的摘要信息
图45 训练模型的摘要信息(1)
图46 训练模型的摘要信息(2)
图47 训练模型的摘要信息(3)
图48 训练模型的摘要信息(4)
图49 训练模型相关参数
模型训练
模型训练将训练集切分为
8:2
的比例,进行模型训练,绘制并保存训练模型的准确率、丢失率曲线、分类报告、混淆矩阵。结果如下:
准确率曲线
曲线说明:
横轴:
accuracy(训练准确率)
:
history.history['accuracy']
表示模型在训练集上每个epoch的准确率。
训练准确率是指模型在当前
epoch
内,在训练数据上预测正确的比例。它反映了模型在训练数据上的拟合程度。
val_accuracy(验证准确率)
:
history.history['val_accuracy']
表示模型在验证集上每个
epoch
的准确率。验证准确率是指模型在当前
epoch
内,在验证数据上预测正确的比例。验证集通常是从训练数据中划分出来的一部分数据,用于评估模型在未见过的数据上的表现。
纵轴:
accuracy(准确率数值):
accuracy
准确率是一个评估模型预测性能的指标,通常用百分比(小数)表示。表示每个
epoch
(训练周期)结束时,模型在对应数据集(训练集或验证集)上的准确率数值。
图51 训练批次为30的准确率
如上图51训练批次为
30
的准确率:通过分析训练和验证准确率曲线,发现模型在训练过程中表现稳定,验证准确率与训练准确率趋势相似,显示出良好的泛化能力。虽然验证集的准确率曲线存在一定的波动,不排除是噪声的影响,是在适当范围内。最后,训练集的准确率和验证集的准确率数值接近1。说明模型在训练中没有过拟合,并且在验证集上也有良好的表现。
图52 训练批次为40的准确率
如上图52训练批次为
40
的准确率:通过分析训练和验证准确率曲线,发现模型在训练过程中表现稳定,验证准确率与训练准确率趋势相似,显示出良好的泛化能力。最后,训练集的准确率和验证集的准确率数值接近1。说明模型在训练中没有过拟合,并且在验证集上也有良好的表现。
图53 训练批次为50的准确率
如上图53训练批次为
50
的准确率:通过分析训练和验证准确率曲线,发现模型在训练过程中表现稳定,验证准确率与训练准确率趋势相似,显示出良好的泛化能力。虽然验证集的准确率曲线存在一定的波动,不排除是噪声的影响,是在适当范围内。最后,训练集的准确率和验证集的准确率数值接近
1
。说明模型在训练中没有过拟合,并且在验证集上也有良好的表现。
图54 训练批次为60的准确率
如上图54训练批次为
60
的准确率:通过分析训练和验证准确率曲线,发现模型在训练过程中表现稳定,验证准确率与训练准确率趋势相似,显示出良好的泛化能力。虽然验证集的准确率曲线存在一定的波动,不排除是噪声的影响,是在适当范围内。最后,训练集的准确率和验证集的准确率数值接近1。说明模型在训练中没有过拟合,并且在验证集上也有良好的表现。
图55 训练批次为70的准确率
如上图55训练批次为
70
的准确率:通过分析训练和验证准确率曲线,发现模型在训练过程中表现稳定,验证准确率与训练准确率趋势相似,显示出良好的泛化能力。虽然验证集的准确率曲线存在一定的波动,不排除是噪声的影响,是在适当范围内。最后,训练集的准确率和验证集的准确率数值接近1。说明模型在训练中没有过拟合,并且在验证集上也有良好的表现。
图56 训练批次为80的准确率
如上图56训练批次为
80
的准确率:通过分析训练和验证准确率曲线,发现模型在训练过程中表现稳定,验证准确率与训练准确率趋势相似,显示出良好的泛化能力。虽然验证集的准确率曲线存在一定的波动,不排除是噪声的影响,是在适当范围内。最后,训练集的准确率和验证集的准确率数值接近1。说明模型在训练中没有过拟合,并且在验证集上也有良好的表现。
图57 训练批次为90的准确率
如上图57训练批次为
90
的准确率:通过分析训练和验证准确率曲线,发现模型在训练过程中表现稳定,验证准确率与训练准确率趋势相似,显示出良好的泛化能力。最后,训练集的准确率和验证集的准确率数值接近1。说明模型在训练中没有过拟合,并且在验证集上也有良好的表现。
图58 训练批次为100的准确率
如上图58训练批次为
100
的准确率:通过分析训练和验证准确率曲线,发现模型在训练过程中表现稳定,验证准确率与训练准确率趋势相似,显示出良好的泛化能力。虽然验证集的准确率曲线存在一定的波动,不排除是噪声的影响,是在适当范围内。最后,训练集的准确率和验证集的准确率数值接近1。说明模型在训练中没有过拟合,并且在验证集上也有良好的表现。
8.2.2 丢失率曲线
曲线说明:
横轴:
loss:history.history['loss']
表示模型在训练集上每个epoch的损失值。这反映了模型在训练数据上拟合的程度,即模型对训练数据的预测误差。
val_loss:history.history['val_loss']
表示模型在验证集上每个epoch的损失值。这反映了模型在未见过的验证数据上的预测误差,是模型泛化能力的一种指标。
纵轴:
损失(
loss
)通常用来衡量模型预测结果与实际标签之间的差异或错误程度。损失越低,表示模型在给定数据上的预测越准确。
图59 训练批次为30的丢失率
如上图59训练批次为
30
的丢失率:训练损失(
loss
)和验证损失(
val_loss
)都在减小且趋势相似,说明模型在训练过程中不仅在训练数据上表现良好,也能在验证数据上表现良好。训练损失和验证损失的曲线都保持平稳或者趋势平缓,表示模型在训练和验证数据上的表现相对稳定,泛化能力较强。最后,训练集的丢失率和验证集的丢失率数值接近
0
。说明模型在训练中没有过拟合,并且在验证集上也有良好的表现。
图60训练批次为40的丢失率
如上图60 训练批次为
40
的丢失率:训练损失(loss)和验证损失(val_loss)都在减小且趋势相似,说明模型在训练过程中不仅在训练数据上表现良好,也能在验证数据上表现良好。训练损失和验证损失的曲线都保持平稳或者趋势平缓,表示模型在训练和验证数据上的表现相对稳定,泛化能力较强。最后,训练集的丢失率和验证集的丢失率数值接近0。说明模型在训练中没有过拟合,并且在验证集上也有良好的表现。
图61 训练批次为50的丢失率
如上图61训练批次为
50
的丢失率 :训练损失(loss)和验证损失(val_loss)都在减小且趋势相似,说明模型在训练过程中不仅在训练数据上表现良好,也能在验证数据上表现良好。训练损失和验证损失的曲线都保持平稳或者趋势平缓,表示模型在训练和验证数据上的表现相对稳定,泛化能力较强。最后,训练集的丢失率和验证集的丢失率数值接近0。说明模型在训练中没有过拟合,并且在验证集上也有良好的表现。
图62训练批次为60的丢失率
如上图62 训练批次为60的丢失率:训练损失(
loss
)和验证损失(
val_loss
)都在减小且趋势相似,说明模型在训练过程中不仅在训练数据上表现良好,也能在验证数据上表现良好。虽然验证损失(val_loss)和训练损失(loss)在某个批次范围内存在一定的波动,不排除是噪声的影响,是在适当范围内。训练损失和验证损失的曲线都保持平稳或者趋势平缓,表示模型在训练和验证数据上的表现相对稳定,泛化能力较强。最后,训练集的丢失率和验证集的丢失率数值接近
0
。说明模型在训练中没有过拟合,并且在验证集上也有良好的表现。
图63 训练批次为70的丢失率
如上图63训练批次为70的丢失率:训练损失(
loss
)和验证损失(
val_loss
)都在减小且趋势相似,说明模型在训练过程中不仅在训练数据上表现良好,也能在验证数据上表现良好。虽然验证损失(val_loss)和训练损失(loss)在某个批次范围内存在一定的波动,不排除是噪声的影响,是在适当范围内。训练损失和验证损失的曲线都保持平稳或者趋势平缓,表示模型在训练和验证数据上的表现相对稳定,泛化能力较强。最后,训练集的丢失率和验证集的丢失率数值接近0。说明模型在训练中没有过拟合,并且在验证集上也有良好的表现。
图64训练批次为80的丢失率
如上图64训练批次为
80
的丢失率:训练损失(loss)和验证损失(val_loss)都在减小且趋势相似,说明模型在训练过程中不仅在训练数据上表现良好,也能在验证数据上表现良好。虽然验证损失(val_loss)和训练损失(loss)在某个批次范围内存在一定的波动,不排除是噪声的影响,是在适当范围内。训练损失和验证损失的曲线都保持平稳或者趋势平缓,表示模型在训练和验证数据上的表现相对稳定,泛化能力较强。最后,训练集的丢失率和验证集的丢失率数值接近0。说明模型在训练中没有过拟合,并且在验证集上也有良好的表现。
图65训练批次为90的丢失率
如上图65训练批次为
90
的丢失率:训练损失(loss)和验证损失(val_loss)都在减小且趋势相似,说明模型在训练过程中不仅在训练数据上表现良好,也能在验证数据上表现良好。训练损失和验证损失的曲线都保持平稳或者趋势平缓,表示模型在训练和验证数据上的表现相对稳定,泛化能力较强。最后,训练集的丢失率和验证集的丢失率数值接近0。说明模型在训练中没有过拟合,并且在验证集上也有良好的表现。
图66 训练批次为100的丢失率
如上图66训练批次为
100
的丢失率:训练损失(loss)和验证损失(val_loss)都在减小且趋势相似,说明模型在训练过程中不仅在训练数据上表现良好,也能在验证数据上表现良好。训练损失和验证损失的曲线都保持平稳或者趋势平缓,表示模型在训练和验证数据上的表现相对稳定,泛化能力较强。最后,训练集的丢失率和验证集的丢失率数值接近0。说明模型在训练中没有过拟合,并且在验证集上也有良好的表现。
分类报告
各类别的评估指标(
precision、recall、f1-score、support
)
precision(精确率)
:在所有被分类为该类别的样本中,正确被分类为该类别的比例。以每个类别为例,比如对于
"Acadian_Flycatcher"
类别,精确率为
0.95
,表示有95%的样本被正确分类为
"Acadian_Flycatcher"
。
recall(召回率)
:在所有真实属于该类别的样本中,被正确分类为该类别的比例。对于
"American_Crow"
类别,召回率为
0.93
,表示有
93%
的
"American_Crow"
样本被正确分类。
f1-score(F1分数)
:精确率和召回率的调和平均数,用于综合评价分类器的性能。
F1
分数越高,表示模型在精确率和召回率之间取得了较好的平衡。
support(支持数)
:每个类别的样本数量。例如,每个类别的支持数都是
45
, 除
"American_Three_toed_Woodpecker"
类别是
38
。这个数字用来帮助理解每个类别指标的统计意义。
总体评估指标:
accuracy(准确率)
:模型在测试集上的整体正确分类的比例。总体准确率为1,即
100%
,
这通常是一个很好的表现。
macro avg(宏平均)
:各类别指标的平均值,不考虑各类别样本的不平衡分布,对每个类别平等对待。在这里,宏平均准确率为
1
,宏平均召回率为
0.957768
,宏平均
F1
分数为
0.944389
。
weighted avg(加权平均)
:各类别指标的加权平均,以支持数作为权重。这个指标更多考虑到各类别样本的不平衡分布。在这里,加权平均准确率为
1
,加权平均召回率为
0.956868
,加权平均F1分数为
0.924589
。
分析和解释:
高精确率(
precision
)和召回率(
recall
)对于每个类别表明模型在各个类别上的分类能力较强。
F1
分数整体上较高,显示出模型在精确率和召回率之间取得了良好的平衡。
总体准确率为1
,但宏平均和加权平均的指标略低于
1
,说明在考虑各类别样本分布不平衡时,模型性能可能略有下降,但依然表现良好。
分类报告如下:
Type precision recall f1-score support
Acadian_Flycatcher 0.95 1 0.95 45
American_Crow 0.95 0.93 0.95 45
American_Goldfinch 0.95 0.95 0.93 45
American_Pipit 0.95 0.95 0.95 45
American_Redstart 0.95 0.95 0.93 45
American_Three_toed_Woodpecker 0.95 0.95 0.95 38
Anna_Hummingbird 0.95 0.93 0.95 45
Artic_Tern 0.95 0.93 0.95 44
Baird_Sparrow 0.95 0.93 0.95 38
Baltimore_Oriole 0.95 0.95 0.95 45
Bank_Swallow 0.95 0.95 0.95 45
Barn_Swallow 0.95 0.95 0.95 45
Bay_breasted_Warbler 0.95 0.95 0.93 45
Belted_Kingfisher 0.95 0.95 0.95 45
Bewick_Wren 0.95 0.95 0.95 45
Black_Tern 0.95 0.93 0.95 45
Black_and_white_Warbler 0.95 0.95 0.95 45
Black_billed_Cuckoo 0.95 0.95 0.95 45
Black_capped_Vireo 0.95 0.95 0.95 39
Black_footed_Albatross 0.95 0.95 0.95 45
Black_throated_Blue_Warbler 0.95 0.95 0.95 45
Black_throated_Sparrow 0.95 0.95 0.95 45
Blue_Grosbeak 0.95 0.95 0.95 45
Blue_Jay 0.95 0.95 0.95 45
Blue_headed_Vireo 0.95 0.95 0.95 45
Blue_winged_Warbler 0.95 0.95 0.92 45
Boat_tailed_Grackle 0.95 0.95 0.95 45
Bobolink 0.95 0.95 0.95 45
Bohemian_Waxwing 0.95 0.95 0.95 45
Brandt_Cormorant 0.95 0.95 0.95 45
Brewer_Blackbird 0.95 0.95 0.95 45
Brewer_Sparrow 0.95 0.95 0.95 45
Bronzed_Cowbird 0.95 0.95 0.87 45
Brown_Creeper 0.95 0.95 0.95 45
Brown_Pelican 0.95 0.95 0.95 45
Brown_Thrasher 0.95 0.87 0.95 45
Cactus_Wren 0.95 0.95 0.95 45
California_Gull 0.95 0.95 0.95 45
Canada_Warbler 0.95 0.95 0.95 45
Cape_Glossy_Starling 0.95 0.95 0.95 45
Cape_May_Warbler 0.95 0.95 0.95 45
Cardinal 0.95 0.95 0.95 43
Carolina_Wren 0.95 0.95 0.95 45
Caspian_Tern 0.95 0.95 0.95 45
Cedar_Waxwing 0.95 0.95 0.87 45
Cerulean_Warbler 0.95 0.95 0.95 45
Chestnut_sided_Warbler 0.95 0.95 0.95 45
Chipping_Sparrow 0.95 0.95 0.95 45
Chuck_will_Widow 0.95 0.95 0.95 42
Clark_Nutcracker 0.95 0.95 0.95 45
Clay_colored_Sparrow 0.95 0.95 0.95 45
Cliff_Swallow 0.95 0.95 0.95 45
Common_Raven 0.95 0.95 0.95 45
Common_Tern 0.95 0.95 0.95 45
Common_Yellowthroat 0.95 0.95 0.95 45
Crested_Auklet 0.95 0.95 0.95 33
Dark_eyed_Junco 0.95 0.95 0.95 45
Downy_Woodpecker 0.95 0.95 0.95 45
Eared_Grebe 0.95 0.95 0.95 45
Eastern_Towhee 0.95 0.95 0.95 45
Elegant_Tern 0.95 0.95 0.95 45
European_Goldfinch 0.95 0.95 0.95 45
Evening_Grosbeak 0.95 0.95 0.87 45
Field_Sparrow 0.95 0.95 0.95 45
Fish_Crow 0.95 0.95 0.95 45
Florida_Jay 0.95 0.97 0.95 45
Forsters_Tern 0.95 0.95 0.95 45
Fox_Sparrow 0.95 0.95 0.95 45
Frigatebird 0.95 0.95 0.95 45
Gadwall 0.95 0.95 0.95 45
Geococcyx 0.95 0.95 0.95 45
Glaucous_winged_Gull 0.95 0.95 0.95 45
Golden_winged_Warbler 0.95 0.95 0.95 45
Grasshopper_Sparrow 0.95 0.95 0.95 45
Gray_Catbird 0.95 0.95 0.95 45
Gray_Kingbird 0.95 0.95 0.95 45
Gray_crowned_Rosy_Finch 0.95 0.95 0.95 45
Great_Crested_Flycatcher 0.95 0.95 0.95 45
Great_Grey_Shrike 0.95 0.95 0.95 45
Green_Jay 0.95 0.97 0.95 43
Green_Kingfisher 0.95 0.95 0.95 45
Green_Violetear 0.95 0.95 0.95 45
Green_tailed_Towhee 0.95 0.95 0.95 45
Groove_billed_Ani 0.95 0.95 0.95 45
Harris_Sparrow 0.95 0.95 0.95 45
Heermann_Gull 0.95 0.95 0.95 45
Henslow_Sparrow 0.95 0.95 0.95 45
Herring_Gull 0.95 0.95 0.95 45
Hooded_Merganser 0.95 0.95 0.95 45
Hooded_Oriole 0.95 0.95 0.95 45
Hooded_Warbler 0.95 0.95 0.95 45
Horned_Grebe 0.95 0.95 0.95 45
Horned_Lark 0.95 0.95 0.95 45
Horned_Puffin 0.95 0.95 0.95 45
House_Sparrow 0.95 0.95 0.95 45
House_Wren 0.95 0.95 0.95 45
Indigo_Bunting 0.95 0.95 0.95 45
Ivory_Gull 0.95 0.95 0.95 45
Kentucky_Warbler 0.95 0.97 0.95 45
Laysan_Albatross 0.95 0.95 0.95 45
Lazuli_Bunting 0.95 0.95 0.95 44
Le_Conte_Sparrow 0.95 0.95 0.95 45
Least_Auklet 0.95 0.95 0.95 31
Least_Flycatcher 0.95 0.95 0.93 45
Least_Tern 0.95 0.95 0.95 45
Lincoln_Sparrow 0.95 0.95 0.95 45
Loggerhead_Shrike 0.95 0.95 0.95 45
Long_tailed_Jaeger 0.95 0.95 0.95 45
Louisiana_Waterthrush 0.95 0.95 0.95 45
Magnolia_Warbler 0.95 0.97 0.95 45
Mallard 0.95 0.95 0.95 45
Mangrove_Cuckoo 0.95 0.95 0.95 45
Marsh_Wren 0.95 0.95 0.95 45
Mockingbird 0.95 0.95 0.95 45
Mourning_Warbler 0.95 0.93 0.95 45
Myrtle_Warbler 0.95 0.95 0.95 45
Nashville_Warbler 0.95 0.95 0.95 45
Nelson_Sharp_tailed_Sparrow 0.95 0.95 0.95 45
Nighthawk 0.95 0.95 0.93 45
Northern_Flicker 0.95 0.95 0.95 45
Northern_Fulmar 0.95 0.95 0.95 45
Northern_Waterthrush 0.95 0.95 0.95 45
Olive_sided_Flycatcher 0.95 0.95 0.95 45
Orange_crowned_Warbler 0.95 0.95 0.95 45
Orchard_Oriole 0.95 0.95 0.93 45
Ovenbird 0.95 0.95 0.95 45
Pacific_Loon 0.95 0.95 0.93 45
Painted_Bunting 0.95 0.93 0.95 44
Palm_Warbler 0.95 0.95 0.95 45
Parakeet_Auklet 0.95 0.95 0.95 495
Pelagic_Cormorant 0.95 0.93 0.95 45
Philadelphia_Vireo 0.95 0.95 0.95 45
Pied_Kingfisher 0.95 0.95 0.93 45
Pied_billed_Grebe 0.95 0.95 0.95 45
Pigeon_Guillemot 0.95 0.95 0.93 44
Pileated_Woodpecker 0.95 0.93 0.95 45
Pine_Grosbeak 0.95 0.95 0.95 45
Pine_Warbler 0.95 0.95 0.95 45
Pomarine_Jaeger 0.95 0.93 0.95 45
Prairie_Warbler 0.95 0.95 0.93 45
Prothonotary_Warbler 0.95 0.95 0.95 45
Purple_Finch 0.95 0.93 0.95 45
Red_bellied_Woodpecker 0.95 0.95 0.93 45
Red_breasted_Merganser 0.95 0.93 0.95 45
Red_cockaded_Woodpecker 0.95 0.95 0.95 44
Red_eyed_Vireo 0.95 0.95 0.95 45
Red_faced_Cormorant 0.95 0.95 0.95 39
Red_headed_Woodpecker 0.95 0.95 0.95 45
Red_legged_Kittiwake 0.95 0.93 0.95 45
Red_winged_Blackbird 0.95 0.95 0.95 45
Rhinoceros_Auklet 0.95 0.95 0.93 36
Ring_billed_Gull 0.95 0.95 0.95 45
Ringed_Kingfisher 0.95 0.95 0.93 45
Rock_Wren 0.95 0.95 0.95 45
Rose_breasted_Grosbeak 0.95 0.95 0.95 45
Ruby_throated_Hummingbird 0.95 0.95 0.93 45
Rufous_Hummingbird 0.95 0.95 0.95 45
Rusty_Blackbird 0.95 0.95 0.93 45
Sage_Thrasher 0.95 0.93 0.95 45
Savannah_Sparrow 0.95 0.95 0.95 45
Sayornis 0.95 0.93 0.95 45
Scarlet_Tanager 0.95 0.95 0.95 45
Scissor_tailed_Flycatcher 0.95 0.97 0.95 45
Scott_Oriole 0.95 0.95 0.95 45
Seaside_Sparrow 0.95 0.95 0.95 45
Shiny_Cowbird 0.95 0.95 0.93 45
Slaty_backed_Gull 0.95 0.95 0.95 38
Song_Sparrow 0.95 0.95 0.93 45
Sooty_Albatross 0.95 0.95 0.95 44
Spotted_Catbird 0.95 0.93 0.93 34
Summer_Tanager 0.95 0.95 0.95 45
Swainson_Warbler 0.95 0.95 0.95 42
Tennessee_Warbler 0.95 0.93 0.95 45
Tree_Sparrow 0.95 0.97 0.95 45
Tree_Swallow 0.95 0.95 0.95 45
Tropical_Kingbird 0.95 0.93 0.95 45
Vermilion_Flycatcher 0.95 0.95 0.95 45
Vesper_Sparrow 0.95 0.93 0.95 45
Warbling_Vireo 0.95 0.95 0.95 45
Western_Grebe 0.95 0.95 0.95 45
Western_Gull 0.95 0.95 0.95 45
Western_Meadowlark 0.95 0.95 0.95 45
Western_Wood_Pewee 0.95 0.93 0.93 45
Whip_poor_Will 0.95 0.95 0.95 37
White_Pelican 0.95 0.95 0.95 38
White_breasted_Kingfisher 0.95 0.95 0.95 45
White_breasted_Nuthatch 0.95 0.95 0.95 45
White_crowned_Sparrow 0.95 0.95 0.95 45
White_eyed_Vireo 0.95 0.95 0.95 45
White_necked_Raven 0.95 0.95 0.95 45
White_throated_Sparrow 0.95 0.95 0.95 45
Wilson_Warbler 0.95 0.95 0.95 45
Winter_Wren 0.95 0.95 0.95 45
Worm_eating_Warbler 0.95 0.95 0.95 45
Yellow_Warbler 0.95 0.95 0.95 45
Yellow_bellied_Flycatcher 0.95 0.93 0.95 45
Yellow_billed_Cuckoo 0.95 0.95 0.95 45
Yellow_breasted_Chat 0.95 0.95 0.95 45
Yellow_headed_Blackbird 0.95 0.95 0.95 42
Yellow_throated_Vireo 0.95 0.95 0.95 45
test 1 0.95 0.95 3600
accuracy 1 0.956489 0.965559 3600
macro avg 1 0.957768 0.944389 3600
weighted avg 1 0.956868 0.924589 3600
混淆矩阵
根据每个类别的精确率和召回率,可以推断模型在大多数类别上能够有效地区分和预测。例如,精确率和召回率都接近
1
的类别(如
"Acadian_Flycatcher"
)表明模型在这些类别上的分类效果非常好。高准确率、良好的精确率和召回率以及稳定的
F1
分数,可以推测混淆矩阵可能会显示出大多数类别的主对角线(
True Positive
)上有较高的值,而其他地方(如
False Positive、False Negative
)则相对较低。最后,可以得出模型在多类别分类任务中的性能非常好。如下图67、68所示。
图67 200种鸟类混淆矩阵
图68 代表性鸟类的混淆矩阵
实验结论
(1) 9:1 比例的训练结果分析:
精确率和损失曲线:在9:1的训练集和验证集比例下,模型展现出稳定的精确率曲线和可接受范围内的损失曲线。这表明模型在训练过程中能够有效地学习并保持对鸟类图像的高准确识别能力。
鸟类图像识别成功率接近100%:由于训练集占比较高,模型在测试集上表现出色,接近100%的成功率,符合预期的效果。这表明模型在这个设定下能够高度专注于训练数据的特征,从而在测试时表现优异。
(2) 8:2 比例的进一步优化和泛化能力:
泛化能力的提高:通过将训练集和验证集比例调整为8:2,模型的泛化能力得到进一步提高。这意味着模型在更少训练数据的情况下依然能够有效地推广到新的、未见过的数据样本上。
曲线拟合度和总体表现:曲线拟合度较高,表现丝滑且贴合,这反映了模型在训练和验证过程中的稳定性和效率。
识别图像能力的改善:调整后的模型在识别鸟类图像方面表现较好,这表明优化后的模型能够更准确地捕捉和利用数据中的特征,从而提高识别图像的能力。
最后,该模型能够对鸟类图像进行高准确识别。
结论与展望
本次鸟类识别系统的设计和实现基于
CNN(卷积神经网络)
,使用了
Keras框架和TensorFlow库
。经过训练和评估,该系统在识别鸟类方面表现出较高的准确性和可靠性。
通过使用卷积神经网络,我们能够充分利用图像的空间结构和特征,从而提高了鸟类识别系统的性能。在模型的设计中,我们使用了多个卷积层和池化层,以捕捉鸟类图像中的细节和特征。同时,我们采用了批量归一化层和全局平均池化层,以进一步提高模型的准确性和泛化能力。
通过对数据集的预处理和划分,我们确保了训练数据和测试数据的质量和平衡性。在训练过程中,我们使用了自适应学习率的优化器和稀疏分类交叉熵损失函数,以提高模型的收敛速度和分类能力。
经过30、40、……、100个
训练周期的迭代,我们获得了一个表现良好的鸟类识别模型。通过验证集上的准确性和损失函数曲线的变化,我们可以看出模型在训练和验证数据上都取得了良好的性能。此外,我们还通过回调函数保存了在验证集上表现最好的模型权重,以备后续使用。
展望未来,我们可以进一步优化和改进鸟类识别系统。首先,我们可以尝试更深层次的卷积神经网络结构,以提高模型的表达能力和学习能力。此外,我们可以收集更多的鸟类图像数据,以扩大数据集的规模和多样性,进一步提高模型的泛化能力。此外,我们还可以考虑引入迁移学习和数据增强等技术,以进一步提升模型的性能和鲁棒性。
总之,本次鸟类识别系统的设计和实现通过CNN模型的应用,以及Keras和TensorFlow
的支持,成功实现了高准确性的鸟类识别。这将为鸟类研究、保护和普及教育等领域提供有力的工具和支持,同时也为未来深入研究和应用计算机视觉技术在生物学领域的发展打下了坚实的基础。
结语
本研究通过对复杂场景下鸟类多类别识别的深度学习卷积神经网络进行详尽的模型设计和性能优化研究,取得了一定的成果和深入的理论洞见。实验结果表明,所提出的优化策略和方法有效提升了识别系统在复杂环境中的稳定性和准确性。然而,未来的研究仍可进一步扩展到更广泛和更复杂的场景,如不同季节、地理位置和鸟类物种的多样性,以探索模型的泛化能力和适应性。
这项工作不仅为深度学习在生物多样性监测、环境保护和生态学研究中的应用提供了新的思路和方法,也为相关领域的进一步发展和应用奠定了坚实的基础。期望本研究能够为未来的技术创新和实际应用提供有益的参考和启示。
看到这里的小伙伴,恭喜你又掌握了一个技能👊
希望大家能取得胜利,坚持就是胜利💪
我是寸铁!我们下期再见💕
往期好文💕
保姆级教程
【保姆级教程】Windows11下go-zero的etcd安装与初步使用
【保姆级教程】Windows11安装go-zero代码生成工具goctl、protoc、go-zero
【Go-Zero】手把手带你在goland中创建api文件并设置高亮
报错解决
【Go-Zero】Error: user.api 27:9 syntax error: expected ‘:‘ | ‘IDENT‘ | ‘INT‘, got ‘(‘ 报错解决方案及api路由注意事项
【Go-Zero】Error: only one service expected goctl一键转换生成rpc服务错误解决方案
【Go-Zero】【error】 failed to initialize database, got error Error 1045 (28000):报错解决方案
【Go-Zero】Error 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)报错解决方案
【Go-Zero】type mismatch for field “Auth.AccessSecret“, expect “string“, actual “number“报错解决方案
【Go-Zero】Error: user.api 30:2 syntax error: expected ‘)‘ | ‘KEY‘, got ‘IDENT‘报错解决方案
【Go-Zero】Windows启动rpc服务报错panic:context deadline exceeded解决方案
Go面试向
【Go面试向】defer与time.sleep初探
【Go面试向】defer与return的执行顺序初探
【Go面试向】Go程序的执行顺序
【Go面试向】rune和byte类型的认识与使用
【Go面试向】实现map稳定的有序遍历的方式
版权归原作者 寸 铁 所有, 如有侵权,请联系我们删除。