はじめに
前回、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を詳しく知らない技術者でも利用しやすくまとめられているのはすごいことだと思う。