얼굴 인식 - 얼굴 랜드마크 예측 모델 사용

김성빈·2024년 5월 6일
0

Modern Computer Vision

목록 보기
30/117

Facial Landmark Detection with Dlib

사전준비

얼굴 이미지와 얼굴 랜드마크를 예측하기 위한 모델을 다운로드

!gdown --id 1O2uCujErifjvK1ziRGssaQO9khI15g6q
!gdown --id 1Fi5nTkCUFLAhs8d9Yg9zA7fxcTnwsL8r

!unzip -qq images.zip
!unzip -qq shape_predictor_68_face_landmarks.zip

1. 얼굴 이미지에서 얼굴 Landmark(랜드마크)를 감지하고 주석을 달아주는 작업을 수행하는 예제 - 1


해당 인물의 얼굴에서 특징들을 감지하고 아래와 같이 주석을 달아준다.

해당 기술을 이용해서 눈을 감았는지 입을 열었는지와 같이 얼굴의 특징을 표현할 수 있다.
A. PREDICTOR_PATH
얼굴 랜드마크를 예측하기 위한 모델로

B. get_landmarks(im)
입력 이미지에서 얼굴 랜드마크를 검출

lib 라이브러리를 사용하여 얼굴 검출기(detector)와 랜드마크 예측기(predictor)를 초기화하고, 감지된 얼굴의 수에 따라 예외를 발생

def get_landmarks(im):
    rects = detector(im, 1)

    if len(rects) > 1:
        raise TooManyFaces
    if len(rects) == 0:
        raise NoFaces

    return np.matrix([[p.x, p.y] for p in predictor(im, rects[0]).parts()])

C. annotate_landmarks(im, landmarks)
입력 이미지에 얼굴 랜드마크를 주석 처리하여 표시

def annotate_landmarks(im, landmarks):
    im = im.copy()
    for idx, point in enumerate(landmarks):
        pos = (point[0, 0], point[0, 1])
        cv2.putText(im, str(idx), pos,
                    fontFace=cv2.FONT_HERSHEY_SCRIPT_SIMPLEX,
                    fontScale=0.4,

                    color=(0, 0, 255))
        cv2.circle(im, pos, 3, color=(0, 255, 255))
    return im

D. landmarks = get_landmarks(image)
이미지에서 얼굴 랜드마크를 검출
E. image_with_landmarks = annotate_landmarks(image, landmarks)
얼굴 랜드마크가 표시된 이미지를 생성

PREDICTOR_PATH = "shape_predictor_68_face_landmarks.dat"
predictor = dlib.shape_predictor(PREDICTOR_PATH)
detector = dlib.get_frontal_face_detector()

class TooManyFaces(Exception):
    pass

class NoFaces(Exception):
    pass

def get_landmarks(im):
    rects = detector(im, 1)

    if len(rects) > 1:
        raise TooManyFaces
    if len(rects) == 0:
        raise NoFaces

    return np.matrix([[p.x, p.y] for p in predictor(im, rects[0]).parts()])

def annotate_landmarks(im, landmarks):
    im = im.copy()
    for idx, point in enumerate(landmarks):
        pos = (point[0, 0], point[0, 1])
        cv2.putText(im, str(idx), pos,
                    fontFace=cv2.FONT_HERSHEY_SCRIPT_SIMPLEX,
                    fontScale=0.4,

                    color=(0, 0, 255))
        cv2.circle(im, pos, 3, color=(0, 255, 255))
    return im

image = cv2.imread('images/Trump.jpg')
imshow('Original', image)
landmarks = get_landmarks(image)
image_with_landmarks = annotate_landmarks(image, landmarks)
imshow('Result', image_with_landmarks)

예제 - 2



아까 선언한 함수를 다시 이용해서 이미지만 바꿔서 다시 적용했다.

image = cv2.imread('images/Hillary.jpg')
imshow('Original', image)
landmarks = get_landmarks(image)
image_with_landmarks = annotate_landmarks(image, landmarks)
imshow('Result', image_with_landmarks)
profile
감사합니다. https://www.youtube.com/channel/UCxlkiu9_aWijoD7BannNM7w

0개의 댓글