Vision Transformers for Dense Prediction论文笔记

news2024/7/4 4:28:28

文章目录

  • Vision Transformers for Dense Prediction, ICCV, 2021
  • 一、背景介绍
  • 二、网络结构
  • 三、实验结果
      • 1.语义分割实验
      • 2.消融实验

Vision Transformers for Dense Prediction, ICCV, 2021

一、背景介绍

本篇论文主要提出一种网络,基于Transformer去进行密集预测。

众所周知,对于密集预测任务,常见的网络架构为Encoder+Decoder结构。当Encoder提取的特征有损时,Decoder很难去进行恢复。但是目前常用的卷积网络架构常常使用下采样方式,**逐步增加感受野,将低级特征分组为抽象的高级特征,同时确保网络的内存和计算需求保持易于处理。**但是,下采样有一个明显的缺点,特征分辨率和粒度(我感觉这里的粒度像是细粒度特征)在模型的更深层特征丢失,在Decoder中难以恢复。虽然,特征分辨率和粒度对于图像分类这种任务可能影响不大,但是对于密集预测任务如语义分割而言却是极为重要的。

目前为了缓解特征和粒度的丢失,不少方法被提出来,如以更高的输入分辨率进行训练(如果计算预算允许)、扩张卷积 [51] 以快速增加感受野而无需下采样、适当放置从编码器的多个阶段到解码器的跳过连接,或者,更多最近,通过在整个网络中并行连接多分辨率表示。 作者认为这些方法始终没有脱离使用卷积,故作者想要使用Transformer,如ViT来进行特征提取。

作者认为与全卷积网络不同,视觉转换器主干在计算初始化图像嵌入后放弃显示下采样操作,并在所有处理阶段保持具有恒定维度的表示。此外,他在每个阶段都有一个全局感受野。

二、网络结构

在这里插入图片描述

还是类似Swin Transformer有着上下采样操作。

Encoder部分就是直接使用的VIT,不同点在于作者令patch大小为16x16,输入维度为768(ViT-Base)和1024(ViT-Large)。作者这样解释道说768已经大于等于16x16x3了,这也就意味着可以保留对任务有益的信息。

Decoder部分,作者分别先选取ViT中的四个Transformer block的输出,通过Ressemble模块先把特征转化为卷积能够处理的特征,之后进行上采样或下采样,然后通过Fusion模块将这4个层的特征连接起来。这样便得到最终的输出了,但最终的输出尺寸大小并不是输入图片的原图大小,而是原图的一半。后续会根据具体任务添加不同的Head。

Ressemble模块分为三个部分Read,这个部分就是对于readout token如何处理,因为接下来要通过Concatenate模块将Transformer Block的输出转化为卷积能够处理的特征,故需要从原来的 R N p + 1 × D R^{N_p+1\times D} RNp+1×D变成 R N p × D R ^{N_p\times D} RNp×D。关于readout token如何处理作者提出了三种解决方案:

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

Concatenate模块就比较简单了,之前Transformer Block输出特征维度是 R N p × D R^{N_p\times D} RNp×D,而卷积需要的特征维度是类似于 H × W × C H\times W\times C H×W×C,这就需要进行转化了,因为Transformer Block输出特征始终令token个数 N p = H W / p 2 N_p=HW/p^2 Np=HW/p2。故只需要reshape类似的操作即可。接下来便是需要进行上下采样得到不同尺度的特征了,这里作者使用了卷积进行下采样,反卷积进行上采样(密集预测常见做法,因为ViT每个Transformer Block模块输出特征尺寸一样,且 p = 16 p=16 p=16,故需要使用其它方法进行上下采样,这里作者是基于卷积,而Swin Transformer却不是基于卷积)。

最后就是不同尺度的特征融合模块Fusion了。这个模块内容就简单很多了,其中的Residual Conv Unit模块就是一个残差卷积模块。Resample模块使用的是线性插值。

