【深度学习实战(49)】目标检测损失函数:IoU、GIoU、DIoU、CIoU、EIoU、alpha IoU、SIoU、WIoU原理及Pytorch实现

news2024/12/23 22:38:56

前言

损失函数是用来评价模型的预测值和真实值一致程度,损失函数越小,通常模型的性能越好。不同的模型用的损失函数一般也不一样。损失函数主要是用在模型的训练阶段,如果我们想让预测值无限接近于真实值,就需要将损失值降到最低,在这个过程中就需要引入损失函数,而损失函数的选择又是十分关键。尤其是在目标检测中,损失函数直接关乎到检测效果是否准确,其中IOU损失函数目前主要应用于目标检测的领域,其演变的过程如下:IOU --> GIOU --> DIOU -->CIOU损失函数,每一种损失函数都较上一种损失函数有所提升,下面来具体介绍这几种损失函数。

1 IoU(Intersection over Union)

1.1 IoU简介

UnitBox: An Advanced Object Detection Network

IoU全称Intersection over Union,交并比。IoU是一种测量在特定数据集中检测相应物体准确度的一个标准。只要是在输出中得出一个预测范围(bounding boxes)的任务都可以用IoU来进行测量。

IoU算法是使用最广泛的算法,大部分的检测算法都是使用的这个算法。在目标识别中,我们的预测框与实际框的某种比值就是IoU。
在这里插入图片描述

1.2 IoU公式

在这里插入图片描述

1.3 优点

  • IOU能够直观地反映出目标检测结果与真实情况之间的匹配程度。
  • IOU具有尺度不变性,由于IOU是基于重叠度量的,它不受目标尺度和形状变换的影响,这使得IOU适用于各种不同尺度和形状的目标检测任务。

1.4 缺点

当预测框和目标框不相交时,即IOU=0时,不能反映两个目标之间距离的远近,此时损失函数不可导,IOU Loss 无法优化。
当两个检测框大小相同,两个IOU也相同,IOU_Loss无法精确的反映两个框的重合度大小。
在这里插入图片描述

1.5 IoU代码

def IoU(box1, box2):
    b1_x1, b1_y1, b1_x2, b1_y2 = box1
    b2_x1, b2_y1, b2_x2, b2_y2 = box2
    
    xx1 = np.maximum(b1_x1, b2_x1)
    yy1 = np.maximum(b1_y1, b2_y1)
    xx2 = np.minimum(b1_x2, b2_x2)
    yy2 = np.minimum(b1_y2, b2_y2)
    
    w = np.maximum(0.0, yy2 - yy1)
    h = np.maximum(0.0, xx2 - xx1)
 
    inter = w * h
    IoU = inter/((b1_x2-b1_x1)*(b1_y2-b1_y1) + (b2_x2-b2_x1)*(b2_y2-b2_y1) - inter)
    print("IoU: ", IoU)
 
 
if __name__ == "__main__":
    box1 = np.array([100, 100, 210, 210])
    box2 = np.array([150, 150, 230, 220])
    IoU(box1, box2)

2 GIoU

Generalized Intersection over Union: A Metric and A Loss for Bounding BoxRegression

2.1 GIoU简介

通过上述分析,当预测框和真实框不相交时IoU值为0,导致很大范围内损失函数没有梯度。针对这一问题,提出了GIoU作为损失函数。GIoU比IoU多了一个‘Generalized’,能在更广义的层面上计算IoU。当检测框和真实框没有出现重叠的时候IoU的loss都是一样的,因此GIoU就引入了最小封闭形状C(C可以把A,B包含在内),在不重叠情况下能让预测框尽可能朝着真实框前进,这样就可以解决检测框和真实框没有重叠的问题 。
在这里插入图片描述

2.2 GIoU公式

算法公式及其解释:其实想法也很简单(但这一步很难):假如现在有两个box A,B,我们找到一个最小的封闭形状C,让C可以把A,B包含在内,然后再计算C中没有覆盖A和B的面积占C总面积的比值,最后用A与B的IoU减去这个比值,GIoU计算公式如下
在这里插入图片描述

