036、目标检测-锚框

之——对边缘框的简化

目录

之——对边缘框的简化

杂谈

正文

1.锚框操作

2.IoU交并比

3.锚框标号

4.非极大值抑制

5.实现

拓展


杂谈

        边缘框这样一个指定roi区域的操作对卷积神经网络实际上是很不友好的,这可能会对网络感受野提出一些特定的要求,所以诞生了锚框的技术:

        锚框(Anchor Box),也被称为先验框(Prior Box),是目标检测领域中一种用于提高模型准确性的技术。目标检测任务涉及识别图像中的对象并定位它们的位置。锚框在这方面发挥了关键作用。

在目标检测任务中,模型通常需要为图像中的每个位置预测对象的存在以及其边界框(bounding box)。锚框的作用是为模型提供一组预定义的框,这些框具有不同的大小和宽高比。模型通过这些锚框进行预测,然后根据实际目标的位置和形状进行调整。

以下是锚框的一些关键概念和作用:

  1. 多尺度和宽高比: 锚框通常涵盖了多个尺度和宽高比,以适应不同大小和形状的目标。这使得模型能够更好地适应各种对象的特征。

  2. 预测框的基准: 锚框充当了模型预测目标框的基准。模型会输出一个较为粗糙的框,然后通过与相应的锚框进行比较,进而调整和修正最终的边界框。

  3. 位置敏感性: 锚框使模型能够在图像的不同区域检测目标,而不仅仅是在固定位置。这提高了模型对目标位置变化的适应能力。

  4. 减少计算量: 锚框可以减少模型需要预测的边界框数量,从而减少计算复杂度。相较于在图像的每个位置都预测一个框,使用锚框可以更有效地处理目标检测任务。

        锚框技术广泛应用于基于深度学习的目标检测方法,如Faster R-CNN、SSD(Single Shot Multibox Detector)和YOLO(You Only Look Once)等。这些方法通过锚框提高了模型在复杂场景中检测目标的能力,使其更具鲁棒性和泛化性。

        锚框使得神经网络可以从不同尺度去关注图片以确定最好的物体roi。 


正文

1.锚框操作

        很多目标检测算法都是基于锚框的:

        目标检测算法通常会在输入图像中采样大量的区域,然后判断这些区域中是否包含我们感兴趣的目标,并调整区域边界从而更准确地预测目标的真实边界框(ground-truth bounding box)。 不同的模型使用的区域采样方法可能不同。 这里我们介绍其中的一种方法:以每个像素为中心,生成多个缩放比和宽高比(aspect ratio)不同的边界框。 这些边界框被称为锚框(anchor box)。

        可以理解为,当图片进来的时候,需要有一个算法来衡量我要关注的区域,因为各个图片感兴趣的物体的大小肯定是不一样的,那么对于每一个图片就需要生成一些区域来投入到卷积网络中。 这更多的是为了解决预测时候的需求,因为预测时候才会需要考虑各个尺寸的框。


2.IoU交并比

        度量两个框之间的相似度:

        IoU,或称为交并比(Intersection over Union),是在目标检测和图像分割等计算机视觉任务中常用的评估指标之一。它用于衡量模型预测的两个框之间的重叠程度。

        IoU的计算方式是通过目标的真实区域(或边界框)和模型预测的区域的交集面积除以它们的并集面积得到的。具体而言,IoU的计算公式如下:

        IoU的取值范围在0到1之间,通常以百分比表示。值越大,表示两个框重叠程度越高,因此训练的时候IoU越大通常意味着模型的性能越好。

        在目标检测任务中,通常将IoU用作评估模型在定位目标方面的准确性的指标。一般来说,训练时候,当模型某一锚框样本的置信度达到一定阈值,且与真实框IoU达到一定阈值(例如0.5或0.75)时,认为模型的预测是正确的。

        测试时候,也常用于非极大值抑制(Non-Maximum Suppression,NMS)阶段,以过滤掉IoU低于阈值的冗余边界框,从而提高检测结果的质量。


