目标检测:IOU

IOU(Intersection over Union)交并比:

它计算的是“预测的边框”和“真实的边框”的交叠率,即它们的交集和并集的比值。这个比值用于衡量预测边框与真实边框的重叠程度,从而评估目标检测的准确性。

在目标检测任务中,通常使用bounding box与ground truth之间的IoU值大小来判断预测结果的好坏。一般情况下,认为IoU>0.5就是一个不错的预测结果。

两个box区域的交集除以并集

总的来说:IOU是一个在目标检测中非常重要的评估指标,用于量化预测边框与真实边框的匹配程度。

常规重叠框

代码示例

import cv2
import numpy as npimg = np.zeros((300,300,3),dtype=np.uint8)
img[:,:,:] = 255# 下方红色框
x1,y1,x2,y2 = 20,20,180,180
# 下方蓝色框
x3,y3,x4,y4 = 90,90,280,280cv2.rectangle(img, (x1, y1), (x2, y2), (0,0,255), 2)
cv2.rectangle(img, (x3, y3), (x4, y4), (255,0,0), 2)cv2.imshow('img',img)
cv2.waitKey(10000)
cv2.destroyAllWindows()

当前 一个框 由 左上角 + 右下角 共 2 个坐标点 组成

如果 2 个 框 有交集 ,如下

交集 也是一个 矩形框,由 左上角 + 右下角 2个 坐标点 组成

已知 红框 和 篮框 的 左上角 + 右下角 如何 计算 交集 绿色框 的 左上角 + 右下角 坐标

计算方法

绿色区域 (交集) 左上角 与 右下角

左上角:取 红框 和 篮框 左上角点的 横坐标 (x) 与 纵坐标 (y) 最大值

# 红框
a = [x1, y1, x2, y2]
# 蓝框
b = [x3, y3, x4, y4]c = np.array([a,b])
l_x1,l_y1 = np.max(c[:,0:2],axis=0)

右下角:取 红框 和 篮框 右下角点的 横坐标 (x) 与 纵坐标 (y) 最小值

# 红框
a = [x1, y1, x2, y2]
# 蓝框
b = [x3, y3, x4, y4]c = np.array([a,b])
r_x2,r_y2 = np.min(c[:,2:],axis=0)

 代码实现

import cv2
import numpy as npimg = np.zeros((300,300,3),dtype=np.uint8)
img[:,:,:] = 255def inter(a,b):c = np.array([a,b])l_x1,l_y1 = np.max(c[:,0:2],axis=0)r_x2,r_y2 = np.min(c[:,2:],axis=0)return l_x1,l_y1,r_x2,r_y2x1,y1,x2,y2 = 20,20,180,180
x3,y3,x4,y4 = 90,90,280,280up_x,up_y,bo_x,bo_y = inter([x1,y1,x2,y2],[x3,y3,x4,y4])
cv2.rectangle(img, (up_x, up_y), (bo_x, bo_y), (0,255,0), -1)
cv2.rectangle(img, (x1, y1), (x2, y2), (0,0,255), 2)
cv2.rectangle(img, (x3, y3), (x4, y4), (255,0,0), 2)cv2.imshow('img',img)
cv2.waitKey(10000)
cv2.destroyAllWindows()
cv2.imwrite('iou.jpg',img)

方法验证

实验不同的重叠形式

x1,y1,x2,y2 = 20,20,180,180
x3,y3,x4,y4 = 90,10,280,280

 

x1,y1,x2,y2 = 20,20,180,180
x3,y3,x4,y4 = 40,10,150,200

 

x1,y1,x2,y2 = 20,20,180,180
x3,y3,x4,y4 = 40,10,280,150

 

 

x1,y1,x2,y2 = 20,20,180,180
x3,y3,x4,y4 = 40,50,150,200

x1,y1,x2,y2 = 20,20,180,180
x3,y3,x4,y4 = 40,10,150,150

 

x1,y1,x2,y2 = 20,20,180,180
x3,y3,x4,y4 = 40,50,150,150

 

x1,y1,x2,y2 = 20,20,180,180
x3,y3,x4,y4 = 40,50,200,150

计算IoU

