본문 바로가기
OpenCV[Computer Vision]

Open CV Face Recognition/얼굴 인식[PYTHON 개발]

by cellin 2023. 12. 27.

 

 

Open CV Face Recognition/얼굴 인식

 

 

 

 

1. 이미지 데이터셋

https://github.com/KDDI-AI-Center/LFW-emotion-dataset

 
데이터셋 다운로드하기

이미지경로: [상위경로 different] \LFW-emotion-dataset\LFW-emotion-dataset\data\LFW-FER\LFW-FER\train

 

위의 경로를 따라가시면 3가지 폴더가 존재합니다.

-[negative]

-[neutral]

-[positive]

=>나누어져 있는 이미지를 한 폴더에 저장합니다.

저는 경로를 images/faces로 생성하여 저장하였습니다.

 

 

 

 

 

2. 얼굴 인식 모델 파일

 

https://github.com/opencv/opencv/tree/master/data/haarcascades

 

  • OpenCV에서 제공하는 훈련된 얼굴 인식 모델을 사용
  • GitHub에서 다운로드 가능

 

 

 

 

3. 주피터 노트북을 통해 구현하기

 

01) 필요한 라이브러리 import하기

import cv2
import numpy as np
import os
 
**pip install opencv-python을통해 OpenCV를 설치 (터미널/cmd에서 가능합니다)

 

 

 

 

02) 사진이 있는 디렉터리의 경로 설정 및 os.listdir()을 통해 디렉터리의 파일명을 배열로 받아옴

path_dir = "images/faces/"
file_list = os.listdir(path_dir)
 

 

 

 

03 ) 첫번째 배열을 출력

file_list[0]
 

결과|

'Aaron_Eckhart_0001.jpg'
 

 

 

 

04) 배열에 들어간 원소의 개수 출력해보기

len(file_list)
 

결과|

9330
 
 
 

05)

## file_name_list의 이름으로 배열을 만들고
file_name_list=[]

## .replacefmf 통해 확장자명이 없는 파일명을 새로 만듦->최종 파일명이 [이미지이름.jpg.jpg]가 되지 않도록 별도 처리
for i in range(len(file_list)):
    file_name_list.append(file_list[i].replace(".jpg",""))

file_name_list[0]
 

결과|

'Aaron_Eckhart_0001'
 

 

 

 

 

06)

#자르기 전 이미지에서 얼굴을 잘 인식하는지 확인하기 위해 출력을 하는 코드
## image 변수에 cv2.imread()를 통해 이미지를 불러온다
## face_cascade변수에 cv2.CascadeClassfier()를 통해 얼굴 인식 모델을 불러온다

image = cv2.imread('images/faces/Aaron_Eckhart_0001.jpg')
face_cascade = cv2.CascadeClassifier('models/haarcascade_frontalface_default.xml')
                                     
    
##CascadeClassfier는 OpenCV에서 제공하는 객체검출을 위한 분류기 클래스이다.
##faces변수에 모델에서 제공하는 .detectMultiScale()을 통해 얼굴을 검출 가능하다. 

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
    cv2.rectangle(image, (x,y), (x+w, y+h), (255, 0, 0), 2)
    cv2.imshow("face_recogniton", image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
                
 

결과|

 

 

07)

#얼굴을 잘라 사이즈를 조정해 출력해주는 코드
image = cv2.imread('images/faces/Aaron_Eckhart_0001.jpg')
face_cascade = cv2.CascadeClassifier('models/haarcascade_frontalface_default.xml')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
    cv2.rectangle(image, (x,y), (x+w, y+h), (255, 0, 0), 2)
    cropped = image[y: y+h, x: x+w]
    ## cropped 변수에 검출한 얼굴 영역을 지정하고 해당 부분을 180*180의 크기로 재조정한다
    ## 원본 사진의 크기는 250*250으로 사진의 재조정은 cv2.resize()함수를 사용한다. 
    resize = cv2.resize(cropped, (180, 180))
    cv2.imshow("crop&resize", resize)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
 

 

결과|

 

 

 

 

 

08) 코드를 함수화

#여러 장의 사진을 작업하기 위해 코드를 함수화한다

def Cutting_face_save(image, name):
    face_cascade = cv2.CascadeClassifier('models/haarcascade_frontalface_default.xml')
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    for (x,y,w,h) in faces:
        cropped = image[y: y+h, x: x+w]
        resize = cv2.resize(cropped, (180, 180))
        cv2.imwrite(f"images/cutting_faces/{name}.jpg",resize)
 

 

 

 

09) 지정한 경로의 모든 사진들에서 이미지 검출 및 자르기, 저장하는 작업을 수

for name in file_name_list:
    img = cv2.imread("images/faces/"+name+".jpg")
    Cutting_face_save(img, name)
 

 

 

 

검출된 얼굴 부분을 잘라서 지정된 경로에 이미지 파일이 저장됩니다.

대표사진 삭제

사진 설명을 입력하세요.

 

 

 

 

사진: UnsplashEmile Perron

728x90
반응형