图片由帕维尔AnoshinUnsplash

面部识别的使用正在上升。最近关于面部识别伦理的争论我一直在考虑针对面部检测的潜在对抗性攻击。面部识别被广泛应用机场社交媒体。要想选择不接受面部扫描几乎是不可能的。

最理想的攻击面部检测的方法是在不知情的人看来不显眼的衣服。灵感来自Hyperface项目我决定研究并实现一个可穿戴对抗的例子。在本文中,我将详细介绍创建对抗图像以欺骗选定类型的面部检测的过程,以及如何在口罩上实现一个实际示例。

面部检测与面部识别

面部检测(左)和面部识别(右)的对比图

在深入研究这个项目之前,首先要注意的是面部检测和面部识别之间的区别。人脸检测指的是检测人脸何时出现在图像中的能力。面部识别依赖于面部检测来确定图像中是否存在人脸,但它更进了一步,试图确定这是谁的脸。

对于这个项目,我选择专注于面部检测。主要原因是它更容易测试。为了正确地测试面部识别,访问面部识别数据库将是理想的。

人脸检测模型

下一步是选择哪个面部检测模型来构建对抗示例。目前有许多不同的面部检测模型在使用中。Vikas Gupta在“Learn OpenCV”上有一本关于面部检测模型及其实现的很好的入门书,并有深入的解释。我在这里简单地讲一下。

  • 深度神经网络(DNNs):dnn可以使用输入数据集来训练,以检测许多不同方向的人脸。一种流行的基于DNN的人脸检测方法是single-shot-multibox探测器.dnn是准确和通用的。
  • 卷积神经网络(cnn):CNN是一个深度神经网络设计用于分配图像的不同部分的重要性.它很健壮,但在CPU上相当慢。
  • 哈尔级联分类器:哈尔级联训练使用数据集与大量标记的积极和消极的例子图像。Haar级联分类器的主要缺点是它们只能识别正面的人脸。它们不再被广泛使用,因为神经网络更加通用。
  • 定向梯度直方图(HOG):HOG是一种面部检测方法,它将处理过的输入图像分成具有梯度方向的细胞,然后将结果输入支持向量机。HOG检测速度快,重量轻,但不适用于一些不寻常的面部角度。
一个人脸建模的例子,作为一个方向梯度的直方图从dlib

很快脱颖而出成为最简单的攻击对象的模型是定向梯度的直方图。最值得注意的是,HOG的预期输入可以很容易地可视化并反馈到面部检测模型中。将人脸可视化为定向梯度的直方图还具有对人类观察者来说不是一个明显的人脸的优点。

Python面向梯度面部检测的直方图

为了测试示例,我需要一个简单的基于HOG的面部检测实现。幸运的是,dlib库内置了一个HOG面部检测器frontal_face_detector

正面人脸检测器与输入图像和缩放因子一起运行。1表示输入图像将被放大一次。放大后的图像更大,更容易识别人脸。正面人脸检测的结果是一个包围框列表,每个检测到的人脸对应一个包围框。

使用dlib在我们的可视化HOG中检测人脸的结果

传递HOG预期输入的可视化,您可以看到它被检测为人脸。太棒了!我们有了对抗性进攻的基础。

使用随机优化创建对抗性设计

现在我知道HOG的预期输入的可视化将被检测为正面脸的假阳性,我需要创建一个打印在面具上的设计,看起来不显眼。但是仍然有很多影响设计的因素,我不知道如何优化。人脸的位置、方向和大小都可能影响图像中检测到的人脸数量。我可以简单地尝试不同的设计,直到我找到一个好的设计,但让一个学习模型为我做艰苦的工作似乎更有趣,也不那么乏味。

我考虑了几个不同的模型来找到一个最佳的输入。我研究了强化学习、生成式对抗网络和q学习。最终,我决定使用随机优化的模拟退火,因为它最适合我的问题,即找到与dlib检测到的大多数人脸相对应的输入。

我使用PIL (Python成像库)和mlrose(用于随机优化的Python库)来生成图像并找到最佳状态。使用mlrose进行优化需要初始状态和适应度函数。在我的例子中,找到这个最佳状态是一个非常昂贵的计算,因为生成的状态需要以图像的形式保存到磁盘上,以便找到检测到的人脸数量。

从初始状态开始,mlrose需要一个1D数组(据我所知)。这意味着我必须使用一种有点俗套的解决方案,即赋予不同的数组位置不同的意义(参见索引解释)。我选择优化6个面的输入,因为我总是可以复制设计来增加它的大小。

我的适应度函数只是由状态到图像的转换组成,然后检测图像中的人脸数量。发现的人脸数量越多,适应度越高。我还尝试根据输入HOG人脸图像的大小修改适应度函数。这可能会更好,因为在现实生活中,更大的脸更有可能被发现。然而,我发现考虑人脸大小会导致更长的计算时间,而视觉上的结果相似。

利用适应度和初始状态集,可以简单地配置模拟退火的mlrose。我只是分配了我们的输入,然后让它运行,直到找到最优结果。我运行了几次,以找到一个视觉上有趣的结果。

模拟退火的一个有趣的输出

最后,通过这个有趣的输出,我添加了一些修饰来模糊它的面部设计。我认为我更有资格用手来做这件事,因为目的是愚弄人类。

最终的设计掩盖了面部结构

在掩模上测试设计

在一个原型面具上检测到的人脸覆盖在对抗人脸设计中

随着最终设计的完成,我创建了一些模拟面具设计,以测试它们是如何被HOG面部检测评估的。初步结果似乎很有希望。上述设计始终返回4-5个错误检测的人脸。

Baidu
map