【深度学习】“复杂场景下基于深度学习的卷积神经网络在鸟类多类别识别中的模型设计与性能优化研究“(上)

【深度学习】“复杂场景下基于深度学习的卷积神经网络在鸟类多类别识别中的模型设计与性能优化研究”(上)

大家好 我是寸铁👊
【深度学习】“复杂场景下基于深度学习的卷积神经网络在鸟类多类别识别中的模型设计与性能优化研究”(上)✨
喜欢的小伙伴可以点点关注 💝

在这里插入图片描述


前言

本次【深度学习】"复杂场景下基于深度学习的卷积神经网络在鸟类多类别识别中的模型设计与性能优化研究"分为上、中、下三个部分,后续持续更新,感兴趣的朋友可以继续关注~

代码无偿,记得进入网站fork一下谢谢!
全部源代码地址:

github.com/Joyflower/Brid_CCN/tree/master/

随着科技的进步和深度学习技术的广泛应用,卷积神经网络(CNN)作为一种强大的图像识别工具,在复杂环境中的应用日益引起关注。特别是在鸟类多类别识别这一领域,CNN展现出了巨大的潜力和应用前景。然而,面对复杂场景下的挑战,如光照变化、背景噪声和鸟类姿态的多样性,如何设计和优化CNN模型以提高识别的准确性和鲁棒性仍然是一个重要的研究课题。
本研究旨在探索基于深度学习的卷积神经网络在鸟类多类别识别中的应用潜力,通过深入分析模型设计和性能优化的方法,以应对复杂环境带来的挑战。通过系统的实验验证和性能评估,本研究试图为解决实际应用中的识别难题提供创新的解决方案和理论支持。


数据集

数据来源及特点