2.3 优点

  • GIOU_Loss中,增加了相交尺度的衡量方式,缓解了单纯IOU_Loss时的尴尬,但是依然没有完全解决IoU存在的问题

2.4 缺点

  • 对每个预测框与真实框均要去计算最小外接矩形,计算及收敛速度受到限制
  • 状态1、2、3都是预测框在目标框内部且预测框大小一致的情况,这时预测框和目标框的差集都是相同的,因此这三种状态的GIoU值也都是相同的,这时GIoU退化成了IoU,无法区分相对位置关系。
    在这里插入图片描述

2.5 GIoU代码

def GIoU(box1, box2):
    b1_x1, b1_y1, b1_x2, b1_y2 = box1
    b2_x1, b2_y1, b2_x2, b2_y2 = box2
    
    # IOU
    xx1 = np.maximum(b1_x1, b2_x1)
    yy1 = np.maximum(b1_y1, b2_y1)
    xx2 = np.minimum(b1_x2, b2_x2)
    yy2 = np.minimum(b1_y2, b2_y2)
    inter_w = np.maximum(0.0, yy2 - yy1)
    inter_h = np.maximum(0.0, xx2 - xx1)
    inter = inter_w * inter_h
    Union = (b1_x2-b1_x1)*(b1_y2-b1_y1) + (b2_x2-b2_x1)*(b2_y2-b2_y1) - inter
 
    # GIOU
    C_xx1 = np.minimum(b1_x1, b2_x1)
    C_yy1 = np.minimum(b1_y1, b2_y1)
    C_xx2 = np.maximum(b1_x2, b2_x2)
    C_yy2 = np.maximum(b1_y2, b2_y2)
    C_area = (C_xx2 - C_xx1) * (C_yy2 - C_yy1)
 
    IOU = inter / Union
    GIOU = IOU - abs((C_area-Union)/C_area)
    print("GIOU:", GIOU)
 
if __name__ == "__main__":
    box1 = np.array([100, 100, 210, 210])
    box2 = np.array([150, 150, 230, 220])
    GIoU(box1, box2)

3 DIoU

Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression

3.1 简介

好的目标框回归函数应该考虑三个重要几何因素:重叠面积中心点距离长宽比。针对IoU和GIoU存在的问题,作者从两个方面进行考虑

  • 一:如何最小化预测框和目标框之间的归一化距离?
  • 二:如何在预测框和目标框重叠时,回归的更准确?
    针对第一个问题,提出了DIoU_Loss(Distance_IoU_Loss),从而使收敛速度更快,性能更好。
    在这里插入图片描述

3.2 DIoU公式

在这里插入图片描述
在这里插入图片描述

3.3 优点

  • DIOU在与目标框重叠时,仍然可以为边界框提供移动方向;
  • DIOU可以直接最小化两个目标框的距离,因此比GIOU收敛快得多;
  • DIOU还可以替换普通的IOU评价策略,应用于NMS中,使得NMS得到的结果更加合理和有效。

3.4 缺点

  • DIoU考虑了重叠面积和中心点距离,当目标框包裹预测框的时候,直接度量2个框的距离,因此DIoU收敛的更快,但并没有考虑到长宽比
  • 在这里插入图片描述

比如上面三种情况,目标框包裹预测框,本来DIOU_Loss可以起作用。但预测框的中心点的位置都是一样的,因此按照DIOU_Loss的计算公式,三者的值都是相同的。

3.5 DIoU代码

