深度学习目标检测算法之RetinaNet算法

文章目录

  • 前言
  • RetinaNet 算法原理
    • 1.RetinaNet 简介
    • 2.backbone 部分
    • 3.FPN特征金字塔
    • 4.分类和预测
    • 5.Focal Loss
  • 结束语


  • 💂 个人主页:风间琉璃
  • 🤟 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联系博主
  • 💬 如果文章对你有帮助欢迎关注点赞收藏(一键三连)订阅专栏

前言

提示:这里可以添加本文要记录的大概内容:

在RetinaNet之前,目标检测领域普遍认为one-stage算法,如YOLO系列和SSD,在准确性上不及two-stage算法,如Faster R-CNN。这种差异主要源于以下两个原因:

  • two-stage算法的流程包括使用RPN(Region Proposal Network)生成一系列的建议框,随后在这些建议框的基础上利用Fast R-CNN进行精细化调整,这一双阶段的设计使得结果更为精确。
  • 样本不平衡问题在one-stage算法中尤为突出。在Faster R-CNN中,正负样本的比例被明确设定为1:3,而one-stage算法中的正负样本比可能极端失衡,有时甚至达到1:1000。这种不平衡导致在训练过程中,梯度主要被简单样本所驱动,而复杂样本因为占比小,在损失函数的计算中被大量简单样本的影响所淹没。

RetinaNet的提出,在一定程度上解决了这一问题,它使得one-stage算法也能达到与two-stage算法相媲美的准确性。RetinaNet 原始论文为发表于 2017 ICCV 的 Focal Loss for Dense Object Detection。one-stage 网络首次超越 two-stage 网络,拿下了 best student paper,仅管其在网络结构部分并没有颠覆性贡献。

论文地址:https://arxiv.org/pdf/1708.02002.pdf


RetinaNet 算法原理

1.RetinaNet 简介

单阶段目标检测经过不断发展,虽然在检测速度上能够满足实时性的要求,但在精度上与 R-CNN 系列为代表的两阶段目标检测仍有着一定的差距。一个主要原因是正负样本数量的不均衡,对训练过程产生负面影响, He 等人提出基于Focal Loss的RetinaNet 模型,来改善样本间的不均衡性,以达到两阶段检测方法同等的精度。
在这里插入图片描述
如上图所示,RetinaNet 网络主要由ResNet主干网络FPN特征金字塔分类子网络边框回归子网络组成。其中,主干网络由 ResNet 与 FPN 共同构成,以实现对目标的特征提取分类子网络与边框回归子网络分别负责对== FPN 输出的特征图进行目标分类与位置回归==。在锚点的设计上,为了使锚框与目标边框的重合度更高, RetinaNet 设置了三种长宽比为 1:2、 1:1、 2:1,尺寸为 2 0 、 2 1 / 3 、 2 2 / 3 2^0、2^{1/3}、2^{2/3} 2021/322/3 的锚框,并使锚框的大小跟随特征层的增加而增加,使之能够匹配不同特征层上大小尺度不同的目标。

2.backbone 部分

在这里插入图片描述
RetinaNet的网络结构如图所示,与FPN网络相比,FPN在构建过程中融合了C2层的特征,而RetinaNet则跳过了C2层。这一省略是出于对计算资源的有效利用考虑,因为C2层产生的P2特征图会显著增加计算的复杂度。因此,RetinaNet的设计者选择了从C3层直接开始生成P3特征图。

RetinaNet的backbone部分与FPN在结构上相似,在P6特征图的生成上,RetinaNet的实现与原始论文描述的不同。原论文建议通过最大池化操作来下采样C5层的特征图以获得P6,而在实际的pytorch实现中,采用了一种更为高效的方法——通过一个3×3的卷积层来进行下采样。RetinaNet与FPN在特征图的尺度上也有所不同。FPN构建了一个从P2到P6的特征金字塔,而RetinaNet则构建了一个从P3到P7的特征金字塔。

3.FPN特征金字塔

