前回の記事でdlibをインストールしました。今回はそのdlibとOpenCVを使って顔認識をしていきます。
では始めます。
1:学習済みデータのダウンロード
顔の認識には学習済みのデータを使用します。
上記のページを開き、一番下にある「shape_predictor_68_face_landmarks.dat.bz2」というファイルをダウンロードします。
ファイルをダウンロードして解凍すると「shape_predictor_68_face_landmarks.dat」という学習済みデータであるdatファイルが作成されるので、これを利用していきます。(解凍すると100MBほどになるので注意してください)
2:顔認識のサンプルコード
以下の内容をコピペして「dlibTest.py」というファイル名で保存します。
・dlibTest.py
# # dlibとOpenCVを使った顔認識 # import cv2 import dlib def main(): detector = dlib.get_frontal_face_detector() predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") # 学習済みファイル読み込み cap = cv2.VideoCapture(0) # 任意のカメラ番号に変更する while True: ret, frame = cap.read() k = cv2.waitKey(1)&0xff # キー入力を待つ if k == ord('q'): # 「q」キーが押されたら終了する break # 画面サイズを1/2にする height = frame.shape[0] width = frame.shape[1] frame = cv2.resize(frame , (int(width/2), int(height/2))) img = frame * 0 dets = detector(frame[:, :, ::-1]) if len(dets) > 0: parts = predictor(frame, dets[0]).parts() # 顔の点を取得 # 確認 for i in parts: # cv2.circle(frame, (i.x, i.y), 1, (255, 0, 0), -1) cv2.circle(img, (i.x, i.y), 1, (255, 0, 0), -1) # 点をプロット # cv2.imshow("camera", frame) # 画像を表示 cv2.imshow("camera", img) # 画像を表示 # キャプチャをリリースして、ウィンドウをすべて閉じる cap.release() cv2.destroyAllWindows() if __name__ == '__main__': main()
保存したらdlibTest.pyと同じ階層に1で準備した「shape_predictor_68_face_landmarks.dat」ファイルを配置します。
Webカメラを繋げた状態でdlibTest.pyを実行すると以下のように顔の特徴点をとらえた画像が表示されます。
以上がdlibとOpenCVを使って顔認識をする方法です。
OpenCVだけでも顔認識などはできましたが、dlibを使った方がより精度が高く表情などが取れると思います。
・参考資料