目标检测之多尺度融合

news2024/12/28 18:26:02

多尺度

卷积神经网络通过逐层抽象的方式来提取目标的特征,其中一个重要的概念就是感受野。
高层网络的感受野比较大,语义信息表征能力强,但是特征图的分辨率低,几何信息的表征能力弱(空间几何特征细节缺乏);
低层网络的感受野比较小,几何细节信息表征能力强,虽然分辨率高,但是语义信息表征能力弱。
高层的语义信息能够帮助我们准确的检测或分割出目标,而低层的细节信息可以准确地包含物体位置信息。
高层与低层特征即为不同尺度。

常见应用不同尺度

在这里插入图片描述
(a) Featurized image pyramid:这种方式就是先把图片弄成不同尺寸的,然后再对每种尺寸的图片提取不同尺度的特征,再对每个尺度的特征都进行单独的预测,这种方式的优点是不同尺度的特征都可以包含很丰富的语义信息,但是缺点就是时间成本太高。

(b) Pyramid feature hierarchy:这是SSD采用的多尺度融合的方法,即从网络不同层抽取不同尺度的特征,然后在这不同尺度的特征上分别进行预测,这种方法的优点在于它不需要额外的计算量。而缺点就是有些尺度的特征语义信息不是很丰富,此外,SSD没有用到足够低层的特征,作者认为低层的特征对于小物体检测是非常有帮助的。

© Single feature map:这是在SPPnet,Fast R-CNN,Faster R-CNN中使用的,就是在网络的最后一层的特征图上进行预测。这种方法的优点是计算速度会比较快,但是缺点就是最后一层的特征图分辨率低,不能准确的包含物体的位置信息。

FPN 特征金字塔(Feature Pyramid Network)

而FPN则是融合了以上三种特点提出的多尺度融合模型

为了使得不同尺度的特征都包含丰富的语义信息,同时又不使得计算成本过高,FPN就采用top down和lateral connection的方式,让低层高分辨率低语义的特征和高层低分辨率高语义的特征融合在一起,使得最终得到的不同尺度的特征图都有丰富的语义信息。

特征金字塔的结构主要包括三个部分:bottom-up,top-down和lateral connection
在这里插入图片描述

Bottom-up

Bottom-up的过程就是将图片输入到backbone ConvNet中提取特征的过程中。Backbone输出的feature map的尺寸有的是不变的,有的是成2倍的减小的。对于那些输出的尺寸不变的层,把他们归为一个stage,那么每个stage的最后一层输出的特征就被抽取出来。以ResNet为例,将卷积块conv2, conv3, conv4, conv5的输出定义为{ C2,C3,C4,C5 } ,这些都是每个stage中最后一个残差块的输出,这些输出分别是原图的{1/4,1/8,/1/16 ,1/32}倍,所以这些特征图的尺寸之间就是2倍的关系。

Top-down

Top-down的过程就是将高层得到的feature map进行上采样然后往下传递,这样做是因为,高层的特征包含丰富的语义信息,经过top-down的传播就能使得这些语义信息传播到低层特征上,使得低层特征也包含丰富的语义信息。本文中,采样方法是最近邻上采样,使得特征图扩大2倍。上采样的目的就是放大图片,在原有图像像素的基础上在像素点之间采用合适的插值算法插入新的像素,在本文中使用的是最近邻上采样(插值)。这是最简单的一种插值方法,不需要计算,在待求像素的四个邻近像素中,将距离待求像素最近的邻近像素值赋给待求像素。设待求像素的坐标为**(i+u,j+v)** ,( i,j 为正整数, u,v 为大于零小于1的小数),则待求像素灰度的值 的计算方式如下图所示:
在这里插入图片描述
如果 (i+u,j+v) 落在A区域内,即 u<0.5,v<0.5 ,则将a点的像素值赋给待求像素,同理,落在B区则将b点的像素值赋给待求像素,落在C区则赋予c点的像素值,落在D区则赋予d点的像素值。最邻近法计算量较小,但可能会造成插值生成的图像灰度上的不连续,在灰度变化的地方可能出现明显的锯齿状。

Lateral connection

如下图所示,lateral connection主要包括三个步骤:

(1) 对于每个stage输出的feature map Cn,都先进行一个1*1的卷积降低维度。

