box_iou交并比及assign_anchor_to_bbox个人理解

news2024/9/24 17:18:01

接上篇文章,李沐沐神的《动手学深度学习》中的show_bboxes还是比较好理解的,于是来看这两个方法
以下内容建议对照源代码理解

def box_iou

首先我们来设置boxes1和boxes2的初始值

boxes1 = torch.tensor([[1,2,5,6],[2,1,4,6],[-1,2,7,6],
                      [1,2,5,8]])
boxes2 = torch.tensor([[0,3,5,7],[1,2,3,7],[0,4,5,7],
                      [0,5,5,7]])

设置了第一组的四个锚框的左横,下纵,右横,上纵坐标(详情上一篇文章)和第二组的四个锚框坐标

boxes1[:,2],boxes1[:,0]
'''结果'''
(tensor([5, 4, 7, 5]), tensor([ 1,  2, -1,  1]))
boxes1[:,3],boxes1[:,1]
'''结果'''
(tensor([6, 6, 6, 8]), tensor([2, 1, 2, 2]))

很显然这两个语句将这一组锚框的右横、左横和上纵、下纵坐标表示了出来,而右横坐标-左横坐标便得出了这一个锚框的长,上纵坐标-下纵坐标便得出了这个锚框的宽,相乘便是这个锚框的面积
下面的方法便是求一组锚框的面积

(boxes1[:,2]-boxes1[:,0])*(boxes1[:,3]-boxes1[:,1])
'''结果'''
tensor([16, 10, 32, 24])

与上面求得的各个坐标相对应
于是便有了这个方法

box_area = lambda boxes: ((boxes[:, 2] - boxes[:, 0]) *
                              (boxes[:, 3] - boxes[:, 1]))

下面的语句中包含
inter_upperlefts = torch.max(boxes1[:, None, :2], boxes2[:, :2])
inter_lowerrights = torch.min(boxes1[:, None, 2:], boxes2[:, 2:])
而其中的torch.max(boxes1[:, None, :2], boxes2[:, :2])与 torch.min(boxes1[:, None, 2:], boxes2[:, 2:])实在让人费解,到底为什么要在boxes中增加一个None呢?
让我们带着上面假设的boxes1和boxes2继续向下看
首先我们要知道带None和不带None有什么区别

torch.max(boxes1[:,:2],boxes2[:,:2])
'''结果'''
tensor([[1, 3],
        [2, 2],
        [0, 4],
        [1, 5]])

给boxes1中四个锚框取名为A1,A2,A3,A4,boxes2中四个锚框取名为B1,B2,B3,B4,能够看出这是将A1B1做比较,A2B2、A3B3、A4B4分别做比较

torch.max(boxes1[:,None,:2],boxes2[:,:2])
'''结果'''
tensor([[[1, 3],
         [1, 2],
         [1, 4],
         [1, 5]],

        [[2, 3],
         [2, 2],
         [2, 4],
         [2, 5]],

        [[0, 3],
         [1, 2],
         [0, 4],
         [0, 5]],

        [[1, 3],
         [1, 2],
         [1, 4],
         [1, 5]]])

答案是将A1与所有B做比较,A2与所有B作比较…
接着来看min部分的代码

torch.min(boxes1[:, 2:], boxes2[:, 2:])
'''结果'''
tensor([[5, 6],
        [3, 6],
        [5, 6],
        [5, 7]])
torch.min(boxes1[:, None, 2:], boxes2[:, 2:])
'''结果'''
tensor([[[5, 6],
         [3, 6],
         [5, 6],
         [5, 6]],

        [[4, 6],
         [3, 6],
         [4, 6],
         [4, 6]],

        [[5, 6],
         [3, 6],
         [5, 6],
         [5, 6]],

        [[5, 7],
         [3, 7],
         [5, 7],
         [5, 7]]])

同样也是答案是将A1与所有B做比较,A2与所有B作比较…,这样就知道了加None的作用
在这里插入图片描述
像这张图,相交部分的下横坐标与左纵坐标取两个锚框的max值
相交部分的上横坐标与右纵坐标取两个锚框的min值

inters = (inter_lowerrights - inter_upperlefts).clamp(min=0)
inters
'''结果'''
tensor([[[4, 3],
         [2, 4],
         [4, 2],
         [4, 1]],

        [[2, 3],
         [1, 4],
         [2, 2],
         [2, 1]],

        [[5, 3],
         [2, 4],
         [5, 2],
         [5, 1]],

        [[4, 4],
         [2, 5],
         [4, 3],
         [4, 2]]])

将这两组答案相减,便得到了所有锚框交接的长和宽,clamp(min=0)意思是将小于0的长和宽变为0,因为长和宽都不为0

将长和宽相乘便是相交锚框的面积

inter_areas = inters[:, :, 0] * inters[:, :, 1]
inter_areas
'''结果'''
tensor([[12,  8,  8,  4],
        [ 6,  4,  4,  2],
        [15,  8, 10,  5],
        [16, 10, 12,  8]])

