2023年03月29日 更新

MediaPipeを使って、Colaboratory上でWEBカメラにてリアルタイム顔検出を行う

どうも、クラゲジュニアです。

MediaPipeとは、Googleが開発しているオープンソースの機械学習ライブラリで、提供しているコードを基にカスタマイズ可能となっております。

今回は、こちらのFace Detectionモデルを用いて、PC搭載のWEBカメラでリアルタイム顔検出を行うコードを紹介します。

Open in Colab

Open in Colabから、Colaboratoryを開き、コードを実行できます。カメラが起動すると、顔の位置を検出し、顔の部分に丸印を描画します。

メインコード

#モジュールをインポート
import numpy as np
import mediapipe as mp
from google.colab.patches import cv2_imshow

#(カメラ動画処理)
bbox = ""
video_stream()
label_html = "Capturing..."

# MediaPipe(顔検出)を準備
mp_face_detection = mp.solutions.face_detection

# 描画機能を準備
mp_drawing = mp.solutions.drawing_utils

# 顔検出実行
with mp_face_detection.FaceDetection(
    model_selection=0, min_detection_confidence=0.5) as face_detection:

  while True:
    # js_replyにカメラ映像のデータが入っている(カメラ動画処理)
    js_reply = video_frame(label_html, bbox)
    if not js_reply:
        break

    # imageに画像データが入っている(カメラ動画処理)
    image = js_to_image(js_reply["img"])

    # 画像から顔の座標を検出
    results = face_detection.process(image)

    #(カメラ動画処理)
    bbox_array = np.zeros([480,640,3], dtype=np.uint8)

    # 顔の位置を描画
    if results.detections:
      for detection in results.detections:
        mp_drawing.draw_detection(bbox_array, detection)

    #(カメラ動画処理)
    bbox_array = np.append(bbox_array, np.zeros([480,640,1]), axis=2)
    bbox_array = bbox_array.astype(np.uint8)
    bbox_array[:,:,3] = (bbox_array.max(axis = 2) > 0 ).astype(int) * 255
    bbox_bytes = bbox_to_bytes(bbox_array)
    bbox = bbox_bytes

以上です。