Face Adversary Attack Defense System

Reference

This project aims to develop a software platform for analyzing adversary attacks on facial recognition. The objectives of the software platform include (1) quantitative evaluation of emerging adversary attack algorithms; (2) analyzing and identifying effective detection algorithms for adversary attacks; (3) collection and analysis of digital evidence for criminal activities due to adversary attacks based on forensic methodologies. The platform will be beneficial for a wide variety of users that include law enforcement bodies, AI technology providers, research communities and the public.

Paper Reading

Reference

Abstract

对抗性样本攻击扰乱良性输入,导致DNN行为不当。 现有的防御技术要么假设预先知道特定的攻击,要么由于其潜在的假设而不能很好地在复杂的模型上工作。这篇paper认为,对抗性样本攻击与DNN模型的可解释性有密切的关系:良性输入的分类结果可以基于人类可感知(perceptible)的特征/属性进行推理,而对抗性样本上的结果却很难解释。因此,这篇paper基于可解释性(interpretability)提出了一种新的对抗样本检测技术的人脸识别模型。
1. 它具有一种新的属性与内部神经元之间的双向对应推理,以识别对单个属性至关重要的神经元
2. 关键神经元的激活值被增强以放大计算推理部分,其他神经元的激活值被削弱以抑制不可解释部分。
将变换后的分类结果与原模型的分类结果进行比较以发现adversary。结果表明:
1. 该技术对7种攻击的检测准确率达到94%,良性输入的误报率为9.91%。
2. 相比之下,最先进的特征压缩技术只能达到55%的准确率和23.3%的假阳性。

Introduction

深度神经网络(DNNs)在自然语言处理、场景识别、目标检测、异常检测等领域取得了巨大的成功。尽管它们取得了成功,但DNN的安全问题阻碍了DNN在现实世界任务中的广泛应用。 在Intriguing Properties of Neural Networks中显示,轻微的难以察觉的扰动能够导致DNN的不正确行为。从那时起,各种针对DNN的攻击被证实。关于这些攻击的详细讨论见§2。其后果可能是毁灭性的,例如,对手可以使用一个精心制作的路标,使一辆自动驾驶的汽车偏离轨道; 一张人类无法解读的图片可能会骗过面部识别系统,从而解锁智能设备。

现有的防御技术要么强化DNN模型,使其不那么容易受到敌方样本的攻击,要么在操作过程中检测这些样本。然而许多这些技术通过额外训练对抗样本而起作用,因此需要对可能的攻击有先验知识。 最先进的检测技术,特征压缩Feature Squeezing: Detecting Adversarial Examples in Deep Neural Networks,减少特征空间(例如,通过减少颜色深度和平滑图像),使对手依赖的特征被破坏。然而根据我们在§4.2中的实验,由于该技术可能挤压DNN正常功能所依赖的特征,它会导致检测敌对样本和分类良性输入的准确性下降。

我们的假设是,对抗性样本攻击与DNN分类输出的可解释性是密切关联的。 具体来说,在一个完全连接的网络中,所有神经元都直接/传递地影响最终输出。许多神经元表示人类难以感知的抽象特征/属性。 因此,敌对样本通过利用这些神经元来实现其目标。这样,虽然一个良性的分类结果输入可能是基于一组人类可感知的属性(例如给定的脸图片因为颜色的眼睛和鼻子的形状被公认为人物A),对抗性输入的结果很难归因于人类可感知的特征。也就是说,对于对抗样本,DNN没有使用可解释的特征,或猜测。

图1:DNN与人类面部识别的比较。
像素级的差异被放大了50倍,以获得更好的视觉显示效果。左边的两张女演员艾拉·费舍尔的图像分别是DNN模型的输入和待识别的人脸。最右边的两个图像是对应身份的代表图像。蓝色箭头表示良性输入的路径。红色箭头表示使用C&W L2攻击生成的对抗样本的路径

图1展示了一个攻击示例。对抗样本采用Carlini和Wagner (C&W)提出的方法生成。观察它几乎与原始良性输入相同。 图1中所示的DNN模型是VGG-Face,这是目前最知名、最精确的人脸识别系统之一。 在图1中,女演员艾拉·费舍尔(Isla Fisher)的照片被错误地识别为演员A.J.巴克利(A.J. Buckley)。

显然,对抗性样本的分类不能依赖人类可感知的属性,如眼睛、鼻子和嘴巴,因为这些属性(几乎)与原始图像中的属性相同。(相对于机器可以被这种攻击骗过)事实上,人类几乎不会对被干扰的图像进行错误分类(因为人类根据眼睛、鼻子和嘴巴等可感知的属性来识别脸的身份)。因此,我们的技术的总体思想是检查DNN是否主要基于人类可感知的属性来产生其分类结果。否则,就不能信任结果,输入被认为是对抗的。

针对人脸识别系统(FRSes),提出了一种基于可解释性的对抗样本检测技术AmI (Attacks meet Interpretability)。 FRSes是一种具有代表性的DNN,应用非常广泛。具体来说,AmI首先利用一小组训练图像提取一组神经元(称为属性目击者),这些神经元对人脸的个体属性(如眼睛和鼻子)至关重要。虽然现有的DNN模型解释技术可以生成输入区域,使给定神经元的激活值最大化,或识别出受物体(在图像中)影响的神经元,但这些技术对于我们的目的来说是不够的,因为它们识别出的是弱相关性。

