EDTER:融合transformer的边缘检测网络

原文链接:EDTER

首先回顾viT部分:

和ViT一样,先把图像分割为P*P大小的patch,分别经过映射得到tokens:patch embeddings。后面也加了ViT一样的position embedding,得到combined embeddings。

ViT中的Transformer Encoder:encoder包括L个transformer blocks:每个block包括一个多头自注意力操作MSA、线性感知层MLP、两个层归一化LN。而且每个block都使用了剩余连接residual connection。L个blocks是前后堆叠。

在前向传播中:

MSA并行进行M个头的自注意力计算,将他们的输出concat,然后经过一个映射。

在这里插入图片描述

其中每个头中得到一个y_sa,过程为:上一个transformer block L-1的输出output,在这里输入,首先进行层归一化LN,然后经过矩阵映射W_Q,W_K,W_V为Q,K,V(C维变为U维),然后通过pairwise-similarity分别计算两两向量之间的相似度,得到加了attention 权重的最后输出y_sa:
在这里插入图片描述

本文中的头数M=16。

EDTER的stage I: global context modeling

这部分得到的是图像的全局特征:还是包括transformer encoder和decoder。

将图像分割为16*16patches,映射为tokens,经过encoder计算global attetnion。

encoder:和viT一样,有24个 attention blocks。每个block输出一个Z(patch个数,C),拼起来得到一个global context feature (sequence). 这个sequence上采样,得到高分辨率图,输入给decoder。

decoder:希望能产生像素级别的表征,用于检测边缘。所以设计了BiMLA Decoder。

这个decoder的整体结构上是双方向的,top-down和bottom-up。

先把encoder的transformer block分为4组,获取他们的输出(第6,12,18,24个)。

先把Z reshape为三维:(高,宽,C)。

对top-down: 先经过两个卷积:1*1,3*3得到输出特征t6,12,18,24。(这部分借鉴了SETR-MLA)说的top-down指的是从24到6,一次把1*1卷积后(3*3卷积前)得到的特征,除了向前传播,还相加加在下一层1*1卷积后得到的特征上。

对bottom-up: 也是每个经过3*3卷积,得到b_6,12,18,24。只不过在3*3卷积前,把特征从6到24,依次相加。

和SETR-MLA不同于,所有上采样用的不是双线性插值,而是deconvolution块(+BN+ReLU)。

注意,top-down和bottom-up两个模块是基本独立的。一开始的1*1卷积得到特征后,分别输入两个模块进行操作。每个模块操作4个特征,最后合起来得到8个特征。这八个concat一起,最后经过卷积层来融合提取特征。(这块能借鉴CNN的coFusion吗)最后输出的f_g是像素级别的global特征(大小和输入图像大小一样)

注意:这里说是decoder,但是没用attention机制。

EDTER的stage II: local refinement(这块除了输入更细,和stage I区别不大,能不能设计更关注细节,比如用更多的conv?之前好像看到过这样的)

局部细化,希望得到的edge是单像素。一般会想到将每个像素用作一个token,但是计算成本很大。本文提出用不重叠的window在图上采样,计算采样区域的attention。(除了这个还有别的办法吗)

每个window内的patch数量是固定的。(因为这里主要关注局部,所以用window是符合的)

本文把一张图的H,W分别除以2,得到4个window。

(global和local能不能复用一部分,只不过进行encoder时,用attention内部不同的操作去关注global和local)

每个window再细分为8*8的patches(论文中这里得到16个小的patches),把他们输入给一个local transformer encoder。要注意的是,这里每个window得到的patches,都输入给同一个encoder。

local encoder用了12个transformer blocks。

和stage I类似,也是将transformer输出分4组,分别取其中一组Z_3,Z_6,Z_9, Z_12.然后输入该decoder,得到高分辨率图像。和stage I不同的是,这里decoder 里面卷积用的是1*1卷积(为了避免padding操作,3*3覆盖了增加的边缘,导致产生本来没有的边缘)

(这片论文是先学global,后学local。我能不能先local,然后global?比如local使用boundry attention,然后这个作为先验,学习global联系,平滑、连接这些边缘)

最后融合两个模块的Fusion Module

这块把global context作为先验知识,调制local context(既然前者作为先验知识,且目标是全局信息更好,能不能用显著性等数据集训练。或者有什么其他办法能更关注全局,我目前认为他的全局只在于输入更粗)

包括一个spatial feature transform block和两个卷积层。前者为了调制lcoal context,后者为了平滑。得到的输出再输入给一个lcoal decision head(1*1卷积+sigmoid 函数),输出edge map

训练:

分阶段,先训练stage I,然后固定I,训练II。

stage I的训练:

global 模块也有一个global decision head,用他的输出pred,计算loss,训练这一块。

而且这里还用了侧边输出,把decoder的中间特征4个t和4个b经过同样的处理(4*4反卷积和16*16反卷积),也和GT计算loss加到总loss中。(感觉真的是用尽了边缘检测所有的技巧,CNN那几篇也是几乎都用了侧边输出loss)

loss用的是HED的loss。

对于BSDS数据集,GT有多个。对这个的处理:对一个像素,把多个label归一化,得到edge prob map。然后选定一个阈值,如果prob大于阈值就看做positive样本(即边缘)。

Stage II的训练:

固定stageI。

和StageI一样使用了侧边训练,一样的loss方式。

实行细节:

用了ViT的预训练权重。(所以我最好也能使用一些已有的backbone,因为能用他们的预训练权重)

消融实验:

对每个模块进行消融实验:

除了ViT的encoder,主要对decoder和FFM进行消融实验。

Decoder的消融实验:和借鉴的SETR-MLA对比有提升:好像只是把上采样换成了Deconv(这么看来,应该是先缝合已有的模块,训练得到不错的结果,然后再替换其中的一些模块来提点?)

FFM的消融实验:比较有无这块的效果(理论上多了这块,当然能提升,只能说明模型并没有过拟合,所以加了块才能提升拟合能力或模型容量)

对训练方式进行消融实验:

只训练stageI,加stageII,加stageIII(当然能提升)

你可能感兴趣的:(论文阅读笔记,transformer,网络,深度学习)