class ResidualConvUnit(nn.Module):
    """Residual convolution module."""

    def __init__(self, features):
        """Init.

        Args:
            features (int): number of features
        """
        super().__init__()

        self.conv1 = nn.Conv2d(
            features, features, kernel_size=3, stride=1, padding=1, bias=True
        )

        self.conv2 = nn.Conv2d(
            features, features, kernel_size=3, stride=1, padding=1, bias=True
        )

        self.relu = nn.ReLU(inplace=True)

    def forward(self, x):
        """Forward pass.

        Args:
            x (tensor): input

        Returns:
            tensor: output
        """
        out = self.relu(x)
        out = self.conv1(out)
        out = self.relu(out)
        out = self.conv2(out)

        return out + x

class FeatureFusionBlock(nn.Module):
    """Feature fusion block."""

    def __init__(self, features):
        """Init.

        Args:
            features (int): number of features
        """
        super(FeatureFusionBlock, self).__init__()

        self.resConfUnit1 = ResidualConvUnit(features)
        self.resConfUnit2 = ResidualConvUnit(features)

    def forward(self, *xs):
        """Forward pass.

        Returns:
            tensor: output
        """
        output = xs[0]

        if len(xs) == 2:
            output += self.resConfUnit1(xs[1])

        output = self.resConfUnit2(output)

        output = nn.functional.interpolate(
            output, scale_factor=2, mode="bilinear", align_corners=True
        )

        return output

三、实验结果

由于我只对语义分割比较熟悉,故只看了语义分割的相关实验,当然消融实验也看了。

在此,先说一下因为论文通过最后一个Fusion输出的特征图只有原图的1/2,故需要添加Head将特征图上采样到原图大小。

	    head = nn.Sequential(
            nn.Conv2d(features, features, kernel_size=3, padding=1, bias=False),
            nn.BatchNorm2d(features),
            nn.ReLU(True),
            nn.Dropout(0.1, False),
            nn.Conv2d(features, num_classes, kernel_size=1),
            Interpolate(scale_factor=2, mode="bilinear", align_corners=True), # 上采样两倍
        )

        self.auxlayer = nn.Sequential(
            nn.Conv2d(features, features, kernel_size=3, padding=1, bias=False),
            nn.BatchNorm2d(features),
            nn.ReLU(True),
            nn.Dropout(0.1, False),
            nn.Conv2d(features, num_classes, kernel_size=1),
        )

1.语义分割实验

在这里插入图片描述

其中ViT-Large因为数据集相对较小,故性能相对较差。此外,在Table 5中作者在小数据集上进行了微调结果还是挺不错的。下面的可视化结果可以发现DPT 倾向于产生更清晰和更细粒度的对象边界描绘,并且在某些情况下预测也不会那么混乱。
在这里插入图片描述

2.消融实验

这里面有个实验我是比较感兴趣的,就是Inference resolution。下面我们来看看消融实验都干了些啥。

  • Skip connections: 作者探讨了ViT不同层的输出,得到结果发现从包含低级特征的层以及包含高级特征的更深层中挖掘特征是有益的。

在这里插入图片描述

  • Readout token: 作者方案中提供了三种readout token处理方式,效果如下。
    在这里插入图片描述

  • Backbones:
    在这里插入图片描述

  • Inference speed:

在这里插入图片描述

  • Inference resolution: 虽然全卷积架构在其最深层可以具有较大的有效感受野,但靠近输入的层是局部的并且具有较小的感受野。因此,当以与训练分辨率明显不同的输入分辨率执行推理时,性能会受到严重影响。另一方面,Transformer 编码器在每一层都有一个全局感受野。我们推测这会降低 DPT 对推理分辨率的依赖。为了检验这个假设,我们绘制了在高于 384 × 384 像素训练分辨率的分辨率下执行推理时不同架构的性能损失。我们在图 4 中绘制了相对于在训练分辨率下执行推理的性能的相对性能下降。我们观察到,随着推理分辨率的增加,DPT 变体的性能确实下降得更加优雅。
    在这里插入图片描述

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

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