AmI的特点是一种新的推理技术,揭示了人脸属性和一组内部神经元之间的强相关性(类似于一对一对应)。它需要两者之间的双向关系:属性的变化导致神经元的变化,神经元的变化意味着属性的变化,而大多数现有的技术只关注单向关系。在确定属性目击者后,通过对原模型进行转换,即强化属性目击者神经元的值弱化非属性目击者神经元的值,构造了一个新的模型。直观上,前者是为了增强FRS决策程序的推理方面,后者是为了抑制无法解释的方面

给定一个测试输入,两个模型的预测结果不一致表明输入是对抗性的。综上所述,我们做出了以下贡献:
1. 我们提出利用这些样本上的结果来检测对抗样本,很难用人类可感知的属性来解释。
2. 我们提出了一种新的技术AmI,利用FRSes的可解释性来检测对抗样本。其特点是:
(1) 人脸属性与神经元之间的对应关系的双向推理;
(2) 对应推理时,属性级突变代替像素级突变(如每次替换整个鼻子);
(3) 神经元的增强和减弱。
3. 我们用7种不同的攻击类型将AmI应用于VGG-Face,这是一种广泛使用的FRS。AmI可以成功检测出对抗样本, true positive rate平均为94%,而最先进的特征压缩技术只能达到55%的准确率。AmI有9.91%的false positives rate(即将良性输入0误分类为恶意输入1),而特征压缩有23.32%。
4. AmI在GitHub上可用。

图2:对FRS的不同攻击的对抗样本。
图2(a)为actor阿隆索的原始图像。图2(b)-(h)是使用不同攻击产生的7个对抗性样本(见标题)。左边的图像是生成的对抗样本,右边的图像是与原始图像相比的像素级差异。为了更好地显示视觉效果,这种差异被放大了50倍。

Model Interpretation:

解释DNN是一个长期的挑战。现有的研究从多个角度研究可解释性,特征可视化是其中之一。尽管解释DNN主要是理解单个神经元和层的作用,特征可视化通过生成神经元的接受域来解决这个问题,接受域是使神经元的激活值最大化的感兴趣的输入区域。

Network Dissection: Quantifying Interpretability of Deep Visual Representations中,作者提出了一种将神经元与输入图像中的物体联系起来的技术。特别是当一组神经元的接受域与某些人类可理解的物体(如狗和房子)重叠时,这组神经元就被标记上相应的物体,并被视为该物体的检测器。这种方法将焦点从一个神经元(在特征可视化中)扩展到一组神经元。

然而,虽然这些现有技术与我们的技术中的属性目击者提取相关,但它们还不足以满足我们的目的。特征可视化和中的推理是单向的,即像素扰动导致神经元值的变化。在§3.1和§4.2中,我们讨论/证明了单向推理经常导致过度近似(即,神经元是相关的但不是必要的某些属性),从而导致次优检测结果。在我们的上下文中需要更强的相关性概念。此外,我们在训练图像中利用属性替换来进行突变(例如,用其他不同的鼻子替换一个鼻子),而不是像现有工作中那样使用随机像素扰动

Adversarial Samples

对抗性样本是对手为了欺骗DNN而生成的模型输入。存在两种类型的对抗性样本攻击:定向攻击和非定向攻击。定向攻击操纵DNN输出特定的分类结果,因此更具灾难性。另一方面,没有目标的攻击只会导致错误分类。

定向攻击进一步分为两类:补丁和普遍干扰。前者生成补丁,可以应用于图像来欺骗DNN。图2(b)的左侧图像显示了一个补丁攻击的例子。相比之下,普遍的扰动使任意位置的良性输入发生突变,从而构建敌对的样本。Carlini和Wagner提出了三种这样的攻击。图2(d)显示了L0攻击,它限制可以改变的像素的数量,但不限制其大小; 图2(e)显示L2攻击,使对抗样本和原始图像之间的欧氏距离最小化。图2(f)展示了L∞攻击,它限制了单个像素的变化幅度,但不限制像素的变化数量。

非定向攻击最早由Szegedy等人提出。快速梯度符号法(FGSM)通过沿梯度方向一步变异整个图像来生成对抗样本。Kurakin等人随后通过采取多个小步骤对FGSM进行了扩展。这种攻击称为基本迭代法(Basic Iterative Method, BIM),如图2(h)所示。

Defense Techniques

研究人员已经做出了过多的努力来保护DNN免受对抗性攻击。现有的防御技术大致可以分为两类:模型强化和对抗检测。我们提议的AmI系统属于第二种类型。

模型强化是为了提高DNN的鲁棒性,防止对抗样本导致DNN的错误行为。以前的工作将对抗样本作为一个额外的输出类,用新的类训练DNN。然而由于需要对抗性样本的先验知识,这些方法可能不实用。防御蒸馏Distillation as a Defense to Adversarial Perturbations against Deep Neural Networks旨在向敌人隐藏梯度信息。该策略通过将最后一层替换为修改后的softmax函数来实现。

对抗检测在执行过程中识别对抗样本。Grosse等人使用统计检验来测量敌对样本和良性输入之间的距离。这种技术需要预先生成对抗性样本,这在实践中可能不能满足要求。徐等人则提出了一种不需要对抗样本的特征压缩策略。它通过减少8位尺度的颜色深度和图像平滑来缩小特征空间。经过特征压缩后,相对于未压缩样本,敌对样本很可能会产生不同的分类结果,而良性样本则不会。它被认为是检测对抗样本的最先进的方法。

