分割与检测模型

1 SegFormer

SegFormer两个特点:

  1. 和其他基于transformer的分割模型不一样,Segformer是一种分层结构,能够输出多尺度的特征,并且不需要位置编码。
  2. SegFormer不需要复杂的编码器,直接使用MLP来聚合多尺度的特征。

架构图:

SegFormer会把图像分割成4×4的patch,用比较小的patch会对密集型预测任务比较友好。

Overlapped Patch Merging

在patchify的时候,有一个特色,在ViT里,是把大小为\(N\times N\times3\)(N为patch的大小)patch转换为\(1\times1\times C\)。同样SegFormer为了实现这种多层级的特征,也可以按照这样的操作,把\(2\times2\times C_i\)和为\(1\times1\times C_{i+1}\)。但是这样的方法破坏了patch之间的连续性,因此作者使用overlapped patch merging的方式进行patch之间的融合,具体来说作者采用\(K=7,S=4,P=3\)(K为patchsize,S为步长,P为padding),通过这样的设置,可以生成和nonoverlapping一样大小的特征。

Efficient Self-Attention

将key的数量削减,对于序列\(K\),维度为\(N\times C\),首先做一个reshape,调整为\(\frac{N}{R}\times({C\cdot R})\),然后经过一个linear,调整为\(\frac{N}{R}\times C\),保持query的数量不变,这样计算复杂度变为\(O(\frac{N^{2}}{R}).\)

Mix_FFN

ViT会用位置编码来编码不同位置的patch,但是如果对于别的分辨率的图片,使用位置编码会导致性能退化。作者认为PE是没用的。作者使用的是zero padding,然后在FFN里使用Conv,从来获取位置信息。

\[\mathbf{x}_{out}=\mathrm{MLP}(\mathrm{GELU}(\mathrm{Conv}_{3\times3}(\mathrm{MLP}(\mathbf{x}_{in}))))+\mathbf{x}_{in},\]

Lightweight All-MLP Decoder

把计算之后的每个多级特征,都经过一个MLP,投影为通道\(C\),然后上采样至尺寸为\(\frac{W}{4}\times\frac{W}{4}\),然后将得到的4个特征Concat,然后投影至通道数为\(C\),在经过MLP,投影到通道数为\(N_{cls}\).

2 SETR

创新点:

传统的分割模型都是类似于FCN一样的Encoder-Decoder架构,在Encoder阶段,都是像金字塔一样逐层削减空间分辨率(可以控制计算量、扩大单个像素感受野),作者把分割任务转换成一个sequence to sequence的任务,在encoder结构中,并没有对空间分辨率逐层下采样。

Methods:

  • Encoder:H✖️W✖️C的图片变为H/16✖️W/16✖️C,从而序列化为(HW/256)✖️C的二维矩阵,然后送进Transformer,期间保持空间分辨率不变
  • Decoder:
    • Naive Upsampling:把(HW/256)✖️C向量,先投影到和分类类别一致(比如CityScapes就投影到19),然后通过通过conv+ReLU+conv,然后最后直接upsample到和原图大小一致
    • Progressive Upsampling:刚刚那种方法,直接upsample太粗糙了,这次是采用每次上采样2x,共上采样四次。
    • Multi-level Feature Aggregation:Encoder有4个Stage,每个stage都有一个输出,对于每一个stage:都先经过1×1,3×3,3×3的conv(第一个和第三个conv会减半通道),然后上采样4倍。最后,从上至下逐元素相加,在最后一层得到最后结果,然后继续上采样4x

MaskFormer

之前的语义分割模型都是逐像素分类,对每一个像素都施加一个loss。但是在实例分割上,由于逐像素分割的类别是固定的,所以对于实例分割任务,具有架构上的隔离。在maskformer之前,做实例分割的Mask RCNN,其实是一种检测模型,它是经过检测之后,生成“thing”类别的检测框,送进mask head去生成0-1mask,因此这种方式做不了语义分割,因为语义分割还要求分类出背景(Stuff类别),而且mask rcnn是双阶段的的

maskformer就是一个能统一语义、实例、全景分割的模型,并且是端到端的。

Mask Classification

