当前位置: 首页 > news >正文

YOLO26改进 - 特征融合 | EFC增强层间特征相关性,通过多尺度特征交互减少冗余信息丢失即插即用

前言

本文介绍了基于增强层间特征相关性(EFC)的轻量级融合策略及其在 YOLO26中的结合。检测无人机图像小物体具有挑战性,传统多尺度特征融合方法存在不足。EFC 模块通过引入分组的特征聚焦单元(GFF)增强特征关联性,利用多级特征重构模块(MFR)进行特征重构,减少冗余特征生成,且具有通用性和适应性。我们将 EFC 模块集成进 YOLO26,替换部分特征融合策略。该方法即插即用,有望提升 YOLO26在小物体检测任务中的性能。

文章目录: YOLO26改进大全:卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总

专栏链接: YOLO26改进专栏

文章目录

  • 前言
  • 介绍
    • 摘要
  • 文章链接
  • 基本原理
  • 核心代码
  • YOLO26引入代码
  • tasks注册
    • 步骤1:
    • 步骤2
    • 配置yolo26-EFC.yaml
  • 实验
    • 脚本
    • 结果

介绍

摘要

鉴于无人机图像存在低分辨率以及背景混合的情况,检测其中的小物体颇具挑战性,这会造成特征信息有限。多尺度特征融合能够通过获取不同尺度上的信息来增强检测能力,然而传统方法存在一定缺陷。简单的连接或加法运算无法充分发挥多尺度融合的优势,致使特征之间的相关性不足。这一缺陷对小物体的检测造成了阻碍,尤其是在复杂背景和人口稠密地区。为解决该问题并有效利用有限的计算资源,本文提出一种基于增强层间特征相关性(EFC)的轻量级融合策略,用以替代传统特征金字塔网络(FPN)中的特征融合策略。特征金字塔中不同图层的语义表达存在不一致性。在EFC策略里,分组的特征聚焦单元(GFF)通过聚焦不同特征的上下文信息来增强各层的特征相关性。多级特征重构模块(MFR)对金字塔中各层的强弱信息进行有效的重构和变换,减少冗余的特征融合,从而保留更多的小目标信息。值得一提的是,所提出的方法具有即插即用的特性,能够广泛应用于各种基础网络。

文章链接

论文地址:论文地址

代码地址:代码地址

基本原理

EFC (Enhanced Inter-layer Feature Correlation) 模块是一种轻量级的特征融合策略,旨在提升小物体检测的性能,尤其是在复杂的背景中。以下是对 EFC 模块各组成部分的详细介绍:

  1. 特征关联增强

​ EFC 模块通过引入Grouped Feature Focusing Unit (GFF)来强化不同层之间的特征关联性。GFF 通过关注特征的空间上下文信息,聚合邻近层的特征,使得特征之间的语义表示更加一致和丰富。这种对上下文信息的聚焦有助于解决小物体特征的不确定性问题,使模型能够更好地定位小物体。

  1. 特征重构

​ EFC 中的Multi-Level Feature Reconstruction Module (MFR)关键在于有效利用各层的特征,而不是仅依赖于简单的卷积操作。MFR 模块能够分离强弱特征信息,通过对特征进行重构,来最大程度地保留对于小物体检测至关重要的细节信息,降低语义偏差。这使得模型在不同层次的特征融合中,能够更精确地理解小物体的空间位置和语义内容。

  1. 冗余特征的减少

​ EFC 特别设计时考虑到了减少冗余特征生成的方法。传统的特征融合常常使用大型卷积核,导致冗余信息的产生,而 EFC 通过采用小型卷积或者轻量级卷积设计,降低了计算复杂度,并在不损失信息的前提下,使得输出特征更加精炼和有用。

  1. 通用性和适应性

​ EFC 模块设计为“插件式”,可以广泛应用于多种特征金字塔网络(FPN)框架,提供了更灵活的检测模型适应能力。这种普遍适用性使得 EFC 可以与不同基础网络结合,进一步提升各种目标检测任务中的表现。

通过上述原理,EFC 模块能够有效应对小物体检测中的挑战,尤其是在多尺度和复杂背景下,增强了特征表达能力,最终实现了更高的检测精度和效率

核心代码

