YOLOv8改进方法

YOLOv8改进方法

为解决复杂环境下番茄生长点花蕾检测的难题,本研究针对目标尺度多样、外观相似、遮挡严重等问题,从骨干网络(Backbone)、颈部结构(Neck)和检测头(Head)三个方面系统改进了YOLOv8的网络结构和损失函数,旨在提高其对弱小目标的检测精度和环境适应性。

3.1 YOLOv8基线模型分析

3.1.1 模型架构及其局限性

YOLOv8是一种基于Anchor的单阶段目标检测算法,以其检测速度快、精度高、易部署的优势在工业视觉领域得到广泛应用{XXXX1}。如图7所示,YOLOv8以CSPDarknet53为骨干网络,提取多尺度特征;再通过SPP模块和PANet颈部结构融合细粒度和粗粒度特征信息;最后利用YOLOHead输出三个不同尺度的检测框和类别概率。整个过程实现了端到端的目标检测,可同时适应不同大小和宽高比的目标。

【图7 YOLOv8网络架构图】
(a) 整体流程; (b) CSPDarknet53骨干网; © SPP+PANet颈部; (d) YOLOHead检测头

然而,在番茄生长点花蕾检测任务中,YOLOv8仍面临以下局限:

(1) 生长点和花蕾属于小目标,在骨干网络的高层特征图上尺寸较小,容易漏检。而浅层特征语义信息不足,易引入背景干扰。因此,需要一种自适应的特征增强机制,在低层和高层均衡兼顾细节和语义信息。

(2) 番茄植株枝叶茂密,存在大量遮挡和相似的背景区域,易引起检测框的误匹配。而YOLOv8的Neck采用标准卷积进行特征融合,参数量和计算量都较大,不利于实时筛除冗余信息。需要在降低模型复杂度的同时,保持特征的判别力。

(3) 生长点和花蕾在形态和纹理上相似,但尺寸差异较大,标准的IoU损失函数对不同尺度目标一视同仁,容易导致小目标漏检。因此,需要设计对目标尺度自适应的损失函数,加强对小目标的检测能力。

以上问题制约了YOLOv8在番茄生长点花蕾检测中的性能,针对性的模型改进势在必行。

3.2 Backbone改进:引入SE注意力机制

3.2.1 SE注意力的结构与特点

Backbone作为目标检测网络的特征提取器,其性能直接决定了检测的上限。为增强YOLOv8骨干网络CSPDarknet对番茄生长点花蕾的自适应表达能力,本研究在其高、中、低三个尺度的Block中引入了SE(Squeeze-and-Excitation)注意力模块{XXXX2}。SE通过显式建模特征通道间的依赖关系,自适应地调整不同语义的重要性,使骨干网络聚焦于目标相关的区域和特征。

如图8所示,设第 l l l层特征图 F l ∈ R H l × W l × C l F_l \in \mathbb{R}^{H_l\times W_l\times C_l} FlRHl×Wl×Cl,SE模块首先对其在空间维度做全局平均池化,得到通道描述子 z l ∈ R C l z_l\in \mathbb{R}^{C_l} zlRCl:

z l = 1 H l W l ∑ i = 1 H l ∑ j = 1 W l F l ( i , j ) z_l=\frac{1}{H_lW_l}\sum_{i=1}^{H_l}\sum_{j=1}^{W_l}F_l(i,j) zl=HlWl1i=1Hlj=1WlFl(i,j)

其中 ( i , j ) (i,j) (i,j)为空间坐标。 z l z_l zl实际上是一个包含全局感受野的特征向量,聚合了整个特征图的上下文信息。然后,SE通过两个全连接层和一个Sigmoid函数对 z l z_l zl进行非线性变换,生成通道注意力权重 a l ∈ R C l \boldsymbol{a}_l\in \mathbb{R}^{C_l} alRCl:

a l = σ ( W 2 δ ( W 1 z l ) ) \boldsymbol{a}_l=\sigma(\boldsymbol{W}_2\delta(\boldsymbol{W}_1\boldsymbol{z}_l)) al=σ(W2δ(W1zl))

