YOLOv11 改进 - SPPF模块 AIFI基于注意力的尺度内特征交互:替代SPPF构建高效混合编码器,提升模型综合效能
前言本文介绍了实时检测TransformerRT-DETR及其核心AIFI模块在YOLOv11中的结合应用。RT-DETR旨在解决YOLO速度和准确性受NMS负面影响、DETRs计算成本高的问题通过设计高效混合编码器和解码器层数调整来提升性能。AIFI作为Transformer编码器层通过构建2D正弦 - 余弦位置嵌入处理多尺度特征。我们将AIFI集成进YOLOv11实验表明改进后的模型在COCO数据集上的速度和准确性超越了先进的YOLO模型展现出良好的性能表现。文章目录 YOLOv11改进大全卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总专栏链接: YOLOv11改进专栏介绍摘要YOLO系列因其在速度和准确性之间的合理权衡成为了实时目标检测中最受欢迎的框架。然而我们观察到YOLO的速度和准确性受NMS非极大值抑制的负面影响。最近基于Transformer的端到端检测器DETRs提供了一种消除NMS的替代方案但其高计算成本限制了其实用性并阻碍了其完全利用排除NMS的优势。在本文中我们提出了实时检测TransformerRT-DETR据我们所知这是第一个解决上述困境的实时端到端目标检测器。我们借鉴先进的DETR分两步构建RT-DETR首先我们专注于在提高速度的同时保持准确性然后在保持速度的同时提高准确性。具体而言我们设计了一种高效的混合编码器通过解耦内尺度交互和跨尺度融合来快速处理多尺度特征从而提高速度。然后我们提出了不确定性最小化查询选择以向解码器提供高质量的初始查询从而提高准确性。此外RT-DETR通过调整解码器层数支持灵活的速度调节以适应各种场景而无需重新训练。我们的RT-DETR-R50/R101在COCO数据集上分别达到了53.1%和54.3%的AP并在T4 GPU上达到了108 FPS和74 FPS超越了之前先进的YOLOs在速度和准确性上的表现。此外RT-DETR-R50在准确性上比DINO-R50高2.2% AP且FPS高约21倍。经过Objects365的预训练后RT-DETR-R50/R101分别达到了55.3%和56.2%的AP。项目页面https://zhao-yian.github.io/RTDETR。文章链接论文地址论文地址代码地址代码地址基本原理核心代码class AIFI(TransformerEncoderLayer): Defines the AIFI transformer layer. def __init__(self, c1, cm2048, num_heads8, dropout0, actnn.GELU(), normalize_beforeFalse): Initialize the AIFI instance with specified parameters. super().__init__(c1, cm, num_heads, dropout, act, normalize_before) def forward(self, x): Forward pass for the AIFI transformer layer. c, h, w x.shape[1:] pos_embed self.build_2d_sincos_position_embedding(w, h, c) # Flatten [B, C, H, W] to [B, HxW, C] x super().forward(x.flatten(2).permute(0, 2, 1), pospos_embed.to(devicex.device, dtypex.dtype)) return x.permute(0, 2, 1).view([-1, c, h, w]).contiguous() staticmethod def build_2d_sincos_position_embedding(w, h, embed_dim256, temperature10000.0): Builds 2D sine-cosine position embedding. grid_w torch.arange(int(w), dtypetorch.float32) grid_h torch.arange(int(h), dtypetorch.float32) grid_w, grid_h torch.meshgrid(grid_w, grid_h, indexingij) assert embed_dim % 4 0, Embed dimension must be divisible by 4 for 2D sin-cos position embedding pos_dim embed_dim // 4 omega torch.arange(pos_dim, dtypetorch.float32) / pos_dim omega 1.0 / (temperature**omega) out_w grid_w.flatten()[..., None] omega[None] out_h grid_h.flatten()[..., None] omega[None] return torch.cat([torch.sin(out_w), torch.cos(out_w), torch.sin(out_h), torch.cos(out_h)], 1)[None]实验脚本import warnings warnings.filterwarnings(ignore) from ultralytics import YOLO if __name__ __main__: # 修改为自己的配置文件地址 model YOLO(/root/ultralytics-main/ultralytics/cfg/models/11/yolov11-AIFI.yaml) # 修改为自己的数据集地址 model.train(data/root/ultralytics-main/ultralytics/cfg/datasets/coco8.yaml, cacheFalse, imgsz640, epochs10, single_clsFalse, # 是否是单类别检测 batch8, close_mosaic10, workers0, optimizerSGD, ampTrue, projectruns/train, nameAIFI, )结果