YOLO11 改进 – 即插即用 _ 中小目标检测飙升:Hyper 超图赋能YOLO:轻量级设计实现跨层级信息交互,增强复杂场景感知
前言
本文介绍了目标检测方法Hyper - YOLO及其核心模块在YOLOv11中的结合应用。为克服传统YOLO模型颈部设计局限,提出超图计算赋能语义收集与散射(HGCSCS)框架,构建超图捕捉高阶相关性;骨干网络引入混合聚合网络(MANet)增强特征提取;颈部采用基于超图的跨层和跨位置表示网络(HyperC2Net),实现多尺度复杂交互。我们将MANet和HyperComputeModule集成进YOLOv11,实验表明,Hyper - YOLO在COCO数据集上表现优异,改进后的YOLOv11也取得了良好实验结果。
文章目录: YOLOv11改进大全:卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总
专栏链接: YOLOv11改进专栏
文章目录
[TOC]
介绍
摘要
我们提出了一种创新的目标检测方法——Hyper-YOLO,该方法通过集成超图计算机制来有效捕捉视觉特征之间复杂的高阶相关性。尽管传统YOLO模型在目标检测领域表现出强大的性能,但其颈部网络设计存在固有局限性,制约了跨层级特征的有效整合以及高阶特征相互关系的深度挖掘。为应对这些技术挑战,本研究设计了超图计算赋能的语义收集与散射(HGCSCS)框架,该框架将原始视觉特征图映射到语义空间,并构建超图结构以实现高阶消息传播机制。这一创新设计使得模型能够同时获取丰富的语义信息和结构信息,显著超越了传统以特征为中心的学习范式。Hyper-YOLO在其骨干网络中嵌入了新提出的混合聚合网络(MANet),以增强多尺度特征提取能力,同时在颈部网络中引入了基于超图的跨层与跨位置表示网络(HyperC2Net)。HyperC2Net在五个不同尺度上协同工作,突破了传统网格结构的约束,实现了不同层级和空间位置之间复杂的高阶交互。这些核心组件的协同效应使Hyper-YOLO成为适用于多种模型尺度的先进架构,其在COCO数据集上的卓越性能充分验证了该方法的有效性。具体实验结果表明,HyperYOLO-N的关键性能指标分别比当前先进的YOLOv8-N和YOLOv9-T模型提升了12%和9%,展现出显著的性能优势。相关源代码已公开于:https://github\.com/iMoonLab/Hyper\-YOLO。
文章链接
论文地址: 论文地址
代码地址: 代码地址
基本原理
Hyper - YOLO是一种创新的目标检测方法,它通过融合超图计算来捕捉视觉特征间的高阶相关性,以克服传统YOLO模型在颈部设计上的局限。其技术原理主要涉及以下几个关键部分:
1. 超图计算赋能语义收集与散射(HGCSCS)框架
-
特征收集融合 :该框架首先对输入的视觉特征图进行处理,收集不同层次的特征信息,并将其融合在一起。这一步旨在整合来自不同尺度的特征,因为不同尺度的特征包含了不同层次的语义信息,例如小尺度特征可能包含更多细节,而大尺度特征则侧重于整体结构。
-
超图构建 :将融合后的特征图转换到语义空间,构建超图。在超图中,节点可以代表特征向量或特征区域,而超边则能够描述多个节点之间的复杂关系,这种关系超越了传统图中只能描述两两节点关系的局限,从而可以捕捉到视觉特征间的高阶相关性。例如,在目标检测中,一个物体可能由多个不同局部特征共同描述,超图可以很好地表示这些局部特征之间的复杂组合关系。
-
语义散射 :利用构建好的超图进行高阶消息传播。超图中的节点通过超边相互传递信息,使得每个节点都能获取到与其相关的其他节点的语义和结构信息。这个过程有助于模型更好地理解特征之间的相互作用,从而在后续的检测任务中更准确地识别目标。通过语义散射,模型能够将超图中的信息重新映射回特征空间,为后续的目标检测任务提供更丰富和有价值的特征表示
2. 骨干网络中的混合聚合网络(MANet)
- 增强特征提取 :MANet被集成到Hyper - YOLO的骨干网络中,用于提升特征提取的能力。它融合了多种不同类型的卷积结构,例如可能包括标准卷积、深度可分离卷积等。不同的卷积结构在感受野、计算量和特征提取能力上各有特点。通过混合使用这些卷积结构,MANet能够从输入图像中提取更丰富、更具代表性的特征。例如,标准卷积可以有效地捕捉图像的全局特征,而深度可分离卷积则在减少计算量的同时,对局部特征有较好的提取效果。这种多结构的融合使得MANet能够在不同尺度和不同层次上对图像进行全面的特征提取,为后续的目标检测任务提供更强大的特征基础。
3. 颈部的基于超图的跨层和跨位置表示网络(HyperC2Net)
-
多尺度运行 :HyperC2Net在五个尺度上运行,这使得它能够充分利用不同尺度下的特征信息。不同尺度的特征对于检测不同大小的目标具有重要意义,小尺度特征适合检测小目标,而大尺度特征则对大目标的检测更有利。通过在多个尺度上进行处理,HyperC2Net可以更好地适应各种大小目标的检测需求。
-
突破传统网格结构 :传统的目标检测模型在处理特征时,通常基于网格结构,这种结构在捕捉复杂的空间关系时存在一定局限性。HyperC2Net打破了这种传统网格结构的限制,允许在不同层次和位置之间进行复杂的高阶交互。它借助超图计算,能够在不同尺度的特征之间以及同一尺度特征的不同位置之间,建立更灵活、更复杂的联系。例如,它可以捕捉到目标物体不同部分之间的长距离依赖关系,即使这些部分在空间位置上相隔较远,从而更准确地对目标进行定位和分类。通过这种方式,HyperC2Net能够更有效地融合跨层和跨位置的信息,提升目标检测的性能。
核心代码
class MANet(nn.Module):
def __init__(self, c1, c2, n=1, shortcut=False, p=1, kernel_size=3, g=1, e=0.5):
super().__init__()
self.c = int(c2 * e)
self.cv_first = Conv(c1, 2 * self.c, 1, 1)
self.cv_final = Conv((4 + n) * self.c, c2, 1)
self.m = nn.ModuleList(Bottleneck(self.c, self.c, shortcut, g, k=((3, 3), (3, 3)), e=1.0) for _ in range(n))
self.cv_block_1 = Conv(2 * self.c, self.c, 1, 1)
dim_hid = int(p * 2 * self.c)
self.cv_block_2 = nn.Sequential(Conv(2 * self.c, dim_hid, 1, 1), GroupConv(dim_hid, dim_hid, kernel_size, 1),
Conv(dim_hid, self.c, 1, 1))
def forward(self, x):
y = self.cv_first(x)
y0 = self.cv_block_1(y)
y1 = self.cv_block_2(y)
y2, y3 = y.chunk(2, 1)
y = list((y0, y1, y2, y3))
y.extend(m(y[-1]) for m in self.m)
return self.cv_final(torch.cat(y, 1))
class MessageAgg(nn.Module):
def __init__(self, agg_method="mean"):
super().__init__()
self.agg_method = agg_method
def forward(self, X, path):
"""
X: [n_node, dim]
path: col(source) -> row(target)
"""
X = torch.matmul(path, X)
if self.agg_method == "mean":
norm_out = 1 / torch.sum(path, dim=2, keepdim=True)
norm_out[torch.isinf(norm_out)] = 0
X = norm_out * X
return X
elif self.agg_method == "sum":
pass
return X
class HyPConv(nn.Module):
def __init__(self, c1, c2):
super().__init__()
self.fc = nn.Linear(c1, c2)
self.v2e = MessageAgg(agg_method="mean")
self.e2v = MessageAgg(agg_method="mean")
def forward(self, x, H):
x = self.fc(x)
# v -> e
E = self.v2e(x, H.transpose(1, 2).contiguous())
# e -> v
x = self.e2v(E, H)
return x
class HyperComputeModule(nn.Module):
def __init__(self, c1, c2, threshold):
super().__init__()
self.threshold = threshold
self.hgconv = HyPConv(c1, c2)
self.bn = nn.BatchNorm2d(c2)
self.act = nn.SiLU()
def forward(self, x):
b, c, h, w = x.shape[0], x.shape[1], x.shape[2], x.shape[3]
x = x.view(b, c, -1).transpose(1, 2).contiguous()
feature = x.clone()
distance = torch.cdist(feature, feature)
hg = distance < self.threshold
hg = hg.float().to(x.device).to(x.dtype)
x = self.hgconv(x, hg).to(x.device).to(x.dtype) + x
x = x.transpose(1, 2).contiguous().view(b, c, h, w)
x = self.act(self.bn(x))
return x
实验
脚本
import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLO
if __name__ == '__main__':
# 修改为自己的配置文件地址
model = YOLO('/root/ultralytics-main/ultralytics/cfg/models/11/yolov11-hyper.yaml')
# 修改为自己的数据集地址
model.train(data='/root/ultralytics-main/ultralytics/cfg/datasets/coco8.yaml',
cache=False,
imgsz=640,
epochs=10,
single_cls=False, # 是否是单类别检测
batch=8,
close_mosaic=10,
workers=0,
optimizer='SGD',
amp=True,
project='runs/train',
name='hyper',
)