目标检测:IOU

news2024/11/23 22:00:34

IOU(Intersection over Union)交并比:

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

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

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

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

常规重叠框

代码示例

import cv2
import numpy as np

img = 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,280

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()

当前 一个框 由 左上角 + 右下角 共 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 np

img = np.zeros((300,300,3),dtype=np.uint8)
img[:,:,:] = 255

def 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_y2

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

up_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 np

img = np.zeros((300,300,3),dtype=np.uint8)
img[:,:,:] = 255

def 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_y2

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

up_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 np

img = np.zeros((300,300,3),dtype=np.uint8)
img[:,:,:] = 255

def 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_y2

x1,y1,x2,y2 = 20,20,120,120
x3,y3,x4,y4 = 140,150,260,240

up_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 np

img = np.zeros((300,300,3),dtype=np.uint8)
img[:,:,:] = 255

def 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_y2

x1,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,150

up_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 = 0

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)

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.coloradmin.cn/o/1832021.html

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

相关文章

【总线】AXI总线:FPGA设计中的通信骨干

目录 AXI4:高性能地址映射通信的基石 AXI4-Lite:轻量级但功能强大的通信接口 AXI4-Stream:高速流数据传输的利器 结语:AXI总线在FPGA设计中的重要性 大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计…

在线装X平台源码