相关文章

SpringBoot 集成webSocket

pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …

IT软件行业用契约锁实现“代理-销售-投标-项目-合作”电子签

IT软件行业产品销售渠道多、销售订单体量大&#xff0c;从产品研发、销售到项目实施&#xff0c;伴随着大量的协议、合同、单据需要与员工、客户或者经销商签署。引入电子签章&#xff0c;化解纸质合同签署带来的效率、成本、安全等问题&#xff0c;成为软件行业产品代理、销售…

Vector - CAPL - Panel面板_01

前面有过简单的介绍panel面板的功能&#xff0c;不过终究感觉有点简陋&#xff0c;最近也在搞PyQT5&#xff0c;发现如果对于这块了解不多的情况下&#xff0c;想要做一些东西的话&#xff0c;简直无从下手&#xff0c;因此专门翻阅了之前的文章&#xff0c;查看了下确实缺少了…

ChatGPT自动化提高工作效率: 2分钟快速生成思维导图

一、简要说明 ChatGPT不止是一个聊天机器人&#xff0c;更是一个自然语言处理、文本内容生成模型&#xff0c;它可以理解语言规则&#xff0c;不仅仅是给你输出已有的知识内容&#xff0c;还会给到你一些创意点子&#xff1b;所以我们应该学会如何使用它&#xff0c;让它更好的…

集合例题,

