ECCV2020:论文解读《Synthesize then Compare: Detecting Failures and Anomalies for Semantic Segmentation》

原文地址

https://arxiv.org/pdf/2003.08440.pdf

论文阅读方法

三遍论文法

初识(Abstract & Introduction & Conclusion)

随着DNN在视觉任务上取得了巨大成功,已经有很多基于深度学习算法的CV应用落地,这也对算法的安全性提出了更高的要求。所以,机器学习系统要能够检测故障(即错误的预测),并识别可能导致这些故障的异常(即分布失调(out-of-distribution OOD))。

对于Semantic Segmentation任务来说,故障检测不仅要检测当前的结果是不是错的,还需要检测故障的具体位置;其异常检测(也称为异常分割)与故障检测有关,目的是对给定图像中的异常对象或区域进行分割。本文目的就是建立一个可靠的报警系统来解决语义分割中的故障检测(Fig1(i))和异常分割(Fig1(ii))。
在这里插入图片描述
本文提出了一个统一框架来解决故障检测和异常分割,其包含两个模块:a)Image synthesize module:根据分割结果来重构输入图像(分割的逆过程);b)Comparison module:比较重构图像与输入图像之间的差异。作者认为:分割结果越好,那么由它生成的图像就越接近于原始图像。比如你错误地把一个人分割成了一个点,那么你重构出来的图像肯定在对应的区域与输入图像差别很大。类似地,如果一个异常物体(没有见过的类别)出现在测试图像中,在分割结果中它可能会被分为之前类别中的任何一类,可以通过重构后的图像与输入图像进行比较,从而发现异常物体。

本文使用semantic-image的条件GAN(cGAN)来建立生成模型,其可以对分割布局空间到图像空间的映射关系进行建模,cGAN由image-label pairs训练。将从分割模型得到的分割结果喂到训练好的cGAN中,生成重构图像。将重构图像与原始输入图像送入comparison module中识别故障/异常,comparison的设计取决于具体任务:对于故障检测,comparison module为孪生网络(Siamese network),输出Image-level和pixel-level的置信度;对于异常分割,comparison module通过计算中间特征(从语义分割模型提取)的距离来实现

本文的贡献可总结为以下几点:

  1. 本文是第一篇针对语义分割任务来系统地学习故障检测与异常检测;
  2. 提出了一个统一框架,使用Semantic-to-Image条件GAN来解决这两个任务;
  3. 提取的框架在3个挑战数据集上取得了SOTA的性能。

相知(Body)

2. Related Work

Uncertainty estimation:也称为confidences estimation,可以被直接应用于failure detection。作者介绍了一些不确定性估计的方法,但它们都专注于small image classification任务,如果直接应用于语义分割任务,它们缺乏语义结构和上下文信息。

Segmentation quality assessment:目的是不借助ground-truth,对分割的整体质量进行评估,当模型故障时进行报警。作者同样介绍了一些质量估计方法,但考虑到2D场景复杂性和对象本身存在较大的形状变化,这些方法几乎不适用于自然图像。在本文接下来的内容中,segmentation quality assessment将被称为image-level failure。

OOD detection:检测出测试数据中的OOD样本,但本文所指的OOD detection需要分割出图像中的异常区域(anomaly segmentation)。作者指出,近几年提出的一些anomaly segmentation方法在最新的街景数据集StreetHazards(250类异常样本,6k张高分辨率图像)上还没有baseline(MSP)表现得好。

Generative adversarial networks:我们的工作使用了conditional GAN用于图像转换(pixel-to-pixel translation),它们执行语义分割的逆过程:由语义mask生成真实图像。由于semantic image synthesis的好坏通常取决于分割模型的性能,因此作者认为可以使用semantic-to-image generator来进行语义分割的故障检测。

3. Methodology

3.1 General Framework

在这里插入图片描述
x为输入图像,将x分割模型中得到的对应标签ý,我们的目标就是识别及定位ý中的故障 or 基于检测x中的异常。

Image Synthesis Module:使用cGAN(pixel-to-pixel translation)来作为图像生成模块,其包含两个部分:生成器G,判别器D

Training:使用label-image标签对(y,x)进行训练,y是groundtruth,x是对应的image。生成器G:将semantic label转换成realistic-looking image,判别器D:区分真实image和合成image。
在这里插入图片描述
​ 上面为训练中的优化目标,D(y,x)表示真实图片的概率,G(y)表示由标签y生成的图片:对于生成器G来说,希望生成图像G(y)接近于真实图片,所以最小化目标;对于判别器D来说,希望能够更好地区分假图片和真图片。

