注釈

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

参加する理由

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

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

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

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

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

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

1. 顔検出(Face Detection)

このセクションでは、Raspberry Pi 上で MediaPipe Face Mesh モジュールを使用し、リアルタイムの顔検出と顔ランドマークメッシュ描画を行う方法を紹介します。

../_images/mp_face_mesh_demo.png

MediaPipe は Google が開発したクロスプラットフォームの機械学習パイプラインフレームワークで、動画ストリームや画像をリアルタイムで処理することができます。Face Mesh モジュールは MediaPipe が提供するモデルの一つで、リアルタイムの顔検出とランドマーク追跡を行い、さまざまな顔認識やインタラクションアプリケーションを構築することが可能です。

OpenCV の Haar 検出と比較して、MediaPipe はディープラーニングモデルを使用して検出を行うため、次のような利点があります:

  • より高い検出精度

  • 照明や角度の変化に対して高いロバスト性

  • 顔ランドマーク追跡(468 点)に対応

  • OpenCV とシームレスに統合でき、検出結果を動画ストリーム上に直接描画可能

1. コードの実行

重要

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

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

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

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

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

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

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

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

    sudo python3 ~/ai-lab-kit/mediapipe/mp_face.py
    
  2. スクリプトを実行すると、OpenCV が「Show Video」というタイトルのウィンドウを開き、Raspberry Pi カメラから取得したライブ映像を表示します。

    • カメラの前に顔が現れると、プログラムが自動的に検出し、顔の上に詳細なランドマークメッシュをリアルタイムで描画します。人が動いたり、まばたきをしたり、表情が変化しても、メッシュは滑らかに追従します。

    • 顔が検出されない場合は、ウィンドウには通常のカメラ映像のみが表示され、ランドマークは描画されません。

    動画ストリームはユーザーがプログラムを終了するまで継続して実行されます。 プログラムを終了するには、キーボードの q を押してください。 カメラは停止し、OpenCV のリソースも自動的に解放されます。

2. コード例

完全なコードは以下の通りです:

from picamera2 import Picamera2
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 the mp_face_mesh model
face = mp_face_mesh.FaceMesh(
    static_image_mode=False,          # Set to False for video streams
    max_num_faces=1,                  # Maximum number of faces to detect
    refine_landmarks=True,           # Whether to refine landmarks
    min_detection_confidence=0.5     # Detection confidence threshold
)

# Open Raspberry Pi camera
picam2 = Picamera2()
config = picam2.create_preview_configuration(
    main={"size": (640, 480), "format": "XRGB8888"},
)
picam2.configure(config)
picam2.start()

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

while True:
    frame_bgra = picam2.capture_array()               # XRGB8888 → BGRA
    frame_bgr  = cv2.cvtColor(frame_bgra, cv2.COLOR_BGRA2BGR)

    # Convert BGR to RGB (MediaPipe requires RGB)
    frame = cv2.cvtColor(frame_bgr, cv2.COLOR_BGR2RGB)

    # Face detection and landmark tracking
    results = face.process(frame)

    # Convert RGB back to BGR (for OpenCV display)
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)

    # Draw detected facial landmarks
    if results.multi_face_landmarks:
        for face_landmarks in results.multi_face_landmarks:
            drawing.draw_landmarks(
                image=frame,
                landmark_list=face_landmarks,
                connections=mp_face_mesh.FACEMESH_TESSELATION,
                landmark_drawing_spec=drawing.DrawingSpec(thickness=1, circle_radius=1),
                connection_drawing_spec=drawing_styles.get_default_face_mesh_tesselation_style()
            )

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

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

プログラムを実行すると、ライブカメラ映像が表示され、顔が検出されると自動的に顔メッシュが描画されます。

3. 主要ステップの解説

  1. ライブラリのインポート

    from picamera2 import Picamera2
    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
    

    これらのライブラリは以下の用途で使用されます:

    • Raspberry Pi カメラの制御

    • 画像の処理と表示

    • 顔ランドマークの検出

  2. FaceMesh の初期化

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

    これにより顔検出モデルが作成されます。 動画モードで 1 人の顔を継続的に追跡します。

  3. カメラの起動

    picam2 = Picamera2()
    config = picam2.create_preview_configuration(
        main={"size": (640, 480), "format": "XRGB8888"},
    )
    picam2.configure(config)
    picam2.start()
    

    カメラは 640×480 の解像度でストリーミングを開始します。

  4. ループでフレームを取得

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

    各ループで 1 フレームを取得し、OpenCV 用の形式に変換します。

  5. 顔ランドマークの検出

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

    フレームを RGB に変換し、MediaPipe が画像を解析して顔ランドマークを検出します。

  6. 顔メッシュの描画

    if results.multi_face_landmarks:
        drawing.draw_landmarks(
            image=frame,
            landmark_list=results.multi_face_landmarks[0],
            connections=mp_face_mesh.FACEMESH_TESSELATION
        )
    

    顔が検出された場合、その上にメッシュを描画します。

  7. 結果の表示と終了

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

    q を押すとプログラムが終了し、カメラも自動的に停止します。

4. よくある問題とトラブルシューティング

  • カメラが開けない

    • CSI カメラケーブルが正しく接続されているか確認してください

    • カメラインターフェースを有効にします:

      sudo raspi-config → Interface Options → Camera

    • 有効化後は Raspberry Pi を再起動してください

  • プログラムの起動が遅い

    初回実行時は MediaPipe モデルを読み込むため、数秒かかる場合があります。 これは正常な動作で、2 回目以降はより高速に起動します。

  • 検出が不安定 / 遅延がある

    • カメラ解像度を下げる(例:320×240)

    • CPU 使用率を下げるため refine_landmarks を無効にする

    • 他のプログラムを終了する

  • mediapipe モジュールが見つからない

    MediaPipe をインストールしてください:

    pip install mediapipe
    

    64-bit の Raspberry Pi OS を使用していることを確認してください。

5. まとめ

  • MediaPipe FaceMesh はディープラーニングモデルを使用して Raspberry Pi 上で高精度な顔検出を実現します

  • OpenCV と非常に密接に統合されています

  • 表情認識、アバター追跡、AR アプリケーションなどの用途に適しています

  • 従来の Haar 特徴量ベースの方法よりも堅牢で拡張性があります

次のセクションでは、Face Mesh のランドマークを利用した簡単な顔特徴分析とインタラクション を紹介します。