package com.hspedu.homework;import java.util.*;/*** author 韩顺平* version 1.0*/ SuppressWarnings({"all"}) public class Homework03 {public static void main(String[] args) {Map m new HashMap();m.put("jack", 650);//int->Integerm.put(&…

STL源码剖析-六大部件, 部件的关系,复杂度, 区间表示

C标准库-体系结构与内核分析 根据源代码来分析 介绍 自学C侯捷老师的STL源码剖析的个人笔记&#xff0c;方便以后进行学习&#xff0c;查询。 为什么要学STL&#xff1f;按侯捷老师的话来说就是&#xff1a;使用一个东西&#xff0c;却不明白它的道理&#xff0c;不高明&…

分享一个Vue输入框获取焦点自动选中指令

需求背景&#xff1a;最近项目中遇到很多输入类控件&#xff0c;且有频繁改动需求&#xff0c;如果数值过长&#xff0c;则需要一直按着删除键&#xff0c;于是想能不能获取焦点的时候&#xff0c;就直接选中&#xff0c;这样就可以直接删除了 1、思路分析 记得很早的时候做小…

顺序表的实现

思维导图&#xff1a; 一&#xff0c;顺序表 一&#xff0c;顺序表的创建&#xff08;位置&#xff1a;头文件内&#xff09; 1.1顺序表的结构体类型 要求&#xff1a;创建顺序表并使这个顺序表能够存放数据&#xff0c;能记录有效数据的个数&#xff0c;能够记录容量大小。…

记 ==> 首次使用rabbitMQ优化项目

昨天刚学习完了rabbitMQ&#xff0c;刚好我的项目有个模块挺符合使用rabbitMQ进行异步处理的。 这个模块大概功能是&#xff1a;用户发送的所有帖子都会添加到他的发件箱&#xff0c;当有个新用户关注了他&#xff0c;他发件箱内所有的博客都会被添加到关注他的用户的收件箱里…

binkw32dll缺失怎么办?如何解决binkw32dll修复问题

binkw32dll缺失怎么办&#xff1f;在使用某些计算机游戏或应用程序时&#xff0c;您可能遇到过binkw32dll缺失的问题。这意味着您的计算机无法找到该DLL文件&#xff0c;从而无法正常运行程序。在本文中&#xff0c;我们将探讨binkw32.dll缺失的可能原因并提供解决方案。 一.什…

python flask 接口平台开发

文章目录descFlaskFlask-SQLAlchemyflasggerdesc 考虑到开发的便捷性、生态的丰富程度&#xff0c;用Flask、Flask-SQLAlchemy、flasgger等编写一套简单易用的接口平台 这里记录以下这几个组件的使用方式 Flask 轻量、灵活&#xff0c;相比Django不用遵循太多的开发规范 F…

SSM整合的基本思路梳理

SSM整合的简单思路流程 基本思路 我在整合的时候一般习惯从MyBatis开始向上构建&#xff0c;也就是在开始一个项目的时候先将DAO层搭建起来&#xff0c;再向上整合Spring以及SpringMVC。按照这个流程&#xff0c;可以做出一个比较简单的大致流程作为参考&#xff0c;帮助我们…

企业为什么要做网站?这篇文章告诉你

在如今数字化的时代&#xff0c;企业为什么要做网站&#xff1f;这个问题一直都是企业主和市场营销人员必须要考虑的问题。本文将以一个真实的案例为例&#xff0c;解析为什么企业要做网站以及如何通过网站提升业务和品牌的影响力。 案例背景 以一家小型私人医疗诊所为例&…

【神经网络】tensorflow实验4--Matplotlib数据可视化

1. 实验目的 ①掌握Matplotlib绘图基础 ②运用Matplotlib&#xff0c;实现数据集的可视化 ③运用Pandas访问数据集 2. 实验内容 ①绘制散点图、直方图和折线图&#xff0c;对数据进行可视化 ②下载波士顿数房价据集&#xff0c;并绘制数据集中各个属性与房价之间的散点图&#…

人人可用的敏捷指标工具!Kyligence Zen 正式发布 GA 版

4 月 11 日&#xff0c;Kyligence 指标平台产品发布会成功召开。发布会上&#xff0c;一站式指标平台 Kyligence Zen 正式推出 GA 版&#xff0c;接下来这款人人可用的敏捷指标工具将以更加完善、成熟、稳定的产品性能与功能解决企业面临的指标管理、分析和应用痛点 &#xff0…

【信息论】一、信息与信息论

“The fundamental problem of communication is that of reproducing at one point either exactly or approximately a message selected at another point.” —— Claude Elwood Shannon 1.1 信息的定义 什么是信息&#xff1f;它与消息、信号之间有什么区别和联系&#…

指纹识别q

1、指纹传感器 FTIR(Frustrated Total Internal Reflection)&#xff0c;受抑全内反射。在屏幕的夹层中加入LED光线&#xff0c;当用户按下屏幕时&#xff0c;使夹层的光线造成不同的反射效果&#xff0c;感应器接收光线变化而捕捉用户的施力点。 明显的缺点&#xff1a;体积太…

弹塑性力学--应变硬化

在单轴拉伸试验中&#xff0c;当应力超过屈服强度后&#xff0c;需要施加更大的载荷产生更大的应力&#xff0c;才会使材料发生更多的塑性变形。随着塑性应变的增加&#xff0c;材料变得更强、更难以变形了&#xff0c;因此这个阶段称为“应变硬化”&#xff08;Strain Hardeni…

数据库----------唯一约束、默认约束、零填充约束

目录 1.唯一约束&#xff08;Unique&#xff09; 1.概念 2.语法 3.添加唯一约束 4.删除唯一约束 2.默认约束(default) 1.概念 2.语法 3.添加默认约束 4.删除默认约束 3.零填充约束&#xff08;zerofill&#xff09;了解即可 1.概念 2.操作 3.删除 1.唯一约束&…

如来十三掌(与佛论禅、Rot13编码)

下载附件打开是一串... 佛经 666 这个编码方式还真是第一次遇见----与佛论禅 对文本进行与佛论禅密码解密 得到 MzkuM3gvMUAwnzuvn3cgozMlMTuvqzAenJchMUAeqzWenzEmLJW9 根据题目提示&#xff0c;如来十三掌&#xff0c;猜测是rot13加密&#xff0c;进行rot13解码 得到 Z…