강의자료/머신러닝

[머신러닝활용] dlib 라이브러리를 이용한 얼굴 인식

파아란 기쁨 2023. 1. 17. 18:13

1. 실습환경

Tool : Pycharm

웹캠

OpenCV,dlib  설치

얼굴 특징점 추출 모듈 : https://osdn.net/projects/sfnet_dclib/downloads/dlib/v18.10/shape_predictor_68_face_landmarks.dat.bz2/

 

Downloading File /dlib/v18.10/shape_predictor_68_face_landmarks.dat.bz2 - dlib C++ Library - OSDN

Free download page for Project dlib C++ Library's shape_predictor_68_face_landmarks.dat.bz2.Dlib is a C++ toolkit containing machine learning algorithms and tools that facilitate creating compl...

osdn.net

얼굴 특징점 추출 모듈을 다운로드 하여 해당 파이썬 패키지 안에 포함시킨다.

 

2. OpenCV 설치

pip install opencv-python

 

3. dlib 설치

pip install cmake

pip install opencv-contrib-python dlib

 

4. 웹캠을 이용하여 화면 출력하기

import cv2,dlib,sys
import numpy as np

scaler = 0.7

cap = cv2.VideoCapture(0) #0 웹캠, 동영상 파일을 적용 할 수도 있다.
while True:
    ret,img = cap.read() #프레임 단위로 읽는다.
    if not ret:
        break #프레임이 없다면 종료하자.

    img = cv2.resize(img,(int(img.shape[1] * scaler),int(img.shape[0] * scaler))) #이미지 크기를 축소하자.
    ori = img.copy() #원본 이미지를 ori 에 카피 해 놓자.
    cv2.imshow('img',img) #이미지를 화면에 띄운다.
    cv2.waitKey(1) #1미리세컨드만큼 대기

위의 코드는 cv2를 이용하여 웹캠을 구동하여 프레임 단위로 읽어서 화면에 출력을 하는 코드이다.

 

5. 이미지에서 얼굴을 찾는다.

dlib 라이브러리의 get_frontal_face_detector() 는 이미지에서 얼굴을 검출한다.

dlib 라이브러리의 shape_predictor 는 얼굴에서 68개의 landmark를 찾는다. 이 때 shape_predictor_68_face_landmarks.dat 파일이 필요하다.

detector = dlib.get_frontal_face_detector() #얼굴 검출 라이브러리
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat') #얼굴 특징점 모듈

- 이미지에서 얼굴 찾기

detector 을 이용하여 얼굴 인식하여 첫번째 인식한 얼굴을 가져와서 인식 부분의 크기에 흰색으로 사각형을 그려 본다.

    faces = detector(img) #얼굴인식
    if len(faces) == 0 : continue
    face = faces[0] #찾은 모든 얼굴에서 첫번째 얼굴만 가져 오기

    #얼굴 부분에 사각형을 그려 보자.
    img = cv2.rectangle(img,pt1=(face.left(),face.top()),pt2=(face.right(),face.bottom()), color=(255,255,255),thickness=2,lineType=cv2.LINE_AA)

6. 얼굴의 특징점 68개 찾기

predictor를 이용하여 이미지에서 얼굴의 특징점을 찾아본다.

# 특징점 추출
    dlib_shape = predictor(img, face)
    shape_2d = np.array([[p.x, p.y] for p in dlib_shape.parts()])  # 특징점을 넘파이로 바꾼다.

    for s in shape_2d:  # shape_2d 의 갯수는 68개이다.
        cv2.circle(img, center=tuple(s), radius=1, color=(255, 255, 255), thickness=2,
                   lineType=cv2.LINE_AA)  # 68개의 특징점에 원모양을 그리자

predictor 매개변수로 이미지와 얼굴 위치를 넘겨 주면 이미지의 얼굴 위치에서 68개의 특징점을 추출하여 shape_2d 에 저장합니다.

이 특징점들의 위치를 반지름 1펙셀의 원으로 화면에 표시 합니다.

7. 활용하기

- 얼굴을 아이콘으로 추가해서 가리는 프로그램을 만들어 볼 수 있다.

사업자 정보 표시
원당컴퓨터학원 | 기희경 | 인천 서구 당하동 1028-2 장원프라자 502호 | 사업자 등록번호 : 301-96-83080 | TEL : 032-565-5497 | Mail : icon001@naver.com | 통신판매신고번호 : 호 | 사이버몰의 이용약관 바로가기