Как экспортировать состязательные примеры для Facenet в Cleverhans? - PullRequest
0 голосов
/ 30 марта 2019

Я пытаюсь проследить за этим блогом https://brunolopezgarcia.github.io/2018/05/09/Crafting-adversarial-faces.html, чтобы сгенерировать враждебные изображения лица на Facenet. Код здесь https://github.com/tensorflow/cleverhans/tree/master/examples/facenet_adversarial_faces и работает отлично! У меня вопрос, как я могу экспортировать эти состязательные изображения. Является ли этот вопрос слишком простым, поэтому блог не упомянул его, а только показывает некоторые примеры фотографий.

Я думал, что это не сложная проблема, так как я знаю, что сгенерированные состязательные образцы находятся в "adv". Но этот адв (float32) пришел от лица1 после предварительного отбеливания и нормализации. Чтобы восстановить образы int8 из adv (float32), я должен обратить процесс нормализации и предварительного отбеливания. Кажется, что если мы хотим вывести некоторые изображения из FaceNet, мы должны сделать этот процесс.

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

В facenet_fgsm.py мы наконец получили состязательные образцы. Мне нужно экспортировать adv в обычные изображения int. adv = sess.run(adv_x, feed_dict=feed_dict)

В set_loader.py. Есть какая-то нормализация.

def load_testset(size):
  # Load images paths and labels
  pairs = lfw.read_pairs(pairs_path)
  paths, labels = lfw.get_paths(testset_path, pairs, file_extension)

  # Random choice
  permutation = np.random.choice(len(labels), size, replace=False)
  paths_batch_1 = []
  paths_batch_2 = []

  for index in permutation:
    paths_batch_1.append(paths[index * 2])
    paths_batch_2.append(paths[index * 2 + 1])

  labels = np.asarray(labels)[permutation]
  paths_batch_1 = np.asarray(paths_batch_1)
  paths_batch_2 = np.asarray(paths_batch_2)

  # Load images
  faces1 = facenet.load_data(paths_batch_1, False, False, image_size)
  faces2 = facenet.load_data(paths_batch_2, False, False, image_size)

  # Change pixel values to 0 to 1 values
  min_pixel = min(np.min(faces1), np.min(faces2))
  max_pixel = max(np.max(faces1), np.max(faces2))
  faces1 = (faces1 - min_pixel) / (max_pixel - min_pixel)
  faces2 = (faces2 - min_pixel) / (max_pixel - min_pixel)

В функции loadnet_py для facenet.py есть процесс предварительного отбеливания.

    nrof_samples = len(image_paths)
    images = np.zeros((nrof_samples, image_size, image_size, 3))
    for i in range(nrof_samples):
        img = misc.imread(image_paths[i])
        if img.ndim == 2:
            img = to_rgb(img)
        if do_prewhiten:
            img = prewhiten(img)
        img = crop(img, do_random_crop, image_size)
        img = flip(img, do_random_flip)
        images[i,:,:,:] = img
    return images

Я надеюсь, что какой-то эксперт может указать мне какую-то скрытую функцию в facenet или cleverhans, которая может напрямую экспортировать изображения adv, в противном случае процесс нормализации и предварительного отбеливания кажется неправильным. Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 09 июня 2019

Я сделал это:

for index in range(adv.shape[0]):
        image_array = (np.reshape(adv[index], (160, 160, 3)) * 255).astype(np.uint8)
        Image.fromarray(image_array, 'RGB').save(folder + str(index) + '.png')

160 - размер изображений.

Не забудьте импортировать:

from PIL import Image

Вы также можете сохранитьшум с использованием adv --face1 вместо adv.

0 голосов
/ 09 июня 2019

Я не знаю много о коде Facenet.Из вашего обсуждения кажется, что вам придется сохранить значения функции min_pixel, max_pixel to reverse the normalization, and then look at the prewhiten`, чтобы увидеть, как вы можете ее изменить.Я пришлю электронное письмо Бруно, чтобы узнать, есть ли у него какие-либо дополнительные комментарии, чтобы помочь вам.

...