YOLOv8目标检测创新改进与实战案例专栏
专栏目录: YOLOv8有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例
专栏链接: YOLOv8基础解析+创新改进+实战案例
介绍
摘要
当前的深度学习方法主要关注如何设计最合适的目标函数,以使模型的预测结果尽可能接近真实值。同时,还需设计合适的架构,以便获取足够的信息用于预测。现有方法忽略了一个事实:当输入数据经过逐层特征提取和空间变换时,会丢失大量信息。本文将深入探讨数据通过深度网络传输时的数据丢失这一重要问题,即信息瓶颈和可逆函数。我们提出了可编程梯度信息(PGI)的概念,以应对深度网络实现多重目标所需的各种变化。PGI可以为目标任务提供完整的输入信息,以计算目标函数,从而获得可靠的梯度信息来更新网络权重。此外,我们设计了一种新的轻量级网络架构——基于梯度路径规划的广义高效层聚合网络(GELAN)。GELAN的架构证明了PGI在轻量级模型上取得了优异的结果。我们在MS COCO数据集上的目标检测任务中验证了所提出的GELAN和PGI。结果表明,GELAN仅使用常规卷积操作符就能比基于深度卷积开发的最先进方法实现更好的参数利用率。PGI可用于从轻量级到大型的各种模型,可以获得完整的信息,使得从零开始训练的模型能够取得比使用大数据集预训练的最先进模型更好的结果,比较结果如图1所示。源码可在 https://github.com/WongKinYiu/yolov9 获取。
文章链接
论文地址:论文地址
代码地址:代码地址
基本原理
核心代码
class RepNCSPELAN4(nn.Module):
# csp-elan模块
def __init__(self, c1, c2, c3, c4, c5=1): # 输入通道数, 输出通道数, 中间通道数1, 中间通道数2, 块重复次数
super().__init__()
self.c = c3 // 2
self.cv1 = Conv(c1, c3, 1, 1) # 使用1x1卷积将输入通道数变为c3
self.cv2 = nn.Sequential(RepNCSP(c3 // 2, c4, c5), Conv(c4, c4, 3, 1)) # 定义包含RepNCSP和3x3卷积的顺序容器
self.cv3 = nn.Sequential(RepNCSP(c4, c4, c5), Conv(c4, c4, 3, 1)) # 定义另一个包含RepNCSP和3x3卷积的顺序容器
self.cv4 = Conv(c3 + (2 * c4), c2, 1, 1) # 使用1x1卷积将c3+2倍c4通道数变为c2
def forward(self, x):
y = list(self.cv1(x).chunk(2, 1)) # 先经过cv1卷积,然后在通道维度上分成两部分
y.extend((m(y[-1])) for m in [self.cv2, self.cv3]) # 将第一部分依次经过cv2和cv3
return self.cv4(torch.cat(y, 1)) # 将所有输出在通道维度上拼接后经过cv4卷积
def forward_split(self, x):
y = list(self.cv1(x).split((self.c, self.c), 1)) # 先经过cv1卷积,然后在通道维度上按指定通道数分成两部分
y.extend(m(y[-1]) for m in [self.cv2, self.cv3]) # 将第一部分依次经过cv2和cv3
return self.cv4(torch.cat(y, 1)) # 将所有输出在通道维度上拼接后经过cv4卷积
task与yaml配置
详见: https://blog.csdn.net/shangyanaf/article/details/140460307