原文链接: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(当然能提升)