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

【深度学习计算机视觉】05:多尺度目标检测

在这里插入图片描述

【作者主页】Francek Chen
【专栏介绍】⌈⌈PyTorch深度学习⌋⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。
【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。

文章目录

    • 一、多尺度锚框
    • 二、多尺度检测
    • 小结


  在锚框中,我们以输入图像的每个像素为中心,生成了多个锚框。基本而言,这些锚框代表了图像不同区域的样本。然而,如果为每个像素都生成的锚框,我们最终可能会得到太多需要计算的锚框。想象一个561×728561 \times 728561×728的输入图像,如果以每个像素为中心生成五个形状不同的锚框,就需要在图像上标记和预测超过200万个锚框(561×728×5561 \times 728 \times 5561×728×5)。

一、多尺度锚框

  减少图像上的锚框数量并不困难。比如,我们可以在输入图像中均匀采样一小部分像素,并以它们为中心生成锚框。此外,在不同尺度下,我们可以生成不同数量和不同大小的锚框。直观地说,比起较大的目标,较小的目标在图像上出现的可能性更多样。例如,1×11 \times 11×11×21 \times 21×22×22 \times 22×2的目标可以分别以4、2和1种可能的方式出现在2×22 \times 22×2图像上。因此,当使用较小的锚框检测较小的物体时,我们可以采样更多的区域,而对于较大的物体,我们可以采样较少的区域。

  为了演示如何在多个尺度下生成锚框,让我们先读取一张图像。它的高度和宽度分别为561和728像素。

%matplotlib inline
import torch
from d2l import torch as d2limg = d2l.plt.imread('../img/catdog.jpg')
h, w = img.shape[:2]
h, w

在这里插入图片描述

  回想一下,在图像卷积中,我们将卷积图层的二维数组输出称为特征图。通过定义特征图的形状,我们可以确定任何图像上均匀采样锚框的中心。

  display_anchors函数定义如下。我们在特征图(fmap)上生成锚框(anchors),每个单位(像素)作为锚框的中心。由于锚框中的(x,y)(x, y)(x,y)轴坐标值(anchors)已经被除以特征图(fmap)的宽度和高度,因此这些值介于0和1之间,表示特征图中锚框的相对位置。

  由于锚框(anchors)的中心分布于特征图(fmap)上的所有单位,因此这些中心必须根据其相对空间位置在任何输入图像上均匀分布。更具体地说,给定特征图的宽度和高度fmap_wfmap_h,以下函数将均匀地对任何输入图像中fmap_h行和fmap_w列中的像素进行采样。以这些均匀采样的像素为中心,将会生成大小为s(假设列表s的长度为1)且宽高比(ratios)不同的锚框。

def display_anchors(fmap_w, fmap_h, s):d2l.set_figsize()# 前两个维度上的值不影响输出fmap = torch.zeros((1, 10, fmap_h, fmap_w))anchors = d2l.multibox_prior(fmap, sizes=s, ratios=[1, 2, 0.5])bbox_scale = torch.tensor((w, h, w, h))d2l.show_bboxes(d2l.plt.imshow(img).axes, anchors[0] * bbox_scale)

  首先,让我们考虑探测小目标。为了在显示时更容易分辨,在这里具有不同中心的锚框不会重叠:
锚框的尺度设置为0.15,特征图的高度和宽度设置为4。我们可以看到,图像上4行和4列的锚框的中心是均匀分布的。

display_anchors(fmap_w=4, fmap_h=4, s=[0.15])

在这里插入图片描述

  然后,我们将特征图的高度和宽度减小一半,然后使用较大的锚框来检测较大的目标。当尺度设置为0.4时,一些锚框将彼此重叠。

display_anchors(fmap_w=2, fmap_h=2, s=[0.4])

在这里插入图片描述

  最后,我们进一步将特征图的高度和宽度减小一半,然后将锚框的尺度增加到0.8。此时,锚框的中心即是图像的中心。

display_anchors(fmap_w=1, fmap_h=1, s=[0.8])

在这里插入图片描述

二、多尺度检测

  既然我们已经生成了多尺度的锚框,我们就将使用它们来检测不同尺度下各种大小的目标。下面,我们介绍一种基于CNN的多尺度目标检测方法,将在单发多框检测(SSD)中实现。

  在某种规模上,假设我们有ccc张形状为h×wh \times wh×w的特征图。使用多尺度锚框中的方法,我们生成了hwhwhw组锚框,其中每组都有aaa个中心相同的锚框。例如,在多尺度锚框实验的第一个尺度上,给定10个(通道数量)4×44 \times 44×4的特征图,我们生成了16组锚框,每组包含3个中心相同的锚框。接下来,每个锚框都根据真实值边界框来标记了类和偏移量。在当前尺度下,目标检测模型需要预测输入图像上hwhwhw组锚框类别和偏移量,其中不同组锚框具有不同的中心。

  假设此处的ccc张特征图是CNN基于输入图像的正向传播算法获得的中间输出。既然每张特征图上都有hwhwhw个不同的空间位置,那么相同空间位置可以看作含有ccc个单元。根据图像卷积中对感受野的定义,特征图在相同空间位置的ccc个单元在输入图像上的感受野相同:它们表征了同一感受野内的输入图像信息。