我们的AmI系统也依赖于分类不一致性,但AmI利用了FRSes的可解释性,并且在人脸识别环境中比特征压缩具有明显更好的性能,如§4.2所示。

Approach

我们的目的是探索使用DNN的可解释性来检测对抗样本。我们关注FRSes,其目标是识别给定人脸图像的身份。在这种特定情况下,我们的技术的首要思想是确定FRS DNN的预测结果是否基于人类可识别的特征/属性(例如,眼睛、鼻子和嘴巴)。否则,我们认为输入图像是对抗性的。

我们的技术包括两个关键步骤:(1)通过分析FRS在一小组训练输入上的行为,识别与人类可感知属性相对应的神经元,称为属性目击者; (2)给定一幅测试图像,观察属性目击者的激活值,并与其他神经元的激活值进行比较,以预测该图像是否为对抗性。在(2)中,也采用活化值的变换来增强对比。

图3: AmI的架构。
它首先识别人脸属性的形状(步骤1-Landmark generation),然后要求人类对识别出的形状进行注释(步骤2-Attribute annotation)(Left eye, Right eye, Nose, Mouth …)。对于每个属性,AmI自动提取原始模型中的属性目击者(步骤3-Attribute witness extraction)。随后利用提取的属性目击者来构建属性导向模型(步骤4-Attribute steered model)。对于一个测试输入,新模型和原始模型并排执行,以检测输出不一致,表明为对抗样本(步骤5-Consistency observer)。

AmI的工作流如图3所示。
1. 首先,我们分析了FRS如何使用人类可感知的属性来识别输入图像,以提取属性目击者。图3中的步骤1-3说明了提取过程。对于训练输入,我们在步骤1中利用自动技术dlib检测人脸属性的形状。
2. 注意,在这一步之后,重要的形状是用虚线标识的。在第2步中,利用人工工作来用属性注释形状。虽然可以使用人脸属性识别DNN模型实现自动化,但这些模型中的固有错误可能会阻碍证明我们技术的概念,因此我们决定使用人类的努力来完成这一步。注意,这些都是一次性的工作,带注释的图像可以在多个模型中重用。
3. 对于每个人类识别的属性,我们在FRS中提取相应的神经元(步骤3),这些神经元就是属性目击者。这一步涉及一种新的双向推理属性变化和神经元变化之间的相关性。具体内容见§3.1。对于每个属性,我们将这些步骤应用于一组10个训练输入(经验上足够),以提取统计上有意义的证据。其次,利用所提取的证据构造了一种新的对抗样本检测模型。图3中的步骤4-5显示了这个过程。
4. 在第四步中,我们通过增强属性目击者神经元和削弱其他神经元来获得一个新的模型。我们将结果模型称为属性导向模型。直观地说,新模型旨在抑制模型执行中不可解释的部分,鼓励可解释的部分(即推理部分)。这类似于人类决策的回顾和强化过程。详细内容见§3.2。
5. 为了检测对抗样本,对于每个测试输入,我们都使用原始模型和属性导向模型来预测其身份。如果观察到不一致的预测(第5步),我们将其标记为对抗性。

Attribute Witness Extraction

图4: 属性目击者提取。
步骤A-Attribute substitution: 将属性替换应用于基础图像,将属性替换为其他图像中的对应属性,然后观察具有不同值的神经元(步骤C)。观察最上面一排的图片有不同的鼻子,但脸是一样的。(数值发生改变的区域A就包含属性1的区域)
步骤B-Attribute preservation: 通过将其他图像中的属性替换为基础图像的属性,然后观察没有改变的神经元来保存一个属性(步骤D)。(数值保持不管的区域B就包含属性1的区域)
注意,下面一行不同的脸有相同的鼻子(从基础图像复制)。两个集合相交产生属性目击者(步骤E)。(区域A和区域B求交集)

  1. AmI的第一步是确定属性目击者,即单个属性对应的神经元。提取过程如图4所示,由两个相反方向的推理组成:属性替换(步骤A)和属性保持(步骤B)。更具体地说,在步骤A中,给定一个称为基本图像的输入图像和一个感兴趣的属性,我们的技术自动用其他图像中相应的属性替换图像中的属性。例如,在图4的第一行图像中,原始图像中的鼻子被替换为其他不同的鼻子。
  2. 然后,FRS执行基础图像和每个替换图像,提取激活值较大差异的内部神经元作为替换属性的超集(步骤C)。然而,并不是所有这些神经元都对这个属性至关重要。因此,我们通过属性保持来进一步细化神经元集。
  3. 特别是在步骤B中,我们使用基础图像中的属性来替换其他图像中的属性。我们将得到的图像称为属性保留图像,然后利用这些图像提取与基础图像在步骤上没有或相差很小的神经元激活值(步骤D)。从直观上看,由于所有的图像都保留了相同的属性,所以属性目击者神经元不会有激活值的变化。但是,没有变化的神经元并不一定是属性的本质,因为一些抽象的特征也可能不会发生变化。
  4. 因此,我们将属性替换和属性保持提取的神经元相交作为属性目击者(步骤E)。

双向推理的设计选择至关重要。理想情况下,我们希望提取与个体属性有很强相关性的神经元。换句话说,给定一个属性,它的目击者将包括与该属性有对应关系的神经元(或某种意义上“等价于”该属性)。属性替换表示下面的正向推理。
$$\text{Attribute changes} → \text{Neuron activation changes (1)} $$

