SETR 学习记录

这篇论文的实验与对实验结果的分析都十分详细,实验部分不仅细节详细,而且实验考虑了多种情况进行对比,可以从实验结果中得到各种结论,

研究背景

当时语义分割最常用的网络结构是FCN的结构:编码器-解码器。用编码器学习特征表示,用解码器进行像素基级别的分类。
基于CNN的模型大多通过堆叠卷积层来构成编码器,可以学习到更加全局/抽象的特征,但有限的感受野依然会限制其在全局上下文信息的表现。
为了克服这些限制,一种方法还是通过卷积操作,例如大的卷积核、特征金字塔等等;另一种方法是在FCN中引入注意力机制,注意力机制可以对图像的全局进行建模,让模型在全局特征上有更好的表现。
但上述方法都没有摆脱FCN结构的性质:编码器不断对输入图像进行下采样,获得用于语义分割的低分辨率特征,然后解码器就将这些低分辨率特征上采样到原始分辨率的分割图中。

贡献

提出了一种encoder的替代方案,用Transformer来替代堆叠的卷积层作为encoder。将输入图像视为一组patch的序列,输入到Transformer中。输入图像在Transformer中不会降低分辨率,这与CNN是有本质不同的。利用Transformer,可以不需要像CNN那样降低分辨率就可以在每层都学习全局特征。
得到Transformer的输出后,使用解码器将分辨率恢复为原始,文中提出了三种复杂程度不同的解码器:Navie、PUP、MLA

网络

网络的整体结构如图所示,可以看到整个网络由Transformer与Decoder构成。
下面分别介绍encoder与decoder。
在这里插入图片描述

Encoder

网络中使用的encoder为ViT,查看ViT来学习,这里就不过多追溯。
关键是其中的参数,在这里,作者使用的是ViT-Large/16作为编码器,参数:patch_size=16,num_layer=24,embed_dim=1024,num_head=16。
这些参数在decoder中很重要。

Decoder

作者在论文中提出了三种复杂程度不同的解码器,分别为Naive、PUP与MLA。

Naive

通过1x1卷积+ReLU+1x1卷积将通道数变为num_class,然后再通过一个线性上采样恢复为原始分辨率

PUP

首先将Transformer的输出进行reshape:HW/256 x 1024 -> H/16 x W/16 x 1024
然后使用多个卷积层与2x上采样将图像恢复为H x W x num_class
在这里插入图片描述

MLA (Multi-Level feature Aggregation)

①:在Transformer中,按照特定的步长提取出特定的Transformer Layer的输出 Z Z Z,这里以6为步长,提取了 Z 6 , Z 12 , Z 18 . Z 24 Z^6,Z^{12},Z^{18}.Z^{24} Z6,Z12,Z18.Z24,每个尺寸都为HW/256 x 1024
②:对每个 Z Z Z进行Reshape,变为H/16 x W/16 x 1024,然后通过一个1x1的卷积层,通道数减半,变为H/16 x W/16 x 512
③:从第二层开始,每层与上层数据进行融合。
④:首先经过一个3x3的卷积,不改变尺寸与通道数;再经过一个3x3的卷积,通道数减半,变为H/16 x W/16 x 256,最后在经过一个4x的线性上采样,每个 Z Z Z变为H/4 x W/4 x256
⑤:将各个 Z Z Z进行拼接(concat),变为H/4 x W/4 1024,然后进行一个3x3的卷积,让通道数变为类别数,1024 -> num_class;最后进行一次4x的双线性上采样,让分辨率恢复为原始图像,H x W x num_class
在这里插入图片描述

实验

实验细节

消融实验

在这里插入图片描述
通过分析Table2的数据可以得到以下观点:

  1. Cityscapes数据集中 SETR-PUP表现的最好,这可能是因为MLA不具有特征金字塔那样的优势
  2. 使用ViT-Large的效果优于使用ViT-Base
  3. 虽然在样本为40K时,SETR-PUP-Base的指标低于Hybrid-Base。但是达到80K时,优于Hybrid-Base,这证明了FCN中的编码器是可以被替代的
  4. 预训练模型是重要的。随机初始化的SETR-PUP的IoU很低,使用了预训练的ViT或DeiT,指标就高很多。

在这里插入图片描述

对比实验

对比不同模型在不同数据上的表现
可以得到以下结论:

  1. SeTR模型在不同数据集上都是优于其它的
  2. PUP与MLA在指标上相差,但PUP的实现更加简单,因此很多代码都是使用PuP
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
03-14
目前提供的引用内容并未提及与 `SETR` 相关的技术信息或具体用法。然而,在 C++ 或其他编程语言中,通常不存在名为 `SETR` 的标准库函数或关键字。以下是可能的情况分析: ### 可能的解释 1. **拼写错误** 如果是指某个特定功能或方法名称,则可能是输入有误。例如,常见的设置属性的方法通常是 `setXxx()` 形式的命名约定[^5]。 2. **自定义函数或宏** 在某些项目或框架中,开发者可能会定义类似的标识符作为自定义函数或宏。这种情况下,需查阅项目的源码文档以确认其作用和用法。 3. **领域专用术语** 若 `SETR` 是某一特定领域的缩写或专有名词(如硬件驱动程序、嵌入式开发或其他高级应用),则需要进一步了解该领域的背景知识。 ### 假设场景下的实现示例 假设 `SETR` 是一种用于设置资源的抽象函数,下面是一个简单的伪代码示例来展示如何设计此类接口: ```cpp class Resource { public: void SETR(int value) { // 自定义 SEQR 方法 this->value = value; std::cout << "Resource set to: " << value << std::endl; } private: int value; }; int main() { Resource res; res.SETR(42); // 调用自定义方法 return 0; } ``` 上述代码片段展示了如何在一个类中定义并调用类似于 `SETR` 的成员函数[^6]。 ### 缺乏上下文的信息补充建议 由于当前缺乏关于 `SETR` 的确切描述及其所属环境的具体细节,请提供更多线索以便更精准地解答问题。例如: - 它属于哪种编程语言? - 是否来自某第三方库或者工具链? ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值