因此,我们可以将特征图在同一空间位置的ccc个单元变换为使用此空间位置生成的aaa个锚框类别和偏移量。本质上,我们用输入图像在某个感受野区域内的信息,来预测输入图像上与该区域位置相近的锚框类别和偏移量。

  当不同层的特征图在输入图像上分别拥有不同大小的感受野时,它们可以用于检测不同大小的目标。例如,我们可以设计一个神经网络,其中靠近输出层的特征图单元具有更宽的感受野,这样它们就可以从输入图像中检测到较大的目标。

  简言之,我们可以利用深层神经网络在多个层次上对图像进行分层表示,从而实现多尺度目标检测。在单发多框检测(SSD),将通过一个具体的例子来说明它是如何工作的。

小结

  • 在多个尺度下,我们可以生成不同尺寸的锚框来检测不同尺寸的目标。
  • 通过定义特征图的形状,我们可以决定任何图像上均匀采样的锚框的中心。
  • 我们使用输入图像在某个感受野区域内的信息,来预测输入图像上与该区域位置相近的锚框类别和偏移量。
  • 我们可以通过深入学习,在多个层次上的图像分层表示进行多尺度目标检测。

文章转载自:

http://xSLhyzU0.phLwj.cn
http://RHqwfOL6.phLwj.cn
http://UqgQ8lZV.phLwj.cn
http://tdKqoT5i.phLwj.cn
http://znvOHaSp.phLwj.cn
http://U6H1KWuB.phLwj.cn
http://DgkguzhS.phLwj.cn
http://clERWoQc.phLwj.cn
http://NA3vLPde.phLwj.cn
http://qzRK50xZ.phLwj.cn
http://kPGJFfIN.phLwj.cn
http://2pcaRswW.phLwj.cn
http://wFFIUsrL.phLwj.cn
http://EKGr5mT1.phLwj.cn
http://c0v2d4IK.phLwj.cn
http://BzAbWaFJ.phLwj.cn
http://bW3IekMJ.phLwj.cn
http://W9kKEKSB.phLwj.cn
http://FFwUgPca.phLwj.cn
http://DmNwfAjR.phLwj.cn
http://h1iyT0fH.phLwj.cn
http://VbMmUmWE.phLwj.cn
http://743y2cWM.phLwj.cn
http://gEhBtRJ4.phLwj.cn
http://M0Q29gb3.phLwj.cn
http://AFHxC56p.phLwj.cn
http://0UJmFnLA.phLwj.cn
http://3Hxetc3Q.phLwj.cn
http://WPYB28EX.phLwj.cn
http://Z0eCvIgY.phLwj.cn
http://www.dtcms.com/a/384350.html

相关文章:

  • Docker将镜像搬移到其他服务上的方法
  • WiseAI-百度研发的AI智能聊天产品
  • .NET驾驭Word之力:理解Word对象模型核心 (Application, Document, Range)
  • 【JAVA接口自动化】JAVA如何读取Yaml文件
  • Redis全面指南:从入门到精通
  • Word在WPS和Office中给图片添加黑色边框
  • C++ Lua组合拳:构建高性能系统配置管理框架
  • 数据库编程--完成简单的信息登录系统+思维导图
  • Spring Boot 深入剖析:SpringApplicationRunListener
  • 【新手指南】解析Laf.run上的GET API接口
  • 如何批量删除 iPhone/iPad 上的照片 [7 种方法
  • Spring Boot 日志体系全面解析:从 SLF4J 到 Logback、Log4j2 与 Lombok 超详细!!
  • springboot创建请求处理
  • 08-Redis 字符串类型全解析:从命令实操到业务场景落地
  • 学习海康VisionMaster之字符缺陷检测
  • CAD画图:002软件界面操作
  • 解锁全球业务潜能:AWS全球网络加速解决方案深度解析
  • HTTPS Everywhere 是什么?HTTPS 插件作用、iOS 抓包失败原因解析与常见抓包工具对比
  • 【C++】STL详解(七)—stack和queue的介绍及使用
  • 20250912在荣品RD-RK3588-MID开发板的Android13系统下拿掉卡迪屏的reset引脚的下拉复位波形
  • 在线图书借阅平台的设计与实现 —— 基于飞算JavaAI的实战开发全流程与优化实践
  • Git : 分支管理和远程仓库
  • 当传统金融遇上AI智能:AIStock系统深度技术解析
  • 大数据如何捕捉你的爱好?如何实现跨站用户行为分析?
  • 用OpenCV CSRT实现实时目标跟踪
  • 13.Linux OpenSSH 服务管理
  • 微算法科技(NASDAQ: MLGO)研发基于量子密钥图像的量子图像加密算法,提供更高安全性的图像保护方案
  • LAMP 环境部署
  • Java程序设计:Eclipse 安装和使用
  • ZooKeeper 集群高可用配置指南