在 Linux 上使用 Howdy 进行人脸验证

Howdy 为 Linux 提供了 Windows Hello™ 风格的身份验证。您可以使用内置的红外发射器和摄像头,配合面部识别来证明身份。
Linux
作者

kymot

发布于

2024-09-22 10:47:17 +08:00

修改于

2024-09-22 12:42:00 +08:00

虽然是常识但还是提一下:任何Linux的经验分享,甚至任何计算机相关的经验分享,都是有时效的。也就是说,发布时间离你看到的时间越远,就越有可能包含已经不适用的描述。复现需要控制的变量包括但不限于软件的版本号。

本文适用于 Howdy 2.6.1 和 Ubuntu 22.04 LTS(及其衍生版本;在 Kubuntu 22.04 和 Pop!_OS 22.04 上均成功)。

Howdy:https://github.com/boltgolt/howdy

Howdy provides Windows Hello™ style authentication for Linux. Use your built-in IR emitters and camera in combination with facial recognition to prove who you are.

Using the central authentication system (PAM), this works everywhere you would otherwise need your password: Login, lock screen, sudo, su, etc.

Howdy 为 Linux 提供了 Windows Hello™ 风格的身份验证。您可以使用内置的红外发射器和摄像头,配合面部识别来证明身份。

通过使用中央认证系统(PAM),它可在任何需要输入密码的地方发挥作用:登录、锁定屏幕、sudo、su 等。

可以用于用户登录和 sudo 验证身份。只要是有红外摄像头、支持 Windows Hello 的笔记本都是支持的。外接摄像头的台式不知道行不行。

安装和使用过程中遇到一些坑,简单写一下供后来人参考。虽然因为经验是适用于 Ubuntu 22.04 及其衍生系统的,对新版 Ubuntu 已经有点过时了。

在 Pop!_OS 24.04 Alpha 上安装失败了。遇到的坑包括但不限于 pip 策略的改变(进一步限制 sudo 下的使用)、Wayland 禁止 sudo 运行窗口程序。

准备工作

  • sudo apt install -y python3 python3-pip:如果你看得懂,你大概率不需要这行;看不懂就姑且跑一下吧。
  • 换源:如果你在国内最好换一下,不然下载慢到怀疑人生
    • APT:注意 Ubuntu 和 Pop!_OS 的源严格意义上是不一样的。比如说,Pop 的源里哪怕是 LTS 的 kernel 版本也会新一点。Ubuntu 的 APT 源镜像一搜一大把,Pop!_OS的我只知道上海交通大学 Linux 用户组有一个
    • pip:也一搜一大把,随便换一个就好
  • 同前,如果网络连接不稳定,先从GitHub(davisking/dlib-models)下载三个用于人脸识别的模型文件;先不要解压
    • dlib_face_recognition_resnet_model_v1.dat.bz2
    • mmod_human_face_detector.dat.bz2
    • shape_predictor_5_face_landmarks.dat.bz2

安装

Ubuntu 系可以用 PPA(ppa:boltgolt/howdy),但国内连接比较慢,用 deb 包安装就好了。GitHub 的 release 页面有提供。

不想查 dpkg 怎么用的话也可以 sudo apt install ./howdy_2.6.1.deb

按步骤走,选择三种识别精度(f/b/s;fast/balanced/safe)的时候我们选择b,其他的没试过不知道所用的模型文件会不会有变化。

之后会开始下载三个模型文件,如果网不好往往会下载失败退出安装。可是又没法直接重新安装 Howdy(因为到选择识别精度的时候已经是APT安装完之后的 post-installation script 了),就必须先卸载一次(sudo apt remove howdy)再重新安装。

这次我们在让我们选 f/b/s 的时候先停下,新开一个命令行界面,换到我们下载好模型文件的目录,sudo mv -t /lib/security/howdy/dlib-data/ *.bz2。会提示我们这个目录不存在,没关系。然后回到安装界面选择好精度后迅速切换回新开的命令行,重复上一条命令。这里的技巧是先做过一次sudo后短时间同一处不需要重复输入密码。没试过需要多少时间,1秒内应该都是可以的。

手速不行可以试试先提前建立这个目录把文件放进去。没验证过行不行。

然后进入选择红外设备环节。一般笔记本电脑的红外摄像头是会闪红光的,切到闪红光的设备时候输y确认就行。但也有情况是不会闪红光(可能是真·红外吧),这种情况可以先随便选一个跳过这个环节,之后再来设置设备。

一般来说(其实只是就我手头两台机子而言),红外摄像头开启时是不会启动摄像头开启指示灯(小白灯)的。可以以此排除正常摄像头。

调试

使用 sudo howdy test 打开测试窗口。能看到摄像头画面不代表就成功了;如果摄像头画面特别高清、特别灵敏,很有可能是设置到了普通摄像头而非红外摄像头上,红外摄像头的画面会分辨率低一些、迟缓一些。红外摄像头不挑环境亮度,普通摄像头在光照不好时会录入失败,说最小暗度没有达到预设的阈值50。这个阈值可以改高,但如果红外摄像头正常运作是没有必要的。

顺利识别到人脸后可能会报错退出。具体报错我忘了,复制搜索后得知是 numpy 2.0 以后的版本跟 dlib 存在不兼容,需要回退。sudo pip install numpy==1.26.4(或当前你了解到的 numpy 1.26 系列里的最新版本)即可。

如果摄像头设备没设置对,先 ls /dev/v4l/by-path/ 看看,记下设备 ID。然后 sudo howdy config,在 [video] 下的 device_path 换换设备 ID 试试。

其实用普通摄像头在保证采光的情况下也是可以识别的,只是环境稍暗就完全不可用了。

sudo howdy add 为当前用户录入人脸。录多几张识别效果会好一点,但超过3张会稍微延长识别时间。

然后试试锁屏登录和重启后登录。如果发现这时 Howdy 没法解锁,排除是没识别出来(多录几次人脸完善下模型)的情况后,用 sudo chmod -R 755 /lib/security/howdy/ 使模型目录在未解锁的情况下也可读取。

其他

  • 在KDE上,想要完全不需要输入密码的体验可能还需要把 KWallet 设置成无密码。Wifi密码也归KWallet管,所以不这样做的话每次解锁后都需要输密码才能连上Wifi。担心安全的话选上 Prompt when an application accesses a wallet 就好(参见 Arch Wiki)。

参考