注釈

こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 Enthusiast Community on Facebookへようこそ!他の愛好家と一緒に、Raspberry Pi、Arduino、ESP32の世界により深く入り込みましょう。

参加する理由

  • 専門家サポート: 購入後の問題や技術的な課題を、コミュニティと私たちのチームの助けを借りて解決します。

  • 学習と共有: ヒントやチュートリアルを交換して、スキルを向上させましょう。

  • 限定プレビュー: 新製品の発表や先行プレビューに早期アクセスできます。

  • 特別割引: 最新製品を特別割引でお楽しみいただけます。

  • 季節限定キャンペーンとプレゼント: プレゼント企画やホリデーキャンペーンに参加しましょう。

👉 一緒に発見し、創造する準備はできましたか? [こちら] をクリックして、今すぐ参加しましょう!

3. 顔輪郭と虹彩検出(Facial Contours and Iris Detection)

1. 概要

これまでのセクションでは、基本的な Face Mesh 検出と シンプルな表情認識を実装しました。

このセクションでは、MediaPipe FaceMesh が提供する より詳細な特徴接続方法に焦点を当てます:

  • FACEMESH_CONTOURS — 顔の輪郭線を描画 (顔の外周や主要な特徴の境界)

  • FACEMESH_IRISES — 両目の虹彩領域を描画

輪郭と虹彩のみを描画することで、可視化がよりシンプルで軽量になります。 これは次のような用途に適しています:

  • 顔特徴の抽出

  • 視線追跡

  • 瞳孔追跡

  • 視線インタラクション

../_images/mp_face_iris.png

2. 動作原理

プログラムは次の手順で処理を行います:

  1. MediaPipe FaceMesh モデルを初期化する

  2. Raspberry Pi カメラから動画フレームを取得する

  3. 画像を RGB 形式に変換する(MediaPipe の要求)

  4. FACEMESH_CONTOURS を使用して顔の輪郭線を描画する

  5. FACEMESH_IRISES を使用して虹彩ランドマークを描画する

  6. 主要部分のみを表示して、より見やすい可視化を行う

3. コードの実行

重要

開始する前に、次の項目を確認してください:

  • パンチルト機構が組み立てられている

  • Raspberry Pi のデスクトップにアクセスできる

  • コードパッケージがインストールされている

  • Fusion HAT+ がインストールおよび設定されている

  • OpenCV がインストールされている

詳細な手順については 0. OpenCV のセットアップ を参照してください。

  1. ターミナルを開き、次のコマンドを入力します:

    sudo python3 ~/ai-lab-kit/mediapipe/mp_face_iris.py
    
  2. プログラムを実行すると、「Show Video」というタイトルのビデオウィンドウが開き、カメラのライブ映像が表示されます。

    カメラの前に顔が現れると:

    • MediaPipe が顔ランドマークをリアルタイムで検出します。

    • 顔の輪郭線(顔の外周、眉、唇など)のみが描画されます。

    • 両目の虹彩領域が円形のランドマーク接続で強調表示されます。

    フル Face Mesh と異なり、画面には主要な輪郭と虹彩のみが表示されるため、 可視化がよりシンプルで見やすくなります。

    ユーザーが頭や目を動かすと:

    • 輪郭線が顔の動きに滑らかに追従します。

    • 虹彩ランドマークが目の動きをリアルタイムで追跡します。

    顔が検出されない場合は、通常のカメラ映像のみが表示され、 注釈は描画されません。

    q を押すとプログラムを終了できます。 カメラは停止し、OpenCV ウィンドウは自動的に閉じます。

4. 完全なコード

from picamera2 import Picamera2, Preview
import cv2
import mediapipe.python.solutions.face_mesh as mp_face_mesh
import mediapipe.python.solutions.drawing_utils as drawing
import mediapipe.python.solutions.drawing_styles as drawing_styles

# Initialize FaceMesh model
face = mp_face_mesh.FaceMesh(
    static_image_mode=False,
    max_num_faces=1,
    refine_landmarks=True,
    min_detection_confidence=0.5
)

# Open camera
picam2 = Picamera2()
config = picam2.create_preview_configuration(
   main={"size": (640, 480), "format": "XRGB8888"} ,
)
picam2.configure(config)
# picam2.start_preview(Preview.QTGL) # Enable if hardware preview is needed
picam2.start()

print("Streaming... press 'q' to quit")

while True:
   frame_bgra = picam2.capture_array()
   frame_bgr  = cv2.cvtColor(frame_bgra, cv2.COLOR_BGRA2BGR)

   frame = cv2.cvtColor(frame_bgr, cv2.COLOR_BGR2RGB)
   results = face.process(frame)
   frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)

   if results.multi_face_landmarks:
      for face_landmarks in results.multi_face_landmarks:
         # Draw facial contours
         drawing.draw_landmarks(
               image=frame,
               landmark_list=face_landmarks,
               connections=mp_face_mesh.FACEMESH_CONTOURS,
               landmark_drawing_spec=None,
               connection_drawing_spec=drawing_styles.get_default_face_mesh_contours_style()
         )
         # Draw iris features
         drawing.draw_landmarks(
               image=frame,
               landmark_list=face_landmarks,
               connections=mp_face_mesh.FACEMESH_IRISES,
               landmark_drawing_spec=None,
               connection_drawing_spec=drawing_styles.get_default_face_mesh_iris_connections_style()
         )

   cv2.imshow("Show Video", frame)
   if cv2.waitKey(1) & 0xff == ord('q'):
      break

picam2.stop_preview()
picam2.stop()
cv2.destroyAllWindows()

プログラムを実行すると、画面には顔の輪郭と両目の虹彩領域のみが表示されます。

5. 主要ステップの解説

このセクションのコードは 1. 顔検出(Face Detection) とほぼ同じです。

主な違いは、メインループ内で使用する描画方法です。 draw_landmarks() 関数が 2 回呼び出されます:

  • 1 回目: FACEMESH_CONTOURS

  • 2 回目: FACEMESH_IRISES

どちらかの描画ブロックをコメントアウトすると、 表示結果の違いを確認できます。


FACEMESH_CONTOURS

  • MediaPipe が提供する接続セットです。

  • 主に次の要素を描画します:

    • 顔の外周

    • 目の輪郭

    • 鼻の輪郭

    • 唇の輪郭

この方法により、顔輪郭の変化を観察しやすい 簡略化された可視化が得られます。


FACEMESH_IRISES

  • 両目の虹彩領域を描画します。

  • 虹彩のキーポイントと円形の接続線が含まれます。

  • 次の用途に適しています:

    • 視線追跡

    • 瞳孔追跡

    • 視線検出


landmark_drawing_spec=None

  • 個々のランドマーク点の描画を無効にします。

  • 接続線のみが表示されるため、 よりシンプルで見やすい表示になります。

点と線の両方を表示したい場合は、 カスタム DrawingSpec を定義してください。


drawing_styles.get_default_face_mesh_contours_style()

  • デフォルトの輪郭描画スタイルを返します。

drawing_styles.get_default_face_mesh_iris_connections_style()

  • デフォルトの虹彩接続線スタイルを返します。

6. トラブルシューティング

  • 虹彩が検出されない

    虹彩が検出されない場合、照明が不足している、 顔がカメラから遠すぎる、または refine_landmarks が 有効になっていない可能性があります。

    照明を改善し、カメラに近づき、 FaceMesh 初期化時に refine_landmarks=True が 設定されていることを確認してください。

  • 輪郭線が不安定

    輪郭線が揺れる場合、検出信頼度が低すぎる、 または照明や頭の動きが追跡に影響している可能性があります。

    min_detection_confidence を高く設定し、 照明を改善し、頭の動きをゆっくり滑らかにしてください。

  • 遅延が大きい

    映像の応答が遅い場合、解像度が高すぎる、 または refine_landmarks が追加の計算負荷を 発生させている可能性があります。

    解像度を下げる(例:320×240)か、 虹彩検出が不要な場合は refine_landmarks を無効にしてください。

7. まとめ

  • FACEMESH_CONTOURSFACEMESH_IRISES は MediaPipe が提供する重要な接続方法です。

  • フルメッシュ描画と比べて軽量で直感的なため、実用的なインタラクション用途に適しています。

  • 次の章では、これらの機能を利用した視線追跡や瞬き検出の方法を紹介します。