再算出原始锚框的面积

areas1 = box_area(boxes1)
areas2 = box_area(boxes2)

相交部分的所有面积(同样有None,人们也叫这个机制为广播机制)

union_areas = areas1[:, None] + areas2 - inter_areas
union_areas
'''结果'''
tensor([[24, 18, 23, 22],
        [24, 16, 21, 18],
        [37, 34, 37, 37],
        [28, 24, 27, 26]])

相除便得到了io比

inter_areas / union_areas
''''''
tensor([[0.5000, 0.4444, 0.3478, 0.1818],
        [0.2500, 0.2500, 0.1905, 0.1111],
        [0.4054, 0.2353, 0.2703, 0.1351],
        [0.5714, 0.4167, 0.4444, 0.3077]])

assign_anchor_to_bbox方法

设置初始值
生成锚框的数量和真实锚框的数量
io比

num_anchors, num_gt_boxes = 4, 4
jaccard=torch.tensor([[0.5000, 0.4444, 0.3478, 0.1818],
        [0.2500, 0.2500, 0.1905, 0.1111],
        [0.4054, 0.2353, 0.2703, 0.1351],
        [0.5714, 0.4167, 0.4444, 0.3077]])
max_ious, indices = torch.max(jaccard, dim=1)
max_ious, indices
'''结果'''
(tensor([0.5000, 0.2500, 0.4054, 0.5714]), tensor([0, 0, 0, 0]))

dim=0即在横方向比较,max_ious储存了所有行最大的io比,indices储存了最大io比的位置,这里很巧都是第一个最大
设置最小的io比,即小于这个的io比不做考虑

iou_threshold = 0.3
anc_i = torch.nonzero(max_ious >= iou_threshold).reshape(-1)
torch.nonzero(max_ious >= iou_threshold).reshape(-1)
'''结果'''
tensor([0, 2, 3])

只有序号为0,2,3的位置算作有效io比
而下一段代码

box_j = indices[max_ious >= iou_threshold]
box_j
'''结果'''
tensor([0, 0, 0])

表示了有效io比的行里最大的io比,与上面的anc_i对应


后面的就比较好理解了
剩下的多看看视频理解老师的思路就可以了

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

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

相关文章

ubuntu14.04改静态ip

现在可能已经用ubuntu14.04的人已经不多了,这里讲一下Ubuntu14.04怎么改静态ip 第一步:输入ifconfig查看ip和子网掩码 第二步:输入route -n查看网关 上面ip是192.168.88.136,子网掩码是255.255.255.0,网关是192.168.…

中国ui设计师年终工作总结

一、萌芽阶段 记得初次应聘时,我对公司的认识仅仅局限于行业之一,对UI设计师一职的认识也局限于从事相对单纯的界面的设计创意和美术执行工作。除此之外,便一无所知了。所以,试用期中如何去认识、了解并熟悉自己所从事的行业&…

C++,day0907

#include <iostream>using namespace std; struct stu { private:int num; private:double score[32];public:void setNum(){cout <<"请输入学生人数:";cin >>num;}void input(){cout<<"请输入学生的成绩:"<<endl;for(int i…

Spring IOC之ListableBeanFactory

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

go work 不同包下mod + work实现.go文件的互相调用

一、文件架构 . ├── go.mod ├── go.work ├── main │ └── main.go └── util├── go.mod└── util.go其中go.mod module testgo 1.21.0其中go.work go 1.21.0use (../util )main/main.go 1 package main …

海外风控中这类征信数据与模型实践,实操落地效果最有效

今天的文章我们跟大家详细介绍&#xff0c;海外现金贷征信数据的特征介绍与建模实践。 希望今天的内容可以帮助各位童鞋了解海外现金贷的数据维度及其特征体系&#xff0c;并重点熟悉特征衍生的加工方法&#xff0c;在实际任务场景中加以实践应用。 首先&#xff0c;我们需要明…

从驾考科目二到自动驾驶,聊聊 GPU 为什么对自动驾驶很重要

“下一个项目&#xff0c;坡道起步。” …… “考试不合格&#xff0c;请将车子开到起点&#xff0c;重新验证考试。你的扣分项是&#xff1a;起步时间超30秒&#xff1a;扣100分。行驶过程中车轮轧到边线&#xff1a;扣100分。” 想必经历过驾驶证考试的同学&#xff0c;对…

Unity 之Material 类型和 MeshRenderer 组件中的 Materials 之间有一些重要的区别

文章目录 区别代码例子 区别 在Unity中&#xff0c;Material 类型和 MeshRenderer 组件中的 Materials 之间有一些重要的区别。 Material 类型&#xff1a; Material 是 Unity 中用来定义渲染属性的资源。它包含了一系列定义了如何绘制一个对象的属性&#xff0c;比如颜色、纹…

