【目标检测实验系列】YOLOv5改进实验:结合VariFocal Loss损失函数,减少小目标漏检问题,高效提升模型检测的召回率(超详细改进代码流程)

news2024/9/22 23:55:26

目录

    • 1. 文章主要内容
    • 2. VariFocal Loss损失函数(原理:简单介绍,可自行详细研究)
      • 2.1 VariFocal Loss损失函数
      • 2.2 博主数据集实验效果
    • 3. 代码详细改进流程(重要)
      • 3.1 新建varifocalLoss.py文件
      • 3.2 修改hyp.scratch-low.yaml文件
      • 3.3 修改loss.py文件
    • 4. 本篇小结

1. 文章主要内容

       本篇博客主要涉及两个主体内容。第一个:简单介绍VariFocal Loss的原理。第二个:基于YOLOv5 6.0版本,将损失函数替换为VariFocal Loss的详细调试步骤(通读本篇博客大概需要5分钟左右的时间)。

2. VariFocal Loss损失函数(原理:简单介绍,可自行详细研究)

2.1 VariFocal Loss损失函数

       VariFocal Loss是从Focal Loss而来,所以我们要首先了解Focal Loss。Focal Loss提出来要解决的问题是训练数据中,正负样本不均衡的问题。 何为正负样本不均衡?比如说,我们训练的图片样本,尤其是包含很多小目标的图片样本,其实要检测的目标(也就是我们说的正样本)只占图片区域的少部分(综合来看),大部分的区域则为背景区域(也就是我们说的负样本);这就会导致训练数据负样本占多,而正样本相对来说占少数,模型的训练效果会变差,Focal Loss给难分、易分样本加上权重因子,提升难分样本的权重,降低易分样本的权重,从而控制正负样本均衡的问题,其中背景类一般为易分样本,而目标类为难分样本。 同时,Focal Loss适合检测密集型目标的图片样本,这个对小尺寸、拥挤、遮挡等特点的数据集会有不错的效果。

       VariFocal Loss是在Focal Loss的基础上提出的,因为Focal Loss对正负样本的处理是均衡的,而varifocal loss仅减少了负样本的损失贡献,而不以同样的方式降低正样本的权重。具体的公式、原理还请查看原论文或者网上的文章解析。
       原论文地址:Focal Loss 论文、VariFocal Loss 论文

2.2 博主数据集实验效果

       博主所训练的数据集特点:小尺寸目标居多,密集且目标尺寸不一,实验数据如下所示:
       原YOLOv5s框架实验数据:P(查准率):0.935、R(召回率):0.927、mAP@0.5(平均检测精度):0.942
       YOLOv5s+VFLoss:P(查准率):0.974、R(召回率):0.95、mAP@0.5(平均检测精度):0.962
       由实验数据对比,YOLOv5s+VariFocal Loss能够极大的提升R,同时P、mAP也有所提升,提升R指标,就表明能够检测更多的目标,可以减少模型漏检的问题,且FLOPs和原YOLOv5模型一样。

3. 代码详细改进流程(重要)

3.1 新建varifocalLoss.py文件

       ( 注意:博主使用的是Pycharm集成开发工具)首先在data->tricks目录下新建一个叫varifocal loss的py文件( 注意:tricks文件夹是自定义创建的,没有自己创建一个即可),将如下代码复制到varifocal loss的py文件中:

import torch
from torch import nn

