Исходный кот. Как заставить нейронную сеть ошибиться

Нейросети теперь повсюду, и распознавание объектов на картинках — это одно из самых популярных применений. Но что, если ты не хочешь, чтобы объекты на твоей картинке распознали? Или, например, хотел бы, чтобы нейросеть «увидела» что-то, что не увидит человек, глядя на ту же картинку? Для этого придуманы обманные методы, которые обращают нейросети против них самих. И благодаря готовым библиотекам пользоваться ими легче легкого.

Подопытная нейросеть

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

Код будем писать на Python 3 — для работы с нейросетями это фактически стандарт. На наше везение, модуль keras включает в себя заранее обученную модель, которую мы и используем.

Для начала установим все самые свежие библиотеки. В реестре pypi недостаточно моделей нейросетей, в отличие от репозитория на GitHub.

$ pip3 install -U git+https://github.com/keras-team/keras.git 
$ pip3 install -U git+https://github.com/keras-team/keras-applications.git

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

Исходный кот
import numpy as np
from keras.preprocessing import image
from keras.applications import resnet_v2

## Загружаем предобученную модель
model = resnet_v2.ResNet50V2(include_top=True,
                             weights='imagenet',
                             input_shape=(224, 224, 3))

## Загружаем изображение
img = image.load_img("kitten.jpg#26759185", target_size=(224, 224))
input_image = image.img_to_array(img, 'channels_last')

## Перевод изображения из формата [0; 255] в [-1; 1]
input_image = (input_image / 255 - 0.5) * 2

## Делаем из изображения массив с изображением (batch)
input_image = np.expand_dims(input_image, axis=0)
## Прогоним через нейронную сеть
predictions = model.predict(input_image)

## Переведем ответ нейронной сети (вектор) в категорию
predicted_classes = resnet_v2.decode_predictions(predictions, top=1)
imagenet_id, name, confidence = predicted_classes[0][0]
print("Я на {:.4}% уверен, что это - {}!".format(confidence * 100, name))

В результате программа скажет нам, что это кот.

$ python3 test.py 
Using TensorFlow backend.
Я на 99.51% уверен, что это - Persian_cat!

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

Принцип создания поддельного изображения

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

Математика такой атаки до неприличия проста: мы выворачиваем процесс обучения нейронной сети наизнанку. Вместо фиксированных входных данных (тренировочного датасета) и обучающейся сети тут мы имеем меняющиеся, «‎обучающиеся»‎ входные данные и фиксированную сеть.

Как и для обучения нейронной сети, нам нужно два параметра: функция потерь (способ подсчитать ошибку) и градиент (мы используем производную нейронной сети).

И градиент, и ошибку мы можем посчитать, используя алгоритм обратного распространения, просто приняв все веса нейронной сети правильными (и, соответственно, неизменными), а вход — ошибочным и подлежащим исправлению.

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


Комментарии (4)

  • Загрузил обоих персидских котов (нормального и зашумлённого) на Яндекс - в первом случае фото определилось тегами "персидская кошка злая", "персидский кот", "фото ржачного кота".
    Во втором случае теги были: "кошки", "морда кота с языком", "кот".

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

  • Отличная статья! Спасибо!
    Надавно читал об атаках, когда можно на майку/футболку/кепку нанести такое изображение которые заставит сойти сеть с ума и вообще не обнаружить на нем человека или лицо
    Можете в следующей статье раскрыть как генерить такие изображения и как это работает?

    • Спасибо за отзыв!
      Безусловно, такие атаки существуют, однако их использованию мешает то, что, например, в Китае система распознавания лиц использует аж три разные (в том числе и по архитектуре) нейронные сети, поэтому, даже если получится обмануть одну, то другие всё равно будут работать. Также мешает то, что все описанные в статье атаки - атаки White Box, то есть мы имеем обученную модель в виде файла, которую взламываем. Однако в случае с видеокамерами, которые мы не контролируем, взламывать в разы сложнее: нет файла, ничего не работает.
      И всё же, в случае, если данная тема будет интересна, то статья такая тоже появится!