2026/4/18 10:09:51
网站建设
项目流程
房产做网站是什么意思,seo推广学院,购物网站app制作,厦门海沧建设局网站前言
本文介绍了分离与增强注意力模块#xff08;SEAM#xff09;在YOLO26中的结合应用。SEAM模块旨在增强面部特征学习能力#xff0c;特别是处理面部遮挡问题。它采用多头注意力机制强调面部区域、抑制背景区域#xff0c;第一部分使用深度可分离卷积减少参数并学习通道…前言本文介绍了分离与增强注意力模块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获取。文章链接论文地址论文地址代码地址代码地址基本原理SEAMSeparated and Enhanced Attention Module是YOLO-FaceV2中引入的一个模块旨在增强面部特征的学习能力特别是在面部遮挡的情况下。多头注意力机制SEAM模块采用了多头注意力机制旨在强调图像中的面部区域同时抑制背景区域。这种机制使得模型能够更好地关注到重要的面部特征从而提高检测的准确性。深度可分离卷积SEAM的第一部分使用深度可分离卷积这种卷积方式是逐通道进行的能够有效减少参数数量同时学习不同通道的重要性。通过这种方式模型能够提取出更具代表性的特征。通道关系的学习虽然深度可分离卷积在减少参数方面表现良好但它可能忽略通道之间的信息关系。为了解决这个问题SEAM在深度卷积的输出后使用1x1卷积进行点对点的组合以增强通道之间的联系。这一过程有助于模型在遮挡场景中更好地理解被遮挡面部与未遮挡面部之间的关系。全连接网络的融合在通道关系学习之后SEAM使用一个两层的全连接网络来融合每个通道的信息。这一过程进一步加强了通道之间的连接使得模型能够更有效地处理面部遮挡问题。指数归一化SEAM模块的输出经过指数函数处理将值范围从[0, 1]扩展到[1, e]。这种指数归一化提供了一种单调映射关系使得结果对位置误差更加宽容从而提高了模型的鲁棒性。注意力机制的应用最后SEAM模块的输出被用作注意力权重与原始特征相乘。这一过程使得模型能够更有效地处理面部遮挡提高了对被遮挡面部的响应能力。核心代码classSEAM(nn.Module):def__init__(self,c1,c2,n,reduction16):super(SEAM,self).__init__()ifc1!c2:c2c1 self.DCovNnn.Sequential(# nn.Conv2d(c1, c2, kernel_size3, stride1, padding1, groupsc1),# nn.GELU(),# nn.BatchNorm2d(c2),*[nn.Sequential(Residual(nn.Sequential(nn.Conv2d(in_channelsc2,out_channelsc2,kernel_size3,stride1,padding1,groupsc2),nn.GELU(),nn.BatchNorm2d(c2))),nn.Conv2d(in_channelsc2,out_channelsc2,kernel_size1,stride1,padding0,groups1),nn.GELU(),nn.BatchNorm2d(c2))foriinrange(n)])self.avg_pooltorch.nn.AdaptiveAvgPool2d(1)self.fcnn.Sequential(nn.Linear(c2,c2//reduction,biasFalse),nn.ReLU(inplaceTrue),nn.Linear(c2//reduction,c2,biasFalse),nn.Sigmoid())self._initialize_weights()# self.initialize_layer(self.avg_pool)self.initialize_layer(self.fc)defforward(self,x):b,c,_,_x.size()yself.DCovN(x)yself.avg_pool(y).view(b,c)yself.fc(y).view(b,c,1,1)ytorch.exp(y)returnx*y.expand_as(x)def_initialize_weights(self):forminself.modules():ifisinstance(m,nn.Conv2d):nn.init.xavier_uniform_(m.weight,gain1)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,mean0.,std0.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.fnfndefforward(self,x):returnself.fn(x)xclassSEAM(nn.Module):def__init__(self,c1,n1,reduction16):super(SEAM,self).__init__()c2c1 self.DCovNnn.Sequential(# nn.Conv2d(c1, c2, kernel_size3, stride1, padding1, groupsc1),# nn.GELU(),# nn.BatchNorm2d(c2),*[nn.Sequential(Residual(nn.Sequential(nn.Conv2d(in_channelsc2,out_channelsc2,kernel_size3,stride1,padding1,groupsc2),nn.GELU(),nn.BatchNorm2d(c2))),nn.Conv2d(in_channelsc2,out_channelsc2,kernel_size1,stride1,padding0,groups1),nn.GELU(),nn.BatchNorm2d(c2))foriinrange(n)])self.avg_pooltorch.nn.AdaptiveAvgPool2d(1)self.fcnn.Sequential(nn.Linear(c2,c2//reduction,biasFalse),nn.ReLU(inplaceTrue),nn.Linear(c2//reduction,c2,biasFalse),nn.Sigmoid())self._initialize_weights()# self.initialize_layer(self.avg_pool)self.initialize_layer(self.fc)defforward(self,x):b,c,_,_x.size()yself.DCovN(x)yself.avg_pool(y).view(b,c)yself.fc(y).view(b,c,1,1)ytorch.exp(y)returnx*y.expand_as(x)def_initialize_weights(self):forminself.modules():ifisinstance(m,nn.Conv2d):nn.init.xavier_uniform_(m.weight,gain1)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,mean0.,std0.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, verboseTrue):elifmin{SEAM}:args[ch[f],*args]配置yolo26-SEAM.yamlultralytics/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. modelyolo26n.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, cacheFalse, imgsz640, epochs10, single_clsFalse, # 是否是单类别检测 batch8, close_mosaic10, workers0, optimizerMuSGD, ampTrue, projectruns/train, nameyolo26-SEAM, )结果