毕业设计 深度学习昆虫识别系统(源码+论文)
文章目录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/10/15 2:17:42 阅读更多 →
LLMStudio模型思考模式关闭机制与性能优化

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

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

2026/10/15 23:00:26 阅读更多 →
Netmind AI多模态API集成与优化实践

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

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

2026/10/15 22:59:58 阅读更多 →

最新新闻

AI芯片软硬件协同设计:从计算分布图到编译器适配的完整链路

AI芯片软硬件协同设计:从计算分布图到编译器适配的完整链路

1. 从异构计算说起:为什么AI芯片要软硬件一起设计大家做AI这块久了,应该都体会过一种割裂感:算法工程师拿着PyTorch调模型,觉得硬件就是个黑盒子,只要显存够大、算子能跑就行;做芯片的工程师呢,…

2026/10/16 17:50:16 阅读更多 →
线性回归不是单个模型,而是一个应对不同数据问题的家族

线性回归不是单个模型,而是一个应对不同数据问题的家族

1. 为什么线性回归不是“一个模型”,而是一整个家族?很多人第一次在 sklearn 里调用LinearRegression(),跑通了房价预测 demo,就以为自己“掌握了线性回归”。我当年也是——直到在某次模型上线后发现:训练集 R0.92&am…

2026/10/16 17:50:16 阅读更多 →
深度学习数据shuffle原理与工程实践指南

深度学习数据shuffle原理与工程实践指南

1. 为什么一个“打乱顺序”的操作,能让模型学得更准?你有没有试过:同样一份训练数据、同样的网络结构、同样的学习率,只是把数据读入的顺序从“按类别排好”改成“随机打乱”,结果验证准确率直接跳了1.8%?这…

2026/10/16 17:50:16 阅读更多 →
AD9精简版免安装:嵌入式硬件协同验证的轻量级ADC/DAC仿真工具

AD9精简版免安装:嵌入式硬件协同验证的轻量级ADC/DAC仿真工具

简介:本资源为AD9(Altium Designer 9)精简版免安装绿色软件包,面向电子设计初学者、PCB快速原型开发者及教学实训场景下的轻量级EDA需求用户。它在保留完整原理图绘制与PCB布局布线核心功能基础上,剔除了仿真、VHDL开发…

2026/10/16 17:50:16 阅读更多 →
TF-IDF提取《红楼梦》回目关键词:中文古白话文本分析实战

TF-IDF提取《红楼梦》回目关键词:中文古白话文本分析实战

做文本分析这些年,我越来越觉得中文语料的坑比想象中多。前阵子接了个活儿,把《红楼梦》一百二十回按回目做核心关键词提取,用来快速浏览每回到底讲了啥,顺便看看能不能发现一些隐藏的叙事线索。标题里写的“基于 TF-IDF”&#x…

2026/10/16 17:50:16 阅读更多 →
从文本清洗到情感曲线:NLP文本挖掘项目harrypotter15-1解析

从文本清洗到情感曲线:NLP文本挖掘项目harrypotter15-1解析

“harrypotter15-1”看起来像某个内部实验目录,或者某个数据集的版本号。说实话我第一次拿到这个代号的时候也愣了一下,下意识以为是谁在整理同人素材时把所有文档编号成了“哈利波特第15卷第1部分”。但拆开看就清楚多了:harrypotter 是主题…

2026/10/16 17:49:13 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →