얼굴 이미지와 얼굴 랜드마크를 예측하기 위한 모델을 다운로드
!gdown --id 1O2uCujErifjvK1ziRGssaQO9khI15g6q
!gdown --id 1Fi5nTkCUFLAhs8d9Yg9zA7fxcTnwsL8r
!unzip -qq images.zip
!unzip -qq shape_predictor_68_face_landmarks.zip
해당 인물의 얼굴에서 특징들을 감지하고 아래와 같이 주석을 달아준다.
해당 기술을 이용해서 눈을 감았는지 입을 열었는지와 같이 얼굴의 특징을 표현할 수 있다.
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)
아까 선언한 함수를 다시 이용해서 이미지만 바꿔서 다시 적용했다.
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)