深度神经网络学习到的特征中,浅层特征学到的是物理信息,如物体的角点、边缘的细节信息,而深层特征学到的是语义信息,更加high-level和抽象化。对于分类任务来说,深层网络学到的特征可能更为重要,而对于定位任务来说,深层次和浅层次的特征同样重要,因为要想精准的定位,浅层的物理细节信息是必不可少的。
在这里插入图片描述
FPN之前的目标检测算法,多数只采用顶层特征来做预测,所含的细节信息比较粗略,即使采用了特征融合的方法,也一般是采用融合后的特征进行预测的。FPN提出了特征金字塔网络,可以在不同的特征层上独立进行预测。FPN 通过自下向上、自上向下以及横向连接,可以融合不同层的特征图,得到更加丰富的信息,如上图所示。
在这里插入图片描述

  • 图(a)
    先对原始图像构造图像金字塔,然后对图像金字塔的每一层提取不同的特征并进行相应的预测。优点:精度不错;缺点:计算量大,占用内存大。

  • 图(b)
    通过对原始图像进行卷积和池化操作来获得不同尺寸的特征图,在图像的特征空间中构造出金字塔。因为浅层的网络更关注于细节信息,高层的网络更关注于语义信息,更有利于准确检测出目标,因此利用最后一个卷积层上的feature map来进行预测分类。优点:速度快、内存少。缺点:仅关注深层网络中最后一层的特征,却忽略了其它层的特征。

  • 图(c )
    在图(b)的基础之上,同时利用低层特征和高层特征,首先在原始图像上面进行深度卷积,然后分别在不同的特征层上面进行预测。优点:在不同的层上面输出对应的目标,不需要经过所有的层才输出对应的目标(即对于有些目标来说,不用进行多余的前向操作),速度更快,又提高了算法的检测性能。缺点:获得的特征不鲁棒,都是一些弱特征(因为很多的特征都是从较浅的层获得的)。

  • 图(d)
    FPN(Feature Pyramid Network)即特征金字塔:自下而上,自上而下,横向连接和卷积融合
    (1)自下而上:即神经网络的前向传播过程,特征图经过卷积核计算,通常会越变越小。对于ResNet,使用每个阶段的最后一个residual block输出的特征激活输出。对于conv2,conv3,conv4和conv5输出,将这些最后residual block的输出表示为{C2,C3,C4,C5},如下图所示,并且它们相对于输入图像具有{4, 8, 16, 32} 的步长。由于其庞大的内存占用,不会将conv1纳入金字塔中。
    (2)自上而下把更抽象、语义更强的高层特征图进行上采样(upsampling),而横向连接则是将上采样的结果和自底向上生成的相同大小的feature map进行融合(merge)。横向连接的两层特征在空间尺寸相同,这样做可以利用底层定位细节信息。将低分辨率的特征图做2倍上采样(为了简单起见,使用最近邻上采样)。然后通过按元素相加,将上采样映射与相应的自底而上映射合并。这个过程是迭代的,直到生成最终的分辨率图。 为了开始迭代,只需在C5上附加一个1×1卷积层来生成低分辨率图P5。最后,在每个合并的图上附加一个3×3卷积来生成最终的特征映射,这是为了减少上采样的混叠效应。这个最终的特征映射集称为{P2,P3,P4,P5},分别对应于{C2,C3,C4,C5},它们具有相同的尺寸。 由于金字塔的所有层次都像传统的特征化图像金字塔一样使用共享分类器/回归器,因此在所有特征图中固定特征维度(通道数,记为d),文中设置d = 256,因此所有额外的卷积层都有256个通道的输出。
    (3)横向连接:采用1×1的卷积核进行连接(减少特征图数量)。
    在这里插入图片描述

在RetinaNet网络中,输入特征经ResNet50骨干网络特征提取后,送入FPN特征金字塔中进行特征融合,以得到目标的多尺度信信息,丰富特征语义。 RetinaNet 中的特征金字塔对 FPN 部分改进,FPN 接收 C3、 C4、 C5 特征图,输出 P3-P7 五个特征图,其中 P5 上采样和 P4 进行融合, P4 上采样与 P3 进行融合, P6 和 P7 为 P5 下采样得到,目的是增大感受野,获得图片的全局信息,具体结构如下图所示。
在这里插入图片描述

4.分类和预测

在这里插入图片描述
融合后的特征层送入分类子网络(Class Subnet)边界框子网络(Box Subnet)中,分类子网络中先进行 4 次卷积核为 256 的 3×3 的卷积操作,并且在每次卷积后都使用一次 Relu 激活函数,再进行一次卷积核为K×A3×3 卷积操作,其中== K 为目标的类别数==,== A 为锚框的数量==,最后使用 Softmax 函数得到每个锚框的置信度,训练时候选择达到置信度阈值的锚框使用Focal Loss计算分类损失,并对网络进行学习优化,分类子网络和边界框框子网络之间不共享参数,但对特征层之间实现参数共享。

5.Focal Loss

基于回归的目标检测算法由于没有候选区域生成这一步骤,因此在使用锚点对目标进行预测时,会出现正负样本不平衡和难易样本不平衡问题,这将使简单负样本占据网络模型训练中的大部分损失值,导致网络模型的优化效果不佳,影响网络模型对难样本的训练,进而使得网络模型对目标的检测效果不好。