def DIoU(box1, box2):
    b1_x1, b1_y1, b1_x2, b1_y2 = box1
    b2_x1, b2_y1, b2_x2, b2_y2 = box2
    
    # IOU
    xx1 = np.maximum(b1_x1, b2_x1)
    yy1 = np.maximum(b1_y1, b2_y1)
    xx2 = np.minimum(b1_x2, b2_x2)
    yy2 = np.minimum(b1_y2, b2_y2)
    inter_w = np.maximum(0.0, xx2 - xx1)
    inter_h = np.maximum(0.0, yy2 - yy1)
    inter = inter_w * inter_h
    Union = (b1_x2 - b1_x1)*(b1_y2 - b1_y1) + (b2_x2 - b2_x1)*(b2_y2 - b2_y1) - inter
 
    # DISTANCE
    C_xx1 = np.minimum(b1_x1, b2_x1)
    C_yy1 = np.minimum(b1_y1, b2_y1)
    C_xx2 = np.maximum(b1_x2, b2_x2)
    C_yy2 = np.maximum(b1_y2, b2_y2)
    C_area = (C_xx2 - C_xx1) * (C_yy2 - C_yy1)
 
    center_b_x = (b1_x1+b1_x2)/2
    center_b_y = (b1_y1+b1_y2)/2
    center_gtb_x = (b2_x1+b2_x2)/2
    center_gtb_y = (b2_y1+b2_y2)/2
 
    center_distance = (center_gtb_x-center_b_x)**2 + (center_gtb_y-center_b_y)**2
	c_distance = (C_xx2 - C_xx1)**2 + (C_yy2 - C_yy1)**2
	
    IOU = inter/Union
    DIOU = IOU - center_distance /c_distance
    print("DIOU:", DIOU)
 
if __name__ == "__main__":
    box1 = np.array([100, 100, 210, 210])
    box2 = np.array([150, 150, 230, 220])
    DIoU(box1, box2)

4 CIoU

Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression

4.1 简介

DIoU考虑了重叠面积和中心点距离,当目标框包裹预测框的时候,直接度量2个框的距离,因此DIoU收敛的更快,但并没有考虑到长宽比。针对这个问题,又提出了CIOU_Loss,不对不说,科学总是在解决问题中,不断进步!!

CIoU就是在DIoU的基础上增加了检测框尺度的loss,增加了长和宽的loss,使得目标框回归更加稳定,不会像IoU和GIoU一样出现训练过程中发散等问题。

4.2 CIoU公式

在这里插入图片描述

4.3 优点

  • 形状不变性: CIOU 损失函数在设计上考虑了目标框的形状信息,通过引入修正因子,使得损失对于不同形状的目标框更具鲁棒性。这使得模型更容易捕捉目标的准确形状。
  • 对定位精度的敏感性: CIOU 损失函数对目标框的位置预测更为敏感,因为它考虑了目标框的对角线距离。这有助于提高目标检测模型在定位目标时的精度。
  • 全面性: CIOU 损失函数综合考虑了位置、形状和方向等多个因素,使得模型更全面地学习目标框的特征。这有助于提高模型在复杂场景中的性能。

4.4 缺点

  • 如果预测框和gt框的长宽比是相同的,那么长宽比的惩罚项恒为0,不合理
  • 观察CIoU中w, h相对于v的梯度,发现这两个梯度是一对相反数,也就是说,w和h不能同时增大或减小,这显然也不够合理的。

4.5 代码

def CIoU(box1, box2):
    b1_x1, b1_y1, b1_x2, b1_y2 = box1
    b2_x1, b2_y1, b2_x2, b2_y2 = box2
 
    # IOU
    xx1 = np.maximum(b1_x1, b2_x1)
    yy1 = np.maximum(b1_y1, b2_y1)
    xx2 = np.minimum(b1_x2, b2_x2)
    yy2 = np.minimum(b1_y2, b2_y2)
    inter_w = np.maximum(0.0, xx2 - xx1)
    inter_h = np.maximum(0.0, yy2 - yy1)
    inter = inter_w*inter_h
    Union = (b1_x2-b1_x1)*(b1_y2-b1_y1) + (b2_x2-b2_x1)*(b2_y2-b2_y1) - inter
    IOU = inter/Union
 
    C_xx1 = np.minimum(b1_x1, b2_x1)
    C_yy1 = np.minimum(b1_y1, b2_y1)
    C_xx2 = np.maximum(b1_x2, b2_x2)
    C_yy2 = np.maximum(b1_y2, b2_y2)
 
    # DISTANCE
    center_b_x = (b1_x1 + b1_x2)/2
    center_b_y = (b1_y1 + b1_y2)/2
    center_gtb_x = (b2_x1 + b2_x2)/2
    center_gtb_y = (b2_y1 + b2_y2)/2
    C_area = (C_xx2-C_xx1)*(C_yy2-C_yy1)
    Distance = (center_gtb_x-center_b_x)**2 + (center_gtb_y-center_b_y)**2
    Distance_area = Distance/C_area**2
 
    # aspect ratio
    pred_w = b1_y2 - b1_y1
    pred_h = b1_x2 - b1_x1
    gt_w = b2_y2 - b2_y1
    gt_h = b2_x2 - b2_x1
    v = (4/(np.pi)**2)*(np.arctan(gt_w/gt_h) - np.arctan(pred_w/pred_h))**2
    alpha = v/((1-IOU) + v)
 
    CIOU = IOU - Distance_area - alpha*v
    print("CIOU:", CIOU)
 