类似于DETR,使用N个(远多于GT数量)query,产生N个prediction,然后和GT使用匈牙利算法寻找最优偶匹配,让下列匹配损失最小的就是最优匹配:

\[-p_i(c_j^{\mathrm{gt}})+\mathcal{L}_\mathrm{mask}(m_i,m_j^{\mathrm{gt}})\]

找到最优匹配\(\sigma\)之后,对于这个最优匹配计算损失,然后反向传播

\[\mathcal{L}_{\mathrm{mask-cls}}(z,z^{\mathrm{gt}})=\sum_{j=1}^N\left[-\log p_{\sigma(j)}(c_j^{\mathrm{gt}})+1_{c_j^{\mathrm{gt}}\neq\varnothing}\mathcal{L}_{\mathrm{mask}}(m_{\sigma(j)},m_j^{\mathrm{gt}})\right].\]

MaskFormer

Pixel-Level Module

先经过backbone(ResNet/Swin-Transformer),编码为\(\mathcal{F}\in\mathbb{R}^{C_{\mathcal{F}}\times\frac{H}{S}\times\frac{W}{S}}\),然后经过一个pixel decoder,这里是一个FPN结构,逐层上采样为\(\mathcal{E}_{\mathrm{pixel}}\in\mathbb{R}^{C\varepsilon\times{H\times W}}\)的per-pixel embedding,值得注意的是,所有基于像素分类的分割模型都符合像素级模块设计,包括近期基于Transformer的模型。MaskFormer可无缝将此类模型转换为掩码分类模型。

Transformer Module

使用N个learnable posional embedding作为query,使用类似于DETR Decoder的结构,解码出N个per-segment embedding,里面内含maskformer预测的每个segment的全局信息、语义信息。

Segmentation Module

K个类别,K+1个类别是多了一个“无物体”类别,因为预测的query数量要大于图片中真实物体的数量。

首先,per-segment-embedding经过一个mlp,会输出N个K+1维度的向量,表示各个segment的预测class的类别概率分布,同时,per-segment embedding也会经过一个mlp,这个会输出\({\mathcal{E}_\mathrm{mask}}\in\mathbb{R}^{C_{\mathcal{E}}\times N}\),因为要做分割任务,所以要结合丰富细节信息的pixel-level module输出的per-pixel embedding相乘,\(m_i[h,w]=\operatorname{sigmoid}(\mathcal{E}_\mathrm{mask}{[:,i]^\mathrm{T}}\cdot\mathcal{E}_\mathrm{pixel}{[:,h,w]}).\),产生N个mask。这样一来,mask的产生和分类是分开进行的,区别于传统的per pixel model

DETR

模型结构

  1. Backbone:输出一个2048×H0/32×W0/32大小的特征图
  2. Encoder:首先把C=2048投影到d,H=H0/32,W=W0/32,得到(H×W)×d的矩阵,送到标准encoder里
  3. Decoder:区别于普通的标准transformer,DETR的decoder是并行解码N个query,并且这几个query是一个可学习的参数,并且无需加入位置编码

Loss

首先使用匈牙利算法找到pred和gt之间的最优偶匹配

\[\hat{\sigma}=\arg\min_{\sigma\in\mathfrak{S}_N}\sum_i^N\mathcal{L}_{\mathrm{match}}(y_i,\hat{y}_{\sigma(i)}),\]

\(\hat{\sigma}\)是找到的最优匹配,就是一个最优映射,让上述式子最小,对于第i个gt的框,其在所有预测框中,匹配最优的是第\(\hat{\sigma}(i)\)个预测框。\(\mathcal{L}_{\mathrm{match}}(y_i,\hat{y}_{\sigma(i)})\)的计算公式是:

\[\mathcal{L}_{\mathrm{match}}(y_i,\hat{y}_{\sigma(i)})=-\mathbb{1}_{\{c_{i}\neq\varnothing\}}\hat{p}_{\sigma(i)}(c_{i})+\mathbb{1}_{\{c_{i}\neq\varnothing\}}\mathcal{L}_{\mathrm{box}}(b_{i},\hat{b}_{\sigma(i)})\]

\({\hat{p}}_{\sigma(i)}(c_{i})\)就是对于第i个gt框,其第\(\sigma(i)\)个预测框是类别\(c_{i}\)的概率,\(c_{i}\)是GT。

