【深度学习】“复杂场景下基于深度学习的卷积神经网络在鸟类多类别识别中的模型设计与性能优化研究”(下)
大家好 我是寸铁👊
【深度学习】“复杂场景下基于深度学习的卷积神经网络在鸟类多类别识别中的模型设计与性能优化研究”(下)✨
喜欢的小伙伴可以点点关注 💝
前言
本次【深度学习】"复杂场景下基于深度学习的卷积神经网络在鸟类多类别识别中的模型设计与性能优化研究"分为上、中、下
三个部分,后续持续更新,感兴趣的朋友可以继续关注~
代码无偿,记得进入网站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
是类别的名称列表