其中 W 1 ∈ R C l r × C l , W 2 ∈ R C l × C l r \boldsymbol{W}_1\in\mathbb{R}^{\frac{C_l}{r}\times C_l},\boldsymbol{W}_2\in\mathbb{R}^{C_l\times \frac{C_l}{r}} W1RrCl×Cl,W2RCl×rCl分别为两个全连接层的权重矩阵, δ \delta δ为ReLU函数, σ \sigma σ为Sigmoid函数, r r r为缩放比例(通常取16)。这两个全连接层起到了bottleneck的作用,在减少参数量的同时增加了非线性。最后,将 a l \boldsymbol{a}_l al F l F_l Fl逐通道相乘,得到注意力加权后的特征图 F ^ l \hat{F}_l F^l:

F ^ l ( i , j , c ) = a l ( c ) ⋅ F l ( i , j , c ) \hat{F}_l(i,j,c)=a_l(c)\cdot F_l(i,j,c) F^l(i,j,c)=al(c)Fl(i,j,c)

【图8 SE注意力模块结构示意图】
SE模块结构简洁,计算效率高,可以即插即用地嵌入到任意卷积网络中。其优势主要体现在:
(1) 通过引入通道注意力,自适应增强目标相关通道的权重,抑制背景干扰通道,提高检测网络的判别力;
(2) 利用bottleneck结构减少了全连接层的参数量,每个SE模块的时空复杂度均为 O ( C l ) \mathcal{O}(C_l) O(Cl),几乎不增加推理开销;
(3) 通过在高低层同时嵌入SE模块,在提取尺度不变语义特征的同时,也兼顾了位置敏感的细节特征。

因此,SE模块是一种高效、灵活、泛化性好的注意力机制,非常适合用于提升YOLOv8的小目标检测能力。

3.2.2 基于梯度的SE嵌入位置搜索

除了SE模块本身的设计,其嵌入位置也会影响检测性能。为寻找最优的SE嵌入位置组合,本研究采用了基于梯度的NAS(Neural Architecture Search)方法{XXXX3},即将待搜索的超参数(每一层是否嵌入SE)建模为伯努利分布,通过梯度反向传播联合优化超参数分布和网络权重,找到在验证集上表现最佳的嵌入方案。如图9所示,搜索过程可分为三步:

(1) 参数化:设骨干网共 L L L个Block,每个Block是否嵌入SE构成一个 L L L维二值向量 z ∈ { 0 , 1 } L \boldsymbol{z}\in\{0,1\}^L z{0,1}L,服从参数为 α ∈ R L \boldsymbol{\alpha}\in\mathbb{R}^L αRL的伯努利分布:

P ( z ∣ α ) = ∏ l = 1 L α l z l ( 1 − α l ) 1 − z l P(\boldsymbol{z}|\boldsymbol{\alpha})=\prod_{l=1}^L\alpha_l^{z_l}(1-\alpha_l)^{1-z_l} P(zα)=l=1Lαlzl(1αl)1zl

(2) 松弛:将 z \boldsymbol{z} z松弛为连续值 z ^ \hat{\boldsymbol{z}} z^,每个分量 z ^ l ∈ [ 0 , 1 ] \hat{z}_l\in[0,1] z^l[0,1]表示第 l l l个Block嵌入SE的概率,由 α l \alpha_l αl通过Sigmoid变换得到:

z ^ l = σ ( log ⁡ α l 1 − α l ) \hat{z}_l=\sigma(\log \frac{\alpha_l}{1-\alpha_l}) z^l=σ(log1αlαl)

则Block l l l输出的特征可表示为 F l o u t = z ^ l S E ( F l i n ) + ( 1 − z ^ l ) F l i n F_l^{out}=\hat{z}_lSE(F_l^{in})+(1-\hat{z}_l)F_l^{in} Flout=z^lSE(Flin)+(1z^l)Flin

(3) 优化:令 L t r ( z ^ , w ) \mathcal{L}_{tr}(\hat{\boldsymbol{z}},\boldsymbol{w}) Ltr(z^,w)为训练集上的损失函数, w \boldsymbol{w} w为网络权重,则联合优化的目标为最小化验证集损失的期望:

min ⁡ α E z ∼ P ( z ∣ α ) [ L v a ( z ^ , w ∗ ( z ^ ) ) ] s.t. w ∗ ( z ^ ) = arg ⁡ min ⁡ w L t r ( z ^ , w ) \begin{aligned} \min_{\boldsymbol{\alpha}}\quad & E_{\boldsymbol{z}\sim P(\boldsymbol{z}|\boldsymbol{\alpha})}[\mathcal{L}_{va}(\hat{\boldsymbol{z}},\boldsymbol{w}^{*}(\hat{\boldsymbol{z}}))] \\ \text{s.t.}\quad &\boldsymbol{w}^{*}(\hat{\boldsymbol{z}})=\arg\min_{\boldsymbol{w}}\mathcal{L}_{tr}(\hat{\boldsymbol{z}},\boldsymbol{w}) \end{aligned} αmins.t.EzP(zα)[Lva(z^,w(z^))]w(z^)=argwminLtr(z^,w)

由于 L v a \mathcal{L}_{va} Lva α \boldsymbol{\alpha} α可微,可用梯度反向传播联合优化 α \boldsymbol{\alpha} α w \boldsymbol{w} w。搜索结束后,每个Block是否嵌入SE取决于 z ^ l \hat{z}_l z^l的大小,当 z ^ l > 0.5 \hat{z}_l>0.5 z^l>0.5时嵌入SE,否则不嵌入。

【图9 基于梯度的SE嵌入位置搜索流程】

为避免搜索过程过拟合,本研究采用了交叉验证的方式,即将原始数据集划分为4个fold,每次取其中3个fold作为训练集,余下1个fold作为验证集,轮流交叉搜索4次,得到4组SE嵌入方案。实验发现,不同fold得到的最优嵌入位置组合虽有差异,但整体趋势一致:浅层Block(1,2,3)倾向于不嵌入SE,中层Block(4,5,6,7)倾向于嵌入SE,高层Block(8,9,10)倾向于不嵌入SE。这可能是因为:浅层语义信息简单,SE收益有限;高层分辨率低,SE可能损失细节;中层兼具一定语义和位置信息,最适合嵌入SE。

综合4组搜索结果,最终确定在第4,5,6,7个Block嵌入SE模块,记为SE@4567。相比直接在所有Block嵌入SE,该方案可在几乎不损失精度的情况下,减少约一半的计算开销。SE@4567成为后续实验的默认配置。

YOLOv8针对遮挡问题进行了改进,引入了一种名为Repulsion Loss的损失函数。这个改进的目的是解决目标遮挡场景下的目标检测问题,特别是在密集人群检测中。 Repulsion Loss是一种用于解决目标遮挡问题的损失函数。它通过引入目标之间的相互排斥力来改善目标检测的性能。在YOLOv8中,通过计算目标框之间的IoU(Intersection over Union)来度量目标之间的重叠程度,并将重叠程度作为相互排斥力的度量。当目标之间的重叠程度较高时,Repulsion Loss会增加,从而鼓励网络更好地处理目标遮挡的情况。 这种改进的损失函数可以提高YOLOv8在目标遮挡场景下的检测性能,尤其是在密集人群检测中。通过引入相互排斥力,网络可以更好地处理目标之间的遮挡情况,提高检测的准确性和鲁棒性。 下面是一个示例代码,展示了如何使用YOLOv8改进的损失函数Repulsion Loss进行目标检测: ```python # 导入相关库和模块 import torch import torch.nn as nn import torch.optim as optim # 定义YOLOv8模型 class YOLOv8(nn.Module): def __init__(self): super(YOLOv8, self).__init__() # 模型结构定义 def forward(self, x): # 前向传播过程 # 定义损失函数 class RepulsionLoss(nn.Module): def __init__(self): super(RepulsionLoss, self).__init__() # 损失函数定义 def forward(self, pred, target): # 计算损失 # 创建模型和损失函数实例 model = YOLOv8() loss_fn = RepulsionLoss() # 定义优化器 optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9) # 训练过程 for epoch in range(num_epochs): # 前向传播 output = model(input) # 计算损失 loss = loss_fn(output, target) # 反向传播 optimizer.zero_grad() loss.backward() optimizer.step() # 打印损失 print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item())) # 模型评估 # ... # 模型预测 # ... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AgriTube

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值