【YOLOv5改进系列(1)】高效涨点----使用EIoU、Alpha-IoU、SIoU、Focal-EIOU替换CIou

在这里插入图片描述


改进IOU损失函数

  • 🚀🚀🚀前言
  • 一、1️⃣ 如何添加损失函数
    • 1.1 🎓 修改bbox_iou函数
    • 1.2 ✨修改__call__中iou函数
  • 二、2️⃣替换EIOU
  • 三、3️⃣替换SIoU
  • 四、4️⃣替换Alpha-IoU
  • 五、5️⃣替换Focal-EIOU
  • 六、6️⃣ 替换后的实验结果


在这里插入图片描述

👀🎉📜系列文章目录

【yolov5-v6.0详细解读】
【目标检测—IOU计算详细解读(IoU、GIoU、DIoU、CIoU、EIOU、Focal-EIOU、WIOU)】

🚀🚀🚀前言

YOLOv5使用的默认边界框回归损失是CIou,在CVPR上等相关论文作者提出了EIoU、Alpha-IoU、SIoU、Focal-IOU等边界框回归损失计算方法,经过实验证明,使用这些方法对于数据集"涨点"有一定的帮助,在后面测试过程中使用的是由东北大学(NEU)发布的表面缺陷数据库,收集了热轧钢带的六种典型表面缺陷,即轧制氧化皮(RS),斑块(Pa),开裂(Cr),点蚀表面( PS),内含物(In)和划痕(Sc)。该数据库包括1,800个灰度图像:6种不同类型的典型表面缺陷,每一类缺陷包含300个样本。


一、1️⃣ 如何添加损失函数

1.1 🎓 修改bbox_iou函数

首先找到utils文件夹下的metrics.py文件,然后找到该python文件下的bbox_iou函数,其实在yolov5源码中设置是有GIoU, DIoU, CIoU这些边界框iou损失,但是默认值都为False
在这里插入图片描述

📌然后将原始的bbox_iou函数代码注释掉,替换成如下代码,这段代码是将EIoU、Alpha-IoU、SIoU、Focal-EIOU这几个功能集中在一起,如果想要使用不同的Iou计算边界框损失,只需要修改utils/loss.py下的iou方法即可。

def bbox_iou(box1, box2, xywh=True, GIoU=False, DIoU=False, CIoU=False, SIoU=False, EIoU=False, Focal=False, alpha=1,gamma=0.5, eps=1e-7):# Returns Intersection over Union (IoU) of box1(1,4) to box2(n,4)# Get the coordinates of bounding boxesif xywh:  # transform from xywh to xyxy(x1, y1, w1, h1), (x2, y2, w2, h2) = box1.chunk(4, -1), box2.chunk(4, -1)w1_, h1_, w2_, h2_ = w1 / 2, h1 / 2, w2 / 2, h2 / 2b1_x1, b1_x2, b1_y1, b1_y2 = x1 - w1_, x1 + w1_, y1 - h1_, y1 + h1_b2_x1, b2_x2, b2_y1, b2_y2 = x2 - w2_, x2 + w2_, y2 - h2_, y2 + h2_else:  # x1, y1, x2, y2 = box1b1_x1, b1_y1, b1_x2, b1_y2 = box1.chunk(4, -1)b2_x1, b2_y1, b2_x2, b2_y2 = box2.chunk(4, -1)w1, h1 = b1_x2 - b1_x1, (b1_y2 - b1_y1).clamp(eps)w2, h2 = b2_x2 - b2_x1, (b2_y2 - b2_y1).clamp(eps)# Intersection areainter = (b1_x2.minimum(b2_x2) - b1_x1.maximum(b2_x1)).clamp(0) * \(b1_y2.minimum(b2_y2) - b1_y1.maximum(b2_y1)).clamp(0)# Union Areaunion = w1 * h1 + w2 * h2 - inter + eps# IoU# iou = inter / union # ori iouiou = torch.pow(inter / (union + eps), alpha)  # alpha iouif CIoU or DIoU or GIoU or EIoU or SIoU:cw = b1_x2.maximum(b2_x2) - b1_x1.minimum(b2_x1)  # convex (smallest enclosing box) widthch = b1_y2.maximum(b2_y2) - b1_y1.minimum(b2_y1)  # convex heightif CIoU or DIoU or EIoU or SIoU:  # Distance or Complete IoU https://arxiv.org/abs/1911.08287v1c2 = (cw ** 2 + ch ** 2) ** alpha + eps  # convex diagonal squaredrho2 = (((b2_x1 + b2_x2 - b1_x1 - b1_x2) ** 2 + (b2_y1 + b2_y2 - b1_y1 - b1_y2) ** 2) / 4) ** alpha  # center dist ** 2if CIoU:  # https://github.com/Zzh-tju/DIoU-SSD-pytorch/blob/master/utils/box/box_utils.py#L47v = (4 / math.pi ** 2) * (torch.atan(w2 / h2) - torch.atan(w1 / h1)).pow(2)with torch.no_grad():alpha_ciou = v / (v - iou + (1 + eps))if Focal:return iou - (rho2 / c2 + torch.pow(v * alpha_ciou + eps, alpha)), torch.pow(inter / (union + eps),gamma)  # Focal_CIoUelse:return iou - (rho2 / c2 + torch.pow(v * alpha_ciou + eps, alpha))  # CIoUelif EIoU:rho_w2 = ((b2_x2 - b2_x1) - (b1_x2 - b1_x1)) ** 2rho_h2 = ((b2_y2 - b2_y1) - (b1_y2 - b1_y1)) ** 2cw2 = torch.pow(cw ** 2 + eps, alpha)ch2 = torch.pow(ch ** 2 + eps, alpha)if Focal:return iou - (rho2 / c2 + rho_w2 / cw2 + rho_h2 / ch2), torch.pow(inter / (union + eps),gamma)  # Focal_EIouelse:return iou - (rho2 / c2 + rho_w2 / cw2 + rho_h2 / ch2)  # EIouelif SIoU:# SIoU Loss https://arxiv.org/pdf/2205.12740.pdfs_cw = (b2_x1 + b2_x2 - b1_x1 - b1_x2) * 0.5 + epss_ch = (b2_y1 + b2_y2 - b1_y1 - b1_y2) * 0.5 + epssigma = torch.pow(s_cw ** 2 + s_ch ** 2, 0.5)sin_alpha_1 = torch.abs(s_cw) / sigmasin_alpha_2 = torch.abs(s_ch) / sigmathreshold = pow(2, 0.5) / 2sin_alpha = torch.where(sin_alpha_1 > threshold, sin_alpha_2, sin_alpha_1)angle_cost = torch.cos(torch.arcsin(sin_alpha) * 2 - math.pi / 2)rho_x = (s_cw / cw) ** 2rho_y = (s_ch / ch) ** 2gamma = angle_cost - 2distance_cost = 2 - torch.exp(gamma * rho_x) - torch.exp(gamma * rho_y)omiga_w = torch.abs(w1 - w2) / torch.max(w1, w2)omiga_h = torch.abs(h1 - h2) / torch.max(h1, h2)shape_cost = torch.pow(1 - torch.exp(-1 * omiga_w), 4) + torch.pow(1 - torch.exp(-1 * omiga_h), 4)if Focal:return iou - torch.pow(0.5 * (distance_cost + shape_cost) + eps, alpha), torch.pow(inter / (union + eps), gamma)  # Focal_SIouelse:return iou - torch.pow(0.5 * (distance_cost + shape_cost) + eps, alpha)  # SIouif Focal:return iou - rho2 / c2, torch.pow(inter / (union + eps), gamma)  # Focal_DIoUelse:return iou - rho2 / c2  # DIoUc_area = cw * ch + eps  # convex areaif Focal:return iou - torch.pow((c_area - union) / c_area + eps, alpha), torch.pow(inter / (union + eps),gamma)  # Focal_GIoU https://arxiv.org/pdf/1902.09630.pdfelse:return iou - torch.pow((c_area - union) / c_area + eps, alpha)  # GIoU https://arxiv.org/pdf/1902.09630.pdfif Focal:return iou, torch.pow(inter / (union + eps), gamma)  # Focal_IoUelse:return iou  # IoU

🔥温馨提示:

  • gamma参数是Focal EloU中的gamma参数,一般就是为0.5,有需要可以自行更改。
  • alpha参数为Alpha-IOU中的alpha参数,默认为1,即使用原始I0U。若需要使用Alpha-IOU,只需将其设置为任意值(论文中默认设
    置为3)

1.2 ✨修改__call__中iou函数

📌找到utils文件夹下面的loss.py损失函数计算文件,在该文件中找到ComputeLoss类下面的__call__函数,在__call__()函数里面找到红框部分的代码。
在这里插入图片描述
📌将红框内容替换成如下代码:

iou = bbox_iou(pbox, tbox[i], CIoU=True)  # iou(prediction, target)
if type(iou) is tuple:lbox += (iou[1].detach().squeeze() * (1 - iou[0].squeeze())).mean()iou = iou[0].squeeze()
else:lbox += (1.0 - iou.squeeze()).mean()  # iou lossiou = iou.squeeze()

后续需要想要使用EIOU等函数只需要修改iou = bbox_iou(pbox, tbox[i], CIoU=True)里面相关参数。

二、2️⃣替换EIOU

如果想要使用EIOU,只需要将CIoU替换成EIOU:

iou = bbox_iou(pbox, tbox[i], EIoU=True) 

三、3️⃣替换SIoU

如果想要使用SIoU,只需要将CIoU替换成SIoU:

iou = bbox_iou(pbox, tbox[i], SIoU=True) 

四、4️⃣替换Alpha-IoU

如果想要使用Alpha-IoU,只需要添加alpha这个参数项即可,如果不设置该参数,alpha默认为1:

iou = bbox_iou(pbox, tbox[i], CIoU=True, alpha=3) 

五、5️⃣替换Focal-EIOU

Focal-EIOU相对于EIOU只多了一个Focal项,这两个iou损失都是出自同一篇论文,只需要设置Focal=True即可。

iou = bbox_iou(pbox, tbox[i], EIoU=True, Focal=True) 

🔥其实Focal项也可以用于CIOU、SIOU,至于效果需要根据不同数据集进行测试,修改如下:

📌Focal-SIOU

iou = bbox_iou(pbox, tbox[i], CIOU=True, Focal=True) 

📌Focal-CIOU

iou = bbox_iou(pbox, tbox[i], SIOU=True, Focal=True) 

六、6️⃣ 替换后的实验结果

在基础参数设置相同的情况下,epochs=300, batch_size=16, imgsz=640,使用CIOU、EIOU、SIoU、Focal-EIOU结果如下:

CIOU实验结果:F1置信分数和所有类别map@0.5值
🚀F1置信度分数为0.71、map@0.5=0.779
在这里插入图片描述

EIOU实验结果:F1置信分数和所有类别map@0.5值
🚀对比CIOU的map@0.5值提升了2.7%
在这里插入图片描述
SIOU实验结果:F1置信分数和所有类别map@0.5值
🚀虽然f1置信分数对比ciou有所降低,但是对比CIOU的map@0.5值提升了近2个百分点。
在这里插入图片描述
Focal-EIOU实验结果:F1置信分数和所有类别map@0.5值
🔥使用Focal-EIOU替换之后,map提升最大的是crazing类,使用CIOU的crazing类map@0.5只有56%,但是替换之后可以达到 70.1%,所以数据集整体的map@0.5提升到了81.1%,要优于前面几种IOU替换效果。
在这里插入图片描述


在这里插入图片描述

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

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

相关文章