重点标记性文字设置
具体的标记性正文
具体的标记性正文
具体的标记性正文
具体的标记性正文
具体的标记性正文
具体的标记性正文

结束语

感谢阅读吾之文章,今已至此次旅程之终站 🛬。

吾望斯文献能供尔以宝贵之信息与知识也 🎉。

学习者之途,若藏于天际之星辰🍥,吾等皆当努力熠熠生辉,持续前行。

然而,如若斯文献有益于尔,何不以三连为礼?点赞、留言、收藏 - 此等皆以证尔对作者之支持与鼓励也 💞。

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

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

相关文章

代码学习记录29----贪心算法

随想录日记part29 t i m e : time: time: 2024.03.27 主要内容:今天深入学习贪心算法,接下来是针对题目的讲解:1. 无重叠区间 2.划分字母区间 3. 合并区间 435. 无重叠区间763.划分字母区间56. 合并区间 T…

堆排序基础知识

堆排序基础知识 一、引言二、堆的基本概念三、堆排序的基本思想四、堆排序的详细过程五、堆排序的性能分析六、堆排序的应用七、堆排序的优缺点八、堆排序的实现技巧九、总结与展望 一、引言 堆排序是一种有效的排序算法,它的核心在于使用了一种称为“堆”的数据结…

计算机组成原理-6-计算机的运算方法

6. 计算机的运算方法 文章目录 6. 计算机的运算方法6.1 机器数的表示6.1.1 无符号数和有符号数6.1.2 有符号数-原码6.1.3 有符号数-补码6.1.4 有符号数-反码6.1.5 有符号数-移码6.1.6 原码、补码、反码的比较 6.2 数的定点表示和浮点表示6.2.1 定点表示6.2.2 浮点表示6.2.3 ΔI…

Day20:LeedCode 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

654. 最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums …

Manacher算法学习笔记(洛谷题单 Part 5.3 Manacher)

0.随便说说 字符串学的太差了,每次字符串算法都是学完了就忘,正好上场 c f d i v 1 B cfdiv1B cfdiv1B考了一个 M a n a c h e r Manacher Manacher,就先复习它了。 1.一些概念 子串 ( s u b s t r i n g ) (substring) (substring)&#…

dump文件分析OOM及线程堆栈

OutOfMemoryError (OOM) 如果项目报错: OutOfMemoryError: Java heap space,说明堆内存空间(Heap Space)中没有足够的空间来分配对象了。 一旦发生 OOM,系统有可能不可用,或者频繁重启。属于非常严重的问题…

kubernetes负载均衡资源-Ingress

一、Ingress概念 1.1 Ingress概念 使用NodePort类型的Service可以将集群内部服务暴露给集群外部客广端,但使用这种类型Service存在如下几个问题。 1、一个端口只能一个服务使用,所有通过NodePort暴露的端口都需要提前规划;2、如果通过NodePort暴露端口过多,后期维护成本太…

语法回顾-《Verilog编程艺术》之数据类型

目录 线网(net) 变量(variable) 线网和变量的区别 向量 数组 参考《Verilog 编程艺术》魏家明著 线网(net) 用于表示结构体(如逻辑门)之间的连接。除了 trireg 之外&#xff…

基于单片机病房温度监测与呼叫系统设计

**单片机设计介绍,基于单片机病房温度监测与呼叫系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机病房温度监测与呼叫系统设计概要主要涵盖了通过单片机技术实现病房温度的实时监测以及病人呼叫功能…

【启发式算法】同核分子优化算法 Homonuclear Molecules Optimization HMO算法【Matlab代码#70】

文章目录 【获取资源请见文章第4节:资源获取】1. 算法简介2. 部分代码展示3. 仿真结果展示4. 资源获取 【获取资源请见文章第4节:资源获取】 1. 算法简介 同核分子优化算法(Homonuclear Molecules Optimization,HMO)是…

pytorch+tensorboard

安装依赖 pip install teorboard pip install torch_tb_profiler了解teorboard 记录并可视化标量[组]、图片[组]。 如何使用 第一步:构建模型,记录中间值,写入summarywriter 每次写入一个标量add_scalar 比如: from torch.utils.tensorboard import SummaryWriter wr…

【Linux】进程地址空间详解

前言 在我们学习C语言或者C时肯定都听过老师讲过地址的概念而且老师肯定还会讲栈区、堆区等区域的概念,那么这个地址是指的物理内存地址吗?这里这些区域又是如何划分的呢? 我们在使用C语言的malloc或者C的new函数开辟空间时,开辟…