3.锚框标号

        要对每个锚框进行预测,要么认为是背景什么都没有,要么跟某一个真实类关联并标注差距,这是在训练时候需要的:

        通过计算所有锚框与真实边缘框的IoU,找到最大值,可以绑定锚框和边缘框的类别:

        注意看上面的过程,每次读取一张图片都会按照锚框数生成多个训练样本,所以才需要进行锚框标号,将与真实边缘框相关的锚框赋予类别,但一个锚框又只能用一次,所以才会这样做 ,要保证每个真实框被分配到一个或多个锚框,其他低于要求的锚框变成负样本,这样就可以一次性处理所有生成的锚框并给他们赋予类别。上面这种方案比较极端,只保留了和真实框最接近的锚框,实际情况肯定是有阈值的。

        在目标检测任务中,使用锚框的目的是通过预定义的一组框来提高模型的泛化能力和训练效果。将锚框赋予标号后,通常会采用两阶段的方法:

  1. 生成锚框: 在训练之前,使用一些先验知识(比如目标的大小和形状分布)生成一组锚框,这些锚框覆盖了图像中可能出现目标的多种尺寸和宽高比。这组锚框充当了模型的预测目标的基准。

  2. 赋予标号: 将这些锚框与真实目标进行匹配,赋予标号。匹配的标准通常是通过计算IoU(交并比)来判断一个锚框与真实目标的重叠程度。如果IoU高于某个阈值,就将锚框标记为正样本,表示这个锚框内有目标。如果IoU低于另一个阈值,将锚框标记为负样本,表示这个锚框内没有目标。对于中间情况,可以根据具体的情况进行处理,例如,有的方法会将这些框排除在训练中,而有的方法则将其视为中性样本。

  3. 训练模型: 使用带有标号的锚框进行训练。正样本用于训练模型识别目标和调整边界框的位置,负样本用于训练模型辨别图像中不包含目标的区域。这种两阶段的训练方式有助于模型学习如何准确地预测目标的位置。

        直接使用真实边界框进行训练存在一些问题。首先,如果直接使用真实边界框,模型可能会过于依赖这些具体的框,而泛化能力较差。其次,由于目标的尺寸和形状变化较大,事先定义一组具有多样性的锚框能够更好地覆盖不同的情况。

        因此,通过为锚框赋予标号,并采用两阶段的训练方式,可以更好地引导模型学习目标的特征,提高模型的泛化性能。


4.非极大值抑制

        原理:

        步骤就是,要输出时候,对于每一个锚框,也就是先验框,先去掉属于背景的(保留 softmax有类别输出的);然后确定softmax预测最大值也就是置信度最高的类别;然后去掉所有其他和这个框的IoU值过大的框(去掉重复的)。


5.实现

        对于每个像素为中心,生成不同宽度和高度的锚框:

