Создание простой атаки методом черного ящика с помощью Adversarial Robustness 360 Toolbox (ART)

Автор: Шэрон Цянь (Гарвард) и Бит Бьюссер (IBM)

Задний план

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

В этом руководстве показано, как использовать набор инструментов Adversarial Robustness 360 Toolbox (ART) [1] для создания атаки методом черного ящика против обученного классификатора. В частности, мы показываем, как использовать реализацию атаки HopSkipJump от ART [2] для создания вредоносных примеров, которые обманывают популярный механизм оптического распознавания символов Tesseract [3]. Полный пример кода этого руководства можно найти в репозитории ART на Github [4].

Создать классификатор

Начнем с того, что завернем Tesseract в BlackBoxClassifier ART, что позволит нам подключить все, что можно запустить с помощью функции Python, к инструментам в ART. Здесь мы будем использовать его для запуска распознавания текста на изображениях слов «несогласие» и «согласие». BlackBoxClassifier требует только определения функции прогнозирования, установки формы входного изображения и количества возможных классов.

Чтобы продемонстрировать универсальность BlackBoxClassifier, мы будем запрашивать Tesseract через командную строку, вызываемую Python. Приведенная ниже функция предсказания оборачивает этот вызов командной строки и сопоставляет вывод Tesseract с 3 возможными классами: «несогласие», «согласие» или «другое». Это значительно снижает сложность модели до задачи 3-го класса.

# predict function to call tesseract from the command line and convert
# its output to a one-hot encoding
def predict(x):
   out_label = []
   for x_i in x:
   # save image as intermediate png
   imageio.imsave(‘tmp.png’, x_i)
 
   # run tesseract
   os.system(“tesseract tmp.png out”)
   
   # read text
   file = open(“out.txt”,”r+”)
   test = file.read()
   out_string = test.strip()
   # convert to categorical
   if out_string == ‘dissent’:
       out_label.append(0)
   elif out_string == ‘assent’:
      out_label.append(1)
   else:
      out_label.append(2)
   
   return to_categorical(out_label, 3)

Затем мы прочитаем начальное изображение image_init, слово, которое мы хотели бы видеть предсказанным Tesseract, и целевое изображение image_target, слово, которое мы хотели бы увидеть и прочитать на враждебном изображении.

image_init = imageio.imread(‘assent.png’)
image_target = imageio.imread(‘dissent.png’)

Теперь мы готовы создать ART BlackBoxClassifier.

classifier = BlackBoxClassifier(predict, image_target.shape, 3, clip_values = (0, 255))

Протестировать классификатор

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

# this is the image we want to target
plt.imshow(image_target)
plt.show()
print(‘Tesseract output is: ‘ + label_dict[np.argmax(classifier.predict(np.array([image_target])))])

# this is the label we want to perturb to
plt.imshow(image_init)
plt.show()
print(‘Tesseract output is: ‘ + label_dict[np.argmax(classifier.predict(np.array([image_init])))])

Создание состязательных примеров для оптического распознавания символов (OCR)

Теперь мы создаем состязательный пример, запрашивая Tesseract для прогнозов, чтобы распознать «несогласие» как «согласие» с реализацией ART атаки HopSkipJump.

attack = HopSkipJump(classifier=classifier, targeted=True, norm=2, max_iter=0, max_eval=1000, init_eval=10)
iter_step = 10
x_adv = np.array([image_init])
for i in range(13):
   x_adv = attack.generate(x=np.array([image_target]),
           x_adv_init=x_adv, y=to_categorical([1], 3))
   if i%3 == 0:
      print(“Adversarial image at step %d.” % (i * iter_step), “L2 error”, np.linalg.norm(np.reshape(x_adv[0] — image_target, [-1])), “and Tesseract output %s.” % label_dict[np.argmax(classifier.predict(x_adv)[0])])
      plt.imshow(x_adv[0])
      plt.show(block=False)
   attack.max_iter = iter_step

Полученное изображение ясно показывает «несогласие», но Tesseract выводит «согласие» в качестве предсказания, показывающего, что мы успешно обманули этот классификатор!

Дополнительные примеры см. в блокнотах и ​​демонстрациях здесь или ознакомьтесь с новыми возможностями ART здесь.

использованная литература

[1] https://github.com/IBM/adversarial-робастность-тулбокс

[2] https://arxiv.org/abs/1904.02144

[3] https://github.com/tesseract-ocr/

[4] https://github.com/IBM/adversarial-робастность-toolbox/blob/master/notebooks/classifier_blackbox_tesseract.ipynb