世間話
アイトラッキングを作ろうとしていたところ、とりあえず顔検出の速度が最も早いのはどれだろうか、、、という事でいろいろと試していました。
結論から言ってしまうと、Dlib
の方が様々な面で優れているように思います。情報量や使いやすさはあちらが優れています。
しかし、このInsightFace
の大きなメリットとしては、追加で学習データなどをインストールする必要がないところ。
定量的評価はしていませんが、こちらの方が検出精度が高いかもしれないところなどが挙げられます。
そしてなにより、このライブラリは顔の特徴量などの検出とマッチングなどがメインのようで、それらが簡単に行えるそうです。
↓参考資料
https://nuco.co.jp/blog/article/TbUHF1lK#index_CwYeU8Jc
とりあえず、ランドマーク検出という「InsightFace
とOpenCV
を使う場合のほぼ最小単位での実行の為のサンプルコード」としてお使いください。
インストール
今回のInsightFace
を動かすための前提パッケージなどは以下の通り。
pip install cmake
pip install cython
pip install onnxruntime
pip install insightface
なおcython
はonnxruntime
の前にインストールしてください。
また、公式サイトに示されるバージョン要求などは以下の通り。
Cython>=0.29.28
cmake>=3.22.3
numpy>=1.22.3
動かなそうであればこのバージョンに指定してインストールしなおしてください。
また、cmake
はVisual StudioやC言語のコンパイラがなければ動かない(インストールできない)場合があります。
cmake
にはめちゃくちゃ気を付けてください。
サンプルコード
コードは以下の通りです。
なおこのInsightFaceは一回目の実行時は以降に比べて非常に時間がかかります。
そもそもで実行に非常に時間がかかるため、不便でした。
import cv2
import numpy as np
from insightface.app import FaceAnalysis
from insightface.data import get_image as ins_get_image
#モデルの読み込み
app = FaceAnalysis()
app.prepare(ctx_id=1, det_size=(640, 640))#ctx_id=0だとCPUを使用。1だとGPUを使用して処理。
capture = cv2.VideoCapture(0)
while True:
ret, flame = capture.read()
if(ret == False):
break
faces = app.get(flame)
# 顔の境界ボックスとランドマークを描画
for face in faces:
# 顔の境界ボックスを描画
if face.bbox is not None:
bbox = face.bbox.astype(int)
cv2.rectangle(flame, (bbox[0], bbox[1]), (bbox[2], bbox[3]), (0, 255, 0), 2)
# ランドマークを描画
if face.landmark_2d_106 is not None:
for landmark in face.landmark_2d_106.astype(int):
cv2.circle(flame, tuple(landmark), 1, (0, 0, 255), -1)
cv2.imshow('Face Detection', flame)
if cv2.waitKey(1) & 0xFF == ord('q'):#qキーを押すと終了
break