mediapipeにとっつきたい
表情認識などで使われるmediapipeを手元のpythonで使ってみます。
使い方の理解のためになるべくシンプルにして試します。
準備
がんばってmediapipeをインストールします。
方法は調べると出てくると思います。
未対応のM1 silicon Macの方は下記の記事が参考になるかもしれません。
参考記事
MediaPipe Face Mesh
こちらの公式記事にあるスクリプトを、解説用にギリ動作するレベルまで短く刈り込んでいます。
理解のための素朴なコード
もろもろ省略したシンプルなコードです。ちょっとわからないところもありました。
mediapipe_simple.py
import cv2
import mediapipe as mp
cap = cv2.VideoCapture(2)#カメラのIDを選ぶ。映らない場合は番号を変える。
with mp.solutions.face_mesh.FaceMesh(#mesh化の設定をしてその処理名をface_meshとする
max_num_faces=1,refine_landmarks=True,min_detection_confidence=0.5,min_tracking_confidence=0.5) as face_mesh:
#↑顔の数, 目の周りを細かくするか, ランドマーク検出成功判定の閾値, ランドマークトラッキング成功判定の閾値
while cap.isOpened():
success, image = cap.read()#キャプチャが成功していたら画像データとしてimageに取り込む
results = face_mesh.process(image)#メッシュ化計算の結果がresutsに入る
if results.multi_face_landmarks:#ランドマークが取得できたら
for face_landmarks in results.multi_face_landmarks:#結果データについて順次描画処理をしていく
mp.solutions.drawing_utils.draw_landmarks(#以下の設定で描画を実行
image=image, landmark_list=face_landmarks, connections=mp.solutions.face_mesh.FACEMESH_TESSELATION,
#↑画像データ, ランドマークのリスト, メッシュの繋ぎ方?(テッセレーション)
landmark_drawing_spec=None,connection_drawing_spec=mp.solutions.drawing_styles.get_default_face_mesh_tesselation_style())
#↑わからぬ, わからぬ
cv2.imshow('MediaPipe Face Mesh', cv2.flip(image, 1))#imageを鏡像で表示
if cv2.waitKey(5) & 0xFF == 27:#ESCキーが押されたら終わり
break
cap.release() #カメラを終了
multi_face_landmarksは468個のランドマークで表されるらしい。
ランドマークはx,y,zを持ち、x,yは0~1で正規化されているらしい。
zは頭を頂点を原点として、カメラに近いほど小さい値になるらしい。
実行結果
スマホ画面をカメラに向けて撮影しているので色が悪いですが、高速にフェイスメッシュをとってくれます。
もちろん動画で、リアルタイムに線が顔にびっしり張り付きます。
実行結果
間違いやおすすめの解説ページがありましたら教えてください。