如何在 Cleverhans 中导出 Facenet 的对抗样本?

Posted

技术标签:

【中文标题】如何在 Cleverhans 中导出 Facenet 的对抗样本?【英文标题】:How to exporting adversarial examples for Facenet in Cleverhans? 【发布时间】:2019-08-21 04:50:43 【问题描述】:

我正在尝试关注此博客https://brunolopezgarcia.github.io/2018/05/09/Crafting-adversarial-faces.html 来生成对抗 Facenet 的对抗性人脸图像。代码在这里https://github.com/tensorflow/cleverhans/tree/master/examples/facenet_adversarial_faces 并且工作正常!我的问题是如何导出这些对抗性图像。这个问题是不是太直白了,所以博文没有提,只展示了一些样图。

我认为这不是一个难题,因为我知道生成的对抗样本在“adv”中。但是这个 adv (float32) 来自 faces1,经过预白化和标准化。要从 adv(float32) 恢复 int8 图像,我必须反转标准化和预白化过程。看起来如果我们想从 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)

在facenet.py load_data函数中,有一个prewhiten过程。

    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图像,否则逆向归一化和预白化过程似乎很尴尬。非常感谢。

【问题讨论】:

【参考方案1】:

我对 Facenet 代码了解不多。从您的讨论来看,您似乎必须保存 min_pixel,max_pixelto reverse the normalization, and then look at theprewhiten 函数的值才能查看如何反转它。我会发邮件给布鲁诺,看看他是否还有其他的 cmets 可以帮助你。

【讨论】:

【参考方案2】:

编辑:现在图像导出包含在 Cleverhans 的 Facenet 示例中:https://github.com/tensorflow/cleverhans/commit/08f6fb9cf2a7f199467d5ed60179fc3ae9140458

【讨论】:

以上是关于如何在 Cleverhans 中导出 Facenet 的对抗样本?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在 prometheus 中导出 cadvisor 指标

如何在 TypeScript npm 模块中导出类型

如何在 TypeScript 中导出对象?

如何在 R 中导出时间序列模型?

如何在 GraphQL 中导出字段定义

如何在 apache phoenix 中导出表模式?