先计算 重叠 区域面积,再计算 红/蓝 框的 并集,最后 计算 占比

 

代码实现

import cv2
import numpy as npimg = np.zeros((300,300,3),dtype=np.uint8)
img[:,:,:] = 255def inter(a,b):c = np.array([a,b])l_x1,l_y1 = np.max(c[:,0:2],axis=0)r_x2,r_y2 = np.min(c[:,2:],axis=0)return l_x1,l_y1,r_x2,r_y2x1,y1,x2,y2 = 20,20,180,180
x3,y3,x4,y4 = 40,50,200,150up_x,up_y,bo_x,bo_y = inter([x1,y1,x2,y2],[x3,y3,x4,y4])# 红框 / 蓝框 / 重叠-绿色区域 面积
S_red = (x2-x1) * (y2-y1)
S_blue = (x4-x3) * (y4-y3)
S_green = (bo_x-up_x) * (bo_y-up_y)
print('面积-红框:',S_red,', 面积-蓝框:',S_blue,', 面积-绿色:',S_green)# 红框 与 蓝框 的 并集
S_union = S_red + S_blue - S_green
print('红框与蓝框的并集-面积:',S_union)iou = S_green / S_union
print('交集 / 并集: ',iou)cv2.rectangle(img, (up_x, up_y), (bo_x, bo_y), (0,255,0), -1)
cv2.rectangle(img, (x1, y1), (x2, y2), (0,0,255), 2)
cv2.rectangle(img, (x3, y3), (x4, y4), (255,0,0), 2)cv2.imshow('img',img)
cv2.waitKey(10000)
cv2.destroyAllWindows()
cv2.imwrite('iou.jpg',img)

 结果

面积-红框: 25600 , 面积-蓝框: 16000 , 面积-绿色: 14000
红框与蓝框的并集-面积: 27600
交集 / 并集:  0.5072463768115942
无重叠情况

 

import cv2
import numpy as npimg = np.zeros((300,300,3),dtype=np.uint8)
img[:,:,:] = 255def inter(a,b):c = np.array([a,b])l_x1,l_y1 = np.max(c[:,0:2],axis=0)r_x2,r_y2 = np.min(c[:,2:],axis=0)return l_x1,l_y1,r_x2,r_y2x1,y1,x2,y2 = 20,20,120,120
x3,y3,x4,y4 = 140,150,260,240up_x,up_y,bo_x,bo_y = inter([x1,y1,x2,y2],[x3,y3,x4,y4])print(up_x,up_y,bo_x,bo_y)cv2.rectangle(img, (x1, y1), (x2, y2), (0,0,255), 2)
cv2.rectangle(img, (x3, y3), (x4, y4), (255,0,0), 2)cv2.imshow('img',img)
cv2.waitKey(10000)
cv2.destroyAllWindows()

结果

140 150 120 120

左上角:(140, 150)

右下角:(120, 120)

按照上面计算方式,在 2框 无交集的情况的下,也能 算出 重叠区域的 坐标

无交集 计算的 坐标特点:左上角 > 右下角

代码实现

import cv2
import numpy as npimg = np.zeros((300,300,3),dtype=np.uint8)
img[:,:,:] = 255def inter(a,b):c = np.array([a,b])l_x1,l_y1 = np.max(c[:,0:2],axis=0)r_x2,r_y2 = np.min(c[:,2:],axis=0)return l_x1,l_y1,r_x2,r_y2x1,y1,x2,y2 = 20,20,120,120
x3,y3,x4,y4 = 140,150,260,240
# x1,y1,x2,y2 = 20,20,180,180
# x3,y3,x4,y4 = 40,50,200,150up_x,up_y,bo_x,bo_y = inter([x1,y1,x2,y2],[x3,y3,x4,y4])print(up_x,up_y,bo_x,bo_y)# 红框 / 蓝框 / 重叠-绿色区域 面积
S_red = (x2-x1) * (y2-y1)
S_blue = (x4-x3) * (y4-y3)if bo_x > up_x and bo_y > up_y: S_green = (bo_x-up_x) * (bo_y-up_y)
else: S_green = 0print('面积-红框:',S_red,', 面积-蓝框:',S_blue,', 面积-绿色:',S_green)# 红框 与 蓝框 的 并集
S_union = S_red + S_blue - S_green
print('红框与蓝框的并集-面积:',S_union)iou = S_green / S_union
print('交集 / 并集: ',iou)if bo_x > up_x and bo_y > up_y: cv2.rectangle(img, (up_x, up_y), (bo_x, bo_y), (0,255,0), -1)cv2.rectangle(img, (x1, y1), (x2, y2), (0,0,255), 2)
cv2.rectangle(img, (x3, y3), (x4, y4), (255,0,0), 2)cv2.imshow('img',img)
cv2.waitKey(10000)
cv2.destroyAllWindows()
cv2.imwrite('iou.jpg',img)