然而,这种单向关系比等价关系弱。理想情况下,我们希望见证神经元也能满足以下逆向推理。
$$\text{Neuron activation changes} → \text{Attribute changes (2)} $$

然而,这种逆向推理在实践中很难实现。因此,我们诉诸推理下列性质,它在逻辑上等同于等式2,但可向前计算。
$$\text{No attribute changes} → \text{No neuron activation changes (3)} $$
式3所示的推理本质上对应于属性保持。在§4.2中,我们证明了单向推理产生的检测结果不如双向推理。

详细设计。假设$F: X \rightarrow Y$表示一个$FRS$,其中$X$是输入图像的集合而$Y$是输出身份的集合。令$f^l$表示$l \verb|-| th$层,$x \in X$表示一些输入。一个有$n+1$层的$FRS$可以按下述定义:
$$F(x)=\text{softmax} \circ f^n \circ \cdots \circ f^1(x) \text{ } \text{(4)}$$

对于每一层$f^l$,它从上一层获取一个激活向量,并生成一个新的激活向量。每个新的激活值(表示该层中的一个神经元)由一个神经元函数计算,该神经元函数取前一层的激活向量并生成该神经元的激活值。换句话说,
$$f^l(p)=\langle f_1^l(p), \cdots, f_m^l(p) \rangle \text{ } \text{(5)}$$
$m$代表第$l$层的神将元个数,$p$代表第$l-1$层的激活向量,$f_j^l(p)$代表神经元$j$的函数。

属性替换推理属性变化导致神经元值的变化。具体来说,它将一个基础图像中的一个属性(例如,鼻子)替换为其他图像中的对应属性,然后观察神经元的变化。在第$l$层的神经元$j$的激活差异定义如下:
$$\triangle f_{j,as}^l=\lvert f_j^l(p) - f_j^l(p_{as}) \rvert \text{ } \text{(6)}$$

其中下标$as$表示替换后的图像。变化的幅度表明了属性与相应神经元之间正向关系的强度。变异越大,关系越强。具体来说,如果一个神经元$f_j^l(p)$的变化大于该层所有观测变化的中位数,则我们考虑其为(属性目击者的)一个候选人。令$g_{as}^{i,l}(p)$为第$l$层属性$i$的目击者候选集。它可以用下面的方法计算:
$$g_{as}^{i,l}(p)=\{ f_j^l(p) \vert f_{j,as}^l > median_{j \in [1,m]}(\triangle f_{j,as}^l) \} \text{ } \text{(7)}$$
我们对10幅训练图像计算$g_{as}^{i,l}(p)$,并采取多数票。注意,属性目击者表示(训练过的)$FRS$的属性,可以通过分析少量的训练运行来提取。

值得指出的是,一个关键的设计选择是用对应的属性替换属性(来自其他人)。一个简单的图像转换,消除了一个属性(例如,用一个黑/白矩形取代鼻子)不能很好地工作。直观地说,我们正在推理一个属性的不同实例化(例如,不同形状和不同肤色的鼻子)如何影响内部神经元。然而,消除属性反而能推导出属性的存在(或不存在)如何影响神经元,这并不是身份识别的基础。

属性保存可以推导出,一个属性不改变就不会导致其目击者神经元的改变。换句话说,它通过将基础图像复制到其他图像来保留基础图像的属性。令$g_{ap}^{i,l}(p)$表示在属性$i$变换下,第$l$层中变化不大的神经元函数集合,下标$ap$表示属性保持。可以用下面的方法计算:
$$g_{ap}^{i,l}(p)=\{ f_j^l(p) \vert f_{j,ap}^l \leq median_{j \in [1,m]}(\triangle f_{j,ap}^l) \} \text{ } \text{(8)}$$

它本质上是捕捉那些有很强反向关系的神经元(如公式2和公式3)。然后通过交集计算属性$i$的见证$g^i$:
$$g^i=\bigcap\limits_{l=1}^n g^{i,l}(p)=\bigcap\limits_{l=1}^n g_{as}^{i,l}(p) \cap g_{ap}^{i,l}(p) \text{ } \text{(9)}$$

最后,我们想指出的是,不同属性的见证集可能会重叠,特别是对于模型属性间关联的神经元(见表1)。对于$FRS$能够基于属性进行推理的良性输入,新模型能够产生与原模型一致的预测结果。相对于对抗性输入,新模型会产生不一致的结果,因为这种输入很难推理。

Attribute-steered Model

在提取见证后,通过对原模型的转换(不需要额外的训练)构造一个新的模型。我们称之为属性导向模型。特别是,我们加强了目击神经元而削弱了其他神经元。直觉上,我们强调推理和压抑直觉。

