在Python中使用相似性度量评估对抗样本

在Python中使用相似性度量评估对抗样本_第1张图片

对于分类神经网络,一个攻击的例子是输入图像受到干扰(或策略性修改),从而导致故意错误分类。

有各种算法利用给定分类模型的信息(梯度和特征映射),并修改输入图像,使其被错误分类(非目标攻击)或总是被错误分类为特定类别(目标攻击)。

在本文中,我们将研究一些白盒攻击(在了解模型信息后生成攻击的算法)。

攻击:

  • Fast Gradient Sign Method(https://arxiv.org/abs/1412.6572) (FGSM)

  • Projected Gradient Descent (https://arxiv.org/abs/1706.06083)(PGD)

  • DeepFool(https://arxiv.org/pdf/1511.04599.pdf)

  • Carlini & Wagner(https://arxiv.org/abs/1608.04644) (C&W)

生成攻击

有一些Python库已经实现了这些(和其他)攻击算法,并且还提供了现成的模块来为我们的用例生成它们。Cleverhans(https://github.com/cleverhans-lab/cleverhans), FoolBox(https://github.com/bethgelab/foolbox), and ART(https://adversarial-robustness-toolbox.readthedocs.io/en/latest/)是三个普遍使用并定期维护的用于对抗样本(AE)生成的开源库。

现在,我们使用ART。

安装对抗性健壮性工具箱,如下所示:

pip install adversarial-robustness-toolbox

或参考官方存储库以获取进一步指导:https://github.com/Trusted-AI/adversarial-robustness-toolbox。

接下来,我们可以生成如下所示的攻击:

import torch
from torchvision import models

from art.classifiers import PyTorchClassifier
from art.attacks.evasion import FastGradientMethod, ProjectedGradientDescent, DeepFool, CarliniL2Method

# l加载和预处理imagenet图像
# images = load_preprocess_images(im_paths)

inceptionv3 = models.inception_v3(pretrained=True)

loss = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(alexnet.parameters(), .1, momentum=0.9, weight_decay=1e-4)
wrapped_model = PyTorchClassifier(
    model=inceptionv3, 
    loss=loss, 
    optimizer=optimizer, 
    clip_values=(0, 1),
    input_shape=(3,299,299),
    nb_classes=1000,
    preprocessing=((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))
)

norm = 2
attack_fgsm = FastGradientMethod(wrapped_model, norm=norm)
attack_pgd = ProjectedGradientDescent(wrapped_model, norm=norm, verbose=True)
attack_df = DeepFool(wrapped_model, max_iter=1000, verbose=True)
attack_cw = CarliniL2Method(wrapped_model, max_iter=1000, verbose=True)

path="./sample.png"
im = cv2.imread(path)
# 输入格式为(channel, width, height) 像素值范围为[0,1]
org_im_in = [(im.T/255).astype(np.float32)]

adv_images_fgsm = attack_fgsm.generate(x = org_im_in)
adv_images_pgd = attack_pgd.generate(x = org_im_in, verbose=True)
adv_images_df = attack_df.generate(x = org_im_in, verbose=True)
adv_images_cw = attack_cw.generate(x = org_im_in, verbose=True)

为了生成攻击,我们使用InceptionNet V3模型作为算法生成攻击的基础。我们使用ImageNet数据集中的真实图像,因此也使用ImageNet上预训练的InceptionNet V3的Pytorch模型。

generate()方法的输出是一个列表,其中包含与输入格式相同(通道、宽度、高度)且像素值在[0,1]范围内的干扰图像。

在Python中使用相似性度量评估对抗样本_第2张图片

从视觉上看,在上面的图像中,我们可以看到FGSM攻击会造成人眼可见的扰动。据说这是一次相对较弱的攻击。然而,CW显示了理想情况!没有明显的扰动,并且证明该攻击比其他攻击对分类器更具鲁棒性。

接下来,我们可以开始测量这些被攻击图像与原始图像的相似性。

对于人眼来说,很容易分辨出两幅给定图像的质量有多相似。然而,如果要量化这种差异,我们需要数学表达式。从余弦相似性到ERGAS,有几种这样的度量标准可用于测试图像与其原始版本相比的相似度。

我们从现有文献中了解到,DeepFool和CW是健壮的攻击,它们欺骗分类器的成功率较高。由于它们对目标图像的干扰(或噪声)最小,因此也很难检测到它们。这些点分别通过降低模型的分类精度和图像的视觉效果进行评估。

阅读有关在Python中实现这些图像相似性度量的更多信息:https://towardsdatascience.com/measuring-similarity-in-two-images-using-python-b72233eb53c6。

Python中的相似性度量

我们将使用Python中的sewar库来实现一些可用指标。

从pip开始安装sewar并导入所需模块,如下所示

from sewar.full_ref import mse, rmse, psnr, uqi, ssim, ergas, scc, rase, sam, msssim, vifp

在这些攻击中,我们将只使用PSNR、ERGAS、SSIM和SAM。我只选择了这几个,因为在像CW和Deep傻瓜这样的健壮攻击中,在上面列出的所有攻击中,只有这几个能够以明显的方式捕获和放大差异。

sewar模块可直接使用,如

ergas_score = ergas(original, adversarial)

下面你可以看到各种攻击和各种分数的结果。显然,ERGAS和SAM比其他人更能放大攻击之间的差异。

在Python中使用相似性度量评估对抗样本_第3张图片

根据我们的假设,我们发现CW攻击图像的相似性得分高于FGSM/PGD攻击。这意味着与其他不太复杂的攻击相比,CW/DeepFool的敌对图像与原始图像更为相似。

你可以自己尝试其他类型的攻击!

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。

扫描二维码添加小编↓

在Python中使用相似性度量评估对抗样本_第4张图片

你可能感兴趣的:(python,深度学习,机器学习,人工智能,计算机视觉)