2026/1/10 0:59:52
网站建设
项目流程
做网站是否过时了,手机端网站html好看的单页模板,百度收录,杭州网站开发制作公司前言
本文提出基于单阶段检测器YOLOv5的实时人脸检测器YOLO - FaceV2#xff0c;并将SEAM模块集成到YOLOv8中。传统人脸检测算法在精度、速度及处理遮挡等问题上存在不足。SEAM模块采用多头注意力机制#xff0c;通过深度可分离卷积、1x1卷积、全连接网络学习面部特征#…前言本文提出基于单阶段检测器YOLOv5的实时人脸检测器YOLO - FaceV2并将SEAM模块集成到YOLOv8中。传统人脸检测算法在精度、速度及处理遮挡等问题上存在不足。SEAM模块采用多头注意力机制通过深度可分离卷积、1x1卷积、全连接网络学习面部特征同时采用指数归一化提高模型鲁棒性。我们将SEAM代码集成到YOLOv8中。实验表明改进后的YOLOv8在数据集上性能超过YOLO及其变体在简单、中等和困难子集中均有提升尤其在面部遮挡场景下表现出色。文章目录 YOLOv8改进大全卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总专栏链接: YOLOv8改进专栏介绍摘要近年来基于深度学习的人脸检测算法取得了显著进展现有方法主要可分为两类以Faster R-CNN为代表的二阶段检测器以及以YOLO为代表的单阶段检测器。由于在检测精度与推理速度之间实现了更优的平衡单阶段检测器已在众多实际应用场景中得到广泛部署。本文提出了一种基于YOLOv5单阶段检测器架构的实时人脸检测系统命名为YOLO-FaceV2。我们设计了感受野增强模块RFE以提升小尺度人脸目标的感受野覆盖范围并采用NWD损失函数来缓解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)引入代码在根目录下的ultralytics/nn/目录新建一个attention目录然后新建一个以SEAM为文件名的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)注册在ultralytics/nn/tasks.py中进行如下操作步骤1:fromultralytics.nn.attention.SEAMimportSEAM步骤2修改def parse_model(d, ch, verboseTrue):elifmin{SEAM}:c2ch[f]args[c2,*args]配置yolov8-SEAM.yamlultralytics/cfg/models/v8/yolov8-SEAM.yaml# Ultralytics YOLO , AGPL-3.0 license# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect# Parametersnc:80# number of classesscales:# model compound scaling constants, i.e. modelyolov8n.yaml will call yolov8.yaml with scale n# [depth, width, max_channels]n:[0.33,0.25,1024]# YOLOv8n summary: 225 layers, 3157200 parameters, 3157184 gradients, 8.9 GFLOPss:[0.33,0.50,1024]# YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients, 28.8 GFLOPsm:[0.67,0.75,768]# YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients, 79.3 GFLOPsl:[1.00,1.00,512]# YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPsx:[1.00,1.25,512]# YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs# YOLOv8.0n backbonebackbone:# [from, repeats, module, args]-[-1,1,Conv,[64,3,2]]# 0-P1/2-[-1,1,Conv,[128,3,2]]# 1-P2/4-[-1,3,C2f,[128,True]]-[-1,1,Conv,[256,3,2]]# 3-P3/8-[-1,6,C2f,[256,True]]-[-1,1,Conv,[512,3,2]]# 5-P4/16-[-1,6,C2f,[512,True]]-[-1,1,Conv,[1024,3,2]]# 7-P5/32-[-1,3,C2f,[1024,True]]-[-1,1,SPPF,[1024,5]]# 9# YOLOv8.0n headhead:-[-1,1,nn.Upsample,[None,2,nearest]]-[[-1,6],1,Concat,[1]]# cat backbone P4-[-1,3,C2f,[512]]# 12-[-1,1,nn.Upsample,[None,2,nearest]]-[[-1,4],1,Concat,[1]]# cat backbone P3-[-1,3,C2f,[256]]# 15 (P3/8-small)-[-1,1,SEAM,[]]-[-1,1,Conv,[256,3,2]]-[[-1,12],1,Concat,[1]]# cat head P4-[-1,3,C2f,[512]]# 18 (P4/16-medium)-[-1,1,SEAM,[]]-[-1,1,Conv,[512,3,2]]-[[-1,9],1,Concat,[1]]# cat head P5-[-1,3,C2f,[1024]]# 21 (P5/32-large)-[-1,1,SEAM,[]]-[[16,19,22],1,Detect,[nc]]# Detect(P3, P4, P5)实验脚本importosfromultralyticsimportYOLO yamlultralytics/cfg/models/v8/yolov8-SEAM.yamlmodelYOLO(yaml)model.info()if__name____main__:resultsmodel.train(datacoco128.yaml,nameSEAM,epochs10,workers8,batch1,)结果