windows苹果商店上架ipa(基于appuploader)

参考文章&#xff1a; 上传ipa到appstore详细步骤 1、苹果商店地址&#xff1a;https://appstoreconnect.apple.com/apps 2、创建我的app 使用hbuilderx或apicloud云打包后&#xff0c;会生成一个ipa文件&#xff0c;而iphone是无法直接安装这个ipa文件的&#xff0c;需要将这…

【专栏必读】数字图像处理(MATLAB+Python)专栏目录导航及学习说明

文章目录 第一章&#xff1a;绪论第二章&#xff1a;数字图像处理基础第三章&#xff1a;图像基本运算第四章&#xff1a;图像的正交变换第五章&#xff1a;图像增强第六章&#xff1a;图像平滑第七章&#xff1a;图像锐化第八章&#xff1a;图像复原第九章&#xff1a;图像形态…

多维时序 | MATLAB实现GWO-GRU灰狼算法优化门控循环单元的多变量时间序列预测

多维时序 | MATLAB实现GWO-GRU灰狼算法优化门控循环单元的多变量时间序列预测 目录 多维时序 | MATLAB实现GWO-GRU灰狼算法优化门控循环单元的多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现基于GWO-GRU灰狼算法优化门控循环单元的多变量时…

第15章_锁: (表级锁、页级锁、行锁、悲观锁、乐观锁)

3.2 从数据操作的粒度划分&#xff1a;表级锁、页级锁、行锁 为了提高数据库并发度&#xff0c;每次锁定的数据范围越小越好&#xff0c;理论上每次只锁定当前操作的数据的方案会得到最大的并发度&#xff0c;但管理锁是很耗资源&#xff08;涉及获取、检查、释放锁等动作)。因…

服务器数据恢复-Xen server虚拟机数据恢复案例

服务器数据恢复环境&#xff1a; 一台某品牌服务器通过一张同品牌某型号RAID卡将4块STAT硬盘组建为一组RAID10阵列。上层部署Xen Server虚拟化平台&#xff0c;虚拟机上安装的是Windows Server操作系统&#xff0c;包括系统盘 数据盘两个虚拟机磁盘&#xff0c;作为Web服务器使…

JavaScript个人笔记

1.常用数据布尔值判断 const data [,0,-1,null,undefined,[],{},()>{}]data.forEach(item>{if(item){console.log(item,结果)} 打印结果&#xff1a;、0、null、undefined这四个值的布尔值都是false&#xff0c;其余都是true

没钱,没人,没经验?传统制造型企业如何用无代码实现转型

2023年&#xff0c;国家市场监督管理总局发布了三项重要标准&#xff0c;包括《工业互联网平台选型要求》、《工业互联网平台微服务参考框架》和《工业互联网平台开放应用编程接口功能要求》。这些标准的发布对于完善工业互联网平台标准体系&#xff0c;提升多样化工业互联网平…

如何查找遥感卫星相关参数

背景介绍 做遥感卫星筛选和数据处理时&#xff0c;我们经常需要查询遥感卫星的参数&#xff0c;比如说传感器类型、分辨率、轨道参数和幅宽等。 但如果只用百度&#xff0c;搜索的结果要不没有卫星参数&#xff0c;要不就是卫星相关的新闻&#xff0c;有用的一部分是技术博客&…

JS中call方法是什么,call()的原理是什么?如何手写一个call()?Symbol是什么,怎么用Symbol调优?含详细解析

&#x1f389;call() &#x1f495;call()的参数 thisArg&#xff1a;在调用 func 时要使用的 this 值 arg1, …, argN &#xff08;可选&#xff09; 函数的参数 ✨call()的描述&#xff1a; 首先声明 func是一个函数&#xff0c;person是一个对象 针对这段代码&#xff1a;f…

SSL证书系列--DV、OV、EV三种证书类型的区别

原文网址&#xff1a;SSL证书系列--DV、OV、EV三种证书类型的区别_IT利刃出鞘的博客-CSDN博客 简介 本文介绍DV、OV、EV这三种SSL证书的区别。 DV、OV、EV的区别 项 DV OV EV 英文全称 Domain Validation &#xff08;域名验证型证书&#xff09; Organization Valida…

前端的规范

假如团队中的小伙伴在提交代码时没有遵循规范要求&#xff0c;只写了一个"fix"或"update&#xff0c;这会给其他小伙伴造成困扰&#xff0c;不得不花时间查看代码和推测逻辑。 不仅会浪费了时间和精力&#xff0c;可能会导致项目以下问题&#xff1a; 可读性差…

知网被网信办罚款5000万

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 9月6日&#xff0c;知网被网信办罚款5000万&#xff0c;对此&#xff0c;知网称&#xff0c;诚恳接受&#xff0c;坚决服从。 去年(2022年)知网被市场监管总局以垄断行为对其开出了8760万元的罚单…