PythonでMediaPipeの顔検出を利用する

はじめに

 前回、Pythonでカメラ撮影ができるようになったので、今回はカメラ撮影を利用して顔検出をやってみた。顔検出にはMediaPipeというGoogleが開発したカスタマイズ可能な機械学習ソリューションを使用した。

MediaPipeのインストール

 MediaPipeを利用する場合、Pythonのpipでインストールを行う必要がある。と言っても以下のコマンドを呼び出すだけ。

pip install mediapipe

Pythonでのソースコード

 ほぼMediaPipe face detectionのサイトに記載されているソースコードと同じです。APIの速度をミリ秒単位で表示するようにしている。

import cv2
import time
import mediapipe as mp

# カメラ解像度の設定
wCam, hCam = 640, 480

mp_face_detection = mp.solutions.face_detection
mp_drawing = mp.solutions.drawing_utils

# カメラが1台のみ接続されている場合は0を指定。
# 2台以上接続されている場合は、カメラIDを指定。
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, wCam)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, hCam)
pTime = 0

with mp_face_detection.FaceDetection(model_selection=0, min_detection_confidence=0.5) as face_detection:
    while cap.isOpened():
        success, image = cap.read()

        if success==False:
            continue

        # パオ―マンス向上のため、オプションで参照渡しの画像を書き込み不可にする。
        # To improve performance, optionally mark the image as not writeable to
        # pass by reference.
        image.flags.writeable = False
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

        # 顔検出の時間を計測開始
        apiTime = time.time()
        results = face_detection.process(image)

        # 顔検出アノテーションをイメージ上に描画する。
        # Draw the face detection annotations on the image.
        image.flags.writeable = True
        image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
        if results.detections:
            for detection in results.detections:
                mp_drawing.draw_detection(image, detection)

        # 1秒間のフレーム数とAPIの処理時間を計算する。
        cTime = time.time()
        fps = 1 / (cTime-pTime)
        apiElapsed = cTime - apiTime
        pTime = cTime

        cv2.putText(image, f'FPS: {int(fps)}', (40,30), cv2.FONT_HERSHEY_COMPLEX,1,(255,0,0),3)
        cv2.putText(image, f'API: {int(apiElapsed*1000)} : ms', (40,70), cv2.FONT_HERSHEY_COMPLEX,1,(255,0,0),3)
        cv2.imshow("Img",image)

        key = cv2.waitKey(1)
        if key == 27:  # ESC
            break

# 後始末。しなくても終わる。
cap.release()
cv2.destroyAllWindows()

結果

 PCの結果だが、Intel Core i7-8550U 1.8GHz、メモリ8GBのノートPCを利用して、だいたい8~11msで顔検出のAPIを呼び出すことができた。

 MediaPipeでは顔以外にもポーズ(姿勢)や手を検出させたり、物を検出させることができる。画像から色々なものを検出して数値やデータ化できるので、アイデア次第で便利なものが作れそう。

 コンピュータで画像から簡単に顔や人の位置、行動を検出できるので、悪いことに使えば怖い技術だが、AIの民主化をうたうGoogleらしく、AIを詳しく知らない技術者でも利用しやすくまとめられているのはすごいことだと思う。

参考文献

MediaPipe face detection

https://google.github.io/mediapipe/solutions/face_detection

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください