当前位置: 首页 > 科技观察

真会玩,程序员用AI认双胞胎儿子!“这个树莓派版的人脸识别系统,我都认不准了”

时间:2023-03-22 14:04:17 科技观察

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