Scala--03--变量和数据类型

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 变量和数据类型1.注释2 变量和常量(重点)3 标识符的命名规范4 字符串输出5.IO 输入 输出键盘输入读写文件 IO 6.数据类型(重点&a…

3D开发工具HOOPS如何助力3D项目实现扩展现实技术?

在当今数字化时代,扩展现实(Augmented Reality,AR)技术的应用已经逐渐深入到各行各业,为用户带来了前所未有的沉浸式体验。而在实现这种技术的开发过程中,HOOPS技术的运用无疑是一种强大的助力。HOOPS是一种…

element-ui出的treeselect下拉树组件基本使用,以及只能选择叶子节点的功能,给节点添加按钮操作

element-ui出的treeselect下拉树组件基本使用:Vue通用下拉树组件riophae/vue-treeselect的使用-CSDN博客 vue-treeselect 问题合集、好用的树形下拉组件(vue-treeselect的使用、相关问题解决方案)-CSDN博客 需求1:treeselect下拉…

力扣Lc18--- 168. Excel表列名称(java版)-2024年3月19日

1.题目描述 2.知识点 注1:StringBuilder 对象的 insert() 方法用于在字符串的指定位置插入字符或字符序列。这里的第一个参数是插入位置的索引,而第二个参数是要插入的字符或字符序列。 public class InsertExample {public static void main(String[…

Filter and Listener and AJAX and JSON

一、Filter Filter 表示过滤器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。(拦截指定资源) 正常情况下,浏览器可以访问服务器上的所有的资源&…

瑞_Redis_短信登录

文章目录 项目介绍1 短信登录1.1 项目准备1.1.1 导入SQL1.1.2 导入后端项目1.1.3 导入前端项目 1.2 基于Session实现登录流程1.2.1 功能流程介绍1.2.1.1 发送短信验证码1.2.1.2 短信验证码登录、注册1.2.1.3 校验登录状态 1.2.2 实现发送短信验证码功能1.2.2.1 页面流程1.2.2.2…

【保姆级】前端使用node.js基础教程

文章目录 安装和版本管理:npm 命令(Node 包管理器):运行 Node.js 脚本:调试和开发工具:其他常用命令:模块管理:包管理:调试工具:异步编程和包管理&#xff1a…

【leetcode热题】 地下城游戏

恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0…

【pdf工具】pdf24tools

pdf24tools是一款功能强大的在线PDF工具,它为用户提供了多种实用的功能,方便用户处理和编辑PDF文件。 合并PDF文件、拆分PDF文件、压缩PDF文件和转换PDF文件格式…

分布式搜索引擎elasticsearch专栏三

1.数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机每月的销售情况如何? 实现这些…

[Qt项目实战]Qt实现美松标签打印机标签二维码打印(QR混排模式+页打印模式)

1、硬件信息、环境参数及配套资料 1.1 打印机信息及开发环境 打印机 美松标签打印机串口/USB通讯Qt5.9 64位程序 1.2 打印机配套开发资料 打印机主要配套测试工具、开发SDK及驱动等,均由厂家提供。 开发Demo及动态库:MsPrintSDK-DLL-V2.2.2.5 链接&…

Android Studio实现内容丰富的安卓社交论坛平台

获取源码请点击文章末尾QQ名片联系,源码不免费,尊重创作,尊重劳动 项目编号085 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端: 1.注册登录 2.查看公告 3.视频列表 4.资源列表 5.帖子列表 6.个人中心 …

Design Script之案例练习:曲线组合

让我们来探索一下如何创建分组曲线函数。这个函数将取一个无序曲线列表(必须是连续的),并将它们组合成分组的循环。 在这个例子中,我们将采取一系列的9个爆炸矩形,并洗牌合成曲线。这给了我们36条单独的曲线,它们可以正确地组合回各自的矩形中。 一些分散的曲线显示在右边…

基于python在线图书馆信息管理系统flask-django-nodejs-php

科学技术日新月异的如今,计算机在生活各个领域都占有重要的作用,尤其在信息管理方面,在这样的大背景下,学习计算机知识不仅仅是为了掌握一种技能,更重要的是能够让它真正地使用到实践中去,以创新的视角去不…

Spring-Mybatis字段映射

MybatisComfig.xml文件设置 <settings><setting name"mapUnderscoreToCamelCase" value"true"/> </settings> 完成全局配置将数据库下划线映射为驼峰式命名

nodejs基于vue班级管理系统的设计与实现-flask-django-python-php

根据现实需要&#xff0c;此系统我们设计出一下功能&#xff0c;主要有以下功能模板。 1.学生功能&#xff1a;首页、个人中心、课程信息管理、学生成绩管理、班级事件管理、班费支出管理、班级相册管理、班级音乐角管理。 2.管理员功能&#xff1a;首页、个人中心、班级管理、…

【征稿进行时|见刊、检索快速稳定】2024年区块链、物联网与复合材料与国际学术会议 (ICBITC 2024)

【征稿进行时|见刊、检索快速稳定】2024年区块链、物联网与复合材料与国际学术会议 (ICBITC 2024) 大会主题: (主题包括但不限于, 更多主题请咨询会务组苏老师) 区块链&#xff1a; 区块链技术和系统 分布式一致性算法和协议 块链性能 信息储存系统 区块链可扩展性 区块…

[Uni-app] 微信小程序的圆环进度条

效果图&#xff1a; 组件完整代码如下&#xff1a; <template><view class"base-style":style"position: relative;width: diameter px;height: diameter px;display: flex;flex-direction: row;background-color: bgColor ;"><!…

《动手学深度学习》 第3章 线性神经网络 部分笔记

文章目录 前言一、线性回归1.知识点&#xff08;1&#xff09;解析解&#xff08;2&#xff09;泛化&#xff08;3&#xff09;随机梯度下降&#xff08;4&#xff09;python列表推导&#xff08;5&#xff09;全连接层 二、线性回归的从零开始实现1.知识点&#xff08;1&#…

HCIP作业

实验要求&#xff1a; 1、R6为ISP&#xff0c;接口IP地址均为公有地址&#xff0c;该设备只能配置IP地址&#xff0c;之后不能再对其进行任何配置&#xff1b; 2、R1-R5为局域网&#xff0c;私有IP地址192.168.1.0/24&#xff0c;请合理分配&#xff1b; 3、R1、R2、R4&#x…