在本研究中,数据集来自于官方网站(https://aistudio.baidu.com/datasetdetail/144466),数据集包含了总计11788个样本,涵盖了200种不同的鸟类。每种鸟类的样本数量在4060个之间不等。
为了进行进一步的分析和模型训练,我们手动地从这些数据中按照200种鸟类进行了分类。分类后,我们将数据集按照8:29:1的比例划分为训练集和测试集,以确保训练和评估模型时的数据分布的一致性和准确性。
数据集情况如图3数据集内部分鸟类图片展示、图4数据集数据统计情况所示:

在这里插入图片描述

图1 数据集部分展示


在这里插入图片描述

图2 数据集部分展示


在这里插入图片描述

图3 数据集内部分鸟类图片展示


在这里插入图片描述

图4 数据集数据统计情况


识别任务及问题难度

本次识别任务的目标是对包含200种不同鸟类的数据集进行测试识别。由于鸟类种类繁多,而每种鸟类的样本数量相对较少,使得任务的难度较高。

为了解决这一问题,本次课程设计计划采用神经卷积网络CNN来训练模型。由于使用的是CPU进行模型训练,具体来说是NVIDIA GeForce RTX 3050 Ti,如图5所示。作为开发环境,使用的是PyCharm软件,版本为2023.3.5
这些设定和选择旨在通过神经网络技术,利用CPU资源有效地处理并识别200种不同鸟类,尽管每个类别的数据量有限,但希望能够达到准确的分类结果。

图5 CPU型号

---


  1. 定时批量训练

在这里插入图片描述

图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方法以imagechannels=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稳定的有序遍历的方式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/51131.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LangChain-v0.2 构建 PDF 采集和问答系统

PDF 文件通常包含其他来源无法获取的重要非结构化数据。它们可能非常长,而且与纯文本文件不同,通常无法直接输入到语言模型的提示中。 在本中,我们将创建一个可以回答有关 PDF 文件的问题的系统。更具体地说,就是使用文档加载器加…

【前端 14】Vue常见指令

Vue常见指令 Vue.js 是一个构建用户界面的渐进式框架,它通过一系列简洁的指令(Directives)来增强HTML的功能,使得开发者能够更加方便地构建出响应式的Web应用。本文将详细讲解Vue中的几个核心指令:v-bind、v-model、v…

AndroidAOSP定制之关闭某些app的通知

AndroidAOSP定制之关闭某些app的通知 前言: ​ 最近在做AOSP系统定制时发现gms定制好了后,Google应用商店用不了,提示此设备未获得Play保护机制认证,Google应用和服务无法在此设备上运行,查看官方文档和资料,说是由于…

【学习笔记】| 03 - 使用STM32CubeMX新建工程

使用STM32CubeMX新建工程是一个相对直观的过程,主要涉及到选择芯片型号、配置外设、时钟系统、GPIO引脚等,并最终生成工程代码。以下是一个详细的步骤指南: 一、打开STM32CubeMX并新建工程 启动STM32CubeMX: 打开STM32CubeMX软件…

FPGA实验6: 有时钟使能两位十进制计数器的设计

一、实验目的与要求 1.. 熟练掌握使用原理图设计较复杂电路; 2. 学习原理图设计中总线的表示以及使用方法。 二、实验原理 运用Quartus II 集成环境下的图形设计方法设计有时钟使能的两位十进制计数器。进行波形仿真和分析、引脚分配并下载到实验设备上进行功能…

[ECharts] There is a chart instance already initialized on the dom. 已存在图表,渲染重复

报错:已存在图表,渲染重复 解决: 在合适的时机执行 dispose 方法即可 // echarts 全局存入 实例 let myChart: any;// 在你的 initChart 初始化 Echarts 方法中 先执行清理方法 const initChart () > {// 执行清理方法然后初始化if(myChart){cons…

AndroidStudio 开发环境搭建

文章目录 AndroidStudio 开发环境搭建JDK 下载与安装,配置环境变量JDK1.8 下载安装配置环境变量新建JAVA_HOME编辑Path 下载AndroidStudio最新版本历史版本先安装JDK,后启动AS以管理员身份运行打开解决双击打不开的问题Error:你的主机中的软件中止了一个…

Coggle数据科学 | 大模型技术内参:39 种提示工程 在 29 种 NLP 任务精度对比

本文来源公众号“Coggle数据科学”,仅用于学术分享,侵权删,干货满满。 原文链接:大模型技术内参:39 种提示工程 在 29 种 NLP 任务精度对比 大语言模型(LLMs)在许多不同的自然语言处理&#x…

Linux网络-netstat命令

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注我,我尽量把自己会的都分享给大家,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux服务器作为一个常用的网络服务器,主要的作用就是向客户端提供网络…

1143. 最长公共子序列(详细版)

目录 dp解法: 1.状态代表什么: 2. 状态转移方程 3.初始化 3. so为什么要这样? 代码实现: 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0…

从小白到架构师:万字长文 | 社交媒体应用系统设计

移动互联网时代,社交媒体应用彻底改变了我们联系和共享信息的方式。这些平台在幕后处理庞大的用户群、数据存储和实时交互。 在本文中,我们将深入探讨如何设计一个可扩展且高性能的社交媒体应用系统。我们将探讨关键组件、流程图、功能需求以及容量规划…

科普文:分布式数据一致性协议Paxos

1 什么是Paxos Paxos协议其实说的就是Paxos算法, Paxos算法是基于消息传递且具有高度容错特性的一致性算 法,是目前公认的解决分布式一致性问题最有效的算法之一。 Paxos由 莱斯利兰伯特(Leslie Lamport)于1998年在《The Part-Time Parliament》论文中首次公 开&…

Gitops-Argo-Cli安装与使用

一、安装Argo-Cli工具 Release v2.9.21 argoproj/argo-cd GitHub **选择合适的符合你操作系统以及CPU架构的二进制文件 #依v2.9.21-X86-64-Linux操作系统为例 wget https://github.com/argoproj/argo-cd/releases/download/v2.9.21/argocd-linux-amd64 #添加执行权限并且移…

论文中的流程图参考图片

写论文的时候,在绘制流程图时,一直纠结n是大写还是小写,用不用斜体,号两边要不要空格。今天找到了一张标准的流程图来参考。图片来自 Zhi-Chang Ba et al, Combination of DCE-MRI and NME-DWI via Deep Neural Network for Predi…

虚拟机复制后网络不可用,报错“network.service - LSB: Bring up/down networking”

查询IP地址,eth33 没有显示IP地址 尝试重启,有报错,并且有提示,按照提示执行下看看 解决办法 chkconfig NetworkManager offsystemctl disable NetworkManager.serviceservice NetworkManager stopservice network restart 之后检…

边缘计算网关项目(含上报进程、32Modbus采集进程、设备搜索响应进程源码)

目录 边缘层 架构说明 包含知识点 数据上报进程 功能描述 功能开发 上报线程 数据存储线程 指令处理线程 项目源码 上报模块.c代码: 上报模块Makefile代码: STM32采集模块.c代码 设备搜索响应模块Linux部分.c代码 设备搜索响应模块Qt端代码.h …

C语言画蜡烛图

GPT-4o (OpenAI) 在C语言中,绘制蜡烛图(Candlestick Chart)不是直接的任务,因为C语言本身不包含高级图形绘制库。然而,可以通过某些图形库来完成这项任务,例如使用GTK、SDL、OpenGL等。 以下是通过GTK库绘…

Hive3:Hive初体验

1、创建表 CREATE TABLE test(id INT, name STRING, gender STRING);2、新增数据 INSERT INTO test VALUES(1, 王力红, 男); INSERT INTO test VALUES(2, 钉钉盯, 女); INSERT INTO test VALUES(3, 咔咔咔, 女);3、查询数据 简单查询 select * from test;带聚合函数的查询 …

论文写作之latex配置(VSCODE+TEXT LIVE)

1.overleaf 初学者学习latex可以用这个练习,可以在线编辑十分方便,但是编译时间受限制 网站:https://www.overleaf.com/project 2.Tex live 选择一个.iso文件下载 网站:Index of /CTAN/systems/texlive/Images/ 下载成功&am…

2024第三届钉钉杯大学生大数据挑战赛【A题】完整分享

2024第三届钉钉杯大学生大数据挑战赛已经开赛,小编给大家带来非常实用的助力【A题】完整,(看图片下方的说明),资料预览: 微信公众号