当前位置: 首页 > news >正文

13.3 目标检测和边界框

锚框的计算公式

假设原图的高为H,宽为W
在这里插入图片描述

详细公式推导

在这里插入图片描述

以同一个像素点为锚框,可以生成 (n个缩放 + m个宽高比 -1 )个锚框

在这里插入图片描述
在这里插入图片描述

锚框的作用:

不用直接去预测真实框的四个坐标,而是:
1.先生成多个锚框。
2.预测每个锚框里是否含有要预测的目标。
3.如果是,预测从这个锚框到真实框的偏移(一般是中心点的偏移)。

计算锚框与真实框的IOU

def box_iou(boxes1,boxes2):''':param boxes1: shape = (boxes1的数量,4):param boxes2: shape = (boxes2的数量,4):param areas1: boxes1中每个框的面积 ,shape = (boxes1的数量):param areas2: boxes2中每个框的面积 ,shape = (boxes2的数量):return:'''# 定义一个Lambda函数,输入boxes,内容是计算得到框的面积box_area = lambda  boxes:((boxes[:,2] - boxes[:0]) * (boxes[:3] - boxes[:0]))# 计算面积areas1 = box_area(boxes1)areas2 = box_area(boxes2)# 计算交集 要把所有锚框的左上角坐标 与 真实框的所有左上角坐标 作比较,大的就是交集的左上角 ,加个None 可以让锚框与所有真实框作对比inter_upperlefts = torch.max(boxes1[:,None,:2],boxes2[:,:2])# 把所有锚框的右下角坐标 与 真实框的所有右下角坐标 作比较,小的就是交集的右下角坐标 ,加个None 可以让锚框与所有真实框作对比inter_lowerrights = torch.min(boxes1[:,None,2:],boxes2[:,2:])# 如果右下角-左上角有元素小于0,那就说明没有交集,clamp(min-0)会将每个元素与0比较,小于0的元素将会被替换成0inters = (inter_lowerrights - inter_upperlefts).clamp(min=0) # 得到w和hinter_areas = inters[:,:,0] * inters[:,:,1] # 每个样本的 w*h# 求锚框与真实框的并集# 将所有锚框与真实框相加,他们会多出来一个交集的面积,所以要减一个交集的面积union_areas = areas1[:,None] * areas2 - inter_areasreturn inter_areas/union_areas

给训练集标注锚框

每个锚框包含的信息有:每个锚框的类别 和 偏移量。
偏移量指的是:真实边界相对于锚框的偏移量。

预测时:为每张图片生成多个锚框,预测所有锚框的类别和偏移量。

举例

假设有4个真实框 B1,B2,B3,B4。
9个锚框A1,A2,A3,A4,A5,A6,A7,A8,A9。

在这里插入图片描述
如上,每个真实框都要与所有的锚框计算IOU,如X23,在第三列,拥有最大的IOU,如果该IOU大于阈值,那么第2个锚框的类别就是B3,分配完类别之后,第二个锚框和第3个真实框将不再参与,表现为上面的矩阵去掉第二行第三列。

补充:

训练集不是光使用标注的真实的框做标签来训练吗?为啥要锚框当做训练样本?

应该是扩大训练集的方式,如果只有一张图片,上面标注上了一个真实的框,那么就只有一个训练样本,如果生成一些锚框,根据真实的框,计算IOU,来给生成的锚框标记上相应的类别和与真实框的中心值偏移量,那么这些锚框也成为了训练样本。

lambda匿名函数

它可以用于简洁地定义一个单行的函数

add = lambda x, y: x + y
print(add(2, 3))  # 输出结果为 5

torch.max(boxes1[:, None, :2], boxes2[:, :2])

import torch # 定义两个张量
boxes1 = torch.tensor([[1, 2, 3, 4], [5, 6, 7, 8]]) # 形状为(2, 4)
boxes2 = torch.tensor([[2, 3,4,5], [6, 7,8,9]])
print(boxes1.shape, boxes2.shape)

torch.Size([2, 4]) torch.Size([2, 4])

print(boxes1[:, None, :2])
print(boxes1[:, None, :2].shape)
tensor([[[1, 2]],[[5, 6]]])
torch.Size([2, 1, 2]) 变成了两个通道,每个通道有个一行两列的元素
boxes2[:,:2]
tensor([[2, 3],[6, 7]])
print(torch.max(boxes1[:, None, :2], boxes2[:, :2]))
torch.max(boxes1[:, None, :2], boxes2[:, :2]).shape
tensor([[[2, 3],[6, 7]],[[5, 6],[6, 7]]]) 
torch.Size([2, 2, 2]) 变成两个通道,每个通道有两行,每行有两列的元素
print(torch.max(boxes1[:, :2], boxes2[:, :2]))
tensor([[2, 3],[6, 7]])
http://www.lryc.cn/news/126454.html

相关文章:

  • TCP/IP网络江湖初探:物理层的奥秘与传承(物理层上篇-基础与本质)
  • 计算机视觉五大核心研究任务全解:分类识别、检测分割、人体分析、三维视觉、视频分析
  • linux -- centos -- cmake 留坑
  • 【100天精通python】Day33:使用python操作数据库_SQLite数据库的使用与实战
  • 通过将信号频谱与噪声频谱进行比较,自动检测适当的带通滤波器转折频率研究(Matlab代码实现)
  • 【Sklearn】基于多层感知器算法的数据分类预测(Excel可直接替换数据)
  • 在 Windows 中恢复数据的 5 种方法
  • 配置使用Gitee账号认证登录Grafana
  • 使用 Flask 部署 Next.js
  • 网络安全--iptables
  • 【猿灰灰赠书活动 - 02期】- 【Java从入门到精通2023年7月最新(第7版)】
  • Springboot 设置统一的请求返回格式
  • logstash日志换行处理小解
  • openpnp - 做一个抛料盒
  • 数据结构——单链表的实现(c语言版)
  • 【计算机组成原理】24王道考研笔记——第四章 指令系统
  • C#使用FileInfo和DirectoryInfo类来执行文件和文件夹操作
  • 每日一学——TCP/IP参考模型
  • LAXCUS分布式操作系统:技术创新引领高性能计算与人工智能新时代
  • 两只小企鹅(Python实现)
  • Linux | 使用wget命令调用服务接口
  • POJ Prime Path 埃氏筛法+广度优先搜索
  • React React Native
  • 分布式定时任务系列5:XXL-job中blockingQueue的应用
  • QT网络编程之TCP
  • 《游戏编程模式》学习笔记(四) 观察者模式 Observer Pattern
  • 前端一键升级 package.json里面的依赖包管理
  • 当速度很重要时:使用 Hazelcast 和 Redpanda 进行实时流处理
  • 筛法求欧拉函数
  • consul限制注册的ip