(2) 然后再将得到的特征和上一层采样得到特征图 Pn+1进行融合,就是直接相加,element-wise addition。因为每个stage输出的特征图之间是2倍的关系,所以上一层上采样得到的特征图的大小和本层的大小一样,就可以直接将对应元素相加 。

(3) 相加完之后需要进行一个33的卷积才能得到本层的特征输出 Pn 。使用这个33卷积的目的是为了消除上采样产生的混叠效应(aliasing effect),混叠效应应该就是指上边提到的‘插值生成的图像灰度不连续,在灰度变化的地方可能出现明显的锯齿状’。在本文中,因为金字塔所有层的输出特征都共享classifiers/ regressors,所以输出的维度都被统一为256,即这些3*3的卷积的channel都为256。
在这里插入图片描述

应用

Feature Pyramid Network for RPN

下图所示为Faster R-CNN中的RPN的网络结构,接收单尺度的特征输入,然后经过33的卷积,并在feature map上的每个点处生成9个anchor(3个尺寸,每种尺寸对应3个宽高比),之后再在两个分支并行的进行11卷积,分别用于对anchors进行分类和回归。这是单尺度的特征输入的RPN。
在这里插入图片描述
所以将FPN和RPN结合起来,那RPN的输入就会变成多尺度的feature map,那我们就需要在金字塔的每一层后边都接一个RPN head(一个33卷积,两个11卷积),如下图所示,其中 P6 是通过 P5 下采样得到的。
在这里插入图片描述
在生成anchor的时候,因为输入是多尺度特征,就不需要再对每层都使用3种不同尺度的anchor了,所以只为每层设定一种尺寸的anchor,图中绿色的数字就代表每层anchor的size,但是每种尺寸还是会对应3种宽高比。所以总共会有15种anchors。此外,anchor的ground truth label和Faster R-CNN中的定义相同,即如果某个anchor和ground-truth box有最大的IoU,或者IoU大于0.7,那这个anchor就是正样本,如果IoU小于0.3,那就是负样本。此外,需要注意的是每层的RPN head都参数共享的。

YOLOV3

在这里插入图片描述

FPN进阶增强版PANet

PANet采用的是R-CNN系列Two-Stage检测模型

PANet 最大的贡献是提出了一个自顶向下和自底向上的双向融合骨干网络,同时在最底层和最高层之间添加了一条“short-cut”,用于缩短层之间的路径。PANet还提出了自适应特征池化(Adaptive Features Pooling)和全连接融合(Fully-connected Fusion)两个模块。其中自适应特征池化可以用于聚合不同层之间的特征,保证特征的完整性和多样性,而通过全连接融合可以得到更加准确的预测mask。

PANet的网络结构如图1所示,它由5个核心模块组成。其中(a)是一个FPN,(b)是PAN增加的自底向上的特征融合层,(c)是自适应特征池化层,(d)是PANet的bounding box预测头,(e)是用于预测掩码的全连接融合层。

自底向上

在这里插入图片描述

PANet在FPN的自上向下的路径之后又添加了一个自底向上的路径,通过这个路径PANet得到[N2,N3,N4,N5] 共4个Feature Map。PANet的融合模块如下图所示,它通过一个更浅层的 Ni 和更深层的 Pi+1 融合的方式得到它的下一层 ,以 N2 到 N3 的计算为例,它的代码片段如下。它先通过一个步长为 2 的 33 卷积对 N2 进行降采样,再通过单位加的方式将P3和降采样之后的Feature Map进行特征融合。接着再使用一个 33 的卷积对特征进行融合,增加融合之后的特征的表征能力。最后使用ReLU激活函数对特征进行非线性化。在PANet中,N3,N4,N5 均是采用上面的融合方式,而 N2 是直接复制的 P2 的值。

N3 = KL.Add(name="panet_p3add")([P3, KL.Conv2D(256, (3, 3), strides=2,             padding="SAME", name="panet_n2downsampled")(N2)])
N3 = KL.Conv2D(256, (3, 3), padding="SAME", name="panet_n3")(N3)
N3 = KL.Activation('relu')(N3)

在这里插入图片描述
此外PANet还在自顶向下模块和自底向上模块各添加了一个跨越多层的shortcut,如图1中的红色和绿色虚线。用于缩短层之间的路径。

RPN