Testing:得到训练好的生成G,给定输入图像x和一个分割模型M,将预测得到的分割结果ý送入G,得到生成图像^ x,也可称为重构图像。

​ 接下来,我们需要将^ x和x一起送入Comparison Module

Comparison Module:作者假设,如果x~与x越像,那我们就认为ý越接近于y,但我们无法保证由G生成的^ x与x具有相同的style细节,所以仅靠L1距离这种衡量手段是不准确的。为了解决这个问题,建立task-specific function F,用来估计x和^ x之间的task-specific 置信度^c:
在这里插入图片描述
对于故障检测任务,^c = (^ciu; ^cmm),包含在image-level的IoU以及pixel-level的error map。对于异常分割任务,^c为关于异常物体的pixel-level confidence map。

3.2 Failure Detection

故障检测的目标:1)区分分割结果ý是否存在故障(image-level的IoU);2)定位ý中的故障(pixel-level的error map)。
在这里插入图片描述
Instantiation of Comparison Module:使用ResNet-18作为base network,使用孪生结构去学习x和^ x之间的关系。如上图所示,x和^ x分别与ý进行concat操作,然后分别送入shared-weight的孪生编码器中,分别输出image-level的IOU数组,以及pixel-level的error map。
在这里插入图片描述
在训练阶段,对于image-level的ciu分支,网络的监督来自y和ý,其groundtruth由下式计算,并使用L1损失作为loss function,Ll1(ciu, ^ ciu)。
在这里插入图片描述
对于pixel-level的error map,其groundtruth由下式计算,并使用二元交叉熵作为损失函数。
在这里插入图片描述
最终,整个failure detection的loss function为以下形式:
在这里插入图片描述

3.3 Anomaly Segmentation

Problem Definition:异常分割的目标是将测试样本中的异常物体分割出来(未出现在之前的训练集中),也就是说,给定一张测试图片x,需要输出一个关于异常物体的confidence score map,cn∈[0,1]w*h,cn=1表示i像素为异常,cn=0表示正常(物体在之前的训练集中出现过)。

Instantiation of Comparison Module:由于^x 和^ y都只包含in-distribution object,因此,我们需要比较x与^x,它们之间的pixel-wise semantic区别是异常物体的有力指示。这里,作者简单地实例化一个函数F,使用从分割模型中提取出的中间特征cosine距离作为F。
在这里插入图片描述
FM是分割模型最后一层的输出(logits),< , >表示两个向量的内积。

Post-processing with MSP:由于GANs的artifacts和generalized error,我们的方法很有可能将正常物体(in-distribution object)错误分类为异常物体。所以,使用MSP作为后处理,Cn ← Cn·‖{p(i) ≤ t}+‖{p(i) > t},其中p(i)是分割模型maximum soft-max probability,t∈[0,1]为阈值,‖{·}为指示函数。

3.4 Analysis

在这里插入图片描述
最左边的图表示:如果分割模型M能够正确将图片image映射到分割mask,其由于生成器重构的图片就越接近于原始图片;中间的图表示出现了Failure,右边的图表示产生了OOD异常。

4. Experiments

4.1 Failure Detection
Evaluation Metrics

评价image-level(per-class IoU prediction)的故障检测有三个指标:1)MAE (Mean Absolute Error):均方根误差,衡量预测的IOU分布与真实IoU之间的平均误差;2)P.C (Pearson Correlation) 和3)S.C (Spearman Correlation) 用来描述它们的相关系数。评价pixel-level(error map)的故障检测有以下几个指标:AUPR-Error, AUPR-Success, FPR at 95% TPR and AUROC,其中AUPR-Error作为我们的主要指标,其计算Precision-Recall曲线(使用error作为positive)下的面积。

The Cityscape Dataset: the largest one for failure detection for segmentation.

在这里插入图片描述
Baseline:如上图所示,MSP、MCDropout、TCP作为pixel-level故障检测的标准baselines。VAE alarm是作为image-level故障检测的SOTA方法。Direct Prediction:以image和对应的segmentation result作为输入,直接使用网络预测image-level和pixel-level的failure(可以视为生成模块的消融实验)。

Implementation detail:使用cGAN-SPADE作为框架,comparison module使用ImageNet预训练的ResNet-18作为backbone,Adam作为优化器。分割模型在训练集上使用使用4-fold交叉验证训练,以此生成不完美的分割样本用于故障检测。

