[OpenCV+dlib] 얼굴 인식 실험

1. 소개



OpenCV와 dlib로 얼굴 인식을 실험해 보았습니다.

2. Face Detector()



먼저 얼굴을 감지합니다.
얼굴 감지는 "이미지 중에서 사람의 얼굴을 인식하고 그 위치를 식별"하는 것을 의미합니다.
dlib의 get_frontal_face_detector()를 이용합니다.
import dlib

#dlibのget_frontal_face_detectorのインスタンスを立てる。
detector = dlib.get_frontal_face_detector()
#imagesで顔を検出し、それをfacesに保存する。
faces = detector(images)


위 코드의 faces에 저장된 정보를 바탕으로 감지된 얼굴에 사각형 테두리를 표시합니다.
실행 결과를 나타냅니다. 두 여자가 얼굴을 감지하고 흰색 테두리로 표시되는 것을 알 수 있습니다.



3. Facial Landmark Detection



얼굴 안의 각 파트의 위치 관계, 치수를 바탕으로 식별 가능한 정보를 추출합니다.
이 정보를 Facial Landmark라고합니다.
dlib는 얼굴에서 68 포인트의 정보를 가져옵니다.

실제 얼굴을 식별하려면 랜드마크 포인트의 유클리드 거리가 사용됩니다. 기준이 되는 얼굴의 Landmark point와 새롭게 인식된 얼굴의 Landmark point와의 유클리드 거리를 계산해, 그 값이 역치보다 작은 것과 같은 얼굴인 것을 인식합니다. Google Photos와 스마트 폰의 사진 폴더와 같은 얼굴 인식 알고리즘이 채택되었습니다.


방금 전의 여성의 얼굴보다 Landmark point를 취득합니다. 두 단계로 나뉘어집니다.
import dlib

#---------------------------
#Step 1. Faceを認識する。
#---------------------------
#dlibのget_frontal_face_detectorのインスタンスを立てる。
detector = dlib.get_frontal_face_detector()
#imagesで顔を検出し、それをfacesに保存する。
faces = detector(images)

#--------------------------
#Step 2. FaceよりLandmark pointを抽出する。
#---------------------------
for face in faces:
    dlib_shape = landmark_predictor(imgage,face)
    shape_2d = np.array([[p.x, p.y] for p in dlib_shape.parts()])

취득한 shape_2d의 shape를 확인하면 tuple로서(68,2)가 되어 있습니다. (68=landmark point 68 points, 2= x,y 좌표)

이 정보를 바탕으로 얼굴 주변에 Landmark points를 그립니다.
for s in shape_2d:
    cv2.circle(image, center=tuple(s), radius=1, color=(255, 255, 255), thickness=2, lineType=cv2.LINE_AA)



요약


  • dlib 라이브러리의 Face Detection과 Landmark Points 취득의 기능을 이용해 얼굴 인식의 유효성을 확인했습니다.

  • 참고 자료



    1. Dlib Main Page
    2. Github Davis King's Page

    실행 코드



    1. 7행 'model/shape_predictor_68_face_landmarks.dat'는 여기 링크에서 다운로드하십시오.
    2. 9행의 load video 는, 동영상의 mp4 파일, 혹은 WebCAM를 사용해 주세요. 자신의 얼굴로 하면 꽤 재미있습니다.
    import cv2
    import dlib
    import sys
    import numpy as np
    
    scaler = 0.5
    
    #Initialize face detector and shape predictor
    detector = dlib.get_frontal_face_detector()
    landmark_predictor = dlib.shape_predictor('model/shape_predictor_68_face_landmarks.dat')
    
    #load video
    cap = cv2.VideoCapture('samples/girls3.mp4') 
    #cap = cv2.VideoCapture(0) #内臓カメラ
    #cap = cv2.VideoCapture(1) #USBカメラ
    
    
    #Face recognition
    
    
    
    while True:
        # read frame buffer from video
        ret, img = cap.read()
        if not ret:
            cap.set(cv2.CAP_PROP_POS_FRAMES,0)
            continue
    
    
        # resize frame
        img = cv2.resize(img, (int(img.shape[1] * scaler), int(img.shape[0] * scaler)))
        ori = img.copy()
    
        # detect faces
        faces = detector(img)
    
        #例外処理 顔が検出されなかった時
    
        if len(faces) == 0:
            print('no faces')
            img_rec = img
    
        for face in faces:
    
            # rectangle visualize
            img_rec = cv2.rectangle(img, pt1=(face.left(), face.top()), pt2=(face.right(), face.bottom()),
                                color=(255, 255, 255), lineType=cv2.LINE_AA, thickness=2)
    
            # landmark
            dlib_shape = landmark_predictor(img,face)
            shape_2d = np.array([[p.x, p.y] for p in dlib_shape.parts()])
    
            print(shape_2d.shape)
    
            for s in shape_2d:
                cv2.circle(img, center=tuple(s), radius=1, color=(255, 255, 255), thickness=2, lineType=cv2.LINE_AA)
    
    
        cv2.imshow('original', ori)
        cv2.imshow('img_rec', img_rec)
    
    
        if cv2.waitKey(1) == ord('q'):
            sys.exit(1)
    

    좋은 웹페이지 즐겨찾기