在线装X平台源码 效果图部分源码领取源码下期更新预报 效果图 部分源码 (function() {var host window.location.hostname;var element document.createElement(script);var firstScript document.getElementsByTagName(script)[0];var url https://quantcast.mgr.consens…

解密:不用import,Python编程将遭遇什么?

在Python中,import 语句用于导入其他模块或库,如果不使用 import,会导致以下问题: 无法使用外部库或模块: Python标准库以及第三方库提供了丰富的功能和工具,如果不导入这些库,就无法使用它们提供的功能。 代码可读性降低: import 语句可…

周跳的探测及修复

前言: 本章节代码均在Gitee中开源: 导航工程: 导航工程及其有关的所有项目 - Gitee.comhttps://gitee.com/Ehundred/navigation-engineering/tree/master/%E5%8D%AB%E6%98%9F%E5%AF%BC%E8%88%AA%E5%8E%9F%E7%90%86/%E5%91%A8%E8%B7%B3%E6%8E%A2%E6%B5%…

2024/6/16周报

文章目录 摘要Abstract文献阅读题目问题本文贡献方法aGNN输入和输出模块嵌入模块编码器和解码器模块:支持多头注意的GCN多头自注意力机制GCN模型解释:SHAP 案例研究地下水流动与污染物运移模型研究场景设计 数据集实验结果 代码复现结论 摘要 本周阅读了…

BatchNormalization和Layer Normalization解析

Batch Normalization 是google团队2015年提出的,能够加速网络的收敛并提升准确率 1.Batch Normalization原理 图像预处理过程中通常会对图像进行标准化处理,能够加速网络的收敛,如下图所示,对于Conv1来说输入的就是满足某一分布…

Python 数据持久化:使用 SQLite3 进行简单而强大的数据存储

🍀 前言 博客地址: CSDN:https://blog.csdn.net/powerbiubiu 👋 简介 SQLite3是一种轻量级嵌入式数据库引擎,它在Python中被广泛使用。SQLite3通常已经包含在Python标准库中,无需额外安装。你只需导入 s…

antd的表格组件错乱问题

环境 react:17.0.2 antd:3.26.20 问题 表格头列宽度和表格体列宽度不一致,表格错乱 解决 针对这个问题官方github仓库里面有专门的issues https://github.com/ant-design/ant-design/issues/13825 里面给出了几种解决方案&#xff1a…

31、matlab卷积运算:卷积运算、二维卷积、N维卷积

1、conv 卷积和多项式乘法 语法 语法1:w conv(u,v) 返回向量 u 和 v 的卷积。 语法2:w conv(u,v,shape) 返回如 shape 指定的卷积的分段。 参数 u,v — 输入向量 shape — 卷积的分段 full (默认) | same | valid full:全卷积 ‘same…

Compose 可组合项 - DatePicker、DatePickerDialog

一、概念 一般是以对话框的形式呼出,DatePickerDialog 就是对 DatePicker 的一个简单对话框封装。 Composable fun DatePicker( state: DatePickerState, modifier: Modifier Modifier, dateFormatter: DatePickerFormatter remember { DatePickerFor…

15.编写自动化测试(下)

标题 三、控制测试流程3.1 添加测试参数3.2 并行或连续运行测试3.3 显示函数输出3.4 指定/过滤测试用例名称3.5 忽略某些测试用例3.6 只运行被忽略的测试 四、测试的组织结构4.1 概念引入4.2 测试私有函数4.2 单元测试4.3 集成测试4.4 集成测试中的子模块4.5 二进制crate的集成…

【漏洞复现】畅捷通T+ keyEdit SQL注入漏洞

免责声明: 本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测…

Confluence安装

Confluence安装 1.安装 #下载confluence版本(8.5.11) https://www.atlassian.com/software/confluence/download-archives #修改权限 chmod x atlassian-confluence-8.5.11-x64.bin #执行安装 ./atlassian-confluence-8.5.11-x64.bin按照以下提示输入&…

SD-WAN在教育行业的应用及优势解析

随着教育领域的数字化转型,网络技术的需求变得愈发迫切。作为一种前沿的网络解决方案,SD-WAN正在为教育行业提供强有力的支持。本文将详细探讨SD-WAN在教育行业的应用,并分析其为教育行业带来的众多优势。 实现多校区高效互联 教育机构通常拥…

稳了?L3规模化落地在即,激光雷达公司成首批赢家

作者 | 芦苇 编辑 | 德新 在中国,距L3级自动驾驶的规模化落地,又近了一步。 随着国内试点政策刷新,越来越多的车企在部分市域获得了自动驾驶测试牌照,能上路测试的L3级自动驾驶车辆正在快速增加。 其中一个重要节点是&#xf…

Python基础用法 之 转义字符

将两个字符进⾏转义 表示⼀个特殊的字符 \n ---> 换⾏,回⻋ \t ---> 制表符, tab键 注意: print( end\n): print() 函数中默认有⼀个 end\n, 所以,每个 print 结束之后, 都会输出⼀ 个换行。 未完待续。

Java数据类型及运算符及数组(与C语言对比)

Java和C语言在数据类型大部分相同,但是也有不同 1.新增了byte类型(相当于C语言中把char用作整数一样) 2.然后就是char类型的大小改为了2字节。 3.布尔型改名为boolean而不是bool,且大小没有明确规定,方便进行不同平台之间的移…

使用dev_dbg调试

首先内核要使能两个配置才可以使用。一般内核都是打开的。 CONFIG_DEBUG_FSy CONFIG_DYNAMIC_DEBUGy 当编译选项CONFIG_DYNAMIC_DEBUG打开的时候,在编译阶段,kernel会把所有使用dev_dbg()的信息记录在一个table中,这些信息我们可以从/sys/k…

在线预览多类型文件_全栈

目录 一、下载运行项目 二、项目功能 三、前端项目引用 四、文件预览样式更改 在做项目时经常用到在线预览文件,给大家介绍一个好用的在线预览文件项目。使用技术是后端Java,前端Freemarker模板。 FreeMarker 特别适应与 MVC 模式的 Web 应用&#x…

从“产品的RFM分析”看如何探索“职业方向”

我们在做产品分析时,经常会用到一种方法“产品的RFM分析”,它是一种客户细分和价值评估的常用方法,广泛应用于电子商务、零售和其他众多行业,它可以帮助企业和产品团队更好地理解用户行为,优化营销策略,提升…