Result: image-level和pixel-level的预测结果如Table.1所示,可视化见下图,而且在pixel-level任务中,“Ours joint"普遍好于"Ours separate”,证明多任务学习的好处。(但小小地吐槽一下,上面的实验都是作者自己一个人做的,很多方法甚至在实验上无法收敛,所以我觉得能SOTA也很正常,因为如同作者所说的那样,这个领域目前他是第一个挖坑的人,没有可对比的论文也没办法)
在这里插入图片描述

The Pancreatic Tumor Segmentation Dataset

在这里插入图片描述
VAE alarm是主要对飙的方法,其利用了形状信息作为先验,以进行准确的质量评估(肿瘤形状差异很大)。作者期望本文提出的方法能优于shape-based模型,或者与其互补。在这个数据集上只考虑image-level的故障检测,因为VAE alarm就是针对这个任务的方法,并建立了标准baseline。

使用SOAT网络3D AH-Net作为分割模型,医学分割使用的评价指标为Dice coefficient(DSC),而不是IoU。考虑到GPU的内存与很高的计算代价,训练3D的GANs是很难的,所以在实际操作上,直接将SPADE修改为3D。从结果来看,本文的方法与VAE alarm性能相当,将VAE alarm与本文的方法结合(简单地将predicted DSC进行一个ensemble)之后,所有指标都有所上升,证明本文捕捉到label-to-image信息的方法与shape-based VAE方法互补。
在这里插入图片描述

4.2 Anomaly Segmentation
Evaluation Metrics

AUROC(area under the ROC curve),FPR95(false positive rate at 95% recall),AUPR(area under the precision recall curve)

The StreetHazards Dataset

在这里插入图片描述
Baselines:MSP、Dropout、MSP和MSP+CRF作为我们对飙的基准,除了AE之外,其他都需要一个分割模型来提供softmax probability或者uncertainty estimation;AE需要额外训练一个image的自编码器,对异常分割计算pixel-wise l1 loss。

Implementation details: 分割模型backbone:ResNet-101和PSPNet,cGAN为SPADE,后处理中阈值t=0.999,其中针对阈值的设计还专门设计了实验(t=1时表示不进行后处理)。

在这里插入图片描述
Result:结果见上表和下图
在这里插入图片描述

5. Discussion

Why does our approach work better?

现存的方法大多都是基于self-estimated的统计分析来改进故障检测,而深度网络本身就趋向于生成高置信度的输出,所以这种方法是不准确的(可以通过引入额外的数据和交替的训练策略改进这个问题)。本文从另一个角度来解决这个问题:通过生成模型分析深度判别模型的性能。

Extra computation cost

除了原始的分割模型M所需的时间T,本文的方法还有两个步骤需要额外的计算量:GAN的生成器G、用于故障检测/异常分割的comparison function。作者认为,M和G互为分割的逆过程,两者的inference时间应该在同等幅度;与M或G相比,故障检测的异常分割的inference时间是微不足道的。所以本文所提出的框架,额外的computation cost为T。与其他的方法相比较,基于MSP的方法是最高效的,而VAE alarm和AE-based方法都需要另外的网络,额外的时间损耗和我们提出的框架一致,Dropout方法需要对分割网络进行多次采样,时间消耗通常超过10T。

Failure detection on prediction of unseen model M

作者为了验证故障检测系统的泛化能力,将基于DeepLabv2训练的故障检测系统直接对FCN8的mask进行检测,实验结果不错,其证明了系统的泛化能力。

GAN types

目前使用选择的是SOTA的GAN模型SPADE,作者用弱鸡一点的GAN模型做了实验效果变差,一个stronger的生成器对于故障检测是是非重要的。

Adding image style encoder

因为G无法保证生成的^x与x具有同样的style,作者尝试使用SPADE的imageencoder version来减轻这种影响,但是效果不太好,

回顾(Review)

本文为ECCV2020的Oral,全篇来看,每个模块用的方法都不是新方法。但本文是第一篇针对Semantic Segmentation任务做failure 和 anomaly detection的文章,相当于是一个挖坑人。作者提出一个统一的框架,分为Synthesis和Comparison模块,以conditional GAN作为主要手段。其实核心Idea非常简单,就是对预测出来的标签做反向映射,然后比较其与原始图像之间的差距,从而进行failure and anomaly detection。并且作者针对这个任务的实验做得非常多、并且内容也很扎实,全文读下来内容丰富、立意新颖,不愧为这个领域的开坑之作。

代码

目前代码官方还未开源,整个框架比较复杂,复现起来可能有点麻烦,到时候参照一下官方代码再看看,到时候再更新~


以上为个人的浅见,水平有限,如有不对,望大佬们指点。

未经本人同意,请勿转载,谢谢。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值