AidLux智慧交通AI安全之对抗攻击算法

AI对抗攻击算法划分
目前主流对抗 攻击算法的总体分支与逻辑:

AidLux智慧交通AI安全之对抗攻击算法_第1张图片

 

        其中,当算法模型参数和训练数据等信息被攻击者所掌握,并且攻击者在此基础上进行的针对性攻击称为白盒攻击。白盒攻击主要分为基于梯度的攻击,基于优化的攻击以及基于GAN的攻击。而在对算 法模型的结构和参数一无所知,甚至相关训练数据也一无所知的情况下,进行攻击的过程称为黑盒攻击。 黑盒攻击主要分为基于迁移的攻击和基于查询的攻击两大类。
基于迁移的攻击逻辑由白盒攻击延伸而来,一般会有一个白盒模型作为替身模型(surrogate)进行攻 击,而生成的对抗样本一般也会对其他模型有一定的迁移攻击性。 基于查询的攻击其主要是通过查询黑盒模型的输出信息,对黑盒模型进行直接的攻击,但完成整个攻击流程往往需要大量的查询,容易被模型所有者检测到异常。再者,基于此我们再介绍两个有趣的攻击策略有目标攻击(targeted attack):通过攻击使得模型将特定数据错误输出到指定的label上。 无目标攻击:通过攻击使得模型将特定数据错误输出到除真实label外的其他任何label上。类模型,针对有目标攻击,我们通过生成对抗样本,想让分类模型将猫的类别错判成狗。而无目标攻 击,并不限定特定类别,只要模型发生错判即可。

(一)白盒攻击

        基于迁移的攻击,我们先介绍最经典的FGSM算法,YOLOv4使用的SAT(self adversarial training技术就是基于FGSM开展。
FGSM(Fast Gradient Sign Method) 是第一个使用模型梯度信息来进行对抗攻击的算法。
为什么使用梯度信息进行攻击会有效果呢? 直观地来说,我们想要模型输出错误预测,那就要增大模型对输入数据的loss,而这正好与模型训练时往梯度下降,loss减少的方向相反。 由于模型的参数与结构保持不变,那么我们只有通过原图+梯度信息->更新图像的步骤来实现这个逻辑。
AidLux智慧交通AI安全之对抗攻击算法_第2张图片

 

        PGD(Projected Gradient descent)是FGSM算法的一个优化版本。其在FGSM基础上引入了迭代攻击的思想,将多次攻击后的数据作为最终的对抗样本。
而基于优化的攻击算法的基本逻辑是将攻击流程转换为一个优化问题,以更小的扰动来生成更加高效的对抗样本。
       其中Deepfool攻击算法是基于超平面分类的攻击方法,其通过迭代计算的方法生成最小规范对抗扰动,将位于分类边界内的图像逐步推到边界外,直到出现错误预测。

AidLux智慧交通AI安全之对抗攻击算法_第3张图片

 

        基于GAN的攻击。AdvGAN将GAN思想引对抗攻击,通过生成器生成对抗扰动,添加到干净样本中。而判别器主要负责判别输入的是对抗样本还是干净样本。整个对抗训练过程转化成GAN经典博弈过程。

 AidLux智慧交通AI安全之对抗攻击算法_第4张图片

 

(二)黑盒攻击

        黑盒攻击主要有基于迁移的攻击和基于查询的攻击。基于迁移的攻击主要由白盒攻击扩展,一般来说,通过白盒攻击生成的对抗样本,一般对不同的算法模型具备一定的迁移攻击性。 而基于查询的对抗攻击首先设定一个搜索空间,并通过不断的查询模型的输出来优化对抗扰动。

AidLux智慧交通AI安全之对抗攻击算法_第5张图片

 https://zhuanlan.zhihu.com/p/493333024

源码链接:https://pan.baidu.com/s/1RIduv6ngpCM3jx63D3PQGA  提取码:aid6

import os
import torch
import torch.nn as nn
from torchvision.models import mobilenet_v2
from advertorch.utils import predict_from_logits
from advertorch.utils import NormalizeByChannelMeanStd

from advertorch.attacks import LinfPGDAttack
from advertorch_examples.utils import ImageNetClassNameLookup
from advertorch_examples.utils import bhwc2bchw
from advertorch_examples.utils import bchw2bhwc

device = "cuda" if torch.cuda.is_available() else "cpu"


### 读取图片
def get_image():
    img_path = os.path.join("./images", "school_bus.png")


    def _load_image():
        from skimage.io import imread
        return imread(img_path) / 255.

    if os.path.exists(img_path):
        return _load_image()



def tensor2npimg(tensor):
    return bchw2bhwc(tensor[0].cpu().numpy())

### 展示攻击结果
def show_images(model, img, advimg, enhance=127):
    np_advimg = tensor2npimg(advimg)
    np_perturb = tensor2npimg(advimg - img)

    pred = imagenet_label2classname(predict_from_logits(model(img)))
    advpred = imagenet_label2classname(predict_from_logits(model(advimg)))

    import matplotlib.pyplot as plt

    plt.figure(figsize=(10, 5))
    plt.subplot(1, 3, 1)
    plt.imshow(np_img)

    plt.axis("off")
    plt.title("original image\n prediction: {}".format(pred))
    plt.subplot(1, 3, 2)
    plt.imshow(np_perturb * enhance + 0.5)

    plt.axis("off")
    plt.title("the perturbation,\n enhanced {} times".format(enhance))
    plt.subplot(1, 3, 3)
    plt.imshow(np_advimg)
    plt.axis("off")
    plt.title("perturbed image\n prediction: {}".format(advpred))
    plt.show()


normalize = NormalizeByChannelMeanStd(
    mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])


### 常规模型加载
model = mobilenet_v2(pretrained=True)
model.eval()
model = nn.Sequential(normalize, model)
model = model.to(device)


### 数据预处理
np_img = get_image()
img = torch.tensor(bhwc2bchw(np_img))[None, :, :, :].float().to(device)
imagenet_label2classname = ImageNetClassNameLookup()


### 测试模型输出结果
pred = imagenet_label2classname(predict_from_logits(model(img)))
print("test output:", pred)

### 输出原label
pred_label = predict_from_logits(model(img))


### 对抗攻击:PGD攻击算法
adversary = LinfPGDAttack(
    model, eps=8 / 255, eps_iter=2 / 255, nb_iter=80,
    rand_init=True)


### 完成攻击,输出对抗样本
advimg = adversary.perturb(img, pred_label)


### 展示源图片,对抗扰动,对抗样本以及模型的输出结果
show_images(model, img, advimg)

输出结果:校车误判为缝纫机

AidLux智慧交通AI安全之对抗攻击算法_第6张图片

 

你可能感兴趣的:(人工智能,安全,算法)