核心思想
本文提出一种基于半监督GAN的异常检测算法,主要的创新点在于在自动编码器之后,又增加了一个编码器,构成了“编码-解码-编码”的结构,通过比较第二个编码器的输出和第一个编码器的输出之间的差别,来评估输入图像是否属于异常图像。网络的训练过程同样也引入了对抗训练的思想,即使用一个区分器对解码器输出的重构图像进行判断,是来自原始图像还是重构图像,整个网络的结构如下图所示
整个网络可以分为三个子模块:自动编码器模块(
G
E
,
G
D
G_E,G_D
GE,GD),编码器模块(
E
E
E)和区分器模块(
D
D
D)。首先,输入图像
x
x
x经过自动编码器模块中的编码器部分
G
E
G_E
GE得到潜空间中的特征向量
z
z
z,再经过解码器部分
G
D
G_D
GD得到重构图像
x
^
\hat{x}
x^。然后重构图像
x
^
\hat{x}
x^进入编码器模块
E
E
E,得到重构后的特征向量
z
^
\hat{z}
z^(图中标记有误)。最后重构图像
x
^
\hat{x}
x^和输入图像
x
x
x还要输入到区分器
D
D
D中进行判断。
整个训练过程输入图像都是正常图像,测试时输入的图像既有正常图像,又有异常图像。当输入图像为异常图像时,编码器
G
E
G_E
GE将其信息编码得到特征向量
z
z
z,但因为网络仅在正常图像条件下进行训练,因此解码器
G
D
G_D
GD不具备重构异常图像的能力,重构图像
x
^
\hat{x}
x^就会丢失异常部分的信息。当再次经过编码器
E
E
E进行编码时,得到的重构特征向量
z
^
\hat{z}
z^自然也是不包含异常信息的,因此
z
^
\hat{z}
z^和
z
z
z之间会有明显的差异,计算这一差异的绝对值得到异常得分
A
(
x
^
)
\mathcal{A}(\hat{x})
A(x^)
对于整个测试集
D
^
\hat{\mathcal{D}}
D^可以得到异常得分集
S
=
{
s
i
:
A
(
x
i
^
)
,
x
i
^
∈
D
^
}
\mathcal{S}=\left \{s_i : \mathcal{A}(\hat{x_i}), \hat{x_i} \in \hat{\mathcal{D}}\right \}
S={si:A(xi^),xi^∈D^},对整个异常得分集进行归一化处理
即可获得最终规范化的异常得分集
S
′
\mathcal{S}'
S′.
实现过程
网络结构
两个编码器和区分器的结构基本是相同的,而区分器和解码器结构参考了DCGAN的结构。
损失函数
损失函数包含三个部分:对抗损失(Adversarial Loss),上下文损失(Contextual Loss)和编码器损失(Encoder Loss)。其中对抗损失是计算了区分器中,对于输入图像
x
x
x和重构图像
G
(
x
)
G(x)
G(x)得到的特征图差别,计算过程如下
上下文损失计算输入图像和重构图像之间的差别
编码器损失计算了潜空间的特征向量
z
z
z和重构特征向量
z
^
\hat{z}
z^之间的差异
创新点
- 在原有的自动编码器的基础上又增加了新的编码器模块,构成“编码-解码-编码”的三级结构,并设计了相应的损失函数
算法评价
本文研究的是异常检测问题,与缺陷检测有一定的相似性,但也有区别。异常检测本身只需要关注输入图像是否存在异常即可,不需要输出异常区域的位置,也不需要对异常区域进行分类。这个可以和分割成图块的缺陷检测问题结合起来,把异常得分转化成图块内存在缺陷的概率。最后我觉得本文叫做半监督(Semi-Supervised)并不合适,因为整个训练过程并没有用到任何的异常图像以及对应的Groundtruth,应该叫做无监督或者自监督可能更加合适。
如果大家对于深度学习与计算机视觉领域感兴趣,希望获得更多的知识分享与最新的论文解读,欢迎关注我的个人公众号“深视”。