匈牙利损失

我们在找到最优映射\(\hat{\sigma}\)之后,可以计算匈牙利损失,让一一匹配上的框的位置、和预测类别损失最小

\[\mathcal{L}_{\mathrm{Hungarian}}(y,\hat{y})=\sum_{i=1}^{N}\left[-\log\hat{p}_{\hat{\sigma}(i)}(c_{i})+\mathbb{1}_{\{c_{i}\neq\emptyset\}}\mathcal{L}_{\mathrm{box}}(b_{i},\hat{b}_{\hat{\sigma}}(i))\right]\]

其中Bounding Box的Loss为L1 loss和IoU Loss加权平均,防止仅仅使用l1 loss在小尺寸框和大尺寸框上的loss的scale不一致

\[\lambda_{\mathrm{iou}}\mathcal{L}_{\mathrm{iou}}(b_{i},\hat{b}_{\sigma(i)})+\lambda_{\mathrm{L}1}||b_{i}-\hat{b}_{\sigma(i)}||_{1}\]

Overall Loss

最终整体的loss由两部分组成,一部分是之前的匈牙利损失,也就是匹配上的目标损失,但是object query往往远大于真是目标数量,所以会有很多没匹配上的,因此需要让这些没匹配上的框,让其类别和“无目标”这一类别趋近,如果没有这一限制,没有机制鼓励模型把“不存在目标的位置”预测为背景,模型可能会输出一堆“低置信度但非背景”的预测,导致误检。

\[\mathcal{L}_{\mathrm{DETR}}\left(y,\hat{y}\right)=\underbrace{\sum_{i=1}^{N}\left[-\log\hat{p}_{\sigma(i)}\left(c_{i}\right)+\mathbf{1}_{\{c_{i}\neq\mathbb{Z}\}}\mathcal{L}_{\mathrm{box}}\left(b_{i},\hat{b}_{\sigma(i)}\right)\right]}_{\text{匹配目标损失}}+\underbrace{\lambda_{\mathrm{noobj}}\sum_{j\not\in\mathrm{matched}}\left(-\log\hat{p}_{j}\left(\varnothing\right)\right)}_{\text{未匹配预测根的背景损失}}\]

DAB-DETR

DETR有两个问题,query含义并不清楚,不可解释,二是模型收敛慢。本来这应该是两个独立问题,不过后来我们发现,DETR收敛慢很大程度上来自于query含义的不明。

在原始的DETR文章中的object query画的比较简单,可能会让人觉得query就是一组向量:

但是实际上是由两组向量组成,我们称之为content querypositional query(这两个名字由conditional detr提出。)这里画出来了encoder和decoder中的attention的组成部分。

可以看到,encoder和decoder里attention和query和key都是由两部分组成的,比如encoder里的query分别来自于图像特征(包含语义信息)和位置编码(包含位置信息),因此这两部分分别称为content query(对应图像特征)和positional query(对应位置编码)。key和query完全相同。value只有图像特征这一语义部分。

再看decoder,decoder的key和value与encoder的组成完全相同,但是query则不同。query的语义部分来自于decoder embeddings,对应上层的输入,是由图像特征组合来的。而位置部分则来自于learnable queries,这是与我们看DETR的框架图后的第一反应不同的。因此decoder的learnable query实际指代的是位置信息。

但是DETR里的object query根本就没有先验知识,模型要学出来object query里的位置信息,需要很大的训练量,并且可能收敛不到最优解,因此DAB-DETR显示的将object query用anchor boxes的信息表示。

  • 在self attn里,xywh通过正弦编码,正弦编码会输出D/2维向量,因此xywh concat之后会产生2D向量,然后通过MLP将其投影回D维,和Decoder Embedding相加
  • 在cross attn里,Q来自于xy的正弦编码和content query的乘积,作者说使用content query可以“rescale the positional embeddings”
  • 每一个layer的输出,会产生xywh的四个偏移量,用于更新xywh,从而一层层的refine

DN-DETR

