顔のランドマーク検出

顔の検出(バウンディングボックスを求める)については OpenCV のページでも述べた。ここでは dlib を使って顔の68個のランドマーク(特徴点)を求める。dlib の Image Processing のページからリンクされている face_landmark_detection.py というサンプルが参考になる。入力はの写真(300×300ピクセル)である。

あらかじめ学習済みモデル shape_predictor_68_face_landmarks.dat.bz2 をダウンロードし,bunzip2 で展開したものを,カレントディレクトリに置いておく。

import cv2
import dlib
import numpy as np

predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

img = cv2.imread("okumura.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
white = np.ones((300, 300, 3), dtype="uint8") * 255
detector = dlib.get_frontal_face_detector()
for d in detector(gray, 1):
    for p in predictor(gray, d).parts():
        cv2.drawMarker(white, (p.x, p.y), (0, 0, 0))
cv2.imshow("Landmarks", white)
cv2.imwrite("191001a.png", white)
cv2.destroyAllWindows()
Landmarks

この dlib をラップする形の使いやすいライブラリ face_recognition がある。