【深度学习】“复杂场景下基于深度学习的卷积神经网络在鸟类多类别识别中的模型设计与性能优化研究”(上)
大家好 我是寸铁👊
【深度学习】“复杂场景下基于深度学习的卷积神经网络在鸟类多类别识别中的模型设计与性能优化研究”(上)✨
喜欢的小伙伴可以点点关注 💝
前言
本次【深度学习】"复杂场景下基于深度学习的卷积神经网络在鸟类多类别识别中的模型设计与性能优化研究"分为上、中、下
三个部分,后续持续更新,感兴趣的朋友可以继续关注~
代码无偿,记得进入网站fork一下谢谢!
全部源代码地址:
github.com/Joyflower/Brid_CCN/tree/master/
随着科技的进步和深度学习技术的广泛应用,卷积神经网络(CNN)作为一种强大的图像识别工具,在复杂环境中的应用日益引起关注。特别是在鸟类多类别识别这一领域,CNN展现出了巨大的潜力和应用前景。然而,面对复杂场景下的挑战,如光照变化、背景噪声和鸟类姿态的多样性,如何设计和优化CNN模型以提高识别的准确性和鲁棒性仍然是一个重要的研究课题。
本研究旨在探索基于深度学习的卷积神经网络在鸟类多类别识别中的应用潜力,通过深入分析模型设计和性能优化的方法,以应对复杂环境带来的挑战。通过系统的实验验证和性能评估,本研究试图为解决实际应用中的识别难题提供创新的解决方案和理论支持。
数据集
数据来源及特点
在本研究中,数据集来自于官方网站(https://aistudio.baidu.com/datasetdetail/144466
),数据集包含了总计11788
个样本,涵盖了200
种不同的鸟类。每种鸟类的样本数量在40
到60
个之间不等。
为了进行进一步的分析和模型训练,我们手动地从这些数据中按照200
种鸟类进行了分类。分类后,我们将数据集按照8:2
、9:1
的比例划分为训练集和测试集,以确保训练和评估模型时的数据分布的一致性和准确性。
数据集情况如图3数据集内部分鸟类图片展示、图4数据集数据统计情况所示:
图1 数据集部分展示
图2 数据集部分展示
图3 数据集内部分鸟类图片展示
图4 数据集数据统计情况
识别任务及问题难度
本次识别任务的目标是对包含200种不同鸟类的数据集进行测试识别。由于鸟类种类繁多,而每种鸟类的样本数量相对较少,使得任务的难度较高。
为了解决这一问题,本次课程设计计划采用神经卷积网络
CNN
来训练模型。由于使用的是CPU进行模型训练,具体来说是NVIDIA GeForce RTX 3050 Ti
,如图5所示。作为开发环境,使用的是PyCharm软件,版本为2023.3.5
。
这些设定和选择旨在通过神经网络技术,利用CPU资源有效地处理并识别200
种不同鸟类,尽管每个类别的数据量有限,但希望能够达到准确的分类结果。
图5 CPU型号
- 定时批量训练
图6 定时批量训练流程图
从上图6可得:本次鸟类识别图像系统结合软件工程思想,开启批量定时任务,程序一开始设置批量次数为
30
,之后开启死循环,循环直至批量次数为100
才退出结束。程序开始,先进行数据预处理、再构建、编译模型,接着进行模型的测试,判断训练批次是否大于100
,是则程序结束,否则将训练批次epoch自增10
,进行批量次数递增10
后的批次训练,并将每次训练的成功率、丢失率、分类报告、混淆矩阵、预测数据存入对应的文件夹。
批量定时任务的实现具体如下:
先设置训练批次次数
epochs
为30
。这个变量用来表示初始化训练集为30
,是指在训练机器学习模型时使用的迭代次数。
开启一个无限循环,意味着以下的代码块将会一直执行,直到遇到break
语句或程序被中断。定义了一个字符串变量file_path
,用于存储将要创建的文件夹的路径。
f"..."
是 Python 中的f-string
,用于格式化字符串,其中{epochs}
将被替换为epochs
变量的值,一开始是30
。调用os.makedirs()
是 Python 中用来创建文件夹的函数。编写创建文件夹的路径file_path
。然后exist_ok=True
参数表示如果文件夹已经存在,则不会抛出异常,即使存在也不会报错。实现在指定路径下创建一个名为epoch30
的文件夹,如果该文件夹已经存在则不进行任何操作。如下图7:
图7 循环批量训练
接着,调用
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
变量的值,以便在其内部处理或操作相关文件。如下图8:
图8 启动子进程
最后,开启一个无限循环,每次循环会检查当前的
epochs
值。如果epochs
达到或超过100
,则停止训练(跳出循环)。否则,增加epochs
值,并让程序休眠5 分钟
,然后继续下一次循环。这种方式可以控制训练的迭代次数,并且在每次迭代后给予系统一些休息时间。如下图9:
图9 批量次数递增
数据预处理
预处理流程图
图10 数据预处理流程图
由上图,数据预处理流程如下:
(1) 先读取训练文件夹的图片集
(2) 接着,获取每个图片的标签名称
(3) 再将标签名称去重并映射为序号字典
(4) 反转字典,将所有标签映射为序号
(5) 设置随机种子,将数据随机打乱
(6) 再按照一定比例划分为训练数据和测试数据
(7) 接着,运用tf框架的并行处理深度学习机制,对训练数据和测试数据应用预处理函数和并行处理。
(8) 最后,打乱、分批次和预取数据,消除顺序逆差。
读取数据集图片
首先,我们需要逐一获取数据集文件夹中的每张图片的路径
train/train/*.jpg
。为了实现这一目标,使用Python
提供的glob
模块中的glob方法
。这个方法根据设置的路径参数,逐一读取文件夹内所有以.jpg
为后缀的文件的路径,并将这些路径保存在一个名为imgs_path
的数组中。如下图11所示。
这种方法能够有效地帮助我们收集数据集中所有图片的路径信息,为后续的数据处理和模型训练提供必要的准备工作。
图11 图片路径获取
编写图片编号字典
接下来需要对图片编号编写字典:
首先,.imgs_path
是一个包含文件路径的列表,其中每个元素是一个字符串,代表一个文件的路径,类似于'test/test\\0000.jpg'
。对于每个文件路径img_p
,我们首先使用split('\\')
方法来根据反斜杠\
将路径分割成多个部分。这个操作返回一个列表,包含路径中每个反斜杠分割的部分。在这个列表中,索引为1的部分代表文件名,例如'0000.jpg'
。
接下来,我们再次使用split('.')
方法来根据点号 . 将文件名分割成两部分,即文件名和文件扩展名。这个操作返回一个包含两个元素的列表,其中索引为0的元素是文件名的前缀,索引为1的元素是文件扩展名
,例如['0000', 'jpg']
。最后,我们取列表中索引为1的元素,即文件名的后缀部分,作为标签名称。通过对存储图片路径的数据进行字符串切割,使用split方法提取每张图片路径中的标签名称,即每种鸟类的英文学术名称,并将这些名称保存在一个名为all_labels_name
的数组中。
接下来,使用numpy
模块中的unique
方法对all_labels_name
数组进行操作,去除其中重复的标签名称,并将唯一的标签名称保存在一个新的数组labels_names
中。
随后,将这些唯一的标签名称映射为相应的序号,并将其封装在一个字典中,这个字典被命名为label_to_index
。在这个字典中,标签名称充当键(key
),而序号充当对应的值(value
)。
最后,将label_to_index
字典进行反转操作,生成一个新的字典,其中序号充当键(key
),而标签名称作为对应的值(value
)。
这些步骤旨在为每种鸟类的标签名称分配一个唯一的序号,并为后续的分类任务做好准备。如下图12所示。
图12 识别图片字典编写
数据集切分、随机打乱
然后对数据集进行切分、随机打乱:
先进行整体数据集与字典的之间映射并存在数组all_labels
之中,如下图13标签映射为序号所示。
图13 标签映射为序号
再将数据进行打乱,通过调用
numpy
模块的random
模块的seed
方法设置随机种子,再调用permutation
方法根据数据的总数,此处通过imgs_path
数组的长度获取数据的数量,从而设置长度合适的随机数组random_index
,然后将随机数组作为参数,调用numpy
模块的array
方法,对图片路径即imgs_path数组和标签即all_labels
数组进行相同次序的打乱。如下图14所示:
图14 数据集随机打乱处理
再进行数据集的切分,数据集的划分是进行
8:2
的比率划分的,所以先根据imgs_path
数组的长度乘以0.8
赋值给变量i
,然后划分数据,训练数据数组train_path
和训练标签数组train_labels
分别获得imgs_path
数组和all_labels
数组的前80%
的数据,而test_path
数组和test_labels
数组则是获得后20%
的数据。
然后再调用TensorFlow
模块提供的from_tensor_slices
方法,以train_path
数组和train_labels
数组为参数生成训练数据集,然后再以test_path
数组和test_labels
数组为参数生成测试数据集。如下图15所示:
图15 数据集的切分
图片预处理
在训练模型时,根据数据集依次调用每一张图片来进行特征的提取和对模型的训练,因此还要提供一个统一的图片处理方法,来保证图片的特征提取的准确性。
先设置方法名为load_img
,而参数分别是path
即是读取图片时图片的相对路径,label
则是当前读取的图片所对应的标签名称。
方法内的实现,先调用TensorFlow
函数提供的io.read_file
方法,根据path参数读取图片并保存为数组image
,再调用image.decode_jpeg
方法以image
和channels=3
为参数,将JPEG
编码图像解码为uint8
张量,而因为channels=3
参数,所以输出的是RGB
图像,然后图像数据重新保存在数组image
之中,之后则是对图片的大小进行重构,以保证所有的图片的大小是相同的,从而有利于提高训练出来的模型的准确率。
图片大小的重构调用到的是image.resize
方法,以image数组
和256*256
大小的数组作为参数,进行图片重构,这里图片大小设置256*256是为了方便后面的图片数据归一化。有助于避免梯度消失或梯度爆炸等问题,提高模型的稳定性和收敛速度。
图片大小重构之后,再调用cast
方法将image
数组内的数据转换为float32
类型,然后再将image
数组内的数据逐一除以255
,进行归一化。图片进行归一化之后,方法便返回处理后的图片数据即image
数组,以及图片对应的标签名称即label
变量。有助于满足模型的数值要求、提高数据精度和稳定性,并使得数据能够与深度学习框架中的操作兼容。如下图16所示:
图16 数据集图片预处理
结语
本研究通过对复杂场景下鸟类多类别识别的深度学习卷积神经网络进行详尽的模型设计和性能优化研究,取得了一定的成果和深入的理论洞见。实验结果表明,所提出的优化策略和方法有效提升了识别系统在复杂环境中的稳定性和准确性。然而,未来的研究仍可进一步扩展到更广泛和更复杂的场景,如不同季节、地理位置和鸟类物种的多样性,以探索模型的泛化能力和适应性。
这项工作不仅为深度学习在生物多样性监测、环境保护和生态学研究中的应用提供了新的思路和方法,也为相关领域的进一步发展和应用奠定了坚实的基础。期望本研究能够为未来的技术创新和实际应用提供有益的参考和启示。
看到这里的小伙伴,恭喜你又掌握了一个技能👊
希望大家能取得胜利,坚持就是胜利💪
我是寸铁!我们下期再见💕
往期好文💕
保姆级教程
【保姆级教程】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稳定的有序遍历的方式