YOLO26 改进 - 注意力机制 | 空间增强注意力SEAM(Spatially Enhanced Attention Module)提升遮挡场景检测鲁棒性

前言

本文介绍了分离与增强注意力模块(SEAM)在YOLO26中的结合应用。SEAM模块旨在增强面部特征学习能力,特别是处理面部遮挡问题。它采用多头注意力机制强调面部区域、抑制背景区域,第一部分使用深度可分离卷积减少参数并学习通道重要性,通过1x1卷积增强通道联系,利用两层全连接网络融合通道信息,经指数归一化后作为注意力权重与原始特征相乘。我们将SEAM集成到YOLO26的检测头中,并进行相关注册和配置。实验表明,该方法有助于提升模型检测性能。

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

专栏链接: YOLO26改进专栏

文章目录

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

介绍

摘要

近年来,基于深度学习的人脸检测算法取得了重大进展,这些算法通常可划分为两类,即如Faster R - CNN的二阶段检测器和如YOLO的单阶段检测器。鉴于在精度与速度之间实现了更优平衡,单阶段检测器已在众多应用中得到广泛应用。在本文中,我们提出了一种基于单阶段检测器YOLOv5的实时人脸检测器,命名为YOLO - FaceV2。我们设计了一个名为RFE的感受野增强模块,用以增强小脸部的感受野,并采用NWD Loss来弥补交并比(IoU)对微小物体位置偏差的敏感性。针对面部遮挡问题,我们提出了一个名为SEAM的注意力模块,并引入排斥损失来加以解决。此外,我们运用一个名为Slide的权重函数来解决简单样本与困难样本之间的不平衡问题,并利用有效感受野的信息来设计锚点。在WiderFace数据集上的实验结果表明,我们的面部检测器性能超越了YOLO及其变体,在简单、中等和困难所有子集中均有体现。源代码可在https://github.com/Krasjet - Yu/YOLO - FaceV2获取。

文章链接

论文地址:论文地址

代码地址:代码地址

基本原理

SEAM(Separated and Enhanced Attention Module)是YOLO-FaceV2中引入的一个模块,旨在增强面部特征的学习能力,特别是在面部遮挡的情况下。

  1. 多头注意力机制:SEAM模块采用了多头注意力机制,旨在强调图像中的面部区域,同时抑制背景区域。这种机制使得模型能够更好地关注到重要的面部特征,从而提高检测的准确性。
  2. 深度可分离卷积:SEAM的第一部分使用深度可分离卷积,这种卷积方式是逐通道进行的,能够有效减少参数数量,同时学习不同通道的重要性。通过这种方式,模型能够提取出更具代表性的特征。
  3. 通道关系的学习:虽然深度可分离卷积在减少参数方面表现良好,但它可能忽略通道之间的信息关系。为了解决这个问题,SEAM在深度卷积的输出后,使用1x1卷积进行点对点的组合,以增强通道之间的联系。这一过程有助于模型在遮挡场景中更好地理解被遮挡面部与未遮挡面部之间的关系。
  4. 全连接网络的融合:在通道关系学习之后,SEAM使用一个两层的全连接网络来融合每个通道的信息。这一过程进一步加强了通道之间的连接,使得模型能够更有效地处理面部遮挡问题。
  5. 指数归一化:SEAM模块的输出经过指数函数处理,将值范围从[0, 1]扩展到[1, e]。这种指数归一化提供了一种单调映射关系,使得结果对位置误差更加宽容,从而提高了模型的鲁棒性。
  6. 注意力机制的应用:最后,SEAM模块的输出被用作注意力权重,与原始特征相乘。这一过程使得模型能够更有效地处理面部遮挡,提高了对被遮挡面部的响应能力。

核心代码

