2023/09/17

face_recognition インストールと利用

 face_recognition

2023/09/17
2024/09/23 (WSL)


CUIで顔の検出とか顔の認識してくれる便利な奴.
顔認識なんてそのうち何にでも標準で載るんだろうけれど,自分で利用しようとするとちょっとまだ敷居が高い.
そんな微妙な面倒さを解消するためのメモなのさ.
Windows (Windows11) PCユーザを想定してます.
ちなみにちゃんと使えば誰の顔かまで教えてくれるようにできるのだが,そちらは興味ないので説明しない.

Google Colabでのインストール

一番手っ取り早く体験できるのは Google Colaboratory での導入.
すごーく簡単だが,1つだけ条件がある.
GPU付のランタイムを利用すること(GPUでもTPUでもいいがCPUだけでは動かない).

インストールは僅か1行でOK(2023/09/15現在).
code cellで下記を書いて実行したら準備完了.

!pip3 install face_recognition

あとはpythonで使うなら

import face_recognition

でOKだし,bashから使うなら

%%bash
face_detection --help

でOK.
とはいえ,GPU付ランタイムなので,長時間利用すると制限がついたりする.
お金があるなら課金で解決.

WSLでのインストール

2台のWindows PCでやってみてどっちでも動いたのでこの手順で大丈夫だろう.
ちなみに片方は Ubuntu 20.04.6 LTS,もう片方は Ubuntu 22.04.3 LTS.
(Ubuntuなら cat /etc/os-releaseでバージョン見れるよ!)
参考にしたのはこちらの資料で,それをさらにダイエットした.)

2024/09/23 Windows11/powershell/wslで追記メモ
wsl --install -d Ubuntu (実際にはUbuntu-22.04.5 LTS) なら下記の通りでOK.
wsl --install -d Ubuntu-24.04 だとうまくいかないので注意.

実測でGoogle Colabとほぼ同じ速さっぽい(face_detection利用時).
これGPU(CUDA)使ってるのかな.みりゃわかるはずだが見るの忘れてた.

Powershell好きなのでPowershellから.
あるPCだと:
PS C:\Users\tubep> wsl -l -v
  NAME      STATE           VERSION
* Ubuntu    Running         2
別のPCだと:
PS C:\Users\tubep> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-22.04    Running         1

このまま(一般ユーザで構わないので) wsl を起動.
まずはUbuntuの状態を最新にもってく.

sudo apt -y update
sudo apt -yV upgrade

それから必要なツール群をインストール.
なんかホントに全部要るのか?という気もするが,この程度なら全部入れてもいいか.

sudo apt -y install git cmake cmake-curses-gui cmake-gui curl bzip2
sudo apt -y install build-essential gcc g++ make libtool texinfo
sudo apt -y install dpkg-dev pkg-config

念のために再度 update .(普通ここではなんにも起きないんだけれど心配症なの.)

sudo apt -y update

このあと,あちこちの資料では頑張ってdlibをいろんな作業を苦労して導入しろ,みたいなこと書いてあるけど,2023/09/15現在ではpip3が賢いので実は簡単に済む.
ということで先に pip3 召喚.

sudo apt install python3-pip

導入したばかりのpip3を使って face_recognition 召喚.
pip3が賢いので,必要なdlib周りを依存解析して自動で連れて来てくれる.

sudo pip3 install face_recognition

python3モジュール入れただけはずなのに,face_detectionとface_recongitionもインストールされるのはご愛敬.(中身はただのpython3スクリプトだからねぇ)

face_detection --help

Face_detectionの矩形指定が惨い

三人写ってるような画像(sample768x768.png)を与えると,
sample768x768.png
















face_detection sample768x768.png

出力は次のようになる.

sample768x768.png,162,632,286,507
sample768x768.png,162,286,286,162
sample768x768.png,135,434,238,330

ファイル名はいいとして,そのあとの矩形情報が, top, right, bottom, left という謎順になっている.
画像左上が原点で,右にX軸(第一要素)正,下にY軸(第二要素)正なところは世間一般と同じ仕様.
python内部の画像配列の構造をそのまま使ったのでこうなったのだろう.
だけど,ImageMagickさんとかffmpegさんとか辺りの常識とはかけ離れてるので注意.
気持ち的にはせめて left, top, right, bottom だよねぇ.

つまり最後を先頭に持ってくればかろうじで理解可能
さらにleftで昇順にすると掴みやすいかも.

左上(left, top), 右下(right, bottom)
162,162, 286,286,
330,135, 434,238,
507,162, 632,286,

さらに,

width = right - left = 2番 - 4番
height = bottom - top = 3版 - 1番

という計算をやってやっと,よくある -geometry 表記の (width)x(height)+(top)+(left) とかにもっていける.

ほんとなんとかならんのかこれ.

WSL高速化?

CUDAをWSLから叩いているかどうかよくわからないので一応適当にやってみる.
※MMDとかffmpegとかですでにCUDAを利用しているという前提.

sudo apt -y update
sudo apt -y install python3-dev python3-pip python3-setuptools
pip3 install torch torchvision torchaudio

要するにpip3さんにpytorchの召喚のお願いをすると,そりゃCUDA使うよねぇ,ということで nvidia_* とかいうそれっぽいのを大量に呼びつけてきてくれるようだ.
そしてそれらは,おそらくpytorchに限らずすべてのpython3コード実行に反映されるように配置されるのだろう‥すべて勝手な予想だが.

全部終わってからface_detectionを実行したら トータルで 1.28 秒ぐらいになった.半分ぐらいになったような気がする.(タスクマネージャーではcudaの負荷反応がでてないので,気のせいなのか,時間が短すぎるだけなのか‥)

その後,数百枚で連続して顔検出させてもCUDAグラフが反応しないので,CPUだけでやってるのかも.