文章目录
基于GAN模型的异常检测
AnoGAN
This paper aims to find a point z in the latent space that corresponds to an image G(z) that is visually most similar to query image x and that is located on the manifold X.
基本思想
gan可以做z->image的正向映射,但是不能做image->z的逆向映射,anogan的思想是训练出一个只产生无异常样本的GAN网络。继而,在给出测试图片Img时,试图找到能产生最接近Img分布的z,由于不能逆向映射,所以依靠迭代的方式找寻z,使得loss(G(z),Img)最小。我们假定train期间,GAN已被优化到理想情况,即产生的分布能且仅能sample出无异常样本,此时:假如Img为无异常图片,那么必能找出一个z,使得loss(G(z),Img)=0(近似);假如Img为异常图片,那么即使是最贴近Img的G(z),也会很“不像”,即loss(G(z),Img)很大(超过阈值)。由此可以判别一个图像是否异常,也可以通过计算残差的方式来得到异常区域。
工作流程
- Train DCGAN with solely on image data of healthy cases with the aim to model the variety of healthy appearance.
- Map new images to the latent space and find the most similar image G(z) via applying backpropagation iteratively.
- Compute Anomaly score A(x) which is a weighted sum of residual loss and discrimination loss.
在迭代z时的损失函数
Anomaly_Score = (1-lambda) * Residual Loss + lambda * Discrimination_Loss
Residual loss:图片Img和G(z)的pixel值的L1范数。
Discriminator loss:test Img和G(z)输入D后的某一层feature值的L1范数。(Enforces the generated image to lie on the manifold by using the trained discriminator not as classifier, but as a feature extractor)即从特征层上欺骗过D。
两者求加权和,得到loss值,反向传递优化z。
问题
AnoGAN提出的方法,导致test时,也需要大量的时间做gradient descent来找到隐变量z,不理想。根本原因在于G的z->image的映射不可逆。
Conditional GAN
简单回顾。
在conditional gan中:
min
G
max
D
E
x
∼
P
d
a
t
a
(
x
)
,
m
a
t
c
h
[
l
o
g
D
(
x
∣
c
)
]
+
E
x
∼
P
d
a
t
a
(
x
)
,
d
i
s
m
a
t
c
h
[
1
−
l
o
g
D
(
x
∣
c
)
]
+
E
z
∼
P
z
(
z
)
[
1
−
l
o
g
(
G
(
z
∣
c
)
∣
c
)
]
也可以不考虑真实图片
+
不匹配
c
o
n
d
i
t
i
o
n
的情况
(
原论文提出的
)
,但是效果不如对上者。
min
G
max
D
E
x
∼
P
d
a
t
a
[
l
o
g
D
(
x
∣
c
)
]
+
E
z
∼
P
z
[
l
o
g
(
1
−
D
(
G
(
z
∣
c
)
∣
c
)
)
]
\min\limits_{G} \max\limits_{D} E_{x\sim Pdata(x),match}[logD(x|c)]\\+E_{x\sim Pdata(x),dismatch}[1-logD(x|c)]+E_{z\sim Pz(z)}[1-log(G(z|c)|c)]\\ 也可以不考虑真实图片+不匹配condition的情况(原论文提出的),但是效果不如对上者。\\ \min\limits_{G}\max\limits_{D}E_{x\sim Pdata}[logD(x|c)]+E_{z\sim Pz}[log(1-D(G(z|c)|c))]\\
GminDmaxEx∼Pdata(x),match[logD(x∣c)]+Ex∼Pdata(x),dismatch[1−logD(x∣c)]+Ez∼Pz(z)[1−log(G(z∣c)∣c)]也可以不考虑真实图片+不匹配condition的情况(原论文提出的),但是效果不如对上者。GminDmaxEx∼Pdata[logD(x∣c)]+Ez∼Pz[log(1−D(G(z∣c)∣c))]
训练过程见Conditional GAN部分。
最终可以得到,生成的分布与c值对应。
Condition GAN的训练数据需要是成pair的,也就是必须要有标签label:c,那么是否可以在没有标签的情况下,也做出控制生成分布的效果呢?InfoGAN提出了想法。
Info GAN
基本思想
既然没有外部condition label,那么是否可以从内部下手?即采样的z的某些维度上的值,控制着最终图片的结果?
注意:CGAN是通过加condition label的手段,有目的性的去生成一个【可以通过Condition来控制生成的分布】的一个model,而InfoGAN则是一种“找规律”,寄希望于z的一些维度可以【表征些有用的信息】,要区分二者的“方法”。
但实质上,并不是z的某个维度恰好控制着生成图像的一个属性,比如z[0]控制粗细,z[1]控制rotation。比如下图中的"Actually"。
网络结构
将z划分为{c,z’},Generator输出的X不仅需要过Discriminator来确保X符合Pdata的分布,并且需要经过Classifier,来得到c。
目的在于:原本的Z的各个维度的取值对X的影响是不确定的,而加上classifier后,Generator不仅要保证X尽可能符合Pdata,而且需要从X中提取出信息“C”,也就是c必须对x的取值有着明确的influence,并且是每个维度都需要有influence,比如c[0]代表显示内容,c[1]表示角度,c[2]表示明暗,等等。
但是不能把整个z都当作c,因为我们仍需要一部分的数值并不是有规律的控制x的产生,而是联合起来无规则的随机控制(如同上述的Actually中所画)。
注意:C并不是因为它代表着X中的某些特性而被划分为C;而是因为被划分为C,在经过infogan这样的架构训练下,才使得该分部的数值可以对应影响着X的某些特性。 具体是什么特性,也需要实验才能得出,所以这就是它和CGAN的不同点。
实验结果
第一维度控制显示的是数字几,第二维度没有明显意义,第三维度控制rotation,第四维度控制笔画粗细。
VAE-GAN
基本思想
VAE+GAN,前半部分是VAE,后半部分是GAN。
-
对于整体而言,不仅需要做到产生一个尽可能与input X相近的图片,并且这张图片需要让Discriminator认为是尽量realistic。即融合了VAE和GAN的作用。
-
分开来看,对于VAE而言,本来只能够做到minimize reconstruction loss,但是仅仅重构损失减少导致的问题是,对于输入的“异常图片”,由于vae的z是随机变量,所以隐空间覆盖面积大,vae模型泛化能力强,很容易对“异常图片”也【完美的】重建为“异常图片”本身,并没有对异常区域进行【修复】,可以去联想VAE可以产生的“满月”与“缺月”之间的“半月”图片。但如果换了AE,也不好,VAE起码对没见过的图片能够重构,虽然“没有修复”,但是AE的隐空间有很大的空缺部分,连重构都做不到,会非常模糊。但有了Discriminator,就相当于用Pata对生成的X进行了限制,能且只能产生正常图片的distribution的sample。并且,单纯的VAE产生的图片比较模糊,加上Discriminator后更清晰了,更realistic。
-
从GAN的角度来看,在训练Generator时,理想状态时,随机给出z,有G(z)~Pdata(X),但是对于给定的X,无法反向推导出z,这导致对于异常检测而言,test Image不知道应该如何寻找【能生成最像test Image的隐变量z】。这里对GAN的优化属于【在GAN的输入阶段做优化】(详见2022年的survey论文),VAE的出现,使得X可以逆向推出z。模型训练好后,使得隐空间的z与X出现了一一映射。给出X,便可以立即给出其在隐空间对应的的z,并且这个z就是能【尽可能令output X最和input X相似的z】。这样,相当于省却了AnoGAN中反向迭代寻找隐变量z的过程。
二者相辅相成,是对AnoGAN的优化。
网络结构
训练算法
-
输入input X 图片,训练Encoder的压缩能力和Decoder的重建能力。
VAE部分训练好了,才能更好地完成图像重建工作。训练时让Output X和Input X越来越像,测试图片时才可以相信,encoder得到的z就是能够产生【最像test Img】的那个embedding值,decoder产生的output Img也是最佳【修补】后的图片。(最佳修补指的是,仅对异常部分进行修复)
-
输入随机向量Z,训练Generator的生成能力和Discriminator的判别能力。
GAN部分训练好了,才能更好地对异常图片进行修补。确保Generator产生的Output Img是符合分布Pdata(x)的。
-
Initialize Encoder,Decoder(Generator),Discriminator
-
Sample z from prior Pz(z):
Z P z = { z 1 , z 2 , z 3 , z 4 . . . z m } Z_{Pz}=\{z_1,z_2,z_3,z_4...z_m\} ZPz={z1,z2,z3,z4...zm} -
Generate m images from decoder:
生成样本: G ( Z P z ) = { G ( z 1 ) , G ( z 2 ) , G ( z 3 ) , G ( z 4 ) . . . . . G ( z m ) } 生成样本:G(Z_{Pz})=\{G(z_1),G(z_2),G(z_3),G(z_4).....G(z_m)\} 生成样本:G(ZPz)={G(z1),G(z2),G(z3),G(z4).....G(zm)} -
Sample images from Pdata(X):
真实样本: X P d a t a = { X 1 , X 2 , X 3 , X 4 . . . . . X m } 真实样本:X_{Pdata}=\{X_1,X_2,X_3,X_4.....X_m\} 真实样本:XPdata={X1,X2,X3,X4.....Xm} -
Encode the Images to latent space:
Z E n ( X ) = { E n ( X 1 ) , E n ( X 2 ) , E n ( X 3 ) , E n ( X 4 ) . . . . . E n ( X m ) } Z_{En(X)}=\{En(X_1),En(X_2),En(X_3),En(X_4).....En(X_m)\} ZEn(X)={En(X1),En(X2),En(X3),En(X4).....En(Xm)} -
Decode the Image’s embedding to Image space:
重建样本: G ( Z E n ( x ) ) = { G ( E n ( X 1 ) ) , G ( E n ( X 2 ) ) , G ( E n ( X 3 ) ) , G ( E n ( X 4 ) ) . . . . . G ( E n ( X m ) ) } 重建样本:G(Z_{En(x)})=\{G(En(X_1)),G(En(X_2)),G(En(X_3)),G(En(X_4)).....G(En(X_m))\} 重建样本:G(ZEn(x))={G(En(X1)),G(En(X2)),G(En(X3)),G(En(X4)).....G(En(Xm))} -
Updata Discriminator to increase Dis(真实样本),decrease Dis(生成样本),decrease Dis(重建样本)
-
Updata Generator to increase Dis(生成样本),increase Dis(重建样本),decrease |重建样本-真实样本|
-
Updata Encoder to decrease KL(P(z|x)||P(z)),decrease |重建样本-真实样本|.
注意,上述算法中认为,由于Encoder由于不在GAN范围内,所以不需要优化Encoder使得increase Dis(重建样本)
decrease KL(P(z|x)||P(z))就是VAE中需要限制encoder embedding(X)后的隐空间分布P(z|x)趋近于先验分布P(z)。P(z)可以是正态分布,也可以是均匀分布,不限制。
原Algorithm如下图所示
在异常检测中的应用
VAE-GAN的目标在于三点:
- decoder生成的分布趋同于Pdata(X)
- encoder生成的分布趋同于先验分布P(z)
- VAE产生的output趋同于input
《Deep_Learning_for_Unsupervised_Anomaly_Localization_in_Industrial_Images_A_Survey》中的Improving the input of generator G提到如下网络,其中的A(1)就是一个典型的VAE-GAN
BiGAN
基本思想
VAE-GAN的目标在于三点:
- decoder生成的分布趋同于Pdata(X)
- encoder生成的分布趋同于先验分布P(z)
- VAE产生的output趋同于input
BiGAN用另外的架构实现相同的效果
网络结构
Encoder输入是Pdata的sample,为真实图片,输出是latent space的code z
Decoder输入是从隐空间先验分布Pz sample出来的code z,输出是生成的图片。
Discriminator负责区分(Image+code)是由Encoder产生还是Decoder产生。
也就是整个BiGAN做的是最小化联合分布P(joint distribution of Encoder’s inputs and outputs)和联合分布Q(joint distribution of Decoder’s input and output)的散度。
min
G
J
S
(
P
E
n
(
i
m
a
g
e
,
z
)
∣
∣
Q
D
e
(
i
m
a
g
e
,
z
)
)
\min\limits_{G}JS(P_{En}(image,z)||Q_{De}(image,z))
GminJS(PEn(image,z)∣∣QDe(image,z))
理想状态下,可以达到【基本思想】中的三条准则,即便BiGAN中的encoder和decoder没有链接。
- 联合分布完全一致
P E n ( i m a g e , z ) = Q D e ( i m a g e , z ) 从而有 D e ( E n ( x ) ) = x E n ( D e ( z ) ) = z P_{En}(image,z)=Q_{De}(image,z)\\ 从而有\\ De(En(x))=x\\ En(De(z))=z\\ PEn(image,z)=QDe(image,z)从而有De(En(x))=xEn(De(z))=z
- 边缘分布完全一致
P E n ( i m a g e ) = Q D e ( i m a g e ) , 从而有 d e c o d e r 生成的分布趋同于 P d a t a ( X ) ; P E n ( z ) = Q D e ( z ) , 从而有, e n c o d e r 生成的分布趋同于先验分布 P ( z ) P_{En}(image)=Q_{De}(image),\\从而有decoder生成的分布趋同于Pdata(X);\\ P_{En}(z)=Q_{De}(z),\\从而有,encoder生成的分布趋同于先验分布P(z) PEn(image)=QDe(image),从而有decoder生成的分布趋同于Pdata(X);PEn(z)=QDe(z),从而有,encoder生成的分布趋同于先验分布P(z)
训练算法
-
Initialize Encoder En , Decoder De , Discriminator Dis
-
sample M images from database
X P d a t a = { x 1 , x 2 , x 3 , . . . x m } X_{Pdata}=\{x_1,x_2,x_3,...x_m\} XPdata={x1,x2,x3,...xm} -
generate M codes from encoder
Z P ( z ∣ x ) = { E n ( x 1 ) , E n ( x 2 ) , E n ( x 3 ) , . . . E n ( x m ) } Z_{P(z|x)}=\{En(x_1),En(x_2),En(x_3),...En(x_m)\} ZP(z∣x)={En(x1),En(x2),En(x3),...En(xm)} -
sample M codes from prior Pz
Z P z = { z 1 , z 2 , z 3 , . . . z m } Z_{Pz}=\{z_1,z_2,z_3,...z_m\} ZPz={z1,z2,z3,...zm} -
generate M images from decoder
X P g = { D e ( z 1 ) , D e ( z 2 ) , D e ( z 3 ) , . . . D e ( z m ) } X_{Pg}=\{De(z_1),De(z_2),De(z_3),...De(z_m)\} XPg={De(z1),De(z2),De(z3),...De(zm)} -
update Dis to distinguish Encoder joint distribution P and Decoder joint distribution Q
i n c r e a s e D i s ( X P d a t a , Z P ( z ∣ x ) ) d e c r e a s e D i s ( X P g , Z P z ) increase \;Dis(X_{Pdata},Z_{P(z|x)})\\ decrease \;Dis(X_{Pg},Z_{Pz}) increaseDis(XPdata,ZP(z∣x))decreaseDis(XPg,ZPz) -
update En and De to make the two distributions closer.
d e c r e a s e D i s ( X P d a t a , Z P ( z ∣ x ) ) i n c r e a s e D i s ( X P g , Z P z ) decrease \;Dis(X_{Pdata},Z_{P(z|x)})\\ increase \;Dis(X_{Pg},Z_{Pz}) decreaseDis(XPdata,ZP(z∣x))increaseDis(XPg,ZPz)
实验效果
BiGAN的理想状态和同时训练如下2个AE是一样的。但是在实操中,由于不可能达到optimum,他们的error surface不同,所以还是有区别的。
相比于普通的VAE,由于加入了Discrim inator控制Decoder产生图片的分布,所以使得产生的图片更清晰,更realistic。但是BiGAN的reconstruction的效果不好,因为纯靠联合分布控制,不如直接用L1 Loss控制的AE的重构效果。也就是说,假如输入了一张bird图片,产生的可能是另外一种bird(重构不好),但是图片质量优于VAE。实际上揭示了,GAN读取语义信息的能力更强,更能拟合真实的分布,图像更清晰,但是VAE的重构能力更强。
EGBAD
基于BiGAN的思想建模网络。
GANomaly
基本思想
基于VAE-GAN的思想,通过重构隐空间的features,进一步对隐空间的编码施加了constraints。
设计了encoder-decoder-encoder三层架构,同时运用对抗。
网络结构
该方法不仅对生成的图片外观(图片->图片)做了的约束,也对图片内容(图片编码->图片编码)做了约束。另外,该方法还引入了生成对抗网络(GAN)中的对抗训练思想。推理阶段,该方法也不同于一般的基于自编码器的异常检测方法。**最后用于推断异常的不是原图和重建图的差异,而是第一部分编码器产生的隐空间特征(原图的编码)和第二部分编码器产生的隐空间特征(重建图的编码)的差异。**这种方法更关注图片实质内容的差异,对图片中的微小变化不敏感,因而能解决自编码器中易受噪声影响的问题,鲁棒性更好。
GANomaly目标:
- d e c o d e r decoder decoder生成的分布趋同于 P d a t a P_{data} Pdata——用GAN来约束,记作: L a d v L_{adv} Ladv【论文中仅做了“重构图像”+“真实图像”的对抗训练,没有将”随机z的生成图像“加入到考虑中,这是与VAE-GAN算法的不同之处】
- d e c o d e r decoder decoder产生的output趋同于 e n c o d e r 1 encoder_1 encoder1的input——用reconstruction error(L1范数)来约束,记作: L c o n L_{con} Lcon
- 相比于VAE-GAN,不考虑 e n c o d e r 1 encoder_1 encoder1产生的code z z z趋同于先验分布P(z),因为采用的是AE结构。
- e n c o d e r 2 encoder_2 encoder2产生的code z ^ \hat{z} z^ 趋同于 e n c o d e r 1 encoder_1 encoder1产生的code z z z ——用L2范数损失来约束,记作: L e n c L_{enc} Lenc
训练算法
L = w a d v L a d v + w c o n L c o n + w e n c L e n c L = w_{adv}L_{adv} + w_{con}L_{con} + w_{enc}L_{enc}\\ L=wadvLadv+wconLcon+wencLenc
在论文中给出的 w c o n = 50 , w a d v = w e n c = 1 w_{con}=50,w_{adv}=w_{enc}=1 wcon=50,wadv=wenc=1
测试算法
在测试阶段,该模型使用
L
e
n
c
L_{enc}
Lenc对给定图像的异常进行评分。
A
(
x
^
)
=
∣
∣
G
E
(
x
^
)
−
E
(
G
(
x
^
)
)
∣
∣
A(\hat{x}) = ||G_E(\hat{x}) − E(G(\hat{x}))||
A(x^)=∣∣GE(x^)−E(G(x^))∣∣
对比
AnoGAN, EGBAD, GANomaly
f-AnoGAN
基本思想
回顾VAE-GAN的结构,通过加入了Encoder,来做到 i m a g e − > z image->z image−>z的映射 ,避免了AnoGAN中的迭代z的步骤。
VAE-GAN的对于各个构件的目标如下:
- Encoder要保证 K L ( P z ∣ ∣ P z ∣ x ) = 0 , L r e c o n s = 0 KL(P_z||P_{z|x})=0, L_{recons}=0 KL(Pz∣∣Pz∣x)=0,Lrecons=0
- Decoder要保证 L r e c o n s = 0 , J S ( P g ∣ ∣ P d a t a ) = 0 , J S ( P r e c o n s ∣ ∣ P d a t a ) = 0 L_{recons}=0,JS(P_g||P_{data})=0,JS(P_{recons}||P_{data})=0 Lrecons=0,JS(Pg∣∣Pdata)=0,JS(Precons∣∣Pdata)=0
- Discriminator要尽量区分
P
g
和
P
d
a
t
a
P_g和P_{data}
Pg和Pdata,
P
r
e
c
o
n
s
和
P
d
a
t
a
P_{recons}和P_{data}
Precons和Pdata
回顾GANomaly,通过加入了 E n c o d e r 2 Encoder_2 Encoder2,引入了对隐变量重构误差的constraint ,但是目的是用于计算Anomaly Score判断是否异常.
VAE-GAN中,偏向以VAE为主体,因为Decoder和Discriminator都需要处理 P r e c o n s P_{recons} Precons的问题,而Encoder却不需要考虑adversarial的问题。f-AnoGAN中,对GAN的G和D进行了锁定,后续仅训练Encoder,使得训练更加稳定。
网络结构
训练主要分两步进行,第一步是训练一个生成对抗网络,第二步利用第一步生成对抗网络的权重,训练一个encoder编码器。注意,在训练Encoder时,GAN结构里的参数将被固定,这一点和VAE-GAN不同。
为了更好的训练Encoder,让Encoder成为Generator的逆运算,论文中给出了三种训练Encoder的结构,分别为ziz结构,izi结构和izif结构
-
ziz结构:
L z i z = 1 d ∣ ∣ z − E ( G ( z ) ) ∣ ∣ 2 = M S E ( z , E ( G ( z ) ) ) L_{ziz}=\frac{1}{d}||z−E(G(z))||_2=MSE(z,E(G(z))) Lziz=d1∣∣z−E(G(z))∣∣2=MSE(z,E(G(z))) -
izi结构:
L i z i = 1 p i x e l n u m ∣ ∣ x − G ( E ( x ) ) ∣ ∣ 2 = M S E ( x , G ( E ( x ) ) ) L_{izi}=\frac{1}{pixel\;num}||x-G(E(x))||_2=MSE(x,G(E(x))) Lizi=pixelnum1∣∣x−G(E(x))∣∣2=MSE(x,G(E(x))) -
izif结构:
L i z i f = L i z i + L D = M S E ( x , G ( E ( x ) ) ) + k ∗ 1 n ∣ ∣ f ( x ) − f ( G ( E ( x ) ) ∣ ∣ 2 L_{izif}=L_{izi}+L_{D}=MSE(x,G(E(x)))+k*\frac{1}{n}||f(x)-f(G(E(x))||_2 Lizif=Lizi+LD=MSE(x,G(E(x)))+k∗n1∣∣f(x)−f(G(E(x))∣∣2
其中,k为两个损失函数的权重参数,代码中k=1。 f ( ⋅ ) f(\cdot) f(⋅)表示判别器中间层的输出,n表示判别器中间输出层的维度。
缺陷检测
缺陷检测时,使用
L
i
z
i
f
L_{izif}
Lizif 作为异常评分。
A
(
x
)
=
A
R
(
x
)
+
k
∗
A
D
(
x
)
A
R
为重构损失
L
i
z
i
,
A
D
为判别损失
L
D
A(x)=A_R(x)+k*A_D(x)\\A_R为重构损失L_{izi},A_D为判别损失L_{D}
A(x)=AR(x)+k∗AD(x)AR为重构损失Lizi,AD为判别损失LD