论文阅读:Uncertainty-aware Joint Salient Object and Camouflaged Object Detection

论文地址:https://arxiv.org/abs/2104.02628
代码地址:https://github.com/JingZhang617/Joint_COD_SOD
发表于:CVPR 2021

I. Intro
  • 这个网络是用来进行显著目标检测与伪装目标检测的,并且在这两个任务上均达到了SOTA
  • 将Joint Training应用到了两个近乎相反的任务上
II. Data Augmentation

高质量的数据集对于网络的性能有较大的影响。而对于这两个任务,有一个好玩的情况:显著目标检测与伪装目标检测都是要把图中感兴趣的那个东西给标出来,区别在于:

  • 显著目标的前景与背景往往差别很大,此所谓“显著”
  • 伪装目标的前景与背景往往十分相似,否则就不存在“伪装”的说法

这么乍一分析,感觉对于同一张图片,两个任务的标注对象应该不一样,但如果打开COD数据集一个个去看的话,会发现下面这种例子:
在这里插入图片描述
显然这些样本对也完全可以放到SOD数据集里去,而且属于难度较大的那种,加入这种数据去进行SOD的训练确实有可能能提升网络的性能(Robust Learning)。

那么下一个问题就是,怎么去找这些可以放到SOD数据集里的样本?

  • 一种想法是一个个直接人工去看。个人感觉从某种程度上这样做可能效果更好,就是比较花时间(COD10k数据集里有1万张图,感觉大概得整整砸两天进去…)
  • 另一种想法就是怎么拿算法去找了。文中的解决方法很直接,直接找个SOD的网络来inference COD数据集。MAE大的,说明就是那种伪装得特别好的,不能用(感觉用了可能就会污染SOD数据集);MAE小的,说明原有的SOD模型也能处理的比较好,可以拿去训练看看能不能提升性能。

最终的话作者是挑了400对样本(猜测是MAE从小到大排序到400差不多还能用),然后随机替换掉原有SOD数据集中的400组图片,来作为新的SOD数据集。这里个人感觉是不是直接加进去效果会更好,不过也可能是为了公平起见所以来控制训练样本数相同。

如果要分类的话,这倒可以算是一种contrast level augmentation,既然现有SOD数据集中高对比度的图片比较多,也没有什么比较好的调整对比度的方法,那么不如就直接引入一些低对比度的图片。

III. Network Architecture

在这里插入图片描述
个人感觉看起来像个GAN,其中生成器采用的是Encoder-Decoder框架。其他的信息有:

  • Xs : SOD数据集中的图像
  • Xc : COD数据集中的图像
  • E α s E_{\alpha_{s}} Eαs : 用于SOD的Encoder,backbone为ResNet50
  • E α c E_{\alpha_{c}} Eαc : 用于COD的Encoder,backbone为ResNet50
  • Xp : PASCAL VOC 2007数据集中的图像
  • S θ S_{\theta} Sθ: 相似度度量模块
  • G β {G_\beta } Gβ: 共同decoder,能够生成SOD或者COD的预测结果
  • D γ f D_{\gamma}^{f} Dγf: 判别器
IV. Similarity Measure

其实就是网络的这个 S θ {S_\theta } Sθ模块:
在这里插入图片描述
这个东西是干什么用的呢?按照文中的说法,作用是connection modeling,对SOD与COD两个任务之间的关联性进行建模。那么可以回到Xp上来,这个数据集中的图像既送入了SOD Encoder中也送入了COD Encoder中,目的就是提取同一张图片的显著性特征与伪装性特征。这两个特征记为 F α s p F_{\alpha_{s}}^{p} Fαsp F α c p F_{\alpha_{c}}^{p} Fαcp,即 S θ {S_\theta } Sθ的输入,有:

F α s p = { f s 1 p , f s 2 p , f s 3 p , f s 4 p } F_{\alpha_{s}}^{p}=\left\{f_{s 1}^{p}, f_{s 2}^{p}, f_{s 3}^{p}, f_{s 4}^{p}\right\} Fαsp={fs1p,fs2p,fs3p,fs4p} F α c p = { f c 1 p , f c 2 p , f c 3 p , f c 4 p } F_{\alpha_{c}}^{p}=\left\{f_{c 1}^{p}, f_{c 2}^{p}, f_{c 3}^{p}, f_{c 4}^{p}\right\} Fαcp={fc1p,fc2p,fc3p,fc4p}

这里需要注意的一点是只有从Xp中提取来的特征才会送入 S θ {S_\theta } Sθ,Xs、Xc得到的特征是直接送入Decoder的。

由于这 F α s p F_{\alpha_{s}}^{p} Fαsp F α c p F_{\alpha_{c}}^{p} Fαcp都是用ResNet50算出来的,格式相同,因此 S θ {S_\theta } Sθ会先将 F α s p F_{\alpha_{s}}^{p} Fαsp F α c p F_{\alpha_{c}}^{p} Fαcp进行channel-wise的相加,然后再送入同一个全连接层。此时,就可以得到两个latent feature。将SOD的latent feature记为 f s p f^{s p} fsp,COD的latent feature记为 f c p f^{c p} fcp,有:
f s p = S θ ( F α s p ) f^{s p}=S_{\theta}\left(F_{\alpha_{s}}^{p}\right) fsp=Sθ(Fαsp) f c p = S θ ( F α c p ) f^{c p}=S_{\theta}\left(F_{\alpha_{c}}^{p}\right) fcp=Sθ(Fαcp)
latent feature所在latent space的维度设置为了700,这个值是一个经验值。

在讲下一步的操作之前,首先进行一个论证。对于PASCAL VOC中的图像某一张特定图像Xp,其经过SOD、COD处理后激活的区域应该是不一样的,如下所示(即假设PASCAL数据集中以伪装对象为主的图片极少):
在这里插入图片描述
其中第一行表示经SOD处理后的激活区域,第二行表示经COD处理后的激活区域。

然后,对于latent space中的两个latent feature,计算其余弦相似度,得到latent space loss,记为 L latent  \mathcal{L}_{\text {latent }} Llatent ,有:
L latent  = cos ⁡ ( f s p , f c p ) = f s p ⋅ f c p ∥ f s p ∥ × ∥ f c p ∥ \mathcal{L}_{\text {latent }}=\cos \left(f^{s p}, f^{c p}\right)=\frac{f^{s p} \cdot f^{c p}}{\left\|f^{s p}\right\| \times\left\|f^{c p}\right\|} Llatent =cos(fsp,fcp)=fsp×fcpfspfcp

个人对这种做法的理解是,既然SOD与COD关注的区域不一样,那么如果某一区域被SOD激活了,说明该区域不应该被COD激活,反之亦然。通过这么训练,可以使SOD Encoder丢弃一些误识别的背景,COD Encoder丢弃一些误识别的前景。

V. Prediction Decoder

在介绍decoder之前,首先来指出本文标题中Uncertainty的含义。Uncertainty指的是数据集标注的不确定性:
在这里插入图片描述
左边两张图是SOD不确定性的一个例子:对于图片中的网球,在部分标注中可能被视为前景,而在部分标注中可能被视为背景,即saliency的定义不是特别的明确。

右边两张图是COD不确定性的一个例子:对于树叶上的昆虫,其边缘十分精细,难以做到准确的人工标注,即标注的不确定性。

接下来开始看decoder。decoder即网络结构图中的 G β {G_\beta } Gβ在这里插入图片描述
可以看到,SOD与COD的Encoder是共享同一个Decoder的。由于原文并没有放出Decoder的结构示意图,因此在这里用文字的方式介绍Decoder的构成:

  • Re:[1] 一个自顶向下的,带有residual channel attention的模块,用于提取特征
  • Da:[2] dual attention模块,用于融合低级细节特征与高级语义特征,得到初始预测结果
  • Ha:[3] holistic attention模块,用于对初始预测结果进行细化