DETR把目标检测做成了一个set prediction的问题,并利用匈牙利匹配Hungarian matching)算法来解决decoder输出的objects和ground-truth objects的匹配。因此,匈牙利算法匹配的离散性和模型训练的随机性,导致ground-truth的匹配变成了一个动态的、不稳定的过程。
因此,DN-DETR使用一个denoising task作为一个shortcut来学习相对偏移,它跳过了匹配过程直接进行学习。如果我们把query像上述一样看作四维坐标,可以通过在真实框附近添加一个微小的扰动作为噪声,这样我们的denoising task就有了一个清晰的目标–直接重建真实框而不需要匈牙利匹配。

在DAB-DETR的基础上实现DN-DETR,因为DAB-DETR是DN之前最强的模型之一,而且它显示的把decoder query表示为四维坐标很适合添加denoising training。

沿着Conditional DETR,之后的工作如DAB-DETR都把decoder query设计成了content queryposition query。为了更大限度利用denoising training,我们把content query输入为label embedding,对label也添加噪声进行reconstruct。因为denoising只是一种training方式,不会改变模型结构,只是在输入的时候做了一些改变,如下图所示,我们把decoder embedding(content query)表示为加了noise的label, anchor(position query)表示为加了noise的bbox。对于DETR原始的匹配部分,我们可以添加一个 [Unknown] label来进行区分,anchor部分保持DETR的方式不变

denoising

  1. Label Denoising:我们以一定概率随机把真实label翻转为其余的任何一个label。如COCO中有80个类别,我们以一定概率将其翻转为80个中的其他label。加入label的方法类似NLP中的word embedding,把80个类别进行embedding即可。
  2. box noise:box的noise可以分为两类,即中心点漂移(center shifting)和框缩放(box scaling)。对于中心点漂移,我们可以保证中心点仍然在真实框内部并进行漂移。对于框缩放,可以随机缩放框的长和宽。漂移的强度和缩放的大小控制都由超参数进行控制。
  3. attention mask:除了加noise之外,在decoder的self attention我们需要加一个额外的attention mask防止信息泄露。因为denoising部分包含真实框和真实标签的信息,直接让matching part看到denoising part会导致信息泄漏。因此,训练的时候matching part不能看到denoising part,像原始模型一样训练。额外增加的denoising part看或者不看到matching part对结果影响不大,因为denosing部分含有最多的真实框和标签。

这样一来,query就由两部分明确含义的组成,一部分是class,一部分是bbox

DINO

DINO融合了DAB-DETR和DN-DETR,

  • DAB让我们意识到query的重要性,那么如何学到更好的或者初始化更好的query?
  • DN引入了去噪训练来稳定标签分配,如何进一步优化标签分配?

为了解决上面提到的问题,DINO进一步提出了3个改进来进行优化,模型架构如上图所示。

Contrastive Denoising

DN的去噪训练里面引入的噪声样本都是正样本来进行学习,然而模型不仅需要学习到如何回归出正样本,还需要意识到如何区分负样本。例如,DINO的decoder中用了900个query,而一张图中一般只会有几个物体,因此绝大部分都负样本。

因此,我们设计了训练模型识别负样本的方法,如上图所示,我们对DN进行了改进,不仅要回归真实框,还需要辨别负样本。对于DN的输入当对真实框加入了较大噪声时,我们就认为其为负样本,在去噪训练中会被监督不预测物体。同时,这些负样本恰好是在真实框附近的,因此是相对很难区分难的负样本,让模型得以学习的正负样本的区分问题。

Mixed Query Selection

在大部分detr模型中,query是从数据集中学习出来的,随机初始化,并不和输入图片相关。为了更好得初始化decoder query,deformable detr提出用encoder的dense feature中预测出类别和框,并从这些密集预测中选出一些有意义的来初始化decoder feature。

然而,这种方式并没有在后来的工作中得到广泛运用,我们对这种方式进行了一些改进并重新强调其重要性。在query中,我们实际更关心position query,也就是框。同时,从encoder feature中选取的feature作为content query对于检测来说并不是最好的,因为这些feature都是很粗糙的没有经过优化,可能有歧义性。例如对“人”这个类别,选出的feature可能只包含人的一部分或者人周围的物体,并不准确,因为它是grid feature。

因此,我们对此进行了改进,让position query从encoder feature中初始化得来,保持content query是可学习的。。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