摘要
作者提出了一种基于 YOLOv5 改进的实时人脸检测模型,称为YOLO-FaceV2。设计了一个感受野增强模块(RFE)来提升小尺度人脸的感受野,并引入了 NWD 损失,以弥补 IoU 在小目标位置偏差上的敏感性。针对人脸遮挡问题,提出了 SEAM 注意力模块,并引入了排斥损失进行优化。此外,作者使用 Slide 加权函数来解决易样本和难样本的不平衡问题,并基于有效感受野信息来设计锚框。为了解决样本不平衡问题,因此本文采用 SlideLoss 损失函数。
理论介绍
Slide Loss的核心在于处理样本不平衡问题,对检测中的难易样本进行加权。其主要目的是在训练过程中,将更多的关注放在难样本上,让模型对这些样本的学习更为深入,而不过度关注简单样本。
Slide Loss 的设计灵感来源于样本的 IoU 值。它通过设置一个 IoU 的平均值阈值(记为µ),将样本分为易样本和难样本:
- 易样本:IoU 值高于 µ 的样本。
- 难样本:IoU 值低于 µ 的样本。
Slide Loss 的权重设计像“滑梯”形状,对接近阈值 µ 的样本赋予较高权重。其具体操作是:
- 赋予低于阈值的难样本较高的权重,使模型在训练时对这些样本更为关注。
- 逐渐降低对易样本的权重,减少其在梯度更新中的影响。
理论详解可以参考链接:论文地址
代码可在这个链接找到:代码地址
下文都是手把手教程,跟着操作即可添加成功
目录
- 摘要
- 理论介绍
- 🎓一、YOLOv9原始版本代码下载
- 🍀🍀1.YOLOv9模型结构图
- 🍀🍀2.环境配置
- 🎓二、SlideLoss代码
- 🍀🍀1.代码如下:
- 🎓三、添加方法
- 🎓四、yaml 文件修改
- 🎓五、训练文件修改
- 总结
🎓一、YOLOv9原始版本代码下载
官网的源码下载地址 :YOLOv9官网代码
官网打不开的话,从我的网盘下载就行,网盘下载地址: YOLOv9原始版本源码下载,提取码: eajp
注意注意注意:如果在我之前的文章下载过YOLOv9源码,不用重新下载了,没有特殊说明都是用同一个版本的源码
🍀🍀1.YOLOv9模型结构图
根据 yolov9.yaml 画出 yolo 整体结构图,如下图所示
🍀🍀2.环境配置
环境配置参考教程链接:链接: 环境配置链接,如果已经配置好环境可以忽略此步骤
🎓二、SlideLoss代码
🍀🍀1.代码如下:
import math
class SlideLoss(nn.Module):def __init__(self, loss_fcn):super(SlideLoss, self).__init__()self.loss_fcn = loss_fcnself.reduction = loss_fcn.reductionself.loss_fcn.reduction = 'none' # required to apply SL to each elementdef forward(self, pred, true, auto_iou=0.5):loss = self.loss_fcn(pred, true)if auto_iou < 0.2:auto_iou = 0.2b1 = true <= auto_iou - 0.1a1 = 1.0b2 = (true > (auto_iou - 0.1)) & (true < auto_iou)a2 = math.exp(1.0 - auto_iou)b3 = true >= auto_ioua3 = torch.exp(-(true - 1.0))modulating_weight = a1 * b1 + a2 * b2 + a3 * b3loss *= modulating_weightif self.reduction == 'mean':return loss.mean()elif self.reduction == 'sum':return loss.sum()else: # 'none'return loss
🎓三、添加方法
之后将第二章的代码添加到 utils/loss_tal_dual.py 文件里面,如下截图:
在该文件 找到 ComputeLoss 类,按照下面修改即可:
原始代码是:
BCEcls = nn.BCEWithLogitsLoss(pos_weight=torch.tensor([h["cls_pw"]], device=device), reduction='none')
需要创建 SlideLoss 实例更改传入的损失函数,修改后的代码:
BCEcls = SlideLoss(nn.BCEWithLogitsLoss(pos_weight=torch.tensor([h["cls_pw"]], device=device), reduction='none'))
🎓四、yaml 文件修改
大家也尝试可以在 head 部分继续添加注意机制、改进的卷积等,改法都是换汤不换药
🎓五、训练文件修改
在项目里找到 train_dual.py 文件。
- 在 ’–weights’ 参数的 defaut 处设置为空。
- 在 ’–cfg’ 参数的 defaut 处设置填改进的模型配置文件路径。
- 在’–data’ 参数的 default 处设置为数据集配置文件路径。
- ‘–hyp’ 参数可以默认。
- ’–epochs’ 中的参数设置为 100 ,表示需经过 100 轮训练。
- '–batch-size’ 表示一次训练所抓取的数据样本数量,其大小影响训练速度和模型优化,此处将其参数设置为 4 ,根据自己电脑性能设置大一些也是可以的。
前面六个参数是常用参数,需要注意的是 ’–weights’ 参数可以留空,就是不需要权重,从头训练。
注意注意注意:一般做科研改进工作时候可以不用预训练权重
总结
把环境配置好,数据集处理好,训练基本能成功,创作不易,请帮忙点一个爱心,关注我,带你不挂科!