Howdyを使ってubuntuで顔認証する


環境

参考


Windowsを使っている時に顔認証(Windows Hello)でログインできるのがとても便利だったのでUbuntuでも実現してみます。
UbuntuではHowdyというアプリケーションで実現できそうなので設定してみました。

赤外線カメラ情報の取得

顔認証には赤外線カメラを使います。
カメラ情報を取得するためにv4l-utilsを利用します。

v4l-utilsインストール

sudo apt-get install v4l-utils

カメラ情報確認

以下コマンドでカメラ情報を確認します。
赤外線カメラ(IR Camera)の項目を確認します。

v4l2-ctl --list-devices --all

# 以下出力結果で見る場所
Integrated IR Camera: Integrate (usb-0000:00:14.0-5):
    /dev/video0    ←赤外線カメラのパスはvideo0※
    /dev/video1

Format Video Capture:
    Width/Height      : 340/340   ←キャプチャサイズは340×340

※Thinkpat T480だとvideo1も列挙されてましたが、後々の設定でvideo1を指定すると動きませんでした。

Howdy導入

Howdyのインストール

まず必要なソフトをインストールします。

sudo add-apt-repository ppa:boltgolt/howdy
sudo apt update
sudo apt install howdy

途中で以下のようにセキュア具合を聞かれます。
自分の好みや状況に合わせて選択してください。
(f:早さ重視、b:バランス型、s:セキュリティ重視)

After detection, Howdy knows how certain it is that the match is correct.
How certain Howdy needs to be before authenticating you can be customized.

F: Fast.
Allows more fuzzy matches, but speeds up the scanning process greatly.

B: Balanced.
Still relatively quick detection, but might not log you in when further away.

S: Secure.
The safest option, but will take much longer to authenticate you.

You can always change this setting in the config.
What profile would you like to use? [f/b/s]:            ←ここでfかbかsを入力

設定ファイル更新

以下コマンドでHowdyの設定ファイルを編集します。
vimユーザーには慣れないUIですが、下部に記載されているショートカットを参照しながら対応します。
(^:Ctrl押しながら M-:Alt押しながら)

sudo howdy config

以下の箇所の設定をします。
※機種によってはデフォルトのままでも自動で設定されるようですが、Thinkpad T480では自動で設定されませんでした。

device_path = /dev/video0        ← v4l2-ctlで確認したパス

frame_width = 340                ← v4l2-ctlで確認したキャプチャサイズ
frame_height = 340

dark_threshold = 100             ← 暗さ調整(後述)

これで設定は完了です。
以下コマンドを実行すると顔を検知できるかテストできます。

sudo howdy test

テスト画面で『DARK FRAME』と表示される場合は暗さ調整が必要です。
設定ファイルのdark_thresholdの値を大きくしてください。

顔の登録

以下コマンドで顔の登録をします。
コマンドを入力すると登録名の入力を求められるので必要に応じて入力してください。
(そのままEnterでも可)
その後、顔登録が始まるのでカメラを見つめて待機します。

sudo howdy add

これでAdded a new model to {ユーザー名}と表示されれば登録完了です。

pam設定

/etc/pam.d/配下のファイルにHowdyの設定を追加します。
よく使いそうなのだとloginとsudoあたりかと思います。

/etc/pam.d配下のファイルには以下行を追加します。

auth sufficient pam_python.so /lib/security/howdy/pam.py

これでHowdyの設定は完了です。
顔認証でログインやsudoができるようになっていることを確認してください。

使ってみた所感、確かに顔認証でログインできるのですが
ログイン後にChromeを起動したりするタイミングで結局パスワードを聞かれます。
本当にセキュアな部分は顔認証だけではダメなようでした。


トラブルシューティング

Camera path is not configured エラー

sudo howdy addを実行すると以下エラーが出ました。

Camera path is not configured correctly, please edit the 'device_path' config value.
Exception ignored in: <function VideoCapture.__del__ at 0x7fe09a3a05e0>
Traceback (most recent call last):
  File "/usr/lib/security/howdy/recorders/video_capture.py", line 55, in __del__
    self.internal.release()
AttributeError: 'VideoCapture' object has no attribute 'internal'

デバイスを自動で見つけることができなかったようです。
sudo howdy configでdevice_pathを指定してください。

No face detected エラー

sudo howdy addを実行すると以下エラーが出ました。

Please look straight into the camera
No face detected, aborting

カメラを真っ直ぐ見ていても発生するのですが、これはキャプチャサイズが自動検知できていないのが原因でした。
sudo howdy configでframe_width/frame_heightを指定してください。

All frames were too dark エラー

sudo howdy addを実行すると以下エラーが出ました。

Please look straight into the camera
All frames were too dark, please check dark_threshold in config
Average darkness: [77.42311], Threshold: 50.0

部屋を明るくしたり顔にライトを当てても駄目でした。
sudo howdy configでdark_thresholdを100にしたら治りました。