对于Xs、Xc经各自解码器得到的特征 F α s F_{\alpha_{s}} Fαs F α c F_{\alpha_{c}} Fαc,有:
G init  ( F α s ) = C cla  ( Re ⁡ [ D a ( f 4 s ) , f 4 3 init  s , D a ( f 2 s ) ] ) G_{\text {init }}\left(F_{\alpha_{s}}\right)=C_{\text {cla }}\left(\operatorname{Re}\left[D a\left(f_{4}^{s}\right), f_{43_{\text {init }}}^{s}, D a\left(f_{2}^{s}\right)\right]\right) Ginit (Fαs)=Ccla (Re[Da(f4s),f43init s,Da(f2s)]) G init  ( F α c ) = C cla  ( Re ⁡ [ D a ( f 4 c ) , f 4 3 init  c , D a ( f 2 c ) ] ) G_{\text {init }}\left(F_{\alpha_{c}}\right)=C_{\text {cla }}\left(\operatorname{Re}\left[D a\left(f_{4}^{c}\right), f_{43_{\text {init }}}^{c}, D a\left(f_{2}^{c}\right)\right]\right) Ginit (Fαc)=Ccla (Re[Da(f4c),f43init c,Da(f2c)]) f 43 i n i t = conv ⁡ ( Re ⁡ [ D a ( f 4 ) , D a ( f 3 ) ] ) f_{43i n i t}=\operatorname{conv} \left(\operatorname{Re}\left[D a\left(f_{4}\right), D a\left(f_{3}\right)\right]\right) f43init=conv(Re[Da(f4),Da(f3)])
其中 C cla  C_{\text {cla }} Ccla 为一个3×3卷积,文中写的作用是分类,其实就是将feature map降维至单通道以获得初始结果 G init  G_{\text {init }} Ginit 。接下来就是对粗结果进行细化:
f r 2 = H a ( G init  ( F α ) , f 2 ) , f r 3 = R 3 ( f r 2 ) , f r 4 = R 4 ( f r 3 ) f_{r 2}=H a\left(G_{\text {init }}\left(F_{\alpha}\right), f_{2}\right), f_{r 3}=R_{3}\left(f_{r 2}\right), f_{r 4}=R_{4}\left(f_{r 3}\right) fr2=Ha(Ginit (Fα),f2),fr3=R3(fr2),fr4=R4(fr3) G β ( F α s ) = C c l a ( Re ⁡ [ D a ( f r 4 s ) , f 43 s , f 432 s , conv ⁡ ( f 1 s ) ] ) G_{\beta}\left(F_{\alpha_{s}}\right)=C_{c l a}\left(\operatorname{Re}\left[D a\left(f_{r 4}^{s}\right), f_{43}^{s}, f_{432}^{s}, \operatorname{conv} \left(f_{1}^{s}\right)\right]\right) Gβ(Fαs)=Ccla(Re[Da(fr4s),f43s,f432s,conv(f1s)]) G β ( F α c ) = C c l a ( Re ⁡ [ D a ( f r 4 c ) , f 43 c , f 432 c , conv ⁡ ( f 1 c ) ] ) G_{\beta}\left(F_{\alpha_{c}}\right)=C_{c l a}\left(\operatorname{Re}\left[D a\left(f_{r 4}^{c}\right), f_{43}^{c}, f_{432}^{c}, \operatorname{conv} \left(f_{1}^{c}\right)\right]\right) Gβ(Fαc)=Ccla(Re[Da(fr4c),f43c,f432c,conv(f1c)]) f 43 = conv ⁡ ( Re ⁡ [ D a ( f r 4 ) , D a ( f r 3 ] ) f_{43}=\operatorname{conv} \left(\operatorname{Re}\left[D a\left(f_{r 4}\right), D a\left(f_{r 3}\right]\right)\right. f43=conv(Re[Da(fr4),Da(fr3]) f 432 = conv ⁡ ( Re ⁡ [ D a ( f r 4 ) , f 43 , D a ( f r 2 ) ] ) f_{432}=\operatorname{conv}\left(\operatorname{Re}\left[D a\left(f_{r 4}\right), f_{43}, D a\left(f_{r 2}\right)\right]\right) f432=conv(Re[Da(fr4),f43,Da(fr2)])
这样就得到了Decoder输出的最终结果,其中R3、R4指的是ResNet backbone的1024、2048通道的卷积层。

VI. Adversarial Learning

Adversarial Learning,对抗学习,一个比较典型的例子就是GAN了,对抗样本由Generator来生成。而本文的网络从某种程度上也可以理解成一种GAN:

  • 生成器就是Encoder-Decoder架构的 E α s E_{\alpha_{s}} Eαs E α c E_{\alpha_{c}} Eαc G β {G_\beta } Gβ,最终由输入图像得到了一个SOD/COD预测结果
  • 判别器就是接下来提到的 D γ f D_{\gamma}^{f} Dγf,文中称其作用为Confidence Estimation,目的是区分ground truth与 G β {G_\beta } Gβ生成的预测结果

GAN在训练过程中是生成器与判别器在进行对抗学习,而本文对抗学习的两个对象便是解码器Prediction Decoder与判别器 D γ f D_{\gamma}^{f} Dγf D γ f D_{\gamma}^{f} Dγf在网络结构的这个地方:
在这里插入图片描述
从结构上讲 D γ f D_{\gamma}^{f} Dγf是一个小型的全卷积网络:
在这里插入图片描述
对抗学习所用的loss将在后文进行介绍。

VII. Loss

训练Prediction Decoder所用的loss为 L s t r \mathcal{L}_{s t r} Lstr,即structure-aware loss,出自论文F3net,在本文中,有:
L s t r (  Pred  , Y ) = ω ∗ L c e (  Pred  , Y ) + L i o u (  Pred  , Y ) \mathcal{L}_{s t r}(\text { Pred }, Y)=\omega * \mathcal{L}_{c e}(\text { Pred }, Y)+\mathcal{L}_{i o u}(\text { Pred }, Y) Lstr( Pred ,Y)=ωLce( Pred ,Y)+Liou( Pred ,Y) 其中:

  • ω \omega ω: edge-aware weight, ω = 1 + 5 ∗ ∣ ( avg ⁡ − pool ⁡ ( Y ) − Y ) ∣ \omega = 1+5 * \mid\left(\operatorname{avg}_{-} \operatorname{pool}(Y)-Y\right)\mid ω=1+5(avgpool(Y)Y)
  • L c e \mathcal{L}_{ce} Lce: cross-entropy loss
  • L i o u \mathcal{L}_{iou} Liou: boundary-IOU loss,出自论文Non-local deep features for salient object detection,在本文中有 L i o u = 1 − ω ∗ i n t e r + 1 ω ∗ u n i o n − ω ∗ i n t e r + 1 \mathcal{L}_{i o u}=1-\frac{\omega * i n t e r+1}{\omega * u n i o n-\omega * i n t e r+1} Liou=1ωunionωinter+1ωinter+1 i n t e r = P r e d ∗ Y inter = Pred ∗ Y inter=PredY u n i o n = P r e d + Y union = Pred + Y union=Pred+Y

最终,SOD与COD各自的structure-aware loss为:
L s t r s = 0.5 ∗ [ L s t r ( G i n i t ( F α s ) , Y s ) + L s t r ( G β ( F α s ) , Y s ) ] \mathcal{L}_{s t r}^{s}=0.5 *\left[L_{s t r}\left(G_{i n i t}\left(F_{\alpha_{s}}\right), Y^{s}\right)+L_{s t r}\left(G_{\beta}\left(F_{\alpha_{s}}\right), Y^{s}\right)\right] Lstrs=0.5[Lstr(Ginit(Fαs),Ys)+Lstr(Gβ(Fαs),Ys)] L str  c = 0.5 ∗ [ L str  ( G i n i t ( F α c ) , Y c ) + L s t r ( G β ( F α c ) , Y c ) ] \mathcal{L}_{\text {str }}^{c}=0.5 *\left[L_{\text {str }}\left(G_{init }\left(F_{\alpha_{c}}\right), Y^{c}\right)+L_{s t r}\left(G_{\beta}\left(F_{\alpha_{c}}\right), Y^{c}\right)\right] Lstr c=0.5[Lstr (Ginit(Fαc),Yc)+Lstr(Gβ(Fαc),Yc)]

训练判别器 D γ f D_{\gamma}^{f} Dγf所用的loss与大多GAN判别器loss类似,如下:
L d i s s = L c e ( D γ f ( G β ( F α s ) ) , 0 ) + L c e ( D γ f ( Y s ) , 1 ) \mathcal{L}_{d i s}^{s}=\mathcal{L}_{c e}\left(D_{\gamma}^{f}\left(G_{\beta}\left(F_{\alpha_{s}}\right)\right), \mathbf{0}\right)+\mathcal{L}_{c e}\left(D_{\gamma}^{f}\left(Y^{s}\right), \mathbf{1}\right) Ldiss=Lce(Dγf(Gβ(Fαs)),0)+Lce(Dγf(Ys),1) L d i s c = L c e ( D γ f ( G β ( F α c ) ) , 0 ) + L c e ( D γ f ( Y c ) , 1 ) \mathcal{L}_{d i s}^{c}=\mathcal{L}_{c e}\left(D_{\gamma}^{f}\left(G_{\beta}\left(F_{\alpha_{c}}\right)\right), \mathbf{0}\right)+\mathcal{L}_{c e}\left(D_{\gamma}^{f}\left(Y^{c}\right), \mathbf{1}\right) Ldisc=Lce(Dγf(Gβ(Fαc)),0)+Lce(Dγf(Yc),1)

最后还有个adversarial learning的问题,即我们希望判别器最终无法区分预测结果与ground truth:
L a d v s = L c e ( D γ f ( G β ( F α s ) ) , 1 ) \mathcal{L}_{a d v}^{s}=\mathcal{L}_{c e}\left(D_{\gamma}^{f}\left(G_{\beta}\left(F_{\alpha_{s}}\right)\right), \mathbf{1}\right) Ladvs=Lce(Dγf(Gβ(Fαs)),1) L a d v c = L c e ( D γ f ( G β ( F α c ) ) , 1 ) \mathcal{L}_{a d v}^{c}=\mathcal{L}_{c e}\left(D_{\gamma}^{f}\left(G_{\beta}\left(F_{\alpha_{c}}\right)\right), \mathbf{1}\right) Ladvc=Lce(Dγf(Gβ(Fαc)),1)

其中1指的是相应尺寸的全1矩阵,因为判别器会将其认为是ground truth的图片输出为全1矩阵。

VIII. Training

网络的训练中每轮迭代内的过程大致可以拆分为以下五步:

  • 利用 L latent  \mathcal{L}_{\text {latent }} Llatent 来训练两个编码器与 S θ {S_\theta } Sθ模块
  • 利用 L sod  = L str  s + λ 1 L adv  s \mathcal{L}_{\text {sod }}=\mathcal{L}_{\text {str }}^{s}+\lambda_{1} \mathcal{L}_{\text {adv }}^{s} Lsod =Lstr s+λ1Ladv s来训练SOD编码器与Decoder
  • 利用 L d i s s \mathcal{L}_{d i s}^{s} Ldiss来训练判别器
  • 利用 L cod  = L str  c + λ 2 L adv  c \mathcal{L}_{\text {cod }}=\mathcal{L}_{\text {str }}^{c}+\lambda_{2} \mathcal{L}_{\text {adv }}^{c} Lcod =Lstr c+λ2Ladv c来训练COD编码器与Decoder
  • 利用 L d i s c \mathcal{L}_{d i s}^{c} Ldisc来训练判别器

需要注意的是由于SOD数据集比COD大很多,为了防止过拟合,具体实现过程中是每训练三轮SOD才训练一轮COD。

IX. Experiment

性能超越了11个最近模型,包括NLDF(CVPR 2017)、PiCANet(CVPR 2018)、CPD(CVPR 2019)、SCRN(ICCV 2019)、PoolNet(CVPR 2019)、BASNet(CVPR 2019)、EGNet(ICCV 2019)、AFNet(CVPR 2019)、CSNet(ECCV 2020)、F3Net(AAAI 2020)、ITSD(CVPR 2020)

X. Summary

本文的最大创新点在于将Joint Training应用到了SOD、COD这两个近乎相反的任务上。SOD与COD的关注点不同,SOD寻找局部特征的能力有助于COD获得更精确的伪装边界,而COD处理全局信息的能力能帮助SOD减少对背景噪声的误识别。从SOD的角度讲,这也暂时跳出了如何提升特征融合能力上限这一研究点。

比较好奇的一点是标题中Uncertainty-aware。文中提到了SOD与COD数据集标注的两个问题,但是在结果展示中并没有展示“预测结果比实际结果更准确”的情形,理论上引入了判别器,确实有可能实现判别器将预测结果判定为ground truth(事实上的更精确标注)。

Ref

[1] Yulun Zhang, Kunpeng Li, Kai Li, Lichen Wang, Bineng Zhong, and Yun Fu. Image super-resolution using very deep residual channel attention networks. In Proceedings of the European conference on computer vision (ECCV), pages 286–301, 2018.
[2] Jun Fu, Jing Liu, Haijie Tian, Yong Li, Yongjun Bao, Zhiwei Fang, and Hanqing Lu. Dual attention network for scene segmentation. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, June 2019.
[3] Zhe Wu, Li Su, and Qingming Huang. Cascaded partial decoder for fast and accurate salient object detection. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, June 2019.

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
set_clock_uncertainty是一个设置时钟不确定性的命令,它用于定义时钟的不确定性范围。在引用中,set_clock_uncertainty -setup 0.2 [get_clocks CLK_CONFIG]表示设置CLK_CONFIG时钟的建立时间不确定性为0.2,而set_clock_uncertainty -hold 0.05 [get_clocks CLK_CONFIG ]表示设置CLK_CONFIG时钟的保持时间不确定性为0.05。 set_clock_latency是一个设置时钟延迟的命令,它用于定义时钟信号的传输延迟。在引用中,set_clock_latency 0.8 [get_clocks CLK_CONFIG]表示设置CLK_CONFIG时钟的传输延迟为0.8,而set_clock_latency 1.9 -source [get_clocks SYS_CLK]表示设置SYS_CLK时钟的传输延迟为1.9。此外,set_clock_latency 0.851 -source -min [get_clocks CFG_CLK]和set_clock_latency 1.322 -source -max [get_clocks CFG_CLK]分别表示设置CFG_CLK时钟的最小和最大传输延迟为0.851和1.322。 set_clock_uncertainty和set_clock_latency都是在时钟设计和时序分析中使用的命令。set_clock_uncertainty用于考虑时钟不确定性,以确保电路在时序要求下正常工作。而set_clock_latency用于考虑时钟延迟,以确保时钟信号在各个时序路径中被正确地传输。两者都对于时钟和时序的稳定性和可靠性至关重要。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [数字电路静态时序分析基础三](https://blog.csdn.net/weixin_45799954/article/details/114948996)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值