class VFLoss(nn.Module):
    def __init__(self, loss_fcn, gamma=1.5, alpha=0.25):
        super(VFLoss, self).__init__()
        # 传递 nn.BCEWithLogitsLoss() 损失函数  must be nn.BCEWithLogitsLoss()
        self.loss_fcn = loss_fcn  #
        self.gamma = gamma
        self.alpha = alpha
        self.reduction = loss_fcn.reduction
        self.loss_fcn.reduction = 'none'  # required to apply VFL to each element

    def forward(self, pred, true):

        loss = self.loss_fcn(pred, true)

        pred_prob = torch.sigmoid(pred)  # prob from logits

        focal_weight = true * (true > 0.0).float() + self.alpha * (pred_prob - true).abs().pow(self.gamma) * (
                    true <= 0.0).float()
        loss *= focal_weight

        if self.reduction == 'mean':
            return loss.mean()
        elif self.reduction == 'sum':
            return loss.sum()
        else:
            return loss

       另外项目的data-tricks目录结构如下所示:( 之所以要新建文件,是为了方便,清晰的分辨哪些创新点,而不是一股脑都放在一个文件中
在这里插入图片描述

3.2 修改hyp.scratch-low.yaml文件

       在data/hyps文件夹下面,找到hyp.scratch-low.yaml(注意:hyps下面有多个yaml文件,博主这里修改hyp.scratch-low.yaml,是因为在train.py文件中调用了此文件,如果你调用了是另外的yaml文件,则需要在你调用的那个yaml文件中做修改),修改fl_gamma的这一行值,原本是0.0,这里修改为1.5即可,如下图所示:
在这里插入图片描述

3.3 修改loss.py文件

       loss.py文件在utils文件夹下面,打开并定位到如下代码部分(大概是111行),修改成如下的代码所示:

BCEcls, BCEobj = VFLoss(BCEcls, g), VFLoss(BCEobj, g)

在这里插入图片描述
       这里用VFLoss替换了YOLOv5的分类、置信度损失,回归框损失没有替换。同时,我们注意到,g = h[‘fl_gamma’] 这行代码就是hyp.scratch-low.yaml的fl_gamma值,设置为1.5(1.5为经验值)就可以进入到if g > 0 的条件当中,另外需要导入VFLoss的引用,不然会报错,只需要在文件首部添加from data.tricks.varifocalLoss import VFLoss即可。

4. 本篇小结

       本篇博客主要介绍了VF+YOLOv5的修改详细流程,助力模型对小目标、多尺寸、密集目标的检测涨点。另外,在修改过程中,要是有任何问题,评论区交流;如果博客对您有帮助,请帮忙点个赞,收藏一下;后续会持续更新本人实验当中觉得有用的点子,如果很感兴趣的话,可以关注一下,谢谢大家啦!

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

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

相关文章

【MATLAB图像处理实用案例详解(20)】——利用BP神经网络实现人脸朝向判断

目录 一、问题描述二、算法步骤2.1 读入数据并提取特征2.2 创建神经网络并训练2.3 测试 三、结果分析 一、问题描述 BP神经网络利用输出后的误差来估计输出层的直接前导层的误差&#xff0c;再用这个误差估计更前一层的误差&#xff0c;如此一层一层的反传下去&#xff0c;就获…

4_用dockerfile制作镜像

Docker 镜像原理 思考&#xff1a; Docker 镜像本质是什么&#xff1f; Docker 中一个centos镜像为什么只有200MB&#xff0c;而一个centos操作系统的iso文件要几个个G&#xff1f; Docker 中一个tomcat镜像为什么有500MB&#xff0c;而一个tomcat安装包只有70多MB&#xff…

JavaScript中的Concurrency并发:异步操作下的汉堡制作示例

这篇文章想讲一下JavaScript中同步与异步操作在一个简单的示例中的应用。我们将以制作汉堡为例&#xff0c;展示如何使用同步方法、回调函数&#xff08;callbacks&#xff09;和Promise与async/await来实现该过程。 Let’s imagine we’re trying to make a burger: 1. Get …

基于simulink使用混合波束成形对射频毫米波发射器进行建模

一、前言 本例说明了一种使用66元件混合波束成形天线对32 GHz QPSK射频发射和接收系统进行系统级建模和仿真的方法。该系统包括射频缺陷、发射阵列辐射效应、窄带接收阵列和基带接收器&#xff0c;可校正系统损伤和消息解码。天线波束形成方向使用方位角和仰角定义&#xff0c;…

C语言CRC-16 USB格式校验函数

C语言CRC-16 USB格式校验函数 CRC-16校验产生2个字节长度的数据校验码&#xff0c;通过计算得到的校验码和获得的校验码比较&#xff0c;用于验证获得的数据的正确性。基本的CRC-16校验算法实现&#xff0c;参考&#xff1a; C语言标准CRC-16校验函数。 不同应用规范通过对输…

计算机图形辐照度学、光度学

文章目录 前言&#xff1a;一、什么是辐照度学二、什么是光度学 前言&#xff1a; 在计算机图形学中是把辐射(Radiance)等概念和亮度(Luminance)等概念不做区分的。辐射是辐照度学的概念&#xff0c;而亮度则是光度学上的概念。 辐照强高度并不意味着亮度就强&#xff0c;就比如…

VTK 几何体连通区域分析 vtkPolyDataConnectivityFilter

前言&#xff1a; vtkPolyDataConnectivityFilter 使用过&#xff0c;但网上没有看到完事的教程&#xff1b;这里整理一下&#xff1b; 提取数据集中连通的多边形数据。 该类是一个滤波器&#xff0c;提取cell&#xff08;区域&#xff09; - 拥有公共点或者满足某个阈值 该类…

Soft-RoCE部署及通信测试

Soft-RoCE部署及通信测试 Soft-RoCE是一种基于软件的RoCE&#xff08;RDMA over Converged Ethernet&#xff09;实现。RoCE是一种在以太网上实现RDMA&#xff08;Remote Direct Memory Access&#xff09;的技术&#xff0c;它允许数据在网络中直接传输&#xff0c;而无需CPU…

【ElasticSearch】几点优化及面试相关

文章目录 硬件选择分片策略合理设置分片数推迟分片分配 路由选择写入速度优化(磁盘优化)批量数据提交优化存储设备合理使用合并减少 Refresh 的次数加大 Flush 设置减少副本的数量 内存设置ES配置文件解析Elasticsearch 面试题为什么要使用 Elasticsearch?Elasticsearch 的 ma…

【Java网络编程】基于UDP-Socket 实现客户端、服务器通信

​ 哈喽&#xff0c;大家好~我是你们的老朋友&#xff1a;保护小周ღ 本期为大家带来的是网络编程的 UDP Socket 套接字&#xff0c;基于 UDP协议的 Socket 实现客户端服务器通信&#xff0c;Socket 套接字可以理解为是&#xff0c;传输层给应用层提供的一组 API&#xff0c;…

Java中提升接口性能的一些方法

目录 1.使用线程池并行执行2.数据库优化2.1 小表关联大表2.2 反三大范式操作2.3 增加索引2.4 减小事务粒度2.5 读写分离、分库分表 3.拥抱缓存3.1 Redis3.2 内存缓存 4.锁和异步4.1 减小锁的粒度4.2 分布式锁 1.使用线程池并行执行 假如有一个接口的逻辑如下&#xff1a; 接口…

cadence遇到的问题

1、最烦人的&#xff0c;突然卡住。 设置grid卡住&#xff0c;导出libraries卡住&#xff0c;选择其他产品时卡住。 从微软拼音输入法改成美式键盘后能解决一些问题。但不能解决全部。 今天下载了搜狗输入法来替代微软自带输入法。效果奇佳&#xff0c;真的可以诶。 2、如果…

沁恒 CH32V208(一): CH32V208WBU6 评估板上手报告和Win10环境配置

目录 沁恒 CH32V208(一): CH32V208WBU6 评估板上手报告和Win10环境配置 CH32V208 CH32V208系列是沁恒32位RISC-V中比较新的一个系列, 基于青稞RISC-V4C内核, 最高144MHz主频, 64KB SRAM&#xff0c;128KB Flash, 供电电压2.5/3.3V. 这个型号的特点: 除了特有的硬件堆栈区、…

【C++11那些事儿(三)】

文章目录 一、可变参数模板1.1 概念引入1.2 递归函数方式展开参数包1.3 逗号表达式展开参数包1.4 可变参数模板在STL中的应用 二、包装器1.1 function1.2 bind 一、可变参数模板 1.1 概念引入 C11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板&#x…

链表的添加修改删除操作

public class HeroNodeDemo {public static void main(String[] args) {HeroNode hero1 new HeroNode(1, "松江");HeroNode hero2 new HeroNode(2, "武松");HeroNode hero3 new HeroNode(3, "及时雨");HeroNode hero4 new HeroNode(4, "…

AWVS-window版本安装

Acunetix Web Vulnerability Scanner&#xff08;简称AWVS&#xff09;是一款知名的网络漏洞扫描工具&#xff0c;它通过网络爬虫测试你的网站安全&#xff0c;检测流行安全漏洞。 一、下载 链接&#xff1a;https://pan.baidu.com/s/1GuLCmYBmhVYA2_qBwfjZhw 提取码&#x…

管家婆安装导致电脑蓝屏问题解决方案

安装完管家婆后&#xff0c;电脑蓝屏&#xff0c;重启还是蓝屏&#xff0c;这该怎么办&#xff1f; 导致的原因&#xff1a;因加密狗驱动不适配于Windows10系统&#xff0c;导致电脑蓝屏 修复方案&#xff1a;进入电脑安全模式&#xff08;怎么进入问度娘&#xff09;&#…

css奇淫巧计

1.input文本内容替换 -webkit-text-security&#xff1a;通过用形状替换字符,仅影响那些字段不是的typepassword 可选值:none &#xff08;无&#xff09;&#xff0c;circle &#xff08;圆圈&#xff09;&#xff0c;disc &#xff08;圆形&#xff09;&#xff0c;square &a…

【STM32CubeMX】串口通信

前言 本文记录下我学习STM32CubeMX时的流程&#xff0c;方便以后回忆。本章记录串口通信。这里居然有玄学问题&#xff0c;给我整了好久&#xff0c;头都大了。可能也是我能力有限才有的吧&#xff0c;泪目。 目录 串口通信 串口通信 STM32CubeMX中的串口配置&#xff0c;配…

MiniGPT-4引领潮流,GPT-4提前发布图片阅读功能

ChatGPT中国站翻译自medium.com 让我们来看看如何玩Minigpt-4并将其应用到日常生活中。 今年三月&#xff0c;OpenAI 宣布了 GPT-4 的图像识别功能&#xff0c;这意味着 GPT 技术又被提升一个维度。-4 尚未发布给大众使用很长时间&#xff0c;所以终于有人忍不住了&#xff01;…