if __name__ == "__main__":
    box1 = np.array([100, 100, 210, 210])
    box2 = np.array([150, 150, 230, 220])
    CIoU(box1, box2)

参考:https://blog.csdn.net/qq_40716944/article/details/135026393

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

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

相关文章

kernel-devel导致的linux网卡驱动安装异常

引言 安装包下载:iso镜像文件解压后进入package路径,可以找到所有想要的rpm安装包 1.检查gcc gcc -v:检查gcc编译程序是否安装,如果已经成功安装直接执行步骤3 2.安装gcc & gcc-c gcc程序准备,拷贝到centos后进入…

大厂linux面试题攻略五之数据库管理

一、数据库管理-MySQL语句 0.MySQL基本语句: 1.SQL语句-增 创建xxx用户: mysql>create user xxx % indentified by 123456; xxx表示用户名 %b表示该用户用来连接数据库的方式(远程或本地连接) indentified by 123456设置密码…

《看漫画学Python》全彩PDF教程,495页深度解析,零基础也能轻松上手!

前言 说起编程语言,Python 也许不是使用最广的,但一定是现在被谈论最多的。随着近年大数据、人工智能的兴起,Python 越来越多的出现在人们的视野中。 在各家公司里,Python 还常被用来做快速原型开发,以便更快验证产品…

PyCharm 中如何使用驭码CodeRider?

极狐GitLab 在 5 月 28 日正式发布了 AI 产品驭码CodeRider,可以使用驭码CodeRider 进行AI 编程 & DevOps 流程处理。现已开启免费试用,登录官网:https://coderider.gitlab.cn/ 即可申请试用。 GitLab 中文版学习资料 驭码CodeRider 官…

【论文学习】基于序列统计的未知无线协议特征提取方法

【参考文献】刘治国,蔡文珠,李运琪,等.基于序列统计的未知无线协议特征提取方法[J].计算机工程,2021,47(11):192-197.DOI:10.19678/j.issn.1000-3428.0059551.【注】本文仅为作者个人学习笔记,如有冒犯,请联系作者删除。 这篇题为《基于序列统计的未知无…

U-Net++原理与实现(含Pytorch和TensorFlow源码)

U-Net原理与实现 引言1. U-Net简介1.1 编码器(Encoder)1.2 解码器(Decoder)1.3 跳跃连接(Skip Connections) 2. U-Net详解2.1 密集跳跃连接2.2 嵌套和多尺度特征融合2.3 参数效率和性能2.4 Pytorch代码2.5 …

conda搭建环境,pycham使用

相信学习了tensorflowjs后一定不会满足,毕竟tensorflowjs使用场景以及开源度远不及pyhton的tensorflow,所以不要犹豫,开始使用python吧,有ChatGPT帮助,比想象的简单很多 python环境安装 conda环境安装 推荐大家直接…

[STM32][Bootloader][教程]STM32 HAL库 Bootloader开发和测试教程