因为PANet是一个双阶段的检测模型,因此它也使用了RPN结构。在RPN中它的输入是[P2, P3, P4, P5, P6]。RPN部分的细节和Faster R-CNN保持一致。

自适应特征池化

在FPN中,每个Feature Map都会输出一个预测结果。FPN这么做的原因是出于感受野和网络深度成正比的关系,即网络越深,网络上的像素点的感受野越大。但其实不同的层次的Feature Map的不同特性并不仅仅只有感受野,还有它们不同的侧重点,基于这个思想,PANet提出了融合所有层的Feature Map的池化操作:自适应特征池化层。

自适应特征池化如图4所示。它先将通过RPN提取的ROI压缩成一维的特征向量,然后通过取max或者取和的方式进行不同Feature Map的融合,最后在融合之后的基础上进行bounding box和类别的预测。

class AdaptiveFeaturePooling(KE.Layer):
    def __init__(self, **kwargs):
        super(AdaptiveFeaturePooling, self).__init__(**kwargs)
    def call(self, inputs):
        x2, x3, x4, x5 = inputs
        x = tf.maximum(tf.maximum(x2, x3), tf.maximum(x4, x5))
        # x = tf.add_n([x2, x3, x4, x5])
        return x
    def conpute_output_shpae(self, input_shape):
        return input_shape[0]

在这里插入图片描述

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

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

相关文章

深入React源码揭开渲染更新流程的面纱

转前端一年半了&#xff0c;平时接触最多的框架就是React。在熟悉了其用法之后&#xff0c;避免不了想深入了解其实现原理&#xff0c;网上相关源码分析的文章挺多的&#xff0c;但是总感觉不如自己阅读理解来得深刻。于是话了几个周末去了解了一下常用的流程。也是通过这篇文章…

深入了解Spring循环依赖本质

说明: 1. 本文基于Spring-Framework 5.1.x版本讲解 2. 建议读者对创建对象部分源码有一定了解 概述 这篇讲讲Spring循环依赖的问题&#xff0c;网上讲循环依赖的帖子太多太多了&#xff0c;相信很多人也多多少少了解一点&#xff0c;那我还是把这个问题自己梳理一遍&#xff…

kubernetes,service详解下

kubernetes&#xff0c;service详解下 HeadLiness类型的Service 在某些场景中&#xff0c;开发人员可能不想使用Service提供的负载均衡功能&#xff0c;而希望自己来控制负载均衡策略&#xff0c;针对这种情况&#xff0c;kubernetes提供了HeadLiness Service&#xff0c;这类…

内存分段与内存分页:逻辑地址、物理地址、线性地址、虚拟地址

这篇文章也是我自己的博客网站的里的文章&#xff0c;我觉得这篇文章还是我觉得知识含量比较高的文章&#xff0c;所以特地把它发出来看看。 这篇文章写于我在写自己的操作系统JackOS的时候系统梳理了一下CPU访问内存的各种方式&#xff0c;写完这篇文章之后&#xff0c;我对C…

Kafka高级特性解析之生产者

1、消息发送 1.1、数据生产流程解析 Producer创建时&#xff0c;会创建一个Sender线程并设置为守护线程。生产消息时&#xff0c;内部其实是异步流程&#xff1b;生产的消息先经过拦截器->序列化器->分区器&#xff0c;然后将消息缓存在缓冲区&#xff08;该缓冲区也是在…

Docker桌面版安装与使用(windows)

目录一、Docker概念二、下载安装三、docker镜像安装与操作四、制作自己的python镜像容器五、目录挂载六、多容器通信七、Docker-Compose管理多个容器运行八、发布和部署九、备份数据迁移一、Docker概念 1、Docker 是一个应用打包、分发、部署的工具2、镜像Image、容器Containe…

Windows OpenGL 图像绿幕抠图

目录 一.OpenGL 图像绿幕抠图 1.原始图片2.效果演示 二.OpenGL 图像绿幕抠图源码下载三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基础 Open…

[问题解决方案](多人共同合并场景)git已merge到master分支代码且被同事代码覆盖如何回退

git已merge到master分支代码如何回退&#xff08;多人共同合并&#xff09;场景已经被同事代码覆盖的解决方案&#xff08;无需强制合并权限&#xff09;代码revert后又需要重新启用怎么办如果是未受保护分支代码的回退且只有你一人合并的代码 可以直接使用下面的命令即可如果只…

