Атака В Один Пиксель. Или Как Обмануть Нейросеть

Давайте рассмотрим одну из атак на нейронные сети, которая приводит к ошибкам классификации при минимальном внешнем воздействии.

Представьте на минутку, что нейронная сеть — это вы.

И вот прямо сейчас, попивая чашечку ароматного кофе, вы классифицируете изображения кошек с точностью более 90 процентов, даже не подозревая, что «атака одного пикселя» превратила всех ваших «котов» в грузовики.

Теперь давайте сделаем паузу, отложим кофе в сторону, импортируем все необходимые нам библиотеки и посмотрим, как работают похожие однопиксельные атаки.

Цель этой атаки — заставить алгоритм (нейронную сеть) выдать неверный ответ. Ниже мы увидим это на примере нескольких различных моделей сверточных нейронных сетей.

Используя один из методов многомерной математической оптимизации — дифференциальную эволюцию, мы найдём специальный пиксель, способный изменить изображение так, что нейросеть начнёт неправильно классифицировать это изображение (несмотря на то, что алгоритм ранее «распознавал» это же изображение правильно) и с высокой точностью).

Импорт библиотек:

  
  
  
  
  
  
   

# Python Libraries %matplotlib inline import pickle import numpy as np import pandas as pd import matplotlib from keras.datasets import cifar10 from keras import backend as K # Custom Networks from networks.lenet import LeNet from networks.pure_cnn import PureCnn from networks.network_in_network import NetworkInNetwork from networks.resnet import ResNet from networks.densenet import DenseNet from networks.wide_resnet import WideResNet from networks.capsnet import CapsNet # Helper functions from differential_evolution import differential_evolution import helper matplotlib.style.use('ggplot')

Для нашего эксперимента мы загрузим набор данных CIFAR-10, содержащий изображения реального мира, разделенные на 10 классов.



(x_train, y_train), (x_test, y_test) = cifar10.load_data() class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']

Давайте посмотрим на любое изображение по его индексу.

Например, эта лошадь.



image_id = 99 # Image index in the test set helper.plot_image(x_test[image_id])



Атака в один пиксель.
</p><p>
 Или как обмануть нейросеть

Нам придется искать тот самый мощный пиксель, способный изменить отклик нейронной сети, а это значит, что пришло время написать функцию для изменения одного или нескольких пикселей изображения.



def perturb_image(xs, img): # If this function is passed just one perturbation vector, # pack it in a list to keep the computation the same if xs.ndim < 2: xs = np.array([xs]) # Copy the image n == len(xs) times so that we can # create n new perturbed images tile = [len(xs)] + [1]*(xs.ndim+1) imgs = np.tile(img, tile) # Make sure to floor the members of xs as int types xs = xs.astype(int) for x,img in zip(xs, imgs): # Split x into an array of 5-tuples (perturbation pixels) # i.e., [[x,y,r,g,b], .

] pixels = np.split(x, len(x) // 5) for pixel in pixels: # At each pixel's x,y position, assign its rgb value x_pos, y_pos, *rgb = pixel img[x_pos, y_pos] = rgb return imgs

Давай проверим?! Давайте изменим один пиксель нашей лошади с координатами (16, 16) на желтый.



image_id = 99 # Image index in the test set pixel = np.array([16, 16, 255, 255, 0]) # pixel = x,y,r,g,b image_perturbed = perturb_image(pixel, x_test[image_id])[0] helper.plot_image(image_perturbed)



Атака в один пиксель.
</p><p>
 Или как обмануть нейросеть

Чтобы продемонстрировать атаку, вам необходимо загрузить предварительно обученные модели нейронных сетей в наш набор данных CIFAR-10. Мы будем использовать две модели: lenet и resnet, но вы можете использовать для своих экспериментов и другие, раскомментировав соответствующие строки кода.



lenet = LeNet() resnet = ResNet() models = [lenet, resnet]

После загрузки моделей нам необходимо оценить тестовые изображения каждой модели, чтобы убедиться, что мы атакуем только правильно классифицированные изображения.

Код ниже отображает точность и количество параметров каждой модели.



network_stats, correct_imgs = helper.evaluate_models(models, x_test, y_test) correct_imgs = pd.DataFrame(correct_imgs, columns=['name', 'img', 'label', 'confidence', 'pred']) network_stats = pd.DataFrame(network_stats, columns=['name', 'accuracy', 'param_count']) network_stats Evaluating lenet Evaluating resnet Out[11]:

Теги: #Машинное обучение #спуфинг #Алгоритмы #программирование #Читальный зал #искусственный интеллект #спуфинг-атаки #однопиксельная атака

Вместе с данным постом часто просматривают: