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 d2l

torch.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.5
    offset_h, offset_w = 0.5, 0.5
    steps_h = 1.0 / in_height  # 在y轴上缩放步长
    steps_w = 1.0 / in_width  # 在x轴上缩放步长

    # 生成锚框的所有中心点
    center_h = (torch.arange(in_height, device=device) + offset_h) * steps_h
    center_w = (torch.arange(in_width, device=device) + offset_w) * steps_w
    shift_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_manipulations
    return 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.mfbz.cn/a/161718.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HUAWEI华为笔记本MateBook X 2021款i5集显(EULD-WFH9,WXX9)原装出厂Windows11系统工厂模式包

下载链接:https://pan.baidu.com/s/1gQ_O203SSm83Nc-zDk1iNA?pwd4exz 提取码:4exz 系统带F10一键智能还原功能隐藏恢复分区、所有驱动、Office办公软件、华为电脑管家等预装程序 所需要工具:32G或以上的U盘 文件格式:zip …

智慧工地APP全套源码,智慧工地云平台

智慧工地平台 ,智慧工地源码,智慧工地APP全套源码 智慧工地以施工现场风险预知和联动预控为目标,将智能AI、传感技术、人像识别、监控、虚拟现实、物联网、5G、大数据、互联网等新一代科技信息技术植入到建筑、机械、人员穿戴设施、场地进出关…

Linux下查看pytorch运行时真正调用的cuda版本

一般情况我们会安装使用多个cuda版本。而且pytorch在安装时也会自动安装一个对应的版本。 正确查看方式: 想要查看 Pytorch 实际使用的运行时的 cuda 目录,可以直接输出 cpp_extension.py 中的 CUDA_HOME 变量。 import torch import torch.utils imp…

Nginx反向代理和负载均衡

1.反向代理 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一…

springboot+vue+element简单实现教学课程申报管理系统

目录 一、项目预览 二、项目效果图及说明 1.项目说明 1.登录 2.欢迎页 3.教师管理 4.课程申报 ​5.管理员管理 三、代码实现 1.后端项目结构图 2.数据库表脚本 3.路由配置 四、总结 一、项目预览 在线预览:点击访问其他项目访问:点击访问后端实…

Java学习之路 —— Java高级

文章目录 前言1. 单元测试2. 反射2.1 获取Class对象的三种方式2.2 获取类的构造器的方法2.3 获取类的成员变量2.4 获取类的成员方法2.5 反射的作用 3. 注解3.1 自定义注解3.2 注解的原理3.3 元注解3.4 注解的解析 4. 动态代理5. 总结 前言 终于走到新手村的末端了,…

青少年CTF-WEB-Flag在哪里?

题目环境:F12查看源代码得到flag:qsnctf{1167716c-54f0-47da-baed-49e3b08dfaeb} 此题主要考察F12查看源代码的使用

java.net.UnknownHostException: eureka

java.net.UnknownHostException: eureka 哦。HOST漏了 #linux /etc/hosts #windows C:\Windows\System32\drivers\etc\hosts 127.0.0.1 eureka7000 127.0.0.1 eureka7001 127.0.0.1 eureka7002

MATLAB画图分辨率、图像大小研究

MATLAB画图分辨率、图像大小研究 Figure属性中 InnerPosition Position OuterPosition区别画图与打印的分辨率和图像大小研究首先明确两个概念:MATLAB实操画图 Figure属性中 InnerPosition Position OuterPosition区别 在画图的时候,我们经常需要设置Fi…

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* …

python中sklearn库在数据预处理中的详细用法,及5个常用的Scikit-learn(通常简称为 sklearn)程序代码示例

文章目录 前言1. 数据清洗:使用 sklearn.preprocessing 中的 StandardScaler 和 MinMaxScaler 进行数据规范化。2. 缺失值处理:使用 sklearn.impute 中的 SimpleImputer 来填充缺失值。3. 数据编码:使用 sklearn.preprocessing 中的 OneHotEn…

【左程云算法全讲13】暴力递归

系列综述: 💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于左程云算法课程进行的,每个知识点的修正和深入主要参考…

Springboot集成JDBC

1&#xff0c;pom.xml配置jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> 2&#xff0c;配置数据源信息 server:port: 8088spring:datasource:dr…

AI智剪:批量剪辑实战,技巧与实例

随着人工智能技术的不断发展&#xff0c;越来越多的领域开始应用AI技术提升工作效率和质量。其中&#xff0c;AI智剪技术在视频剪辑领域的应用也越来越广泛。AI智剪是一种基于人工智能技术的视频剪辑方法&#xff0c;通过机器学习算法对视频进行自动分析和处理&#xff0c;实现…

AIGC创作系统ChatGPT源码,AI绘画源码,支持最新GPT-4-Turbo模型,支持DALL-E3文生图

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

TCP协议相关实验

文章目录 一.TCP相关实验1.理解CLOSE_WAIT状态2.理解TIME_WAIT状态3.解决TIME_WAIT状态引起的bind失败的方法4.理解listen的第二个参数5.使用Wireshark分析TCP通信流程 二.TCP与UDP1.TCP与UDP对比2.用UDP实现可靠传输&#xff08;经典面试题&#xff09; 一.TCP相关实验 1.理解…

操作系统·进程同步

进程同步&#xff1a;异步环境下的一组并发进程因直接制约而互相发送消息、互相合作、互相等待&#xff0c;使得各进程按照一定的速度执行的过程。 进程同步的主要任务是使并发执行的诸进程之间能有效地共享资源和相互合作&#xff0c;使执行的结果具有可再现性。 4.1 进程同…

LeetCode——字符串(Java)

字符串 简介[简单] 344. 反转字符串[简单] 541. 反转字符串 II[中等] 151. 反转字符串中的单词 简介 记录一下自己刷题的历程以及代码。写题过程中参考了 代码随想录。会附上一些个人的思路&#xff0c;如果有错误&#xff0c;可以在评论区提醒一下。 [简单] 344. 反转字符串…

9 STM32标准库函数 之 独立看门狗(IWDG)所有函数的介绍及使用

9 STM32标准库函数 之 独立看门狗&#xff08;IWDG&#xff09;所有函数的介绍及使用 1. 图片有格式该文档修改记录&#xff1a;总结 函数描述格式&#xff1a; 函数名外设函数的名称函数原形原形声明功能描述简要解释函数是如何执行的输入参数{x}输入参数描述输出参数{x}输出…

sqli-labs关卡20(基于http头部报错盲注)通关思路

文章目录 前言一、回顾上一关知识点二、靶场第二十关通关思路1、判断注入点2、爆数据库名3、爆数据库表4、爆数据库列5、爆数据库关键信息 总结 前言 此文章只用于学习和反思巩固sql注入知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随意去尚…
最新文章