文章目录
前言
不管是医学图像还是工业图像领域,异常检测都是非常重要的一个研究方向(在训练时只有正常样本,测试时需要模型判断输入样本是否存在异常)。存在一个先验:正常/健康的样本都存在着规律性的结构,而异常样本由于异常/病变区域的存在,其结构通常会被损坏【如上图所示,其展示了"眼底图像中的结构化血管",“光学相干断层扫描图像中的结构化解剖结构”】。
那么,如何利用图像这种结构-纹理的关系到异常检测中来呢?本文介绍上海科技大学Kang Zhou
分别在ECCV2020和TNNLS2020上发表的两篇文章,其创新性地将这种对应关系编码到重构方法中,其中第二篇期刊文章是第一篇会议论文的扩展。
P-Net
论文全称:Encoding Structure-Texture Relation with P-Net for Anomaly Detection in Retinal Images(上海科技大学)
原文地址:https://arxiv.org/pdf/2008.03632.pdf
代码:https://github.com/Kevin-KangZhou/P_Net_Anomaly_Detection and https://github.com/YutingXiao/P-Net_Mvtec_AD
PNet如上所示,主要分为三个模块:① 结构提取模块【原图】;② 图像重构模块;③ 结构提取模块【重构图像】。在训练时,首先从原始图像提取结构信息,然后对原图和结构信息分别编码,将两个编码特征进行拼接后送入解码器进行图像重构,重构后的图像会再次经过一个结构提取模块,提取结构信息【作为regularization
】,同时约束重构误差和结构信息误差。在测试时,采用同样的流程,通过比较重构误差和结构误差来进行异常检测。下面主要介绍这几个模块的详细设计:
结构提取模块: 首先对于医学数据作者采用了语义结构信息(如前言中的例子),但数据集中并没有存在这些结构信息,因此作者采用了一种域自适应的图像分割方法AdaSeg
,利用类似域的分割数据集进行域自适应分割。方法的整体框架如上图图(a)所示,采用一个权重共享的U-Net
对源域和目标域同时进行分割,损失函数如下,对于源域采用GT直接优化,而目标域采用一个域判别器进行对抗训练。最后的效果如上图(b)所示。
当结构提取模块训练好后,后面就固定权重,不再进行更新了。
对于工业数据,简单地采用canny edge作为结构信息,构造一个网络学习边缘分割(作为结构提取模块),采用交叉熵进行训练。
图像重构模块:将原图和提取到的结构信息分别送入两个编码器中进行编码,将编码特征拼接后一起送入解码器进行重构。其中,结构信息编码器和解码器采用skip connection
,避免下采样丢失结构细节。损失函数采用L1 loss
以及增加一个域判别器D使用adversarial loss
:
结构提取模块(重构图像):最后将重构图像再送入一次特征提取模块,提取结构特征。主要有两个目的:① 促进图像能够更好地进行重构【类似regularizer的作用】;② 可以与原图的结构信息进行比较,并作为一个异常评测指标。损失函数同样采用L1 loss
:
损失函数与异常评估准则:训练的目标函数如下所示,包括重构过程中的对抗损失、重构损失以及结构重构损失。
测试阶段的流程与训练阶段一致,最后可以得到重构图像
I
^
\hat{I}
I^、重构的结构信息
S
^
\hat{S}
S^,同时考虑两者的L1
重构误差,得到异常得分:
实验中 λ f \lambda_f λf取0.8
部分实验结果:本文主要关注MVTec AD上的效果,如下所示:
MEMSTC-Net
论文全称:Memorizing Structure-Texture Correspondence for Image Anomaly Detection(上海科技大学)
原文地址:https://ieeexplore.ieee.org/document/9513473
由于这篇论文是上一篇论文的扩展,因此主要介绍两者的区别之处,相同的模块会一笔带过
这篇文章的主要网络框架如下所示,与前一篇文章主要的不同在于:① 引入了一个memory bank
用于存储正常样本structure - texture
的对应关系,文中称此模块为structure-texture correspondence memory, STCM; ② 训练时采用多个结构信息(semantic structure error
和low-level structure
);③ 测试时移除了原图编码分支,只利用结构特征进行重构,避免原图编码了异常特征【限制异常区域被很好地重构】。
网络主要分为五个模块:① 特征提取模块:用于提取结构信息;② 信息编解码模块:编码特征结构信息和原图特征,以及解码重构部分;③ STCM模块:存储/更新结构-纹理
的映射关系;④ Attention-guided fusion
模块:加权融合不同的重构结构;⑤ Structure regularization, SR
模块:再次提取结构信息,作用与上文一致。
结构编码模块:除了要编码语义结构,本文还引入了low-level
结构信息,其实就是Canny edge
。其中网络结构与上文一致。
对于MVTec AD数据集,同样还是只使用
canny edge
信息编解码模块:训练时对来自不同域【原图(纹理)、语义结构、low-level结构】的特征分别进行编码(
E
n
c
t
,
E
n
c
s
,
E
n
c
e
Enc_t,Enc_s,Enc_e
Enct,Encs,Ence),同时采用不同的解码器(
D
e
c
t
,
D
e
c
s
,
D
e
c
e
Dec_t,Dec_s,Dec_e
Dect,Decs,Dece)进行重构,分别计算L1 loss
。
值得注意的是,训练时采用的解码器【以及原图的编码器
E
n
c
t
Enc_t
Enct】在测试时会丢弃。因为文章的重点在于建立structure - texture
的对应关系,并利用这种对应关系进行重构,简单地理解就是在测试时只根据结构信息进行重构。而训练时之所以要加这些编码器和解码器,是为了确保编码器提取到的是正确的的结构和纹理信息,并以此建立对应关系。
STCM模块:如上图所示,模块中存储的是key-value
对,其中key
指的是结构特征,value
是图像(纹理)特征。k表示存储尺寸,在索引时,采用欧氏距离度量检索最近邻项,如下式所示:
更新采用简单的FIFO
策略,即在训练时,在每个batch(大小为n,n<<k)内根据结构特征
和纹理特征
的对应关系,构建键值对(
z
s
,
j
,
z
t
,
j
z_{s,j},z_{t,j}
zs,j,zt,j),依次对Memory Bank
中的存储项进行更新:
注意,不同的结构信息采用不同的STCM模块。
Attention-guided融合模块:两种结构信息经过编码模块和STCM模块后,得到两个索引后的特征,分别送入同一个编码器(
D
e
c
t
Dec_t
Dect,注意:这是和编解码模块中的
D
e
c
t
Dec_t
Dect是同一个)进行重构,能得到两个重构图像。作者为了更好地融合这两幅图像,额外构造了一个加权模块:输入原图,学习一组图像权重(sigmoid
),利用这个权重进行图像加权融合。
得到最终的重构图像之后,与上文一样,采用L1 loss
和对抗损失进行约束。
SR模块:其实就是和上文一致,对重构后的图像再次进行结构特征提取,然后采用L1 loss
进行约束。只不过这里采用了两个特征,loss相应地也要增加为两个。
训练目标、测试流程以及评分策略: 除了结构提取模块的额外训练之外,在训练过程中,采用的损失函数主要有如下几个:
如最开始的网络结构图所示,在测试时,输入样本经过两个特征提取模块提取到对应的结构信息,并分别进行编码。编码得到的特征分别送入对应STCM
模块进行检索,将检索后的特征送入编码器得到两幅重构图像,进行加权融合得到最终的重构结果。将重构结果送入SR
模块提取重构图像对应的结构信息,利用和上文一致的方式进行异常评分:
在计算异常得分时,只使用语义结构信息,因为
low-level
信息容易受到背景噪声的影响。
部分实验: 只展示了MVTec上的结果,但在医学数据集上的效果增益更明显,详情见原文。
总结
本文主要介绍了两篇关于“如何在异常检测中利用结构-纹理
的一致性”的论文,其来自同一个作者。两篇的核心思想都是:将结构信息融入到重构方法中,提升重构的质量,并利用比较图像与原图的结构信息用于异常得分评测。
思想富有创新性,在医学数据集上也展现了不错的效果,并且也在工业数据集上进行了实验。由于博主目前主要关注的是自然图像和工业图像的异常检测,所以在描述时也有所偏重。下图展示了第二篇论文在MVTec AD
数据集上展现的可视化结果,其实从肉眼的效果来看,某些类上的重构并不算太好,但图像能够保留原有正常区域重构清晰的情况下,对异常区域的表现与原图不同,从而也能达到不错的检测效果。