神经元弱化使每一层非目击神经元的激活值小于该层目击神经元激活值的平均值。对所有满意的(非目击的)神经元进行以下缩减:
$$v^{'}=e^{- \frac{\upsilon - \mu}{\alpha \cdot \sigma}} \cdot \upsilon \text{ } \text{(10)}$$
$\upsilon$代表非目击神经元的值;$\mu$和$\sigma$分别是同一层中目击神经元的平均值和标准差;$\alpha$定义减弱的幅度,在本文中设置为100。值得注意的是,非目击神经元的值越大,它们的减少幅度就越大。这里使用的函数$e^{-x}$是受广泛用于图像处理去噪核的高斯函数$e^{-x^2}$的启发。

神经元增强使所有目击神经元的值增加如下:
$$v^{'}= \epsilon \cdot \upsilon + \left( 1 - e^{- \frac{\upsilon - \text{min}}{\beta \cdot \sigma}}\right) \cdot \upsilon \text{ } \text{(11)}$$

其中是$\epsilon$强化因子,第二项的范围在$[0,\upsilon)$(因为$\upsilon \verb|-| \text{min}$必须大于0)。第二项的存在允许更大的激活值有更大的扩展(不仅仅是$\epsilon$)。 在本文中,$\epsilon$和$/beta$分别设为1.15和60。它们是通过由100张良性图像组成的调优集来选择的,这与测试集没有重叠。在生产运行过程中对各试验投入逐层进行弱化强化。

除了弱化和增强之外,我们还应用属性保持变换进一步破坏对抗性样本所利用的不可解释特征。卷积/池化层的激活以矩阵的形式存在。在这个变换中,我们先去掉矩阵的边缘,然后通过插值的方法将其重新塑形到原来的尺寸。请注意,属性导向性模型对于良性输入(其预测结果是基于属性的)的属性保持转换具有弹性。特别是,对于池化层中的非目击神经元,我们首先删除边缘,然后扩大剩余的以适应层来调整它们的大小。例如,在VGG-Face pool3层的激活形状是28x28。我们首先去掉大小为2的边距得到一个新的24x24的激活形状。然后我们使用双三次插值将激活的大小调整回28×28。由于该变换仅适用于非目击神经元,因此将其视为神经元弱化的一部分,其结果见表3。

Experiments

我们使用最广泛使用的FRSes之一VGG-Face来证明AmI的有效性。三个数据集,VGG Face dataset (VF), labelled Faces in the Wild (LFW)和CelebFaces
使用属性数据集(CelebA)。我们使用VF数据集的一个小子集(10幅图像)来提取属性见证,它与其他用于测试的数据集没有交集,以评估提取的属性见证和对抗样本检测的质量。由于见证表示训练过的FRS的特性,它们的提取只需要对一小组良性输入进行分析。将实验结果与目前最先进的特征压缩检测技术对7种敌对攻击进行了比较。AmI在GitHub上公开可用。

Evaluation of Extracted Attribute Witnesses

提取的见证在表1中,表1显示了层数(第1行)、每层神经元数(第2行)和见证数(剩余行)。值得注意的是,虽然每一层有64-4096个神经元,但提取的证人数(见证数)小于20个。有些层由于专注于融合特征而不是提取特征而没有提取见证人。为了评价所提取的见证人的质量,即他们描述相应属性的程度,我们设计了类似于Attribute and Simile Classifiers for Face Verification的实验。对于每个属性,我们创建一组可能包含也可能不包含该属性的图像,然后我们训练一个两类模型,基于目击者的激活值来预测属性的存在预测的准确性反映了证人的素质
该模型有两层:
1. 第一层获取属性目击神经元的激活值(跨越所有层)。
2. 第二层是带有两个输出类的输出层。

我们使用来自VF集的2000幅训练图像(1000幅有属性,1000幅没有属性)来训练模型。然后我们在一个不相交的集合上进行测试来自VF和LFW的400个测试图像(200个带属性,200个不带属性)。为了比较,我们还使用了VGG-Face人脸描述符层(即fc7层)的激活值来预测属性的存在。其他研究人员认为这一层代表了Deep Face Recognition中的抽象人脸特征。结果如表2所示。 对于VF数据集,对于3个属性,证人始终达到高于93%的准确率,而人脸描述符低于86%。因为LFW是一个与训练集中的人员不同的数据集(来自VF),我们观察到准确度下降。然而,属性目击者的准确率仍然高于面部描述符。结果表明,AmI提取的见证人质量较高。

Detection of Adversarial Samples

我们为§2中讨论的每种攻击生成100个对抗样本。对于补丁攻击(表3中的Patch),使用Liu等人提供的代码生成对抗样本。因为Sharif等人没有提供攻击代码,我们根据论文实现了他们的攻击(眼镜)。使用Carlini和Wagner的原始实现生成了三种扰动攻击($C \text{&W}_0$、$C \text{&W}_2$和$C \text{&W}_\infty$)。我们使用CleverHans库生成非目标攻击FGSM和BIM。对于每个目标攻击,我们测试两个类似特征压缩Feature Squeezing: Detecting Adversarial Examples in Deep Neural Networks的设置:目标作为第一个输出标签(First),目标是正确的作为下一个标签(Next)。注意,成功的攻击样本包括具有重叠属性(如眼镜和胡须)的图像。虽然这些重叠属性没有被明确提取,但AmI仍然可以成功地检测到存在的对抗性样本。从表3可以看出对于大多数攻击,AmI可以有效地检测对抗性样本,准确率超过90%。对特征压缩(FS)进行了相同的测试。FS的最佳效果为77%。FS尤其在FGSM和BIM上表现不佳,这与Xu等的观察一致。结果表明,尽管FS在数字识别(即MNIST)和目标分类(即CIFAR-10)方面取得了成功,但它对FRSes的效果并不好。我们怀疑特征压缩只对颜色深度等原始特征进行压缩,因此在人脸识别等依赖更抽象特征的复杂任务中效率较低。然而,目前还不清楚如何压缩人眼等抽象特征。

我们还评估了检测技术对良性输入的影响。假阳性率(表3中的FP列)在VF数据集上,AmI为9.91%,FS为23.32%。同样的评估也在外部数据集CelebA上进行,它不与原始数据集相交。我们从CelebA中随机选择1000张图片,并对FS和AmI进行测试。AmI的假阳性率为8.97%,FS为28.43%。我们怀疑FS较高的假阳性率是由于与良性输入严重依赖的压缩原始特征相同的原因。

为了支持我们使用双向推理提取属性见证和使用神经元增强和弱化的设计选择,我们进行了几个额外的实验:(1)仅使用属性替换提取证人,建立属性导向模型进行检测,结果如表3所示(AS);(2)只使用属性保存(AP);(3)只削弱了非证人(WKN);(4)只加强证人(STN)。我们的结果显示,虽然AS或AP单独可以检测对抗样本具有良好的准确性,但它们的假阳性率(见FP一栏)非常高(即20.41%和30.61%)。这是因为他们提取了太多的神经元作为见证人,而在新模型中,这些神经元得到了强化,导致良性输入的分类结果是错误的。此外,使用弱化有不错的结果,但加强进一步改善了他们与假阳性的权衡。

我们通过在对抗性检测中排除某些属性,进一步研究了使用不同见证集的AmI的鲁棒性。具体来说,我们对使用双向推理提取的属性见证的四个子集进行评估,如表3所示:(1)排除左眼证人(w/o left eye);(2)排除有右眼的证人((w/o Right Eye);(3)排除鼻子证人(w/o Nose);(四)排除嘴巴证人((w/o Mouth)。我们观察到检测精度下降了一点(在大多数情况下小于5%)。这表明AmI对于不同的属性见证是鲁棒的。

Conclusion

我们提出了一种对抗样本检测技术AmI在人脸识别的背景下,利用DNN的可解释性。我们的技术具有一些关键的设计选择:新的面部属性和内部神经元之间的双向对应推理;用属性级突变代替像素级突变;神经元的增强和减弱。结果表明,AmI是高效的,在目标环境中取代了最先进的技术。

Acknowledgment

我们感谢匿名审稿人提出的建设性意见。该研究部分由美国国防部高级研究计划局根据FA8650-15-C-7562合同支持,美国国家科学基金会根据1748764和1409668合同支持,
ONR在N000141410468和N000141712947合同下,Sandia国家实验室在合同下 1701331. 本文中的任何观点、发现和结论都只是作者的观点,并不一定反映我们的发起人的观点。

Demo Pre

Reference

Prepare

对抗攻击: 生成器和判别器一个freeze一个unfrezee,生成对抗性例子和学习对抗性例子,不断迭代,两者的能力都变强。

项目的机制: 强化识别五官的神将元(我们称之为关键神经元)的功能(推理),弱化识别非五官的神经元的功能(直觉)。来抵抗对抗性攻击,做到和人类一样的感官效果来识别人脸。从像素级提高到人脸五官的属性级

优势:
1. 现有的防御技术大致可以分为两类:模型强化和对抗检测。
1. 模型强化:提高DNN的鲁棒性需要对抗性样本的先验知识,通过额外训练对抗样本而起作用,这些方法可能不实用。
2. 对抗检测:在执行过程中识别对抗样本,这种技术需要预先生成对抗性样本,这在实践中可能不能满足要求。
2. 相比之下,最先进的特征压缩技术只能达到55%的准确率和23.3%的假阳性;该技术对7种攻击的检测准确率达到94%,良性输入的误报率为9.91%。所以项目的技术在人脸识别环境中比特征压缩具有明显更好的性能。
3. 无论对定向攻击还是非定向攻击都一样有效,无须再针对攻击类型分别训练,节约成本,提高了效率
1. 定向攻击使用了patching(including a patch in the shape of glasses)和pervasive perturbations(任意位置突变)做实验
2. 非定向攻击使用了FGSM(Fast Gradient Sign Method)和BIM(extended FGSM by taking multiple small steps)做实验
3. 定向攻击:C&W0攻击,限制可以改变的像素的数量,但不限制其大小; C&W2攻击,使对抗样本和原始图像之间的欧氏距离最小化。C&W∞攻击,它限制了单个像素的变化幅度,但不限制像素的变化数量。

Video:
为了验证防御系统的有效性,我们需要先生成一个对抗性例子,使它可以成功攻击人脸识别系统,然后我们的防御系统再进行检测。
1. 首先演示的是人脸识别系统的正常的工作过程,第一步可以观察到,系统会将attacker和victim识别为不同的两个人,所以人脸验证不通过,结果为Fail
2. 第二步,我们随机选取一个最著名的对抗性攻击的算法FGSM来结合attacker和victim的脸生成一个对抗性的例子,并用它来攻击人脸识别系统。观察到对抗攻击成功了,人脸验证被attacker通过了,结果为Pass
3. 第三步,用我们的防御系统来检测对抗性例子,如果是对抗性例子,结果应该为’Adversary’,如果是没有被对抗攻击过的真实图片,结果应该是’Real’。这里我们观察到防御系统给出的结果是’Adversary’,说明对于这张对抗攻击的人脸图片它检测成功了。

Cmpile Caffe

(fgsm detect时需要使用caffe model) cmake-3.9.2 + vs2015 + Anaconda3-2.5.0 (python3.5) + CUDA 8.0 + cuDNN 5

  1. 安装conda
    • Anaconda3-2.5.0-Windows-x86_64.exe
    • 得到系统default python (3.5)
  2. 安装CUDA Toolkit 8.0
    • Windows下多版本的CUDA可以共存
      • 不需要切换,只要环境变量PATH中有相应的CUDA路径即可,无需手动切换了
      • 可以使用任何一个版本,只要在环境变量中有对应的CUDA路径即可
  3. 安装cuDNN 5
    • cuDNN v5 Library for Windows 10
    • 把cuDNN下的lib,include,lib文件夹拷贝到CUDA的安装路径: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0
  4. 添加系统Path
    C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin
    C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\libnvvp
    C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64
    C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include
    C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\extras\CUPTI\lib64
    C:\Program Files\NVIDIA Corporation\NVSMI
    C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR
    C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common
  5. 添加系统环境变量
    CUDA_PATH_V8_0 = C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0
  6. 安装Cmake
    • 版本要>=3.4 | 所有选项保持默认即可,一直点击下一步,直到安装完成
    • 添加系统Path: C:\Program Files\CMake\bin
  7. 安装VS2015 community
    - 安装时
        - vs2013=Microsoft Visual Studio 12.0 
        - vs2015=Microsoft Visual Studio 14.0
        - 两者可以安装在一台电脑上并不冲突,可以同时安装,但必须先安装低版本(vs2013)再安装高版本(vs2015),可以兼容
    - 安装时勾选
        - Technically only the VS C/C++ compiler is required (cl.exe)
        - 通用Windows平台开发(包括其子选项C++通用Windows平台工具)
        - 使用C++的桌面开发
    - 安装地址要添加到系统环境
        - vs2013: C:\Program Files (x86)\Microsoft Visual Studio 12.0
        - vs2015: C:\Program Files (x86)\Microsoft Visual Studio 14.0
    • 若需要安装VS2013 community,点击此处,则Python只能用2.7版本的
  8. 编译caffe
    • 介绍
      caffe是用C++语言编写的深度学习框架,作者是伯克利大学的博士贾扬清,caffe目前主要用于深度学习下的图像处理方面,也就是支持卷积神经网络CNN
    • 下载caffe-windows源码
      $git clone https://github.com/BVLC/caffe.git
      $cd caffe
      $git checkout windows
    • 下载Ninjia (用Nijia编译才做这一步,用VS编译不需要这一步)
      $cd xx\caffe
      $git clone git://github.com/ninja-build/ninja.git
      $cd ninja
      # 打开VS2015 x64 Native Tools Command Prompt
      # 将python.exe(3.5版本的)添加到Path
      $python ./configure.py --bootstrap
      # 编译完成(出现一些东西),将xx\caffe\ninja添加到Path
    • 修改caffe\scripts\build_win.cmd文件
      • 根据自己的编译器(VS or Nijia)、python版本选择修改
        - WITH_NINJA=1      | 表示用Ninja编译(或者直接利用vs2015 直接编译也可以,不用安装Ninja)
        - CPU_ONLY=1        | 沒有GPU,或者就是想编译CPU版本
        - CPU_ONLY=0        | 有GPU,想编译GPU版本
            - 在cmake -G"!CMAKE_GENERATOR!"里添加CUDA的路径: 
                - -DCUDNN_ROOT="C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0" ^
        - CUDA_ARCH_NAME=Pascal | Fermi  Kepler  Maxwell  Pascal  All (这些都是NVIDIA GPU不同的架构)
            - 对于我的 DELL Desktop: NIVIDA GeForce GTX 1050 就是采用的Pascal架构
            - 对于Azure VM 和 Windows Server: NVIDIA Tesla V100 采用的是Volta架构
        - PYTHON_VERSION=3  | 表示python3.x版本接口
            - 相应地: set CONDA_ROOT=C:\Anaconda3 (C:\Anaconda3\python.exe是Python 3.5.1 :: Anaconda 2.5.0 (64-bit))
        - CONDA_ROOT=上面python3.5的路径
        - BUILD_PYTHON=1
        - RUN_INSTALL=1
    • C:\Users\PC.caffe\dependencies\libraries_v140_x64_py35_1.1.0\libraries\include\boost-1_61\boost\config\compiler\nvcc.hpp 删除最后三行
    • build之前的准备
      - python.exe的路径一定只能有python3.5的,如果有conda的python.exe(非3.5版本的)先删除,build完再恢复
      - 否则会报错: Found PythonInterp: C:/ProgramData/Anaconda3/python.exe (found suitable version "3.8.5", minimum required is "2.7")
    • 编译caffe
      • 在caffe\scripts下新建build文件夹,并清空里面的所有文件
      • 以“管理员权限”打开VS2015 x64 Native Tools Command Prompt
        $cd scripts
        $build_win.cmd
        # 每次运行build_win.cmd之前都要先清空build文件夹
        # VS2015 build结果: 9037 个警告 | 0 个错误 | 已用时间 00:22:02.25  √
  9. 添加Python接口到detect.py运行的虚拟环境
    • 将caffe\python\caffe拷贝到虚拟环境的\Lib\site-packages
      $python
      $import caffe

Compile Error

  1. Unsupported gpu architecture ‘compute_90’
    CustomBuild:
    Building NVCC (Device) object src/caffe/CMakeFiles/cuda_compile_1.dir/layers/Release/cuda_compile_1_generated_absval_
    layer.cu.obj
    nvcc fatal   : Unsupported gpu architecture 'compute_90'
    CMake Error at cuda_compile_1_generated_absval_layer.cu.obj.Release.cmake:222 (message):
        Error generating
        C:/Path/caffe/scripts/build/src/caffe/CMakeFiles/cuda_compile_1.dir/layers/Release/cuda_compile_1_generated_absval_
    layer.cu.obj
    
    
    C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.CppCommon.targets(171,5): error MSB6006: “cmd.exe”已 退出,
    代码为 1。 [C:\Path\caffe\scripts\build\src\caffe\caffe.vcxproj]
    已完成生成项目“C:\Path\caffe\scripts\build\src\caffe\caffe.vcxproj”(默认目标)的操作 - 失败。
    
    已完成生成项目“C:\Path\caffe\scripts\build\ALL_BUILD.vcxproj”(默认目标)的操作 - 失败。
    - 解决方法: C:\Users\PC\.caffe\dependencies\libraries_v140_x64_py35_1.1.0\libraries\include\boost-1_61\boost\config\compiler\nvcc.hpp 删除最后三行

Configure Virtual Environment

  1. 配置虚拟环境
    • Visual Studio 2015 + Anaconda env(python 3.5) + CUDA 8.0 + cuDNN 5 |用于编译detect需要使用的caffe model的caffe module
    • Visual Studio 2015 + Anaconda env(python 3.6) + tensorflow-gpu 1.7.0 + CUDA 9.0 + cuDNN 7.0.5 |用于运行facenet recognition和fgsm attack的环境
    • Visual Studio 2015 + Anaconda env(python 3.5) + tensorflow-gpu 1.7.0 + CUDA 9.0 + cuDNN 7.0.5 |用于运行detect的环境
  2. 添加系统环境
    C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\bin
    C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\libnvvp
    C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\lib\x64
    C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\include
    C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\extras\CUPTI\lib64
    C:\Program Files\NVIDIA Corporation\NVSMI
    C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR
    C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common
    测试GPU是否安装成功: nvcc -V
    显示当前GPU使用情况: nvidia-smi.exe -l 1 (一秒钟更新一次信息)
  3. 创建conda虚拟环境
    1. facenet recognition和fgsm attack的环境
      $conda create -n attack python=3.6
      $conda activate attack
      $pip install cleverhans tensorflow-gpu==1.7.0 scikit-learn opencv-python numpy==1.16.2 scipy==1.2.1 matplotlib==3.1.1 Pillow
      $python origin\origin.py Elon_Musk Jeff_Bezos
      $python adv/fgsm.py
    2. detect的环境
      $conda create -n detect python=3.5
      $conda activate detect
      $pip install scikit-image scipy==1.2.1 opencv-python scikit-learn matplotlib Pillow tensorflow-gpu==1.7.0
      $conda install protobuf
      # 将caffe\python\caffe拷贝到python所在\Lib\site-packages(即虚拟环境的site-packages)
      $python detect/detect.py

Run Program

  1. 下载模型20180402-114759
    • LFW accuracy: 0.9965 VGGFace2
    • 放入 Face-Adversary-Attack-Defense\model下
  2. 下载模型VGG-Face caffe model
    • 放入 Face-Adversary-Attack-Defense\model下
  3. 运行程序
    $python C:\ASTRI-Adv-Detector\origin\origin.py Elon_Musk Jeff_Bezos
    # 结果: demo/origin/下生成3张图片
    #   1. 160x160的两张人脸: victim原始剪裁人脸 & attacker原始剪裁人脸
    #   2. origin.png: victim | attacker with face verification probability (fail)
    $python C:\ASTRI-Adv-Detector\adv\fgsm.py
    # 结果: demo/adv/下生成3张图片
    #   1. 160x160的两张人脸: victim原始剪裁人脸 & attacker原始剪裁人脸+fgsm noise
    #   2. adv.png:
    #       - 上排: victim | attacker with face verification probability (fail)
    #       - 下排: noise  | attacker(fgsm face) with face verification probability (pass)
    $python C:\ASTRI-Adv-Detector\detect\detect.py
    # 结果: demo/detect/下生成1张图片detect.png
    #       - 上排: victim | attacker with face verification probability (fail)
    #       - 下排: noise  | attacker(fgsm face) with detect result (Real or Adversary)

Run Server

  1. terminal {node server.js}:
    - 应用程序会启动服务器,并在端口3000上侦听连接。此应用程序以不同的响应针对不同的URL或路由的请求。
    1. 对'/facenet'路由:
        - 接收pathname(Elon_Musk&Jeff_Bezos),分解成attacker(Elon_Musk)和victim(Jeff_Bezos)
        - 写入origin.bat:python ASTRI-Adv-Detector/origin/origin.py attacker victim
        - 执行origin.bat
        - 生成demo/origin/origin.png
    2. 对'/adv'路由:
        - 写入adv.bat: python ASTRI-Adv-Detector/adv/fgsm.py
        - 执行adv.bat
        - 生成demo/adv/adv.png
    3. 对'detect'路由
        - 写入detect.bat: python ASTRI-Adv-Detector/detect/detect.py
        - 执行detect.bat
        - 生成demo/detect/detect.png
  2. Web Browser
    1. http://127.0.0.1:3000/facenet?Elon_Musk&Jeff_Bezos
        - 对服务器发起访问,得到'/facenet'路由下的响应{页面上显示图片demo/origin/origin.png}
    2. http://127.0.0.1:3000/adv
        - 对服务器发起访问,得到'/adv'路由下的响应{页面上显示图片demo/adv/adv.png}
    3. http://127.0.0.1:3000/detect
        - 对服务器发起访问,得到'/detect'路由下的响应{页面上显示图片demo/detect/detect.png}
Author: ElaineXHZhong
Link: https://elainexhzhong.github.io/2021/06/03/Face-Adversary-Attack-Defense-System/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.