毕业设计 深度学习昆虫识别系统(源码+论文)
文章目录0 前言1 项目运行效果2 设计原理3 数据收集和处理4 卷积神经网络4.1卷积层4.2 池化层4.3 激活函数4.4 全连接层4.5 使用tensorflow中keras模块实现卷积神经网络5 MobileNetV2网络6 损失函数softmax 交叉熵6.1 softmax函数6.2 交叉熵损失函数7 优化器SGD8 学习率衰减策略9 最后0 前言这两年开始毕业设计和毕业答辩的要求和难度不断提升传统的毕设题目缺少创新和亮点往往达不到毕业答辩的要求这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。并且很难找到完整的毕设参考学习资料。为了大家能够顺利以及最少的精力通过毕设学长分享优质毕业设计项目提供大家参考学习今天要分享的是毕业设计 深度学习昆虫识别系统源码论文学长这里给一个题目综合评分(每项满分5分)难度系数3分工作量3分创新点4分项目分享见主页任意置顶文章1 项目运行效果视频效果毕业设计 深度学习昆虫识别系统2 设计原理以一个demo作为样例讲解大致原理实际工程要更为细致复杂。中国是农业大国在传统的农业生产中经常会受到病虫害问题的困扰。在解决病虫害问题时第一步是识别昆虫。在传统的昆虫识别方法中昆虫专家根据专业知识观察昆虫的外部特征并对照相关的昆虫图鉴进行识别费时费力。如今传统的昆虫识别方法逐渐被昆虫图像识别技术代替。目前常用的昆虫识别技术有图像识别法、微波雷达检测法、生物光子检测法、取样检测法、近红外及高光谱法、声测法等。近年来随着人工智能的迅速发展深度学习技术在处理自然语言、机器视觉等方面取得了很多成果随着深度学习的发展已经有研究人员开始将深度学习技术应用于昆虫的图像识别。文章旨在利用基于深度学习的图像识别技术解决昆虫识别问题希望能给现实生活中的病虫害识别问题提供新的解决问题的思路。3 数据收集和处理数据是深度学习的基石数据的主要来源有: 百度图片, 必应图片, 新浪微博, 百度贴吧, 新浪博客和一些专业的昆虫网站等爬虫爬取的图像的质量参差不齐, 标签可能有误, 且存在重复文件, 因此必须清洗。清洗方法包括自动化清洗, 半自动化清洗和手工清洗。自动化清洗包括:滤除小尺寸图像.滤除宽高比很大或很小的图像.滤除灰度图像.图像去重: 根据图像感知哈希.半自动化清洗包括:图像级别的清洗: 利用预先训练的昆虫/非昆虫图像分类器对图像文件进行打分, 非昆虫图像应该有较低的得分; 利用前一阶段的昆虫分类器对图像文件 (每个文件都有一个预标类别) 进行预测, 取预标类别的概率值为得分, 不属于原预标类别的图像应该有较低的得分. 可以设置阈值, 滤除很低得分的文件; 另外利用得分对图像文件进行重命名, 并在资源管理器选择按文件名排序, 以便于后续手工清洗掉非昆虫图像和不是预标类别的图像.类级别的清洗手工清洗: 人工判断文件夹下图像是否属于文件夹名所标称的物种, 这需要相关的昆虫学专业知识, 是最耗时且枯燥的环节。4 卷积神经网络卷积神经网络Convolutional Neural NetwoekCNN是一种前馈神经网络它的人工神经元可以局部响应周围的神经元每个神经元都接收一些输入并做一些点积计算。它通常包含卷积层、激活层、池化层、全连接层。4.1卷积层卷积核相当于一个滑动窗口示意图中x大小的卷积核依次划过x大小的输入数据中的对应区域并与卷积核滑过区域做矩阵点乘将所得结果依次填入对应位置即可得到右侧x尺寸的卷积特征图例如划到右上角x所圈区域时将进行xxxxxxxxxx的计算操作并将得到的数值填充到卷积特征的右上角。4.2 池化层池化操作又称为降采样提取网络主要特征可以在达到空间不变性的效果同时有效地减少网络参数因而简化网络计算复杂度防止过拟合现象的出现。在实际操作中经常使用最大池化或平均池化两种方式如下图所示。虽然池化操作可以有效的降低参数数量但过度池化也会导致一些图片细节的丢失因此在搭建网络时要根据实际情况来调整池化操作。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UTsB7AhE-1658995487680)4.3 激活函数激活函数大致分为两种在卷积神经网络的发展前期使用较为传统的饱和激活函数主要包括sigmoid函数、tanh函数等随着神经网络的发展研宄者们发现了饱和激活函数的弱点并针对其存在的潜在问题研宄了非饱和激活函数其主要含有ReLU函数及其函数变体4.4 全连接层在整个网络结构中起到“分类器”的作用经过前面卷积层、池化层、激活函数层之后网络己经对输入图片的原始数据进行特征提取并将其映射到隐藏特征空间全连接层将负责将学习到的特征从隐藏特征空间映射到样本标记空间一般包括提取到的特征在图片上的位置信息以及特征所属类别概率等。将隐藏特征空间的信息具象化也是图像处理当中的重要一环。4.5 使用tensorflow中keras模块实现卷积神经网络classCNN(tf.keras.Model):def__init__(self):super().__init__()self.conv1tf.keras.layers.Conv2D(filters32,# 卷积层神经元卷积核数目kernel_size[5,5],# 感受野大小paddingsame,# padding策略vaild 或 sameactivationtf.nn.relu# 激活函数)self.pool1tf.keras.layers.MaxPool2D(pool_size[2,2],strides2)self.conv2tf.keras.layers.Conv2D(filters64,kernel_size[5,5],paddingsame,activationtf.nn.relu)self.pool2tf.keras.layers.MaxPool2D(pool_size[2,2],strides2)self.flattentf.keras.layers.Reshape(target_shape(7*7*64,))self.dense1tf.keras.layers.Dense(units1024,activationtf.nn.relu)self.dense2tf.keras.layers.Dense(units10)defcall(self,inputs):xself.conv1(inputs)# [batch_size, 28, 28, 32]xself.pool1(x)# [batch_size, 14, 14, 32]xself.conv2(x)# [batch_size, 14, 14, 64]xself.pool2(x)# [batch_size, 7, 7, 64]xself.flatten(x)# [batch_size, 7 * 7 * 64]xself.dense1(x)# [batch_size, 1024]xself.dense2(x)# [batch_size, 10]outputtf.nn.softmax(x)returnoutput5 MobileNetV2网络简介MobileNet网络是Google最近提出的一种小巧而高效的CNN模型其在accuracy和latency之间做了折中。主要改进点相对于MobileNetV1MobileNetV2 主要改进点引入倒残差结构先升维再降维增强梯度的传播显著减少推理期间所需的内存占用Inverted Residuals去掉 Narrow layer(low dimension or depth) 后的 ReLU保留特征多样性增强网络的表达能力Linear Bottlenecks网络为全卷积使得模型可以适应不同尺寸的图像使用 RELU6最高输出为 6激活函数使得模型在低精度计算下具有更强的鲁棒性MobileNetV2 Inverted residual block 如下所示若需要下采样可在 DW 时采用步长为 2 的卷积小网络使用小的扩张系数expansion factor大网络使用大一点的扩张系数expansion factor推荐是5~10论文中 t 6 t 6t6倒残差结构Inverted residual blockResNet的Bottleneck结构是降维-卷积-升维是两边细中间粗而MobileNetV2是先升维6倍- 卷积 - 降维是沙漏形。区别于MobileNetV1, MobileNetV2的卷积结构如下因为DW卷积不改变通道数所以如果上一层的通道数很低时DW只能在低维空间提取特征效果不好。所以V2版本在DW前面加了一层PW用来升维。同时V2去除了第二个PW的激活函数改用线性激活因为激活函数在高维空间能够有效地增加非线性但在低维空间时会破坏特征。由于第二个PW主要的功能是降维所以不宜再加ReLU6。tensorflow相关实现代码importtensorflowastfimportnumpyasnpfromtensorflow.kerasimportlayers,Sequential,ModelclassConvBNReLU(layers.Layer):def__init__(self,out_channel,kernel_size3,strides1,**kwargs):super(ConvBNReLU,self).__init__(**kwargs)self.convlayers.Conv2D(filtersout_channel,kernel_sizekernel_size,stridesstrides,paddingSAME,use_biasFalse,nameConv2d)self.bnlayers.BatchNormalization(momentum0.9,epsilon1e-5,nameBatchNorm)self.activationlayers.ReLU(max_value6.0)# ReLU6defcall(self,inputs,trainingFalse,**kargs):xself.conv(inputs)xself.bn(x,trainingtraining)xself.activation(x)returnxclassInvertedResidualBlock(layers.Layer):def__init__(self,in_channel,out_channel,strides,expand_ratio,**kwargs):super(InvertedResidualBlock,self).__init__(**kwargs)self.hidden_channelin_channel*expand_ratio self.use_shortcut(strides1)and(in_channelout_channel)layer_list[]# first bottleneck does not need 1*1 convifexpand_ratio!1:# 1x1 pointwise convlayer_list.append(ConvBNReLU(out_channelself.hidden_channel,kernel_size1,nameexpand))layer_list.extend([# 3x3 depthwise convlayers.DepthwiseConv2D(kernel_size3,paddingSAME,stridesstrides,use_biasFalse,namedepthwise),layers.BatchNormalization(momentum0.9,epsilon1e-5,namedepthwise/BatchNorm),layers.ReLU(max_value6.0),#1x1 pointwise conv(linear)# linear activation y x - no activation functionlayers.Conv2D(filtersout_channel,kernel_size1,strides1,paddingSAME,use_biasFalse,nameproject),layers.BatchNormalization(momentum0.9,epsilon1e-5,nameproject/BatchNorm)])self.main_branchSequential(layer_list,nameexpanded_conv)defcall(self,inputs,**kargs):ifself.use_shortcut:returninputsself.main_branch(inputs)else:returnself.main_branch(inputs)6 损失函数softmax 交叉熵6.1 softmax函数Softmax函数由下列公式定义softmax 的作用是把 一个序列变成概率。softmax用于多分类过程中它将多个神经元的输出映射到0,1区间内所有概率的和将等于1。python实现defsoftmax(x):shift_xx-np.max(x)# 防止输入增大时输出为nanexp_xnp.exp(shift_x)returnexp_x/np.sum(exp_x)PyTorch封装的Softmax()函数dim参数dim为0时对所有数据进行softmax计算dim为1时对某一个维度的列进行softmax计算dim为-1 或者2 时对某一个维度的行进行softmax计算importtorch xtorch.tensor([2.0,1.0,0.1])x.cuda()outputstorch.softmax(x,dim0)print(输入,x)print(输出,outputs)print(输出之和,outputs.sum())6.2 交叉熵损失函数定义如下:python实现defcross_entropy(a,y):returnnp.sum(np.nan_to_num(-y*np.log(a)-(1-y)*np.log(1-a)))# tensorflow versionlosstf.reduce_mean(-tf.reduce_sum(y_*tf.log(y),reduction_indices[1]))# numpy versionlossnp.mean(-np.sum(y_*np.log(y),axis1))PyTorch实现交叉熵函数分为二分类(torch.nn.BCELoss())和多分类函数(torch.nn.CrossEntropyLoss()# 二分类 损失函数losstorch.nn.BCELoss()lloss(predreal)# 多分类损失函数losstorch.nn.CrossEntropyLoss()7 优化器SGD简介SGD全称Stochastic Gradient Descent随机梯度下降1847年提出。每次选择一个mini-batch而不是全部样本使用梯度下降来更新模型参数。它解决了随机小批量样本的问题但仍然有自适应学习率、容易卡在梯度较小点等问题。pytorch调用方法torch.optim.SGD(params,lrrequired parameter,momentum0,dampening0,weight_decay0,nesterovFalse)相关代码defstep(self,closureNone):Performs a single optimization step. Arguments: closure (callable, optional): A closure that reevaluates the model and returns the loss. lossNoneifclosureisnotNone:lossclosure()forgroupinself.param_groups:weight_decaygroup[weight_decay]# 权重衰减系数momentumgroup[momentum]# 动量因子0.9或0.8dampeninggroup[dampening]# 梯度抑制因子nesterovgroup[nesterov]# 是否使用nesterov动量forpingroup[params]:ifp.gradisNone:continued_pp.grad.dataifweight_decay!0:# 进行正则化# add_表示原处改变d_p d_p weight_decay*p.datad_p.add_(weight_decay,p.data)ifmomentum!0:param_stateself.state[p]# 之前的累计的数据v(t-1)# 进行动量累计计算ifmomentum_buffernotinparam_state:bufparam_state[momentum_buffer]torch.clone(d_p).detach()else:# 之前的动量bufparam_state[momentum_buffer]# buf buf*momentum 1-dampening*d_pbuf.mul_(momentum).add_(1-dampening,d_p)ifnesterov:# 使用neterov动量# d_p d_p momentum*bufd_pd_p.add(momentum,buf)else:d_pbuf# p p - lr*d_pp.data.add_(-group[lr],d_p)returnloss8 学习率衰减策略余弦退火衰减这可以理解为是一种带重启的随机梯度下降算法。在网络模型更新时由于存在很多局部最优解这就导致模型会陷入局部最优解即优化函数存在多个峰值。这就要求当模型陷入局部最优解时能够跳出去并且继续寻找下一个最优解直到找到全局最优解。要使得模型跳出局部最优解就需要在模型陷入局部最优解时突然提高学习率即重启学习率。多周期的余弦退火衰减示意图如下相关代码实现# ----------------------------------------------------------------------- ## 多周期余弦退火衰减# ----------------------------------------------------------------------- ## eager模式防止graph报错tf.config.experimental_run_functions_eagerly(True)# ------------------------------------------------ #importmath# 继承自定义学习率的类classCosineWarmupDecay(keras.optimizers.schedules.LearningRateSchedule): initial_lr: 初始的学习率 min_lr: 学习率的最小值 max_lr: 学习率的最大值 warmup_step: 线性上升部分需要的step total_step: 第一个余弦退火周期需要对总step multi: 下个周期相比于上个周期调整的倍率 print_step: 多少个step并打印一次学习率 # 初始化def__init__(self,initial_lr,min_lr,warmup_step,total_step,multi,print_step):# 继承父类的初始化方法super(CosineWarmupDecay,self).__init__()# 属性分配self.initial_lrtf.cast(initial_lr,dtypetf.float32)self.min_lrtf.cast(min_lr,dtypetf.float32)self.warmup_stepwarmup_step# 初始为第一个周期的线性段的stepself.total_steptotal_step# 初始为第一个周期的总stepself.multimulti self.print_stepprint_step# 保存每一个step的学习率self.learning_rate_list[]# 当前步长self.step0# 前向传播, 训练时传入当前step但是上面已经定义了一个这个step用不上def__call__(self,step):# 如果当前step达到了当前周期末端就调整ifself.stepself.total_step:# 乘上倍率因子后会有小数这里要注意# 调整一个周期中线性部分的step长度self.warmup_stepself.warmup_step*(1self.multi)# 调整一个周期的总step长度self.total_stepself.total_step*(1self.multi)# 重置step从线性部分重新开始self.step0# 余弦部分的计算公式decayed_learning_rateself.min_lr0.5*(self.initial_lr-self.min_lr)*\(1tf.math.cos(math.pi*(self.step-self.warmup_step)/\(self.total_step-self.warmup_step)))# 计算线性上升部分的增长系数kk(self.initial_lr-self.min_lr)/self.warmup_step# 线性增长线段 ykxbwarmupk*self.stepself.min_lr# 以学习率峰值点横坐标为界左侧是线性上升右侧是余弦下降decayed_learning_ratetf.where(self.stepself.warmup_step,warmup,decayed_learning_rate)# 每个epoch打印一次学习率ifstep%self.print_step0:# 打印当前step的学习率print(learning_rate has changed to: ,decayed_learning_rate.numpy().item())# 每个step保存一次学习率self.learning_rate_list.append(decayed_learning_rate.numpy().item())# 计算完当前学习率后step加一用于下一次self.stepself.step1# 返回调整后的学习率returndecayed_learning_rate篇幅有限更多详细设计见设计论文9 最后项目包含内容近3万字 完整详细设计论文项目分享见主页任意置顶文章

相关新闻

前端工程师为何要学Python?提升效率的实战指南

前端工程师为何要学Python?提升效率的实战指南

1. 为什么前端工程师需要学习Python?作为从业八年的全栈开发者,我见过太多前端工程师在职业发展中期遇到瓶颈。去年团队招聘时,一位有5年React经验的前端开发者因为不会写简单的Python脚本而错失晋升机会。这件事让我深刻意识到:在…

2026/7/23 4:12:50 阅读更多 →
LLMStudio模型思考模式关闭机制与性能优化

LLMStudio模型思考模式关闭机制与性能优化

1. 项目概述:LLMStudio模型思考模式关闭机制在大型语言模型应用开发领域,LLMStudio作为集成化开发平台,其"模型思考模式"是一项影响模型推理过程的核心功能。这个模式默认开启时,模型会在生成响应前显示中间推理步骤&am…

2026/7/23 4:12:50 阅读更多 →
Netmind AI多模态API集成与优化实践

Netmind AI多模态API集成与优化实践

1. Netmind AI模型库深度解析Netmind AI作为新一代多模态AI服务平台,其核心价值在于将分散的AI能力整合到统一API中。这个设计理念源于当前AI应用开发中的几个痛点:模型接口碎片化、部署复杂度高、运维成本难以控制。我曾在多个项目中尝试整合不同厂商的…

2026/7/23 4:12:50 阅读更多 →

最新新闻

网络内容安全防护:从XSS攻击到API滥用的全面防护实践

网络内容安全防护:从XSS攻击到API滥用的全面防护实践

1. 网络恶搞事件的技术背景与影响分析近期网络上出现了一起引发广泛关注的恶搞事件,这类事件在技术层面往往涉及网络安全、数据隐私和内容传播等多个维度。作为技术开发者,我们需要从专业角度分析这类事件背后的技术原理和潜在风险,帮助大家更…

2026/7/23 4:48:03 阅读更多 →
用纯C语言实现AI大模型推理:llama2.c项目实战指南

用纯C语言实现AI大模型推理:llama2.c项目实战指南

1. 项目概述:为什么是llama2.c?如果你对AI大模型感兴趣,但又觉得动辄几十GB的PyTorch项目、复杂的Python依赖和昂贵的GPU让人望而却步,那么llama2.c绝对是一个让你眼前一亮的项目。它的核心魅力在于,用最纯粹的C语言&a…

2026/7/23 4:48:03 阅读更多 →
还不会管控 Linux 后台服务?负载监控、压力测试、自定义服务一次性讲清

还不会管控 Linux 后台服务?负载监控、压力测试、自定义服务一次性讲清

监控系统负载与 Linux 服务管理 一、监控系统负载 1. 系统负载概念概念说明Load AverageLinux 内核以活动请求数的指数移动平均值表示系统负载活动请求数包含 R(运行中)和 D(等待 I/O)状态的进程计算周期每 5 秒计算一次&#xff…

2026/7/23 4:48:03 阅读更多 →
C++多模块开发中全局对象多次析构问题的智能指针解决方案

C++多模块开发中全局对象多次析构问题的智能指针解决方案

1. 项目概述:一个C老手常踩的坑 如果你在Windows上用Visual Studio或者Linux上用GCC/Clang开发过大型C项目,尤其是那种由多个动态链接库(DLL/SO)和可执行文件(EXE)组成的复杂系统,那你很可能遇到…

2026/7/23 4:48:03 阅读更多 →
ESP32 HTTP通信开发实战与IDF框架解析

ESP32 HTTP通信开发实战与IDF框架解析

1. ESP32 HTTP通信基础与IDF框架解析在物联网设备开发中,HTTP协议作为应用层通信标准,承担着设备与云端数据交互的重要职责。ESP32作为一款集成Wi-Fi和蓝牙功能的微控制器,其官方开发框架ESP-IDF提供了完整的HTTP客户端实现。不同于常见的Ard…

2026/7/23 4:48:03 阅读更多 →
Kimi K3与Qwen 3.8开源大模型本地部署全流程指南

Kimi K3与Qwen 3.8开源大模型本地部署全流程指南

这次我们来看一个重量级消息:Kimi K3 和 Qwen 3.8 两大模型同时发布,性能直接对标 Anthropic 的 Fable 5,而且最关键的是——它们都将开源。这意味着什么?意味着我们很快就能在本地部署这些顶级模型,不再受限于云端 AP…

2026/7/23 4:47:02 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