旋转框(obb)目标检测计算iou的方法
首先先定义一组多边形,这里的数据来自前后帧的检测结果
pre = [[[860.0, 374.0], [823.38, 435.23], [716.38, 371.23], [753.0, 310.0]],[[829.0, 465.0], [826.22, 544.01], [684.0, 539.0], [686.78, 459.99]],[[885.72, 574.95], [891.0, 648.0], [725.0, 660.0], [719.72, 586.95]],[[1164.0, 406.0], [1101.05, 410.72], [1095.0, 330.0], [1157.95, 325.28]],[[953.04, 102.78], [955.04, 138.78], [915.0, 141.0], [913.0, 105.0]],[[1173.0, 524.0], [1104.0, 524.0], [1104.0, 437.0], [1173.0, 437.0]],[[879.0, 297.0], [831.45, 340.49], [756.0, 258.0], [803.55, 214.51]],[[1136.79, 226.81], [1176.33, 263.31], [1111.54, 333.5], [1072.0, 297.0]],[[835.42, 225.76], [790.0, 251.0], [750.66, 180.19], [796.08, 154.95]],[[887.0, 196.0], [839.04, 208.16], [821.0, 137.0], [868.96, 124.84]],[[1033.0, 109.0], [1027.07, 142.01], [988.0, 135.0], [993.93, 101.99]],[[1056.0, 83.0], [1093.09, 90.53], [1080.0, 155.0], [1042.91, 147.47]],[[1064.01, 155.84], [1104.0, 158.0], [1099.99, 232.16], [1060.0, 230.0]],[[1087.06, 118.88], [1124.0, 137.0], [1097.94, 190.12], [1061.0, 172.0]]]post = [[[860.44, 373.25], [825.0, 434.0], [716.56, 370.75], [752.0, 310.0]],[[829.0, 466.0], [825.64, 545.03], [684.64, 539.03], [688.0, 460.0]],[[884.04, 575.0], [889.0, 649.0], [724.96, 660.0], [720.0, 586.0]],[[1163.0, 406.0], [1100.0, 410.0], [1094.92, 329.94], [1157.92, 325.94]],[[953.0, 103.0], [955.56, 137.96], [914.56, 140.96], [912.0, 106.0]],[[1173.0, 524.0], [1104.0, 524.0], [1104.0, 438.0], [1173.0, 438.0]],[[880.0, 297.0], [831.0, 342.0], [755.34, 259.61], [804.34, 214.61]],[[1137.31, 226.66], [1177.0, 263.0], [1112.0, 334.0], [1072.31, 297.66]],[[887.06, 194.23], [840.0, 207.0], [820.94, 136.77], [868.0, 124.0]],[[836.69, 224.57], [792.69, 251.57], [750.0, 182.0], [794.0, 155.0]],[[1033.0, 106.0], [1030.0, 143.0], [987.95, 139.59], [990.95, 102.59]],[[1055.95, 83.27], [1094.0, 91.0], [1081.0, 155.0], [1042.95, 147.27]],[[1064.0, 155.0], [1105.02, 156.05], [1103.02, 234.05], [1062.0, 233.0]],[[1081.72, 120.74], [1120.0, 135.0], [1101.0, 186.0], [1062.72, 171.74]]]
其中的每个列表元素代表一个多边形,列表中包含四个元素,分别代表多边形的顶点坐标
import numpy as npimport cv2# 创建一个全白图像image = np.ones((1080, 1920, 3), dtype=np.uint8) * 255for i, poly in enumerate(pre):polygon_list = np.array(poly, np.int32)cv2.drawContours(image, contours=[polygon_list], contourIdx=-1, color=(0, 0, 255), thickness=2)for i, poly in enumerate(post):polygon_list = np.array(poly, np.int32)cv2.drawContours(image, contours=[polygon_list], contourIdx=-1, color=(255, 0, 0), thickness=2)cv2.imshow("Image", image)cv2.waitKey(0)cv2.destroyAllWindows()
用opencv将这些坐标画出来:

方法一
使用opencv内置函数计算iou
def bbox_overlaps(boxes, query_boxes):""" Calculate IoU(intersection-over-union) and angle difference for each input boxes and query_boxes. """if isinstance(boxes, list):boxes = np.array(boxes)if isinstance(query_boxes, list):query_boxes = np.array(query_boxes)N = boxes.shape[0]K = query_boxes.shape[0]boxes = np.round(boxes, decimals=2)query_boxes = np.round(query_boxes, decimals=2)overlaps = np.reshape(np.zeros((N, K)), (N, K))delta_theta = np.reshape(np.zeros((N, K)), (N, K))for k in range(K):rect1 = ((query_boxes[k][0], query_boxes[k][1]),(query_boxes[k][2], query_boxes[k][3]),query_boxes[k][4])for n in range(N):rect2 = ((boxes[n][0], boxes[n][1]),(boxes[n][2], boxes[n][3]),boxes[n][4])# can check official document of opencv for detailsnum_int, points = cv2.rotatedRectangleIntersection(rect1, rect2)S1 = query_boxes[k][2] * query_boxes[k][3]S2 = boxes[n][2] * boxes[n][3]if num_int == 1 and len(points) > 2:s = cv2.contourArea(cv2.convexHull(points, returnPoints=True))overlaps[n][k] = s / (S1 + S2 - s)elif num_int == 2:overlaps[n][k] = min(S1, S2) / max(S1, S2)delta_theta[n][k] = np.abs(query_boxes[k][4] - boxes[n][4])return overlaps, delta_thetaoverlaps = bbox_overlaps(np.array(pre).reshape(-1,8),np.array(post).reshape(-1,8))[0]print(overlaps)
运行结果如下:

可以看到其中存在一些异常值,就是有些明明没有交集的部分也会产生比较高的iou值
方法二
使用shapely
from shapely.geometry import Polygondef calculate_iou(poly1, poly2):# 计算两个多边形的交集面积intersection_area = calculate_intersection(poly1, poly2)# 计算两个多边形的并集面积union_area = calculate_union(poly1, poly2)# 计算IoU值iou = intersection_area / union_areareturn ioudef calculate_intersection(poly1, poly2):# 计算多边形的交集面积# 这里使用你选择的多边形交集计算方法,例如使用Shapely库的intersection()函数intersection = poly1.intersection(poly2)intersection_area = intersection.areareturn intersection_areadef calculate_union(poly1, poly2):# 计算多边形的并集面积# 这里使用你选择的多边形并集计算方法,例如使用Shapely库的union()函数union = poly1.union(poly2)union_area = union.areareturn union_areadef bbox_overlaps_shapely(boxes, query_boxes):""" Calculate IoU(intersection-over-union) and angle difference for each input boxes and query_boxes. """if isinstance(boxes, list):boxes = np.array(boxes)if isinstance(query_boxes, list):query_boxes = np.array(query_boxes)N = boxes.shape[0]K = query_boxes.shape[0]boxes = np.round(boxes, decimals=2)query_boxes = np.round(query_boxes, decimals=2)overlaps = np.reshape(np.zeros((N, K)), (N, K))delta_theta = np.reshape(np.zeros((N, K)), (N, K))for k in range(K):q_box = Polygon(query_boxes[k].reshape(-1, 2).tolist())for n in range(N):d_box = Polygon(boxes[n].reshape(-1, 2).tolist())overlaps[n][k] = calculate_iou(q_box, d_box)return overlaps, delta_thetaoverlaps = bbox_overlaps_shapely(np.array(pre).reshape(-1,8),np.array(post).reshape(-1,8))[0]print(overlaps)
运行结果如下:

可以看到这个结果相比方法一中的结果要更加准确一些
方法三
cuda内置的函数,需要编译环境,就不展开了
相关文章:
旋转框(obb)目标检测计算iou的方法
首先先定义一组多边形,这里的数据来自前后帧的检测结果 pre [[[860.0, 374.0], [823.38, 435.23], [716.38, 371.23], [753.0, 310.0]],[[829.0, 465.0], [826.22, 544.01], [684.0, 539.0], [686.78, 459.99]],[[885.72, 574.95], [891.0, 648.0], [725.0, 660.0]…...
render函数举例
在这段代码中,renderButton是一个对象吗 还有render为什么不能写成render() {} 代码原文链接 <template><div><renderButton /></div> </template><script setup> import { h, ref } from "vue"; const renderButt…...
微信小程序文件预览和下载-文件系统
文件预览和下载 在下载之前,我们得先调用接口获取文件下载的url 然后通过wx.downloadFile将下载文件资源到本地 wx.downloadFile({url: res.data.url,success: function (res) {console.log(数据,res);} })tempFilePath就是临时临时文件路径。 通过wx.openDocume…...
图解Redis适用场景
Redis以其速度而闻名。 1 业务数据缓存 1.1 通用数据缓存 string,int,list,map。Redis 最常见的用例是缓存对象以加速 Web 应用程序。 此用例中,Redis 将频繁请求的数据存储在内存。允许 Web 服务器快速返回频繁访问的数据。这…...
掌握Python BentoML:构建、部署和管理机器学习模型
更多资料获取 📚 个人网站:ipengtao.com BentoML是一个开源的Python框架,旨在简化机器学习模型的打包、部署和管理。本文将深入介绍BentoML的功能和用法,提供详细的示例代码和解释,帮助你更好地理解和应用这个强大的工…...
西南科技大学模拟电子技术实验二(二极管特性测试及其应用电路)预习报告
目录 一、计算/设计过程 二、画出并填写实验指导书上的预表 三、画出并填写实验指导书上的虚表 四、粘贴原理仿真、工程仿真截图 一、计算/设计过程 说明:本实验是验证性实验,计算预测验证结果。是设计性实验一定要从系统指标计算出元件参数过程,越详细越好。用公式输入…...
熟悉SVN基本操作-(SVN相关介绍使用以及冲突解决)
一、SVN相关介绍 1、SVN是什么? 代码版本管理工具它能记住你每次的修改查看所有的修改记录恢复到任何历史版本恢复已经删除的文件 2、SVN跟Git比,有什么优势 使用简单,上手快目录级权限控制,企业安全必备子目录checkout,减少…...
代码随想录二刷 |字符串 |反转字符串II
代码随想录二刷 |字符串 |反转字符串II 题目描述解题思路 & 代码实现 题目描述 541.反转字符串II 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。 如果…...
哪吒汽车拔头筹,造车新势力首家泰国工厂投产
中国造车新势力首家泰国工厂投产!11月30日,哪吒汽车位于泰国的首家海外工厂——泰国生态智慧工厂正式投产下线新车,哪吒汽车联合创始人兼CEO张勇、哪吒汽车泰国合作伙伴BGAC公司首席执行官万查曾颂翁蓬素等出席仪式。首辆“泰国制造”的哪吒汽…...
Redis String类型
String 类型是 Redis 最基本的数据类型,String 类型在 Redis 内部使用动态长度数组实现,Redis 在存储数据时会根据数据的大小动态地调整数组的长度。Redis 中字符串类型的值最大可以达到 512 MB。 关于字符串需要特别注意∶ 首先,Redis 中所…...
lxd提权
lxd/lxc提权 漏洞介绍 lxd是一个root进程,它可以负责执行任意用户的lxd,unix套接字写入访问操作。而且在一些情况下,lxd不会调用它的用户权限进行检查和匹配 原理可以理解为用用户创建一个容器,再用容器挂载宿主机磁盘…...
Ubuntu+Tesla V100环境配置
系统基本信息 nvidia-smi’ nvidia-smi 470.182.03 driver version:470.182.03 cuda version: 11.4 查看系统体系结构 uname -aUTC 2023 x86_64 x86_64 x86_64 GNU/Linux 下载miniconda https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/?CM&OA https://mi…...
leetcode:用栈实现队列(先进先出)
题目描述 题目链接:232. 用栈实现队列 - 力扣(LeetCode) 题目分析 我们先把之前写的数组栈的实现代码搬过来 用栈实现队列最主要的是实现队列先进先出的特点,而栈的特点是后进先出,那么我们可以用两个栈来实现&…...
<JavaEE> 什么是进程控制块(PCB Process Control Block)?
目录 一、进程控制块的概念 二、进程控制块的重要属性 2.1 唯一身份标识(PID) 2.2 内存指针 2.3 文件描述符表 2.4 状态 2.5 优先级 2.6 记账信息 2.7 上下文 一、进程控制块的概念 进程控制块(Process Control Block, PCBÿ…...
简历上的工作经历怎么写
通过了简历筛选,后续的面试官会仔细阅读你的简历内容。他们在找什么呢?他们希望搞清楚你在某一段经历中具体干了什么,并且判断你的能力具体达到了什么水平。 简历在线制作下载:百度幻主简历 面试官喜欢具体的经历 越具体&#x…...
数值分析总结
数值分析总结思维导图 Docs 相关代码的使用和注释 列主元Gauss消元法 %%列主元高斯消元法 function xGauss_lzy(A,b)%A为方程组系数矩阵,b为方程组的右侧向量,x为方程组的解 [n,m]size(A);%%得到矩阵A的行和列的宽度 nblength(b);%%方程组右侧向量的长…...
osg demo汇总
1.example_osganimate 演示了路径动画的使用(AnimationPath、AnimationPathCallback),路径动画回调能够做用在Camera、CameraView、MatrixTransform、PositionAttitudeTransform等四种类型的节点上。 演示了osgSim::OverlayNode的使用node 2…...
Leetcode.1590 使数组和能被 P 整除
题目链接 Leetcode.1590 使数组和能被 P 整除 rating : 2039 题目描述 给你一个正整数数组 n u m s nums nums,请你移除 最短 子数组(可以为 空),使得剩余元素的 和 能被 p p p 整除。 不允许 将整个数组都移除。 请你返回你需…...
uniappios请求打开麦克风 uniapp发起请求
第一种 ajax请求方式 uni.request(OBJECT) 参数名类型必填默认值说明平台差异说明urlString是开发者服务器接口地址dataObject/String/ArrayBuffer否请求的参数App(自定义组件编译模式)不支持ArrayBuffer类型headerObject否设置请求的 header,header 中不能设置 Referer。…...
Java 注解在 Android 中的使用场景
Java 元注解有 5 种,常用的是 Target 和 Retention 两个。 其中 Retention 表示保留级别,有三种: RetentionPolicy.SOURCE - 标记的注解仅保留在源码级别中,并被编译器忽略RetentionPolicy.CLASS - 标记的注解在编译时由编译器保…...
从零到一:基于51单片机与DS1302的智能万年历系统设计与实现
1. 项目背景与核心功能 每次看到桌面上那些动辄几百块的智能时钟,我都会想:这东西真的需要这么贵吗?作为一个玩了多年51单片机的老鸟,我决定用最基础的STC89C52芯片搭配DS1302时钟模块,打造一个功能不输商业产品的智能…...
OpenClaw技能市场巡礼:Top5适合Phi-3-vision-128k-instruct的图文处理插件
OpenClaw技能市场巡礼:Top5适合Phi-3-vision-128k-instruct的图文处理插件 1. 为什么需要为多模态模型搭配专用技能? 去年我在尝试用OpenClaw处理一批产品截图时,发现一个有趣现象:当我把图片直接丢给普通文本模型时,…...
[RAG在LangChain中的实现-07]利用重排序选择相关性最高的检索内容构建上下文
重排序(Re-ranking)是一种关键的RAG优化技术。它通过在“初始检索”与“最终生成”之间,通过对初步检索出的文档进行二次评估,筛选出与用户查询语义最相关的结果,从而提高生成内容的准确性。在典型的检索流程中&#x…...
关闭蜂鸣器与外设的初始化代码
针对蓝桥杯单片机开发中关闭蜂鸣器与外设的初始化操作,以及创建标准.h头文件的必备代码,以下是详细的技术方案与实现代码。 1. 蓝桥杯单片机系统初始化与外设关闭 蓝桥杯官方使用的CT107D开发板(以IAP15F2K61S2单片机为核心)&am…...
Ostrakon-VL处理网络协议:从数据包捕获文件可视化网络流量
Ostrakon-VL处理网络协议:从数据包捕获文件可视化网络流量 1. 网络流量分析的痛点与机遇 网络工程师每天都要面对海量的网络数据包,传统的分析工具虽然功能强大,但存在几个明显痛点: 数据量大:一个中等规模企业的日…...
Qwen2-VL-2B-Instruct实操手册:本地化安全机制与temp_images权限控制说明
Qwen2-VL-2B-Instruct实操手册:本地化安全机制与temp_images权限控制说明 1. 项目核心:理解GME-Qwen2-VL模型 你可能听说过很多能“看图说话”的AI模型,但今天要介绍的 GME-Qwen2-VL-2B-Instruct 有点不一样。它不是一个和你聊天的机器人&a…...
C/C++ 调用约定与 Windows GDI 位图操作实用解析
stdcall调用约定 stdcall很多时候被称为pascal调用约定,因为pascal是早期很常见的一种教学用计算机程序设计语言,其语法严谨,使用的函数调用约定就是stdcall。在Microsoft C系列的C/C编译器中,常常用PASCAL宏来声明这个调用约…...
STM32H743+CubeMX配置FDCAN实战:如何利用TxFIFO优化FreeRTOS下的CAN通信性能?
STM32H743CubeMX配置FDCAN实战:如何利用TxFIFO优化FreeRTOS下的CAN通信性能? 在嵌入式系统开发中,CAN总线因其高可靠性和实时性被广泛应用于工业控制、汽车电子等领域。当我们将目光投向STM32H743这类高性能微控制器时,其内置的FD…...
AudioSeal环境部署:Ubuntu+CUDA 12.x+PyTorch 2.3适配性配置指南
AudioSeal环境部署:UbuntuCUDA 12.xPyTorch 2.3适配性配置指南 1. 引言 如果你正在寻找一种可靠的方法来为AI生成的音频打上“数字指纹”,以便后续进行检测和溯源,那么Meta开源的AudioSeal项目绝对值得你花时间研究。简单来说,A…...
MySQL高频面试题(2026最新版):覆盖90%考点,小白也能直接背
很多开发者备考时,要么盲目刷题、记不住重点,要么只背答案、不懂原理,面试时被面试官追问一句就卡壳。其实MySQL面试没有那么复杂,核心考点就那么多,只要吃透高频题、理解底层逻辑,就能从容应对。本文整理了…...