结果

140 150 120 120
面积-红框: 10000 , 面积-蓝框: 10800 , 面积-绿色: 0
红框与蓝框的并集-面积: 20800
交集 / 并集:  0.0

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

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

相关文章

嵌入式操作系统_2.嵌入式操作系统的一般架构

1.嵌入式操作系统的概念 嵌入式操作系统通常由硬件驱动程序、调式代理、操作系统内核、文件系统和可配置组件等功能组成,并为应用软件提供标准的API(Application Programming Interface)接口服务。 2.一般嵌入式操作系统的体系结构 从嵌入…

Mysql特殊用法分享

不存在则插入,存在则更新的2种写法 前置使用条件,必须有唯一索引 -- 1 REPLACE INTO REPLACE INTO typora.ip_view_times_record (ip, view_times, url) VALUES(10.25.130.64, 1, https://10.25.168.80/fhh/index.html?urlindex.md543);-- 2 ON DUPLI…

HTTP服务器实现长连接的思路(Java语言)

一、背景 目前的HTTP服务器很多,只要是编程语言支持线程和网络通信,就能开发一个HTTP协议服务器。 市场上常用的是Tomcat、Ngnix、Httpd等技术。 二、本文目的 介绍使用Java语言来开发HTTP服务器的处理逻辑。 这是个人可以参考的HTTP服务器通用逻辑。…

使用Selenium进行元素定位的全面指南

使用Selenium进行元素定位的全面指南 引言 Selenium 是一个广泛使用的开源工具,用于自动化Web浏览器的操作。无论你是进行自动化测试,还是需要抓取网页数据,Selenium 都是一个非常有用的工具。而在Selenium中,定位网页元素是自动…

LabVIEW机械设备故障诊断中,振动分析的有效性与局限性如何

LabVIEW作为一种强大的图形化编程工具,在机械设备故障诊断中的振动分析中发挥了重要作用。振动分析通过监测机械设备的振动信号,能够有效地诊断设备故障。然而,尽管其有效性显著,但也存在一些局限性。本文将探讨LabVIEW在振动分析…

C# —— for循环语句

基本语法 for (初始表达式; 条件表达式; 增量表达式) { // 循环体 } for循环中 有三个空 第一个空(初始表达式): 一般用来声明一个临时的局部变量 用来计数 第二个空(条件表达式): 表明进入循环的条件 一个bool类型的值(bool类型 条…

深度神经网络——什么是NLP(自然语言处理)?

自然语言处理(NLP) 是对使计算机能够处理、分析、解释和推理人类语言的技术和工具的研究和应用。 NLP 是一个跨学科领域,它结合了语言学和计算机科学等领域已建立的技术。 这些技术与人工智能结合使用来创建聊天机器人和数字助理,…

海成蜘蛛池广州官网下载

baidu搜索:如何联系八爪鱼SEO? baidu搜索:如何联系八爪鱼SEO? baidu搜索:如何联系八爪鱼SEO? 当我们给自己的泛目录设置仅蜘蛛抓取生成缓存的时候,我们需要模拟蜘蛛抓取测试我们的设置是否成功。绝大部分时候我们都使用网页蜘蛛模拟抓取测…

Comparable和Comparator区别

相同点:都是用于比较排序。 不同点: 1、接口所在的包不同:comparable:java.lang.Comparable;Comparator:java.util.Comparator 2、比较逻辑不同:Comparable:内部比较器&#xff1…

2024.618到底买什么数码值得?带你一起来看看!

在618期间,这些新品可能会有特别的优惠活动,包括但不限于折扣、满减、赠品等。因此,如果你正在寻找一款适合自己的数码产品,不妨关注各大电商平台的618促销活动,把握机会,以优惠的价格购买到心仪的产品。 …

文件操作(1)(C语言版)

前言: 为什么要学习文件操作: 1、如果大家写过一些代码,当运行结束的时候,这些运行结果将不复存在,除非,再次运行时这些结果才能展现在屏幕上面,就比如之前写过的通讯录。 现实中的通讯录可以保…

【数据结构初阶】--- 堆

文章目录 一、什么是堆?树二叉树完全二叉树堆的分类堆的实现方法 二、堆的操作堆的定义初始化插入数据(包含向上调整详细讲解)向上调整删除堆顶元素(包含向下调整详细讲解)向下调整返回堆顶元素判断堆是否为空销毁 三、…

一个开源的快速准确地将 PDF 转换为 markdown工具

大家好,今天给大家分享的是一个开源的快速准确地将 PDF 转换为 markdown工具。 Marker是一款功能强大的PDF转换工具,它能够将PDF文件快速、准确地转换为Markdown格式。这款工具特别适合处理书籍和科学论文,支持所有语言的转换,并…

2024年最佳插电式混合动力电动汽车

对电动汽车充满好奇和环保意识的司机们还没有准备好跨入纯电动汽车,他们可以找到一个折衷方案,即插电式混合动力车。 在过去的16年里,我一直在把握汽车行业的脉搏。试驾数百辆汽车、电动汽车、插电式混合动力车,跟踪汽车行业的新闻…

python2.7pip报错:UnicodeDecodeError: ‘ascii‘ codec can‘t decode

找到文件&#xff1a;<yourpath>\Python27\Lib\ntpath.py&#xff0c;修改join函数&#xff1a; # Join two (or more) paths. def join(path, *paths):"""Join two or more pathname components, inserting "\\" as needed."""…

DAY04 HTMLCSS

文章目录 一 表单(1) 数字控件(2) 颜色控件(3) 日期控件(4) 月份控件(5) 星期控件(6) 搜索控件(7) 范围控件 二 浮动框架三 结构化标签四 CSS1 CSS概述2 CSS的编写位置1. inline style 行内样式2. inner style 内部样式3. outer style 外部样式4. 小结 3 CSS选择器1. 通用选择器…

NumPy 差分、最小公倍数、最大公约数、三角函数详解

NumPy 差分 离散差分意味着相邻元素之间的减法。 例如&#xff0c;对于 [1, 2, 3, 4]&#xff0c;离散差分将是 [2-1, 3-2, 4-3] [1, 1, 1] 要找到离散差分&#xff0c;使用 diff() 函数。 示例&#xff1a; import numpy as nparr np.array([10, 15, 25, 5])newarr np…

一个示例学习C语言到汇编层面

给出以下代码 #include<stdio.h> int main() {int x 0, y 0, z 0;while (1) {x 0;y 1;do {printf("%d\n", x);z x y;x y;y z;} while (x < 255);}return 0; }我们把这个程序编写成32位程序&#xff0c;然后我们放入IDA中进行分析 .text:0080187…

Mysql开启查询日志(General Log)

1、增加配置&#xff1a; /etc/my.cnf [mysqld] general_log1 general_log_file/var/log/mysql/query.log 2、增加目录和文件&#xff0c;并且授权 可以使用以下命令修改权限&#xff1a; 创建目录&#xff1a;sudo mkdir -p /var/log/mysql 更改目录所有者&#xff1a;sudo…

okcc呼叫中心系统如何对客户进行按键标记?呼叫系统搭建

要在OKCC呼叫中心系统中对客户进行按键标记&#xff0c;可以按照以下步骤操作&#xff1a; 登录系统&#xff1a;首先&#xff0c;使用管理员或具有相应权限的账户登录OKCC呼叫中心系统。 搜索客户&#xff1a;在系统的主界面或客户管理界面&#xff0c;通过搜索功能找到需要标…