到了 2021 年,人们普遍认为,通过学习算法和人工智能研究,机器在很多方面都优于人类。长期以来,机器一直主导着制造业和供应链领域,甚至开始涉足更复杂的任务,比如自动驾驶,甚至撰写高难度综合类文章。但是,在面部识别方面,机器的发展真的已经超过人类大脑了吗?
13 年前,当我的同卵双胞胎儿子出生时,我和妻子很容易认出哪一个是 Nicolas,哪一个是 Alexander。在旧金山加利福尼亚太平洋医学中心的新生儿重症监护室(NICU)陪伴了他们 8 周后,我们知道如何将他们的个人行为与名字相匹配。我们很早就学到了大多数同卵双胞胎父母都会掌握的东西:
一个人是谁,不仅取决于他的长相,还取决于他走路、说话的方式,以及在与世界互动时的各种行为举止的差异。
处理这个广泛的数据集使人类能够立即识别出我们所认识的人,包括同卵双胞胎。
图|Alexander 和 Nicolas
随着从识别罪犯到帮助我们购物等各个方面的广泛应用,面部识别在新闻中被称为“矩阵式的银弹”(Matrix-like silver bullet),我一直在想,
当数据集只呈现出非常微小的差异时,机器在辨别人脸方面能够做到什么地步?
比如识别同卵双胞胎。随着儿子们一天天长大,我们详细地讨论了他们基因组成的独特性质——本质上说,他们是从同一个受精卵中克隆而来的(注:这有一个频率非常高的“克隆”(“coolness”)因素,因为他们是《星球大战》中克隆人军队的忠实粉丝)。对他们来说,他们是完全相同的人,从相同的蓝图中创造出来。当然,它们之间是有区别的,这些区别使得我偶尔会将他们弄混淆,而且我猜测,机器也会分不清。相同的 DNA 是一回事,但是基因的内在表现和所处环境的影响,在人类随着时间变化和发展中起着重要作用。
举个例子,我最近购买了一部带有指纹识别器的手机,我问我的儿子们是否想做一个小实验:一个将指纹录入,然后另一个用自己的手指去解锁,这显然是行不通的。事实证明,多种环境因素(其中只有一种是基因)驱使了子宫内的“指纹”形成,因此双胞胎通常具有不同的指纹。
为了帮助回答有关“人类或机器谁更擅长识别同卵双胞胎”的问题,我决定设计一个比指纹读取器稍微复杂的实验,并邀请我的“小科学家们”(我的儿子)接受培训以提供帮助。对于这个项目,我想构建一个尽可能便宜的计算机系统,该系统能够运行执行和训练机器学习与面部识别模型所需的所有软件。我选择树莓派(Raspberry Pi)是因为它具有极高的成本效益,其外围支持并且能够运行标准的 Linux 发行版以及所有编译软件所必需的工具。
我现在已经拥有一些用于其他项目的 Raspberry Pi,因此我测试了三个,看哪种最适合该应用程序。Pi Zero 可以正常工作,但在分析视频提要的帧并编译所有必需的软件时,它耗时 48 小时(是的,编译该软件需要 2 天)。对于任何想要运行类似环境的人,我强烈推荐 Pi 4b(8GB 型号),因为它具有更快的处理器,多个内核和扩展内存。我们测试的三个 Pi 的详细细节和形状因子如下所示。该设置过程的其余部分假定使用 Pi 4b(8GB)。
图 | Pi Zero,Pi 3b+ 和 Pi 4b- 刻度铅笔。
这个项目还需要一个网络摄像头。我已经有一个 Logitech USB 网络摄像头,该摄像头运行良好,无需安装驱动程序。任何现代的 Logitech 或类似的网络摄像头都可以使用。设置Pi的第一步是将 Raspberry Pi OS 闪存到 micro SD 卡上并进行一些基本配置。为此,将 Raspberry Pi 成像器下载并安装到工作站上。安装完成后,插入 micro SD 卡(通常使用适配器),启动成像仪,选择操作系统和 SD 卡,然后选择“写入(Write)”。对于 OS(操作系统),请选择 Raspberry PI OS(32位),这是 Debian Linux 的端口,具有设置机器学习环境所需的一切要素。SD 卡写入并验证后,请勿将其移除,将其重新插入 Pi 之前,还需要进行三个附加配置:设置 WiFi,SSH 和视频输出。
- WiFi:启动 Pi 时,需要将其连接到本地网络。创建一个名为 wpa_supplicant.conf 的文件,并将其放在 SD 卡的顶层。确保文件格式为纯文本,并以 .conf 结尾。保存文件之前,添加你地理位置的两个字母的国家/地区代码以及 WiFi 网络的 SSID 和 PSK(保留双引号)。
- SSH:由于我们将 Pi 设置为无头运行(没有监视器),因此我们需要一种连接到它进行管理和配置的方法——使用 SSH。要启用 Linux SSH 守护程序并自动进行,请将一个名为 ssh 的文件放置在 SD 卡的顶层,该文件不包含任何内容且没有文件扩展名。
- 视频:我们将在没有显示器连接的情况下启动 Pi,但仍希望在对其进行远程控制时启用视频,因此即使没有被检测到,我们也必须强制 HDMI 处于活动状态。编辑 SD 卡顶层的名为 config.txt 的文件,然后取消 hdmi_force_hotplug = 1 行的注释。
现在弹出 micro SD 卡,将其插入 Pi,连接到电源并打开。大约一分钟后,Pi 应已完全启动,并应连接到你的 WiFi 网络。检查 WiFi 路由器以获取 Pi 的 IP 地址。
现在,通过打开终端(在 Mac 上)或使用 Putty(在 Windows 上)和 SSH 将 IP 地址作为用户名“Pi”(默认密码为“raspberry”)来验证你可以连接到 Pi。
设置:步骤 2
安装过程的第二步是安装和编译所有必需的软件。为了执行面部识别任务,我决定使用 OpenCV(开源计算机视觉库)和 Dlib。OpenCV 和 Dlib 具有许多优化算法,包括面部识别,已在工业界和学术界广泛应用,受到了良好的尊重和支持,并且具有用于 Python 编程语言的接口,这些接口可用于驱动模型训练和识别程序。互联网上有许多在 Raspberry Pi 上设置 OpenCV 和 Dlib 的示例,但是我找不到任何简洁而全面的内容,因此创建了一个简单的包装程序来安装所有的必备软件并编译 OpenCV 和 Dlib 源代码。要下载和执行此包装程序,请执行以下操作:
- 以 pi 用户的身份通过 SSH 连接到 Pi,并确保你位于 pi 用户的主目录中:cd~
- 在Github上克隆我们的Raspberry Pi面部识别存储库的副本:git clone https://github.com/tomalessi/pi-facial-recognition.git
- 执行安装脚本(大约需要 1 个小时):pi-facial-recognition / pi-setup.sh
设置:步骤 3
Pi 现在已经准备好拍照和训练面部识别模型。为此,我们需要查看 Pi 上的窗口环境,以便通过 VNC Viewer 连接到它。你需要在 Pi 上启用 VNC 服务器,并在你的工作站上下载一个客户端。请按照以下步骤操作:
- Pi 设置:SSH 到 PI,执行命令 sudo raspi-config,向下滚动到界面选项 →VNC 并启用它。启用此功能后,你需要重新启动。
- 工作站设置:从 RealVNC 下载并为你的平台安装 VNC Viewer(免费下载)。安装完成后,使用其 IP 地址设置从 VNC Viewer 到 Pi 的新连接,并确保你可以登录。成功登录后,你将会看到 Raspberry Pi OS 的背景。
面部识别过程涉及 3 个步骤:拍照,训练模型,然后分析实时视频。这 3 个任务都可以使用 face-req.py Python 程序执行,该程序已从上面的 Github 存储库中弹出(注意:这是第一个修订版,没有很多错误处理功能-如果你希望我们进行改进,请提交 PR)。拍摄照片,训练模型和分析视频的步骤如下所示。这三个假设你都已通过 VNC 登录到 Pi,并打开了一个终端窗口。
- 通过执行以下命令并在观看实时视频后按空格键来拍照:python pi-facial-recognition / face-req.py -c photo -n Tom 通过将 -n 参数替换为另一个参数来继续为他人拍照名称。在终端窗口中按 ctrl + c 退出。
- 训练模型:python pi-facial-recognition / face-req.py -c train。分析每张照片,然后将结果序列化以用于分析视频时,大约需要 10 秒钟。
- 分析视频并应用面部识别模型:python pi-facial-recognition / face-req.py -c analyze。大约十秒钟后,应该开始直播视频。识别出的所有面孔将被标记为该人的名字,否则面孔将被标记为无法识别。按“q”退出。
- 清理环境并重新开始,请执行以下操作:python pi-facial-recognition / face-req.py -c clean。
完全设置好环境后,我拍摄了 3 张自己的头像,3 张 Nicolas 的头像和 3 张 Alexander 的头像,然后用这些照片训练面部识别机器学习系统(一张正面,一张向左,另一张向右)。在执行这些测试的当天,除了当前照片外,没有对任何照片进行任何修正。训练完系统后,我们轮流站在镜头前确定机器是否可以识别。
注意:我们尝试了另一种实验,即以不同角度拍摄 10 张照片,但这并没有改变结果,可能是因为我们使用的是面向梯度直方图(HOG)的面部识别方法,它只适用于正面照片。
结果:测试 1
测试 1 是我本人和 Alexander,机器识别正确。
结果:测试 2
测试 2 是我和 Nicolas。机器再次正确识别了。我开始思考自己最开始的猜测是错误的——也许机器会胜利。
结果:测试 3
测试 3 是本次的“重头戏”——我们三个人一起。然后机器故障了!显然,没有两个 Nicolas。我们发现,如果孩子们四处走动,识别会来回切换,但是机器很少能同时识别双胞胎。不科学的是,大约有 5% 的时间,它能同时正确识别双胞胎和我自己。
结果:测试 4
我想看看机器学习模型对 3 岁时的双胞胎照片的识别效果如何——照片被举到镜头前。我必须给这台机器一些肯定,它确实在照片中(第一次)正确地识别了 Nicolas(虽然没有识别出 Alexander),我把照片的方向和距离在镜头上稍微移动了一下,然后它错误地识别了 Alexander,无法识别 Nicolas。不过,这已经是很好的结果,毕竟从 3-10 岁,孩子们的脸已经发生了很多变化。结果:测试 5
我尝试了一张较新的彩色照片(孩子可能已经 4 岁),机器再次出现故障。它错误地识别出两个 Nicolas。对于最后的测试,我想看看这些照片的年龄限制在机器完全无法识别之前应该为多少。
我用了一张双胞胎一岁左右的照片。
机器正确地识别了我,但没有识别出双胞胎。 注意:即使是一张 12 岁的静态照片,我和我妻子也很容易马上分辨双胞胎。这里的第一个结论是显而易见的。一个人花 75 美元就能构建一个能够运行现代面部识别和机器学习算法的功能完备的计算机系统(如果你不介意有点慢,有的甚至只需 10 美元)。暂且不提更复杂的识别双胞胎的任务,这台机器在现场视频中识别非双胞胎的成功率为 100%。该系统训练的每一个非双胞胎都能获得 100% 的识别成功率(我们做了其他非双胞胎测试,这里没有显示)。同时,出于个人隐私方面的考虑,这确实让我踌躇不前。这项技术功能强大,非常容易使用,而且很可能部署在我们日常生活中无法预料的地方——我们需要确保这项技术不会被滥用。第二个结论是,在我们生命的前 13 年中,我们的面部特征会持续发生巨大变化,这使得年轻人的面部识别变得困难。该机器能够从旧照片中识别双胞胎,即使他们还在“蹒跚学步”,也给我留下了深刻的印象。老实说,这太棒了!除了我和我的妻子,没有人可以看我们孩子的旧照片并确定谁是谁。最后,最重要的是,我观察到机器很难识别同卵双胞胎,即使是像我孩子这样有明显差异的双胞胎。该系统识别时确实很费劲,尤其是当一对双胞胎或一个在视频帧内移动时–经常出现标识错误。从这些简单的测试中,我们得出结论:就目前而言,人类在面部识别方面比机器要好得多。这不足为奇,因为 600 万年来我们一直在进化和完善我们的感官。我不能告诉你为什么我能轻易地分辨出我的孩子之间的区别,我只知道这很容易。机器或许终将赶上我们,但不是现在。我的儿子们想在 Pi 上内置一些其他功能,以控制门上的锁,或在他们进入卧室时打招呼,但是根据我们的结果,我们首先需要提高Pi的能力来区分他们(以免一方接触到另一方的宝藏)。
为了提高系统的准确性,我想尝试一些不同的面部识别技术,比如利用 Dlib 支持的卷积神经网络(CNN)(尽管 Raspberry Pi 受其计算能力的限制),或者让 Pi 调用 GCP、AWS 或 Azure 中的公共服务进行面部识别。
学术界对双胞胎面部识别的研究也越来越多,因此技术肯定会继续改进,以解决我们在此处指出的一些现有缺陷——我和我的儿子们肯定会关注这个领域。https://medium.com/swlh/can-a-trained-machine-distinguish-between-identical-twins-better-than-a-human-e801fdbc1943