注釈
こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 Enthusiast Community on Facebookへようこそ!他の愛好家と一緒に、Raspberry Pi、Arduino、ESP32の世界により深く入り込みましょう。
参加する理由
専門家サポート: 購入後の問題や技術的な課題を、コミュニティと私たちのチームの助けを借りて解決します。
学習と共有: ヒントやチュートリアルを交換して、スキルを向上させましょう。
限定プレビュー: 新製品の発表や先行プレビューに早期アクセスできます。
特別割引: 最新製品を特別割引でお楽しみいただけます。
季節限定キャンペーンとプレゼント: プレゼント企画やホリデーキャンペーンに参加しましょう。
👉 一緒に発見し、創造する準備はできましたか? [こちら] をクリックして、今すぐ参加しましょう!
1. 顔検出(Face Detection)
このセクションでは、Raspberry Pi 上で MediaPipe Face Mesh モジュールを使用し、リアルタイムの顔検出と顔ランドマークメッシュ描画を行う方法を紹介します。
MediaPipe は Google が開発したクロスプラットフォームの機械学習パイプラインフレームワークで、動画ストリームや画像をリアルタイムで処理することができます。Face Mesh モジュールは MediaPipe が提供するモデルの一つで、リアルタイムの顔検出とランドマーク追跡を行い、さまざまな顔認識やインタラクションアプリケーションを構築することが可能です。
OpenCV の Haar 検出と比較して、MediaPipe はディープラーニングモデルを使用して検出を行うため、次のような利点があります:
より高い検出精度
照明や角度の変化に対して高いロバスト性
顔ランドマーク追跡(468 点)に対応
OpenCV とシームレスに統合でき、検出結果を動画ストリーム上に直接描画可能
1. コードの実行
重要
開始する前に、次の項目を確認してください:
パンチルト機構が組み立てられている
Raspberry Pi のデスクトップにアクセスできる
コードパッケージがインストールされている
Fusion HAT+ がインストールおよび設定されている
OpenCV がインストールされている
詳細な手順については 0. OpenCV のセットアップ を参照してください。
ターミナルを開き、次のコマンドを入力します:
sudo python3 ~/ai-lab-kit/mediapipe/mp_face.py
スクリプトを実行すると、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. 主要ステップの解説
ライブラリのインポート
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 カメラの制御
画像の処理と表示
顔ランドマークの検出
FaceMesh の初期化
face = mp_face_mesh.FaceMesh( static_image_mode=False, max_num_faces=1, refine_landmarks=True, min_detection_confidence=0.5 )
これにより顔検出モデルが作成されます。 動画モードで 1 人の顔を継続的に追跡します。
カメラの起動
picam2 = Picamera2() config = picam2.create_preview_configuration( main={"size": (640, 480), "format": "XRGB8888"}, ) picam2.configure(config) picam2.start()
カメラは 640×480 の解像度でストリーミングを開始します。
ループでフレームを取得
while True: frame_bgra = picam2.capture_array() frame_bgr = cv2.cvtColor(frame_bgra, cv2.COLOR_BGRA2BGR)
各ループで 1 フレームを取得し、OpenCV 用の形式に変換します。
顔ランドマークの検出
frame = cv2.cvtColor(frame_bgr, cv2.COLOR_BGR2RGB) results = face.process(frame)
フレームを RGB に変換し、MediaPipe が画像を解析して顔ランドマークを検出します。
顔メッシュの描画
if results.multi_face_landmarks: drawing.draw_landmarks( image=frame, landmark_list=results.multi_face_landmarks[0], connections=mp_face_mesh.FACEMESH_TESSELATION )
顔が検出された場合、その上にメッシュを描画します。
結果の表示と終了
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 のランドマークを利用した簡単な顔特徴分析とインタラクション を紹介します。