classSEAM(nn.Module):def__init__(self,c1,c2,n,reduction=16):super(SEAM,self).__init__()ifc1!=c2:c2=c1 self.DCovN=nn.Sequential(# nn.Conv2d(c1, c2, kernel_size=3, stride=1, padding=1, groups=c1),# nn.GELU(),# nn.BatchNorm2d(c2),*[nn.Sequential(Residual(nn.Sequential(nn.Conv2d(in_channels=c2,out_channels=c2,kernel_size=3,stride=1,padding=1,groups=c2),nn.GELU(),nn.BatchNorm2d(c2))),nn.Conv2d(in_channels=c2,out_channels=c2,kernel_size=1,stride=1,padding=0,groups=1),nn.GELU(),nn.BatchNorm2d(c2))foriinrange(n)])self.avg_pool=torch.nn.AdaptiveAvgPool2d(1)self.fc=nn.Sequential(nn.Linear(c2,c2//reduction,bias=False),nn.ReLU(inplace=True),nn.Linear(c2//reduction,c2,bias=False),nn.Sigmoid())self._initialize_weights()# self.initialize_layer(self.avg_pool)self.initialize_layer(self.fc)defforward(self,x):b,c,_,_=x.size()y=self.DCovN(x)y=self.avg_pool(y).view(b,c)y=self.fc(y).view(b,c,1,1)y=torch.exp(y)returnx*y.expand_as(x)def_initialize_weights(self):forminself.modules():ifisinstance(m,nn.Conv2d):nn.init.xavier_uniform_(m.weight,gain=1)elifisinstance(m,nn.BatchNorm2d):nn.init.constant_(m.weight,1)nn.init.constant_(m.bias,0)definitialize_layer(self,layer):ifisinstance(layer,(nn.Conv2d,nn.Linear)):torch.nn.init.normal_(layer.weight,mean=0.,std=0.001)iflayer.biasisnotNone:torch.nn.init.constant_(layer.bias,0)

YOLO26引入代码

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

importtorchimporttorch.nnasnnclassResidual(nn.Module):def__init__(self,fn):super(Residual,self).__init__()self.fn=fndefforward(self,x):returnself.fn(x)+xclassSEAM(nn.Module):def__init__(self,c1,n=1,reduction=16):super(SEAM,self).__init__()c2=c1 self.DCovN=nn.Sequential(# nn.Conv2d(c1, c2, kernel_size=3, stride=1, padding=1, groups=c1),# nn.GELU(),# nn.BatchNorm2d(c2),*[nn.Sequential(Residual(nn.Sequential(nn.Conv2d(in_channels=c2,out_channels=c2,kernel_size=3,stride=1,padding=1,groups=c2),nn.GELU(),nn.BatchNorm2d(c2))),nn.Conv2d(in_channels=c2,out_channels=c2,kernel_size=1,stride=1,padding=0,groups=1),nn.GELU(),nn.BatchNorm2d(c2))foriinrange(n)])self.avg_pool=torch.nn.AdaptiveAvgPool2d(1)self.fc=nn.Sequential(nn.Linear(c2,c2//reduction,bias=False),nn.ReLU(inplace=True),nn.Linear(c2//reduction,c2,bias=False),nn.Sigmoid())self._initialize_weights()# self.initialize_layer(self.avg_pool)self.initialize_layer(self.fc)defforward(self,x):b,c,_,_=x.size()y=self.DCovN(x)y=self.avg_pool(y).view(b,c)y=self.fc(y).view(b,c,1,1)y=torch.exp(y)returnx*y.expand_as(x)def_initialize_weights(self):forminself.modules():ifisinstance(m,nn.Conv2d):nn.init.xavier_uniform_(m.weight,gain=1)elifisinstance(m,nn.BatchNorm2d):nn.init.constant_(m.weight,1)nn.init.constant_(m.bias,0)definitialize_layer(self,layer):ifisinstance(layer,(nn.Conv2d,nn.Linear)):torch.nn.init.normal_(layer.weight,mean=0.,std=0.001)iflayer.biasisnotNone:torch.nn.init.constant_(layer.bias,0)

tasks注册

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

步骤1:

fromultralytics.nn.attention.SEAMimportSEAM

步骤2

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

elifmin{SEAM}:args=[ch[f],*args]

配置yolo26-SEAM.yaml

ultralytics/cfg/models/26/yolo26-SEAM.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,Concat,[1]]# cat backbone P4-[-1,2,C3k2,[512,True]]# 13-[-1,1,nn.Upsample,[None,2,"nearest"]]-[[-1,4],1,Concat,[1]]# cat backbone P3-[-1,2,C3k2,[256,True]]# 16 (P3/8-small)-[-1,1,SEAM,[]]#17-[-1,1,Conv,[256,3,2]]-[[-1,13],1,Concat,[1]]# cat head P4-[-1,2,C3k2,[512,True]]# 19 (P4/16-medium)-[-1,1,SEAM,[]]#17-[-1,1,Conv,[512,3,2]]-[[-1,10],1,Concat,[1]]# cat head P5-[-1,1,C3k2,[1024,True,0.5,True]]# 22 (P5/32-large)-[-1,1,SEAM,[]]# 25-[[17,21,25],1,Detect,[nc]]# Detect(P3, P4, P5)

实验

脚本

import warnings warnings.filterwarnings('ignore') from ultralytics import YOLO if __name__ == '__main__': # 修改为自己的配置文件地址 model = YOLO('./ultralytics/cfg/models/26/yolo26-SEAM.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', amp=True, project='runs/train', name='yolo26-SEAM', )

结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1179304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【信号识别】TFMix:时频域融合赋能特定辐射源识别,领域泛化性能再突破【附python代码】

TFMix:时频域融合赋能特定辐射源识别,领域泛化性能再突破 一、文章题目 TFMix:一种用于特定辐射源识别领域泛化的鲁棒时频混合方法二、摘要 特定辐射源识别(SEI)是基于辐射源个体差异在射频信号中体现的固有特征进行识…

Python+django的校园二手书籍交易平台的设计实现

目录校园二手书籍交易平台的设计与实现摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!校园二手书籍交易平台的设计与实现摘要 该平台基于PythonDjango框架开发,旨在为高校学…

【克拉美罗下界】突破CRB局限!多源波达方向估计的全局紧界ZZB方法重磅来袭【附python代码】

突破CRB局限!多源波达方向估计的全局紧界ZZB方法重磅来袭 文章题目 波达方向估计的Ziv-Zakai界(Ziv-Zakai Bound for DOAs Estimation) 摘要 均方误差(MSE)下界在评估波达方向(DOA)等非线性参数的估计性能中具有重要作用。在众多已知下界中,广泛认可的克拉美-罗界(…

【六杆】六杆快速回归机制运动学和动力学分析【含Matlab源码 14990期】

💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab武动乾坤博客之家💞…

Python+django的校园共享厨房预约美食菜谱系统

目录校园共享厨房预约美食菜谱系统摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!校园共享厨房预约美食菜谱系统摘要 该系统基于PythonDjango框架开发,旨在为高校学生提供共…

Python+django的校园点歌系统的设计与实现

目录校园点歌系统的设计与实现摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!校园点歌系统的设计与实现摘要 该系统基于Python和Django框架开发,旨在为校园师生提供一个便捷…

【LeetCode热题100】Java详解:路径总和 III(含O(N²)暴力解与O(N)前缀和优化)

【LeetCode热题100】Java详解:路径总和 III(含O(N)暴力解与O(N)前缀和优化) 面向人群 正在准备技术面试(尤其是大厂后端、算法岗)的开发者已掌握二叉树基本遍历,希望深入理解路径问题与前缀和技巧的学习者…

基于FPGA的一维序列三次样条插值算法verilog实现,包含testbench

1.前言 三次样条插值是一种在数据拟合和信号处理中广泛应用的技术,它通过构造分段三次多项式来逼近给定的离散数据点,确保整个插值函数在节点处具有连续的一阶和二阶导数,从而获得平滑的插值结果。在 FPGA 实现中,…

Python+django的校园物品租赁共享资源平台设计与实现校园版咸鱼

目录摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!摘要 随着共享经济的快速发展,校园内学生对物品短期租赁的需求日益增长。传统交易模式存在信息不对称、信任缺失、资源利…

蓝桥杯2025年第十六届省赛真题-好串的数目

蓝桥杯2025年第十六届省赛真题-好串的数目题目描述输入格式输出格式样例输入样例输出C语言实现算法解析核心思想算法步骤公式推导复杂度分析样例解析正确性验证使用建议🌺The Begin🌺点点关注,收藏不迷路🌺 题目描述 对于一个长度…

Python+django的协同过滤算法的 电视剧评分推荐系统设计与实现

目录协同过滤算法在电视剧评分推荐系统中的应用用户行为数据采集与处理混合协同过滤推荐引擎设计系统架构与性能优化冷启动与多样性解决方案开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!协…

spark的安装

镜像:https://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-3.5.8/

【LeetCode热题100】Java详解:二叉树的最近公共祖先(含递归/父指针双解法与工程实践)

【LeetCode热题100】Java详解:二叉树的最近公共祖先(含递归/父指针双解法与工程实践) 面向人群 正在准备技术面试(尤其是大厂后端、算法岗)的开发者已掌握二叉树基本遍历,希望深入理解LCA(最近…

【LeetCode热题100】Java详解:二叉树中的最大路径和(含递归解法与工程实践)

【LeetCode热题100】Java详解:二叉树中的最大路径和(含递归解法与工程实践) 面向人群 正在准备技术面试(尤其是大厂后端、算法岗)的开发者已掌握二叉树基本遍历,希望深入理解路径和问题的学习者刷 LeetCo…

Linux设备管理:从内核驱动到用户空间的完整架构解析 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Python+django的协同过滤算法的 美食菜谱推荐分享平台

目录协同过滤算法在美食菜谱推荐平台的应用系统功能与优化策略开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!协同过滤算法在美食菜谱推荐平台的应用 基于Python和Django框架的美食菜谱推荐…

JavaScript的入门

🌟 JavaScript 入门:网页互动的魔法语言 🌟🌟 JavaScript 入门:网页互动的魔法语言 🌟✨ 什么是 JavaScript?💡 为什么要学习 JavaScript?🎯 JavaScript 的基…

Python+django的小区停车场收费车辆计费管理系统的设计与实现

目录小区停车场收费车辆计费管理系统的设计与实现开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!小区停车场收费车辆计费管理系统的设计与实现 该系统基于PythonDjango框架开发&#xff0c…

彼得林奇如何看待公司的股东回报政策

彼得林奇如何看待公司的股东回报政策关键词:彼得林奇、股东回报政策、股息、股票回购、公司价值、投资策略、财务分析摘要:本文深入探讨了投资大师彼得林奇对公司股东回报政策的观点。通过研究彼得林奇的投资理念和方法,阐述了股东回报政策在…

Python+django的小区车辆停车场车位预约管理系统 可视化

目录 系统概述核心功能模块技术实现亮点应用价值 开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 系统概述 PythonDjango开发的小区车辆停车场车位预约管理系统旨在通过数字化手段优化车位…