3D目标检测实战 | 详解2D/3D检测框交并比IoU计算(附Python实现)

news2024/9/24 15:22:46

目录

  • 1 交并比基本概念
  • 2 2D检测框IoU计算
  • 3 旋转2D检测框IoU计算
  • 4 3D检测框IoU计算

1 交并比基本概念

交并比(Intersection Over Union, IoU)是度量两个目标检测框交叠程度的方式,公式如下

I o U = a r e a ( B p ∩ B g t ) a r e a ( B p ∪ B g t ) \mathrm{IoU}=\frac{\mathrm{area(B_p \cap B_{gt})}}{\mathrm{area(B_p \cup B_{gt})}} IoU=area(BpBgt)area(BpBgt)

其中 B g t \mathrm{B_{gt}} Bgt代表真值(Ground Truth) B p \mathrm{B_{p}} Bp代表预测值

在这里插入图片描述

I o U \mathrm{IoU} IoU是一种常用的评估目标检测算法性能的指标,其计算的意义如下:

  • 确定目标的匹配程度:通过比较检测框和真实标注框的重叠部分与总体部分的比例,可以确定目标检测算法对于不同尺寸、形状和姿态的目标的匹配程度。较高的 I o U \mathrm{IoU} IoU值表示检测框与真实标注框更好地匹配
  • 设定阈值进行筛选 I o U \mathrm{IoU} IoU可以用于设定阈值来筛选检测结果。设定一个特定的 I o U \mathrm{IoU} IoU阈值,只有当目标检测框与真实标注框的 I o U \mathrm{IoU} IoU超过该阈值时,才认为检测结果是有效的。这有助于控制误检率和漏检率,提高目标检测的精确性和稳定性
  • 评估算法性能:通过统计一系列目标检测结果的 I o U \mathrm{IoU} IoU值,可以计算出平均 I o U \mathrm{IoU} IoU或者其他评估指标,用于评估目标检测算法的整体性能。这有助于比较不同算法的准确性、鲁棒性和适应性

综上所述, I o U \mathrm{IoU} IoU是评估和改进目标检测算法的关键工具之一,下面介绍具体如何计算

2 2D检测框IoU计算

2D检测框的 I o U \mathrm{IoU} IoU计算比较直接,就是按照公式

I o U = a r e a ( B p ∩ B g t ) a r e a ( B p ∪ B g t ) \mathrm{IoU}=\frac{\mathrm{area(B_p \cap B_{gt})}}{\mathrm{area(B_p \cup B_{gt})}} IoU=area(BpBgt)area(BpBgt)

计算面积,具体如下所示

def cal2dBoxOverlap(g_boxes, q_boxes, criterion=-1):
    N, K = g_boxes.shape[0], q_boxes.shape[0]
    overlaps = np.zeros((N, K), dtype=g_boxes.dtype)
    for k in range(K):
        qbox_area = ((q_boxes[k, 2] - q_boxes[k, 0]) * (q_boxes[k, 3] - q_boxes[k, 1]))
        for n in range(N):
            gbox_area = (g_boxes[n, 2] - g_boxes[n, 0]) * (g_boxes[n, 3] - g_boxes[n, 1])
            iw = (min(g_boxes[n, 2], q_boxes[k, 2]) - max(g_boxes[n, 0], q_boxes[k, 0]))
            if iw > 0:
                ih = (min(g_boxes[n, 3], q_boxes[k, 3]) - max(g_boxes[n, 1], q_boxes[k, 1]))
                if ih > 0:
                    ua = (gbox_area + qbox_area - iw * ih)      
                    overlaps[n, k] = iw * ih / ua
    return overlaps

3 旋转2D检测框IoU计算

与2D目标检测不同,3D目标检测需要使用3D立方体来表示目标物体的位置和姿态。计算IoU时,需要考虑立方体的3D空间位置、大小和朝向的匹配程度

在这里插入图片描述

通常的算法步骤是:

  • 压缩高度信息,计算平面内两个旋转2D检测框的重叠面积

在这里插入图片描述

  • 在高度维度计算重叠高度
  • 重叠面积乘以重叠高度计算重叠体积,从而计算IoU

本节介绍旋转2D检测框重叠面积的计算

def inter(rbbox1, rbbox2):
    corners1 = cuda.local.array((8, ), dtype=numba.float32)
    corners2 = cuda.local.array((8, ), dtype=numba.float32)
    intersection_corners = cuda.local.array((16, ), dtype=numba.float32)

    rbbox2corners(corners1, rbbox1)
    rbbox2corners(corners2, rbbox2)

    num_intersection = quadrilateralIntersection(corners1, corners2, intersection_corners)

    sortVertexInConvex(intersection_corners, num_intersection)

    return area(intersection_corners, num_intersection)

其中quadrilateralIntersection()函数计算了重叠部分的顶点信息,具体而言,通过求直线的交点和判断顶点是否在四边形内部来确定