【Unity3D日常开发】Unity3D中实现不规则Button按钮的精准响应

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客QQ群&#xff1a;1040082875 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在使用Unity3D开发中&#xff0c;可…

全志V853平台Camera模块开发框架详解

Camera 本章节介绍V853平台 Camera 模块的开发。 V853支持并口CSI、MIPI&#xff0c;使用VIN camera驱动框架。 Camera通路框架 VIN支持灵活配置单/双路输入双ISP多通路输出的规格 引入media框架实现pipeline管理 将libisp移植到用户空间解决GPL问题 将统计buffer独立为v…

Web大学生网页作业成品——抗击疫情网站设计与实现(HTML+CSS)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Vue3 样式绑定

Vue3 样式绑定1.Vue.js class2.class 属性绑定3.Vue.js style(内联样式)4.组件上使用 class 属性1.Vue.js class class 与 style 是 HTML 元素的属性&#xff0c;用于设置元素的样式&#xff0c;我们可以用 v-bind 来设置样式属性。 v-bind 在处理 class 和 style 时&#xf…

微信小程序反编译

本文转载于&#xff1a;https://www.cnblogs.com/one-seven/p/15524457.html 微信小程序反编译 微信文件保存位置\WeChat Files\Applet\小程序id_APP_.wxapkg 现在小程序是处于编码状态 github上下载一个python版的解密工具 https://github.com/superdashu/pc_wxapkg_decr…

【免杀前置课——Windows编程】十四、异步IO——什么是异步IO、API定位问题、APC调用队列

异步IO异步IO异步I/0注意事项:定位问题总解决方案APC调用队列异步IO 当我们读取一个文件时&#xff0c;一般情况下&#xff0c;线程是阻塞的&#xff0c;也就是说&#xff0c;当前线程在等待文件读取操作结束,这种方式叫同步IO。 Windows 在系统底层为用户实现了另外一种高效的…

【软考】-- 操作系统(下)

操作系统&#xff08;下&#xff09;第五节 文件管理&#x1f355;一、文件管理的基本概念1️⃣文件2️⃣文件目录3️⃣目录结构:&#x1f354;二、文件路径&#x1f35f;三、文件命名规则&#x1f32d;四、文件的基本操作&#x1f37f;五、文件类型与扩展名&#x1f9c2;六、系…

Docker中安装Kibana

Kibana是一个免费且开放的用户界面,能够让你对Elasticsearch 数据进行可视化,并让你在Elastic Stack中进行导航。你可以进行各种操作,从跟踪查询负载,到理解请求如何流经你的整个应用,都能轻松完成。 在Docker Hub中选择最新版本的Kibaba镜像(选择版本为8.5.1),如下图…

bigquant选股模型主要有哪些?

bigquant选股模型一般常见的有七种&#xff0c;即多因子模型、风格轮动模型、行业轮动模型、资金流模型、动量反转模型、一致预期模型、趋势追踪模型等方面。不过要想样样都学会精通也是需要花费时间&#xff0c;以及精力等&#xff0c;那么&#xff0c;小编就从最基本的多因子…

DPDK Mempool

mempool是DPDK提供的内存池&#xff0c;其用处有&#xff1a; 由于DPDK使用UIO让DMA将网卡中的数据直接拷贝至用户态&#xff0c;因此需要一块固定的区域提供给DMA重复利用内存&#xff0c;提高效率 结构 mempool的主要结构如下图所示。 mempool为每个注册的lcore都分配了一…

Node.js - nvm管理node.js版本

使用nvm来管理node.js的版本真的很方便&#xff0c;这样就可以根据自己的需要来回切换node.js版本&#xff01; 一、卸载本地安装的node.js版本 略 二、安装nvm管理工具 2.1、下载 https://github.com/coreybutler/nvm-windows/releases 2.2 安装 (1) 鼠标双击nvm-setup.exe文件…

【从零开始学习深度学习】7.自己动手实现softmax回归的训练与预测

基于上一篇文章读取fashion-minist数据集的基础&#xff0c;本文自己动手实现一个softmax模型对其进行训练与预测。 目录1. 自己动手实现softmax回归1.1 读取数据1.2 初始化模型参数1.3 实现softmax运算1.4 定义模型1.5 定义损失函数1.6 计算分类准确率1.7 训练模型1.8 预测完整…