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 -vNAME STATE VERSION* Ubuntu Running 2
別のPCだと:
PS C:\Users\tubep> wsl -l -vNAME 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)を与えると,
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だけでやってるのかも.