def quadrilateralIntersection(pts1, pts2, int_pts):
    num_of_inter = 0
    for i in range(4):
        if pointInQuadrilateral(pts1[2 * i], pts1[2 * i + 1], pts2):
            int_pts[num_of_inter * 2] = pts1[2 * i]
            int_pts[num_of_inter * 2 + 1] = pts1[2 * i + 1]
            num_of_inter += 1
        if pointInQuadrilateral(pts2[2 * i], pts2[2 * i + 1], pts1):
            int_pts[num_of_inter * 2] = pts2[2 * i]
            int_pts[num_of_inter * 2 + 1] = pts2[2 * i + 1]
            num_of_inter += 1
    temp_pts = cuda.local.array((2, ), dtype=numba.float32)
    for i in range(4):
        for j in range(4):
            has_pts = lineSegmentIntersection(pts1, pts2, i, j, temp_pts)
            if has_pts:
                int_pts[num_of_inter * 2] = temp_pts[0]
                int_pts[num_of_inter * 2 + 1] = temp_pts[1]
                num_of_inter += 1

    return num_of_inter

得到重叠多边形后,通过切割三角形来计算面积

def area(int_pts, num_of_inter):
    area_val = 0.0
    for i in range(num_of_inter - 2):
        area_val += abs(trangleArea(int_pts[:2], int_pts[2 * i + 2:2 * i + 4],
                        int_pts[2 * i + 4:2 * i + 6]))
    return area_val

4 3D检测框IoU计算

加上高度维度的重叠信息即可计算3D检测框IoU,这部分与2D检测框IoU计算类似,不再赘述

def cal3dBoxOverlap(g_boxes, q_boxes, r_inc, criterion=-1):
    N, K = g_boxes.shape[0], q_boxes.shape[0]
    overlaps = np.zeros((N, K), dtype=g_boxes.dtype)
    for n in range(N):
        for k in range(K):
            if r_inc[n, k] > 0:
                iw = (min(g_boxes[n, 1], q_boxes[k, 1]) - max(
                    g_boxes[n, 1] - g_boxes[n, 4], q_boxes[k, 1] - q_boxes[k, 4]))
                if iw > 0:
                    area1 = g_boxes[n, 3] * g_boxes[n, 4] * g_boxes[n, 5]
                    area2 = q_boxes[k, 3] * q_boxes[k, 4] * q_boxes[k, 5]
                    inc = iw * r_inc[n, k]
                    ua = (area1 + area2 - inc)
                    overlaps[n, k] = inc / ua
    return overlaps

本文完整工程代码请通过下方名片联系博主获取


🔥 更多精彩专栏

  • 《ROS从入门到精通》
  • 《Pytorch深度学习实战》
  • 《机器学习强基计划》
  • 《运动规划实战精讲》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

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

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

相关文章

【VTK】一文讲解vtkImageActor

很高兴在雪易的CSDN见到你,给你糖糖 系列文章目录 VTK付费专栏_雪易的博客-CSDN博客 感谢订阅的小哥哥小姐姐,小易会继续努力分享,一起进步! 若订阅后有其它需求,欢迎随时联系,CSDN一直在线(^U^)ノ~YO 前言 本文主要讲解vtk的

SD卡格式化如何恢复数据?

SD卡作为现代移动设备如手机、数码相机以及行车记录仪中的重要存储组件,其应用场景越来越广泛。与硬盘或U盘一样,SD卡也不是完全免疫于数据丢失的问题,特别是在误格式化或误删除的情况下。所以,许多人会有这样的疑问:S…

【21】c++设计模式——>装饰模式

