目录
一 SEAM 和 Repulsion Loss
本文将要介绍的是2022年8月YOLO-FaceV2论文中提出的改善目标遮挡检测的机制SEAM。首先,我们先对论文内容进行简单的介绍。
论文官方地址:https://arxiv.org/pdf/2208.02019
代码地址:https://github.com/Krasjet-Yu/YOLO-FaceV2
摘要
近年来,基于深度学习的人脸检测算法取得了很大的进展。这些算法一般可以分为两类:两级检测器(例如,Faster R-CNN)和一级检测器(例如,YOLO)。由于在精度和速度之间取得了较好的平衡,一级检测器在许多应用中得到了广泛的应用。本文提出了一种基于一级检测器YOLOv5的实时人脸检测器,命名为yolov - facev2。本文设计了一个名为RFE的感受野增强模块来增强小面部的感受野,并利用NWD Loss来弥补IoU对微小物体位置偏差的敏感性。针对人脸遮挡问题,本文提出了一个注意力模块SEAM,并引入排斥损失来解决该问题。此外,我们使用了一个权重函数Slide来解决易样本和硬样本之间的不平衡,并使用有效接受野的信息来设计锚。在WiderFace数据集上的实验结果表明,我们的人脸检测器优于YOLO,其变体可以在所有的易、中、难子集上找到。源代码在https://github.com/Krasjet-Yu/YOLO-FaceV2。
在下图1 (a)中,左边的红色部分是探测器的主干,由CSP块和CBS块组成,它主要用于提取输入图像的特征。在P5层中加入RFE模块,扩大有效感受场,增强多尺度融合能力。图1 (b)中,右侧蓝色和黄色部分称为颈层,由SPP和PAN组成。此外,还融合了P2层的特征,以提高更准确的目标定位能力。在图1 (c)中,在颈部层输出部分之后,引入分离增强注意模块(SEAM)来增强被遮挡人脸的响应性。
上图图1为YOLO-FaceV2的网络架构。
① 主干:前馈CSP-Darknet53架构提取多尺度特征图。为了扩展感受野,将P5的CSP块替换为接收野增强模块(RFE),如图蓝色虚线框所示。
② 颈部:空间金字塔池(SPP)分离出最重要的上下文特征并增加接受野,路径聚合网络(PAN)从不同的骨干级别为不同的检测器级别聚合参数。为了补偿增加的感受野分辨率损失,P2层被融合到PAN中,如图(a)和(b)所示。
③ 分离和增强注意模块(SEAM)使用特征映射之间的关系来回忆被遮挡的特征,如图红色点框所示。
由于本文重点关注遮挡检测性能提升部分,所以接下来重点介绍注意力模块SEAM(Separated and Enhancement Attention Module)和排斥损失(Repulsion Loss)。
1 SEAM
本文引入了分离和增强注意力模块SEAM来增强Neck层输出部分后被遮挡人脸的响应能力。
下图为SEAM的说明。左边是SEAM的体系结构,右边是CSMM(通道和空间混合模块)的结构。CSMM利用不同斑块到多尺度的特征,利用深度可分离卷积来学习空间维度和通道的相关性。
SEAM旨在补偿被遮挡面部的响应损失,通过增强未遮挡面部的响应来解决这一问题。
2 MultiSEAM
解决多尺度问题的主要方法是构建金字塔来融合人脸的多尺度特征。
在 YOLOv5 中,FPN 融合了 P3、P4 和 P5 层的特征。但是对于小尺度的目标,经过多层卷积后信息很容易丢失,保留的像素信息很少,即使在较浅的P3层也是存在同样的问题。综上,提高特征图的分辨率无疑有利于小目标的检测。
3 排斥损失Repulsion Loss
类内遮挡可能导致人脸A包含人脸B的特征,导致更高的误检率。排斥损失的引入可以通过排斥有效地缓解这一问题。排斥损失分为两部分:RepGT和RepBox。排斥损失通过使边界框之间保持距离,减少预测框重叠,进而提高面部在遮挡情况下的检测性能。
RepGT Loss的作用是使当前边界框尽可能远离周围的真值框。这里的周边真值框是指除了边界框本身要返回的对象外,与该面部有最大IoU的人脸标签。
RepGT损失函数公式如下:
RepBox loss的目的是使预测框尽可能远离周围的预测框,并减少它们之间的IOU,以避免属于两个面的预测框中的一个被NMS抑制。我们将预测框架分成多个组。假设有g个单独的面部,其形式如公式3所示。同一组之间的预测框返回到相同的人脸标签,不同组之间的预测框对应不同的人脸标签。
然后,对于不同组pi和pj之间的预测框,我们希望得到pi和pj之间的重叠面积越小。RepBox还使用Smoothln作为优化函数。总体损失函数为:
接下来,我们基于YOLOv10进行小目标遮挡检测性能提升的具体对应吧。
二 使用SEAM改进YOLOv10的小目标遮挡检测效果
YOLOv10的结构图如下:
1 整体修改
整个改进的结构的示意图如下所示:
① 添加SEAM.py文件
在ultralytics/nn/modules目录下新建SEAM.py文件,文件的内容如下:
② 修改ultralytics/nn/tasks.py文件
具体的修改内容如下图所示:
parse_model函数的修改部分如下:
至此,修改完毕。
2 配置文件
yolov10n_SEAM.yaml文件的内容如下:
# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
# [depth, width, max_channels]
n: [0.33, 0.25, 1024]
# YOLOv8.0n backbone
backbone:
# [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, SCDown, [512, 3, 2]] # 5-P4/16
- [-1, 6, C2f, [512, True]]
- [-1, 1, SCDown, [1024, 3, 2]] # 7-P5/32
- [-1, 3, C2f, [1024, True]]
- [-1, 1, SPPF, [1024, 5]] # 9
- [-1, 1, PSA, [1024]] # 10
# YOLOv8.0n head
head:
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 6], 1, Concat, [1]] # cat backbone P4
- [-1, 3, C2f, [512]] # 13
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 4], 1, Concat, [1]] # cat backbone P3
- [-1, 3, C2f, [256]] # 16 (P3/8-small)
- [-1, 1, SEAM, []] # 17
- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 13], 1, Concat, [1]] # cat head P4
- [-1, 3, C2f, [512]] # 20 (P4/16-medium)
- [-1, 1, SEAM, []] # 21
- [-1, 1, SCDown, [512, 3, 2]]
- [[-1, 10], 1, Concat, [1]] # cat head P5
- [-1, 3, C2fCIB, [1024, True, True]] # 24 (P5/32-large)
- [-1, 1, SEAM, []] # 25
- [[17, 21, 25], 1, v10Detect, [nc]] # Detect(P3, P4, P5)
3 训练
上述修改完毕后,开始训练吧!
标签:torch,return,Neck,遮挡,self,nc,yaml,检测,model From: https://blog.csdn.net/wss794/article/details/139413597