importtorch.nnasnnimporttorch.nn.functionalasFfrommmcv.cnnimportConvModulefrommmcv.runnerimportBaseModule,auto_fp16from..builderimportNECKSclassEFC(BaseModule):def__init__(self,c1,c2):super().__init__()self.conv1=nn.Conv2d(c1,c2,kernel_size=1,stride=1)self.conv2=nn.Conv2d(c2,c2,kernel_size=1,stride=1)self.conv4=nn.Conv2d(c2,c2,kernel_size=1,stride=1)self.bn=nn.BatchNorm2d(c2)self.sigomid=nn.Sigmoid()self.group_num=16self.eps=1e-10self.gamma=nn.Parameter(torch.randn(c2,1,1))self.beta=nn.Parameter(torch.zeros(c2,1,1))self.gate_genator=nn.Sequential(nn.AdaptiveAvgPool2d((1,1)),nn.Conv2d(c2,c2,1,1),nn.ReLU(True),nn.Softmax(dim=1),)self.dwconv=nn.Conv2d(c2,c2,kernel_size=3,stride=1,padding=1,groups=c2)self.conv3=nn.Conv2d(c2,c2,kernel_size=1,stride=1)self.Apt=nn.AdaptiveAvgPool2d(1)self.one=c2 self.two=c2 self.conv4_gobal=nn.Conv2d(c2,1,kernel_size=1,stride=1)forgroup_idinrange(0,4):self.interact=nn.Conv2d(c2//4,c2//4,1,1,)defforward(self,x):x1,x2=x global_conv1=self.conv1(x1)bn_x=self.bn(global_conv1)weight_1=self.sigomid(bn_x)global_conv2=self.conv2(x2)bn_x2=self.bn(global_conv2)weight_2=self.sigomid(bn_x2)X_GOBAL=global_conv1+global_conv2 x_conv4=self.conv4_gobal(X_GOBAL)X_4_sigmoid=self.sigomid(x_conv4)X_=X_4_sigmoid*X_GOBAL X_=X_.chunk(4,dim=1)out=[]forgroup_idinrange(0,4):out_1=self.interact(X_[group_id])N,C,H,W=out_1.size()x_1_map=out_1.reshape(N,1,-1)mean_1=x_1_map.mean(dim=2,keepdim=True)x_1_av=x_1_map/mean_1 x_2_2=F.softmax(x_1_av,dim=-1)x1=x_2_2.reshape(N,C,H,W)x1=X_[group_id]*x1 out.append(x1)out=torch.cat([out[0],out[1],out[2],out[3]],dim=1)N,C,H,W=out.size()x_add_1=out.reshape(N,self.group_num,-1)N,C,H,W=X_GOBAL.size()x_shape_1=X_GOBAL.reshape(N,self.group_num,-1)mean_1=x_shape_1.mean(dim=2,keepdim=True)std_1=x_shape_1.std(dim=2,keepdim=True)x_guiyi=(x_add_1-mean_1)/(std_1+self.eps)x_guiyi_1=x_guiyi.reshape(N,C,H,W)x_gui=(x_guiyi_1*self.gamma+self.beta)weight_x3=self.Apt(X_GOBAL)reweights=self.sigomid(weight_x3)x_up_1=reweights>=weight_1 x_low_1=reweights<weight_1 x_up_2=reweights>=weight_2 x_low_2=reweights<weight_2 x_up=x_up_1*X_GOBAL+x_up_2*X_GOBAL x_low=x_low_1*X_GOBAL+x_low_2*X_GOBAL x11_up_dwc=self.dwconv(x_low)x11_up_dwc=self.conv3(x11_up_dwc)x_so=self.gate_genator(x_low)x11_up_dwc=x11_up_dwc*x_so x22_low_pw=self.conv4(x_up)xL=x11_up_dwc+x22_low_pw xL=xL+x_guireturnxL

YOLO26引入代码

在根目录下的ultralytics/nn/目录,新建一个featureFusion目录,然后新建一个以EFC为文件名的py文件, 把代码拷贝进去。

importtorchimporttorch.nnasnnimporttorch.nn.functionalasFclassEFC(nn.Module):def__init__(self,c1,c2):super().__init__()self.conv1=nn.Conv2d(c1,c2,kernel_size=1,stride=1)self.conv2=nn.Conv2d(c2,c2,kernel_size=1,stride=1)self.conv4=nn.Conv2d(c2,c2,kernel_size=1,stride=1)self.bn=nn.BatchNorm2d(c2)self.sigomid=nn.Sigmoid()self.group_num=16self.eps=1e-10self.gamma=nn.Parameter(torch.randn(c2,1,1))self.beta=nn.Parameter(torch.zeros(c2,1,1))self.gate_genator=nn.Sequential(nn.AdaptiveAvgPool2d((1,1)),nn.Conv2d(c2,c2,1,1),nn.ReLU(True),nn.Softmax(dim=1),)self.dwconv=nn.Conv2d(c2,c2,kernel_size=3,stride=1,padding=1,groups=c2)self.conv3=nn.Conv2d(c2,c2,kernel_size=1,stride=1)self.Apt=nn.AdaptiveAvgPool2d(1)self.one=c2 self.two=c2 self.conv4_gobal=nn.Conv2d(c2,1,kernel_size=1,stride=1)forgroup_idinrange(0,4):self.interact=nn.Conv2d(c2//4,c2//4,1,1,)defforward(self,x):x1,x2=x global_conv1=self.conv1(x1)bn_x=self.bn(global_conv1)weight_1=self.sigomid(bn_x)global_conv2=self.conv2(x2)bn_x2=self.bn(global_conv2)weight_2=self.sigomid(bn_x2)X_GOBAL=global_conv1+global_conv2 x_conv4=self.conv4_gobal(X_GOBAL)X_4_sigmoid=self.sigomid(x_conv4)X_=X_4_sigmoid*X_GOBAL X_=X_.chunk(4,dim=1)out=[]forgroup_idinrange(0,4):out_1=self.interact(X_[group_id])N,C,H,W=out_1.size()x_1_map=out_1.reshape(N,1,-1)mean_1=x_1_map.mean(dim=2,keepdim=True)x_1_av=x_1_map/mean_1 x_2_2=F.softmax(x_1_av,dim=1)x1=x_2_2.reshape(N,C,H,W)x1=X_[group_id]*x1 out.append(x1)out=torch.cat([out[0],out[1],out[2],out[3]],dim=1)N,C,H,W=out.size()x_add_1=out.reshape(N,self.group_num,-1)N,C,H,W=X_GOBAL.size()x_shape_1=X_GOBAL.reshape(N,self.group_num,-1)mean_1=x_shape_1.mean(dim=2,keepdim=True)std_1=x_shape_1.std(dim=2,keepdim=True)x_guiyi=(x_add_1-mean_1)/(std_1+self.eps)x_guiyi_1=x_guiyi.reshape(N,C,H,W)x_gui=(x_guiyi_1*self.gamma+self.beta)weight_x3=self.Apt(X_GOBAL)reweights=self.sigomid(weight_x3)x_up_1=reweights>=weight_1 x_low_1=reweights<weight_1 x_up_2=reweights>=weight_2 x_low_2=reweights<weight_2 x_up=x_up_1*X_GOBAL+x_up_2*X_GOBAL x_low=x_low_1*X_GOBAL+x_low_2*X_GOBAL x11_up_dwc=self.dwconv(x_low)x11_up_dwc=self.conv3(x11_up_dwc)x_so=self.gate_genator(x_low)x11_up_dwc=x11_up_dwc*x_so x22_low_pw=self.conv4(x_up)xL=x11_up_dwc+x22_low_pw xL=xL+x_guireturnxL

tasks注册

ultralytics/nn/tasks.py中进行如下操作:

步骤1:

fromultralytics.nn.featureFusion.EFCimportEFC

步骤2

修改def parse_model(d, ch, verbose=True):

elifmisEFC:c1,c2=ch[f[0]],args[0]c2=make_divisible(min(c2,max_channels)*width,8)args=[c1,c2]

配置yolo26-EFC.yaml

ultralytics/cfg/models/26/yolo26-EFC.yaml

# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license# Ultralytics YOLO26 object detection model with P3/8 - P5/32 outputs# Model docs: https://docs.ultralytics.com/models/yolo26# Task docs: https://docs.ultralytics.com/tasks/detect# Parametersnc:80# number of classesend2end:True# whether to use end-to-end modereg_max:1# DFL binsscales:# model compound scaling constants, i.e. 'model=yolo26n.yaml' will call yolo26.yaml with scale 'n'# [depth, width, max_channels]n:[0.50,0.25,1024]# summary: 260 layers, 2,572,280 parameters, 2,572,280 gradients, 6.1 GFLOPss:[0.50,0.50,1024]# summary: 260 layers, 10,009,784 parameters, 10,009,784 gradients, 22.8 GFLOPsm:[0.50,1.00,512]# summary: 280 layers, 21,896,248 parameters, 21,896,248 gradients, 75.4 GFLOPsl:[1.00,1.00,512]# summary: 392 layers, 26,299,704 parameters, 26,299,704 gradients, 93.8 GFLOPsx:[1.00,1.50,512]# summary: 392 layers, 58,993,368 parameters, 58,993,368 gradients, 209.5 GFLOPs# YOLO26n backbonebackbone:# [from, repeats, module, args]-[-1,1,Conv,[64,3,2]]# 0-P1/2-[-1,1,Conv,[128,3,2]]# 1-P2/4-[-1,2,C3k2,[256,False,0.25]]-[-1,1,Conv,[256,3,2]]# 3-P3/8-[-1,2,C3k2,[512,False,0.25]]-[-1,1,Conv,[512,3,2]]# 5-P4/16-[-1,2,C3k2,[512,True]]-[-1,1,Conv,[1024,3,2]]# 7-P5/32-[-1,2,C3k2,[1024,True]]-[-1,1,SPPF,[1024,5,3,True]]# 9-[-1,2,C2PSA,[1024]]# 10# YOLO26n headhead:-[-1,1,nn.Upsample,[None,2,"nearest"]]-[[-1,6],1,EFC,[512]]# cat backbone P4-[-1,2,C3k2,[512,True]]# 13-[-1,1,nn.Upsample,[None,2,"nearest"]]-[[-1,4],1,EFC,[512]]# cat backbone P3-[-1,2,C3k2,[256,True]]# 16 (P3/8-small)-[-1,1,Conv,[256,3,2]]-[[-1,13],1,EFC,[512]]# cat head P4-[-1,2,C3k2,[512,True]]# 19 (P4/16-medium)-[-1,1,Conv,[512,3,2]]-[[-1,10],1,EFC,[1024]]# cat head P5-[-1,1,C3k2,[1024,True,0.5,True]]# 22 (P5/32-large)-[[16,19,22],1,Detect,[nc]]# Detect(P3, P4, P5)

实验

脚本

importwarnings warnings.filterwarnings('ignore')fromultralyticsimportYOLOif__name__=='__main__':# 修改为自己的配置文件地址model=YOLO('./ultralytics/cfg/models/26/yolo26-EFC.yaml')# 修改为自己的数据集地址model.train(data='./ultralytics/cfg/datasets/coco8.yaml',cache=False,imgsz=640,epochs=10,single_cls=False,# 是否是单类别检测batch=8,close_mosaic=10,workers=0,optimizer='MuSGD',# optimizer='SGD',amp=False,project='runs/train',name='yolo26-EFC',)

结果

http://www.jsqmd.com/news/299251/

相关文章:

  • YOLO26改进 - 特征融合 | 融合Hyper-YOLO混合聚合网络MANet(Mixed Aggregation Network)通过多路径设计实现高效特征学习与模型适应性提升
  • 汉字阅读开挂了?汉英阅读速度实测对比,效率差出40%+!
  • 缓存三剑客困难
  • 2026年 印刷厂家推荐排行榜:化妆瓶、亚克力、咖啡杯、金属、PC满板、电子产品、汽车零件、遥控面板、医疗器材、罐体印刷,专业定制与高精度工艺之选
  • AI工程师必看!X-Distill技术详解:让机器人仅需10条数据就能学会复杂操作,建议收藏学习!
  • AI驱动的动态调度:从理论到实践,程序员必备的智能制造核心技能(建议收藏)
  • NeurIPS 2025多模态表征学习新突破:4篇论文详解
  • 亲测BSHM人像抠图镜像,效果惊艳真实体验分享
  • 大模型部署难题破解:并行计算架构详解与实战
  • 程序员学习大模型必看:腾讯云智商业产品面试经验,AI商业化思维与未来趋势深度解析(建议收藏)
  • LangChain、LangFlow、LangGraph:大模型应用开发框架全解析
  • 大模型微调学习路线:从0到1掌握AI落地核心技能,附四阶段详细规划
  • 2026年 环境老化试验箱厂家推荐排行榜,氙灯/紫外线/湿度/复合循环/盐水喷雾/臭氧/热老化试验箱专业品牌深度解析
  • 救命神器8个AI论文写作软件,自考学生搞定毕业论文不求人!
  • 2026年冷藏车箱厂家推荐排行榜:4米2/3米2/6米8/7米7/9米6冷链运输车箱,精选耐用保温与合规高效品牌
  • 2026年印刷设备厂家实力推荐榜:单色移印机/全自动平面丝印机/多色移印机/曲面丝印机/标准烫金机/化妆品瓶子印刷机,精选高效智能印刷解决方案
  • web3生态分层
  • 基于springboot+vue的农产品销售管理系统(源码+论文+部署+安装)
  • 2026年不锈钢工程厂家实力推荐榜:别墅、会所、酒店、商业空间等高端定制,匠心工艺与创新设计深度解析
  • Opencode CLI 配置 MiniMax M2 (Nvidia API) 指南
  • 2026 年 1 月割草船厂家推荐排行榜:无人/自动/遥控割草船,水域/河道/鱼塘/水下割草船,水草打捞/收割/清理船,高效清淤与生态维护利器精选
  • 实用指南:16000+字!Java集合笔记
  • 告别繁琐命令行:自研多线程 SSH 极速文件传输助手(附 GitHub 源码)
  • Educational Codeforces Round 79 部分题解
  • 钱包
  • 数组(二)
  • 数组(三)
  • Day52 >> 101、孤岛的总面积 + 102、沉默孤岛 + 103、水流问题 + 104、建造最大岛屿
  • 2026 年 1 月珠海烟酒礼品回收厂家推荐榜单:茅台/洋酒/冬虫夏草/燕窝鱼胶等名品高价回收,专业可靠、快捷变现之选
  • MinIO替代方案安全性对比:RustFS如何为数据筑牢防护墙?