Object Detection

face_landmark 방법으로 얼굴 검출하기

jwjwvison 2021. 8. 15. 15:08

이번 포스팅에서는 face_landmark 방법을 이용해 사진에 있는 사람의 얼굴을 검출해보는 방법을 알아보겠다.

 

import numpy as np
import dlib
import cv2

RIHGT_EYE=list(range(36,42))
LEFT_EYE=list(range(42,48))
MOUTH=list(range(48,68))
NOSE=list(range(27,36))
EYEBROWS=list(range(17,27))
JAWLINE=list(range(17,27))
ALL=list(range(0,68))

# 학습된 모델로 dlib에서 미리 만들어놓은 데이터이다.
predictor_file='./model/shape_predictor_68_face_landmarks.dat'
image_file='./image/t.png'

# 정면 사진을 감지 하겠다
detector=dlib.get_frontal_face_detector()
predictor=dlib.shape_predictor(predictor_file)

image=cv2.imread(image_file)
# 흑백으로 바꾸어서 단순화 시켜 인식률을 높이는 방법
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

# 1 -> detection 하기 전에 layer를 upscale하는데 몇번 적용할지
rects=detector(gray,1)
print('Number of faces detected: {}'.format(len(rects)))

for (i,rect) in enumerate(rects):
    points=np.matrix([[p.x,p.y] for p in predictor(gray,rect).parts()]) # 68개 점의 좌표
    show_parts=points[ALL] #points[x]로 내가 원하는 부분만 검출 가능
    
    for (i,point) in enumerate(show_parts):
        x=point[0,0]
        y=point[0,1]
        cv2.circle(image,(x,y),1,(0,255,255),-1)
        cv2.putText(image,'{}'.format(i+1),(x,y-2),cv2.FONT_HERSHEY_SIMPLEX,0.3,(0,255,0),1)

cv2.imshow('Face landmark',image)
cv2.waitKey(0)

 

 먼저 dlib에서 사전 생성된 데이터를 불러와야 한다.

 여기서는 얼굴을 68개의 점으로 나타내주는 데이터를 사용했다.

 

  • points(밑에서 9번째 줄): 얼굴 한개당 68개의 점의 좌표를 돌려준다.
  • show parts(밑에서 8번째 줄): 68개의 점이 아닌 제일 위에서 정의했던 구간의 얼굴 부분만 표시할 수 있다.
  • x,y를 정의할때 point[0,0]을 사용한 이유는 아래와 같이 point가 이차원 배열이기 때문이다.

'Object Detection' 카테고리의 다른 글

Custom YOLO project - YOLO 이미지 데이터 만들기  (0) 2021.08.21
yolov3를 이용한 객체 탐지  (0) 2021.08.17
졸음 감지 프로젝트  (0) 2021.08.16
face_aligned_photo_generator  (0) 2021.08.16
face alignment  (0) 2021.08.15