0. 项目移植 对于不想知道其执行过程的朋友来说,可以直接移植,我的板子是STM32F411CER6, 512K M4内核 项目地址: Bootloader(可以自己写标志位用于自测,项目中这部分代码已经被注释,可以打开自行测试&…

中国智能物流头部集成商的“江湖地位”及其“独门秘笈”

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 物流仓储自动化领域犹如一片充满机遇与挑战的江湖,各大企业群雄逐鹿,各展所长。这些企业,如同金庸小说中的武林高手,不仅拥有深厚的内功…

后台列表复制功能

html&#xff1a; <el-button click"copy(row)">复制</el-button><!-- 复制弹框 --> <el-dialog :close-on-click-modal"false" title"复制" width"600px" :visible.sync"copyVisible" append-to-bod…

博世战胜三星,577亿最大笔收购,豪赌杀入自动化新业务

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 德国工业巨头博世再次震惊业界&#xff01;近日&#xff0c;这家总部位于斯图加特的科技公司以74亿欧元&#xff08;约合人民币577亿&#xff09…

自动化测试常用函数(Java方向)

目录 一、元素的定位 1.1 cssSelector 1.2 xpath 1.2.1 获取HTML页面所有的节点 1.2.2 获取HTML页面指定的节点 1.2.3 获取⼀个节点中的直接子节点 1.2.4 获取⼀个节点的父节点 1.2.5 实现节点属性的匹配 1.2.6 使用指定索引的方式获取对应的节点内容 二、操作测试对…

麒麟系统如何删除光盘刻录痕迹??

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

一文解读ReentrantLock

本期说一下ReentrantLock的相关面试题。 Lock接口 是JDK层面锁 悲观锁 可重入锁。&#xff08;可重入锁&#xff08;Reentrant Lock&#xff09;是一种支持线程重复获取锁的锁机制。当一个线程已经获得了可重入锁后&#xff0c;它可以再次请求该锁而不会被阻塞&#xff0c;这就…

第G6周:CycleGAN实战

本文为365天深度学习训练营 中的学习记录博客 原作者&#xff1a;K同学啊 可参考论文&#xff1a;《Unpaired Image-to-Image Translation》 1、CycleGAN 能做什么&#xff1f; CycleGAN的一个重要应用领域是Domain Adaptation&#xff08;域迁移&#xff1a;可以通俗的理解为…

Stable Diffusion 使用详解(5)---- 光影效果与场景融入

目录 背景 底模选取 提示词 ControlNet openpose illumination 效果 背景 有一家服装品牌店&#xff0c;需要绘制一款模特穿着某个英文LOG的漂亮服装&#xff0c;这是一种很常见UI作画需求&#xff0c;这类需求实际上可以透过选取正确的底模 controlNet 进行完美的实现…

vite vue3 Webstorm multiple export width the same name “default“

系统格式不一样&#xff0c;导致代码文件格式冲突导致的&#xff0c;解决方法找到对应的文件&#xff0c;将文件类型切换成LF。

软件测试--兼容性测试

兼容性测试综述 软件兼容性测试是指检查软件之间是否能够正确的交互和共享信息 交互可以同时运行于同一台计算机上的两个程序之间&#xff0c;甚至在相隔几千公里通过因特网连接的不同计算机上的两个程序之间进行。还可以离线介质如导出到介质然后导入到其他计算机的其他软件…

2024年最新护眼台灯攻略:孩视宝、飞利浦和书客护眼台灯哪个好

在当今数字时代&#xff0c;无论是工作还是学习&#xff0c;长时间面对电子屏幕已成为日常。这对眼睛健康提出了挑战&#xff0c;尤其是对于成长中的孩子&#xff0c;正确的照明环境对保护视力至关重要。因此&#xff0c;选择一款高质量的护眼台灯成为了许多家庭的刚需。 如今…

OPenCV高级编程——OPenCV形态学之腐蚀、膨胀、开运算、闭运算、形态学梯度等详解

目录 引言 形态学基础 结构元素&#xff08;Structuring Element&#xff09; 基本形态学操作 腐蚀&#xff08;Erosion&#xff09; 膨胀&#xff08;Dilation&#xff09; 开运算&#xff08;Opening&#xff09; 闭运算&#xff08;Closing&#xff09; 高级形态学…