import torch
from d2l import torch as d2ltorch.set_printoptions(2)  # 精简输出精度def multibox_prior(data, sizes, ratios):"""生成以每个像素为中心具有不同形状的锚框"""in_height, in_width = data.shape[-2:]device, num_sizes, num_ratios = data.device, len(sizes), len(ratios)boxes_per_pixel = (num_sizes + num_ratios - 1)size_tensor = torch.tensor(sizes, device=device)ratio_tensor = torch.tensor(ratios, device=device)# 为了将锚点移动到像素的中心,需要设置偏移量。# 因为一个像素的高为1且宽为1,我们选择偏移我们的中心0.5offset_h, offset_w = 0.5, 0.5steps_h = 1.0 / in_height  # 在y轴上缩放步长steps_w = 1.0 / in_width  # 在x轴上缩放步长# 生成锚框的所有中心点center_h = (torch.arange(in_height, device=device) + offset_h) * steps_hcenter_w = (torch.arange(in_width, device=device) + offset_w) * steps_wshift_y, shift_x = torch.meshgrid(center_h, center_w, indexing='ij')shift_y, shift_x = shift_y.reshape(-1), shift_x.reshape(-1)# 生成“boxes_per_pixel”个高和宽,# 之后用于创建锚框的四角坐标(xmin,xmax,ymin,ymax)w = torch.cat((size_tensor * torch.sqrt(ratio_tensor[0]),sizes[0] * torch.sqrt(ratio_tensor[1:])))\* in_height / in_width  # 处理矩形输入h = torch.cat((size_tensor / torch.sqrt(ratio_tensor[0]),sizes[0] / torch.sqrt(ratio_tensor[1:])))# 除以2来获得半高和半宽anchor_manipulations = torch.stack((-w, -h, w, h)).T.repeat(in_height * in_width, 1) / 2# 每个中心点都将有“boxes_per_pixel”个锚框,# 所以生成含所有锚框中心的网格,重复了“boxes_per_pixel”次out_grid = torch.stack([shift_x, shift_y, shift_x, shift_y],dim=1).repeat_interleave(boxes_per_pixel, dim=0)output = out_grid + anchor_manipulationsreturn output.unsqueeze(0)

        查看:

img = d2l.plt.imread('../img/catdog.jpg')
h, w = img.shape[:2]print(h, w)
X = torch.rand(size=(1, 3, h, w))
Y = multibox_prior(X, sizes=[0.75, 0.5, 0.25], ratios=[1, 2, 0.5])
Y.shape

        非常贵的锚框数量。 


拓展

        其他的一些方法:

  • 直接把图片隔开成很多个块预测
  • 对每个像素中去比例预测
  • 其他的聚焦方法

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

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

相关文章

【脑与认知科学】【n-back游戏】

请参考课堂内容,设计一种测试工作记忆的实验方法,并选择三位同学作为被试测试工作记忆。请画出实验流程图,叙述实验测试目标,并分析实验结果。 举例:一般我们选择n_back来测试对数字或字母的记忆,选择色块实…

[深度学习]卷积神经网络的概念,入门构建(代码实例)

# 不再任何人,任何组织的身上倾注任何的感情,或许这就是能活得更开心的办法 0.写在前面: 卷积神经网络的部分在之前就已经有所接触,这里重新更全面地总结一下关于深度学习中卷积神经网络的部分.并且在这里对如何构建代码,一些新的思想和网络做出一点点补充,同时会持续更新一些…

传递函数的推导和理解

传递函数的推导和理解 假设有一个线性系统,在一般情况下,它的激励 x ( t ) x(t) x(t)与响应 y ( t ) y(t) y(t)所满足的的关系,可用下列微分方程来表示: a n y ( n ) a n − 1 y ( n − 1 ) a n − 2 y ( n − 2 ) ⋯ a 1 y…

k8s上Pod生命周期、重启策略、容器探测简介

目录 一.Pod的创建过程 二.Pod的终止过程 三.Pod的重启策略(restartPolicy) 1.Always 2.OnFailture 3.Never 4.示例 四.Pod生命周期内的5种状态(相位) 1.Pending 2.Running 3.Succeeded 4.Failed 5.Unknown 五.初始…

SpringCache

1、基本信息 Spring缓存方案:JDK内置的缓存(ConcurrentHashMap)、第三方缓存组件(Caffeine)、分布式的缓存实现(Memcahed、Redis)。 ConcurrentHashMap是JUC之中提供最为重要的技术实现。SpringCache之中为了便于缓存结构的管理,在“org.s…

flutter TabBar指示器

第一层tabView import package:jade/configs/PathConfig.dart; import package:jade/customWidget/MyCustomIndicator.dart; importpackage:jade/homePage/promotion/promotionPost/MyPromotionListMainDesc.dart; import package:jade/homePage/promotion/promotionPost/MyPr…

C++入门(1)—命名空间、缺省参数