装饰模式的定义 装饰模式也可以称为封装模式,所谓的封装就是在原有行为之上进行扩展,并不会改变该行为; 例如网络通信: 在进行网络通信的时候,数据是基于IOS七层或四层网络模型(某些层合并之后就是四层模型…

Rn使用FlatList导航栏自动回到中间

import { useState, useRef } from react import { FlatList, View, Text, StyleSheet, TouchableOpacity } from react-nativeconst Center () > {const tabs ["语文", "数学", "英语", "政治", "历史", "地理&q…

新的“HTTP/2 快速重置”零日攻击打破了 DDoS 记录

自 8 月份以来,一种名为“HTTP/2 快速重置”的新 DDoS(分布式拒绝服务)技术已被作为零日漏洞积极利用,其规模打破了之前的所有记录。 Amazon Web Services、Cloudflare 和 Google 今天联合发布了有关零日技术的消息,他…

PHP 自习室空位查询系统mysql数据库web结构apache计算机软件工程网页wamp计算机毕业设计

一、源码特点 PHP 自习室空位查询系统是一套完善的web设计系统,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 php 自习室空位查询系统1 代码 https://download.csdn.net/download/qq_41221322/…

聊聊身边的嵌入式:点菜机用着好好的,突然挂了,这口锅应该甩给谁?

周末被老婆challenge了。之所以用这个英文词汇,是因为实在难以找出一个恰当的中文,来表达这个意思。挑战?盘问,质疑?臭骂?好像都不对劲儿。对了,想来想去,只有diao这个词有点儿接近&…

小视频APP源码实战:探寻成功案例与经验分享

在这个数字化时代,小视频APP源码已经成为创业者们追逐成功的热门选择。本文将揭示三个成功案例,为您带来宝贵的经验分享。 案例一:「绝绝子」,小视频APP带来的逆袭奇迹 小视频APP「绝绝子」的成功故事令人瞩目。通过精心策划的内…

[网鼎杯 2018]Comment git泄露 / 恢复 二次注入 .DS_Store bash_history文件查看

首先我们看到账号密码有提示了 我们bp爆破一下 我首先对数字爆破 因为全字符的话太多了 爆出来了哦 所以账号密码也出来了 zhangwei zhangwei666 没有什么用啊 扫一下吧 有git git泄露 那泄露看看 真有 <?php include "mysql.php"; session_start(); if(…

TWDS车辆轮对故障、尺寸动态检测系统

随着我国铁路的建设发展&#xff0c;客运专线网络形成&#xff0c;既有铁路的货运能力得到释放&#xff0c;货物运输向重载方向发展&#xff0c;运输组织呈现长交路、运转周期短、编组固定的特点。 跟踪调查表明重载车辆车轮磨耗较普通车辆更为严重。大秦线c80型车辆在不到1个…

vue3+ts项目02-安装eslint、prettier和sass

创建项目 项目创建 安装eslint yarn add eslint -D生成配置文件 npx eslint --init安装其他插件 yarn add -D eslint-plugin-import eslint-plugin-vue eslint-plugin-node eslint-plugin-prettier eslint-config-prettier eslint-plugin-node babel/eslint-parser vue-e…

前端好文+插件分享(持续更新中...)

CSS 「滚动绽放」实现页面滚动时逐渐展示/隐藏元素https://github.com/vnyoon/web-magic &#xff08;相关CSS动画特效实现&#xff09; 钉钉官网首页的炫酷动效” 被我用css新特性轻松破解啦&#xff5e; 软件开发 1 模型驱动是什么意思&#xff1f;底层原理是什么&#xf…

Linux发布Java项目,使用screen窗口

代码写完正常的打包 登录Linux&#xff0c;使用screen -ls命令查看现有的窗口 将之前的jar备份一个cp 原jar包名 备份后jar包名&#xff0c;再将jar包复制到对应的路径下 使用screen -r -d 窗口名 命令进入到之前启动jar包的窗口&#xff0c;停掉之前的窗口&#xff0c;直接…

无法打开文件“opengl32.lib”

无法打开文件“opengl32.lib” [TOC](无法打开文件“opengl32.lib”) 前言一、找到库链接配置勾选继承input里也要勾选继承 前言 随便找个教程配置结果报错无法打开文件opengl32.lib 分析原因&#xff1a; opengl库和windows自带库一样出问题应该是VS配置有问题 提示&#xff…

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— JS进阶(二)

思维导图 构造函数&数据常用函数 一、深入对象 1.1创建对象三种方式 1.2 构造函数 1.3实例成员&静态成员 二、内置构造函数 为什么简单数据类型也有方法? 基本数据类型包装成复杂数据类型 2.1 Object 2.2 Array reduce() 第二个参数&#xff08;初始值&#xff09;不…

rust cfg的使用

前提是一个crate倒入另一个crate。 先看结构 test_lib目录结构 这与另一个crate处于同一个目录,所以另一crate倒入的时候在Cargo.toml中使用如下语句。 test_lib = {path = "../test_lib" }先在test_lib/src/abc/abc.rs中添加没有cfg的两个函数做测试。 pub fn…

Tabby All configured authentication methods failed

文章目录 重要序言错误原因tabby的连接设置 总结 重要序言 Tabby是一款美观耐用的软件&#xff0c;平常一直用来输入密码方法SSH公司服务器&#xff0c;后来为了另外一台服务器加了SSH私钥&#xff0c;之后Tabby SSH连接死活不成功&#xff0c;哎&#xff0c;折腾了好久&#…

【VS Code】推荐一套我非常喜欢的主题和字体样式

话不多说&#xff0c;先上样式&#xff1a; 这里我的主题是 One Dark Pro&#xff0c;也是 VS Code 里面使用非常多的主题之一。直接安装插件即可使用。 我的字体是 JetBrains Mono&#xff0c;虽然使用的是 VS Code&#xff0c;但还是喜欢 webstorm 的字体。我们可以直接去官网…

随着 ChatGPT 凭借 GPT-4V(ision) 获得关注,多模态 AI 不断发展

原创 | 文 BFT机器人 在不断努力让人工智能更像人类的过程中&#xff0c;OpenAI的GPT模型不断突破界限GPT-4现在能够接受文本和图像的提示。 生成式人工智能中的多模态表示模型根据输入生成文本、图像或音频等各种输出的能力。这些模型经过特定数据的训练&#xff0c;学习底层模…

ssm+vue的车辆出租管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的车辆出租管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…