目录 一、什么是C 1、C关键字(C98) 2、C兼容C 二、C程序预处理指令 三、命名空间 1、命名冲突 第一种: 第二种: 2、域作用限定符 3、实现命名空间 4、命名空间冲突 5、访问命名空间 6、命名空间“std” 四、输入输出 1、定义 2、自动识…

生活总是自己的,请尽情打扮,尽情可爱,,

同色系拼接羽绒服了解一下 穿上时尚感一下子就突显出来了 90白鸭绒填充,不仅时尚还保暖 设计感满满的羽绒服不考虑一下吗?

腾讯云服务器租用价格,腾讯云服务器价格流量怎么算?

首先,让我们来看看腾讯云服务器租用价格。根据您的需求不同,腾讯云提供了多种不同的配置选项,从轻量级应用服务器到高性能的GPU服务器,都可以满足您的需求。以下是一些常见的腾讯云服务器租用价格: 一、腾讯云服务器租…

Mysql-复合查询

实际开发中往往数据来自不同的表,所以需要多表查询。 1.笛卡尔积 通俗来讲就是两个表的每一列都组合一遍,也就是穷举法。 穷举出来的数据表会有大量重复数据,而我们只需要加上一些限定条件就可以完成有效数据的筛选。 select EMP.ename, EM…

解决:虚拟机远程连接失败

问题 使用FinalShell远程连接虚拟机的时候连接不上 发现 虚拟机用的VMware,Linux发行版是CentOs 7,发现在虚拟机中使用ping www.baidu.com是成功的,但是使用FinalShell远程连接不上虚拟机,本地网络也ping不通虚拟机&#xff0c…

STM32 I2C详解

STM32 I2C详解 I2C简介 I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线 两根通信线: SCL(Serial Clock)串行时钟线,使用同步的时序,降低对硬件的依赖,同时同步的时序稳定…

【UE5】显示或隐藏物体轮廓线

效果 步骤 1. 先下载所需的材质文件“M_Highlight.uasset” 材质下载链接: 链接:https://pan.baidu.com/s/1rxmRhkUoXVq6-DkIKyBhAQ 提取码:55bv 2. 在视口中拖入后期处理体积 根据需求设置后期处理体积的大小或者直接设置无限范围&…

python爬取网站数据,作为后端数据

一. 内容简介 python爬取网站数据,作为后端数据 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码 链接: 三.主要流程 3.1 通过urllib请求网站 里面用的所有的包 ! pip install lxml ! pip install selenium ! pip install…

【Linux】U盘安装的cfg引导文件配置

isolinux.cfg文件 default vesamenu.c32 timeout 600display boot.msg# Clear the screen when exiting the menu, instead of leaving the menu displayed. # For vesamenu, this means the graphical background is still displayed without # the menu itself for as long …

计算两个图形遮盖率

读取图像 首先,加载待处理的图像,可以使用图像处理库(例如OpenCV)来实现这一步。确保已加载正确的图像。 定义特定颜色范围 确定所需的特定颜色范围。这将是要检测的马赛克填充的颜色。需要指定颜色的下限值和上限值,通…

深度学习中文汉字识别 计算机竞赛

文章目录 0 前言1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习中文汉字识别 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐&#xf…

快速搭建本地的chatgpt

快速搭建本地的chatgpt 参考:一篇文章教你使用Docker本地化部署Chatgpt(非api,速度非常快!!!)及裸连GPT的方式(告别镜像GPT)-CSDN博客 前提是linux下 已安装docker 命…

Leetcode—142.环形链表II【中等】

2023每日刷题(三十三) Leetcode—142.环形链表II 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode *detectCycle(struct ListNode *head) {struct ListNode* …

2023.11.18 - hadoop之zookeeper分布式协调服务

1.zookeeper简介 ZooKeeper概念: Zookeeper是一个分布式协调服务的开源框架。本质上是一个分布式的小文件存储系统 ZooKeeper作用: 主要用来解决分布式集群中应用系统的一致性问题。 ZooKeeper结构: 采用树形层次结构,没有目录与文件之分,ZooKeeper树中的每个节点被…