개발 공부

TO DO. #1-2 OpenCV를 이용한 얼굴 포착 및 얼굴 인식 본문

AI

TO DO. #1-2 OpenCV를 이용한 얼굴 포착 및 얼굴 인식

아이셩짱셩 2018. 6. 11. 15:49

0. 순서

- 1. 얼굴 인식을 위한 데이터베이스 생성

- 2. 얼굴 촬영 및 저장

- 3. Recognizer 훈련시키기


1. 얼굴 인식을 위한 데이터베이스 생성

먼저 SQLite 3를 이용하여 얼굴 이미지에 상응하는 이름을 저장할 DB를 생성해야한다. 

작업 디렉토리에 createDB.py라는 파일을 만들고 아래 코드를 저장한다.

import sqlite3
conn = sqlite3.connect('database.db')
c = conn.cursor()
sql = """
DROP TABLE IF EXISTS users;
CREATE TABLE users (
           id integer unique primary key autoincrement,
           name text
);
"""
c.executescript(sql)
conn.commit()
conn.close()

이제 #1-2에서 생성한 새로운 가상환경을 activate하고 작업 디렉토리에서 createDB.py를 실행한다.

생성한 DB는 DB Browser for SQLite를 설치하여 관리한다.


2. 얼굴 촬영 및 저장

이제 얼굴 인식을 위한 데이터셋을 준비해야한다. 여기서는 opencv의 라이브러리 중 haarcascade_frontalface_default.xml 파일을 사용한다. 여기(opencv github 저장소)에서 받을 수 있다. 

파일을 받아 작업 디렉토리에 넣으면 된다. (*opencv 라이브러리 데이터 파일에 대해서는 더 깊은 공부가 필요하다.)

* github에서 파일 하나만 다운 받기

  1. Go to the file you want to download.

  2. Click it to view the contents within the GitHub UI.

  3. In the top right, right click the Raw button.

  4. Save as...

또한 아래 스크립트를 record_face.py란 파일에 저장한다.(*아래 소스의 라인단위 공부도 필요하다.)

import cv2
import numpy as np 
import sqlite3
import os
conn = sqlite3.connect('database.db')
if not os.path.exists('./dataset'):
    os.makedirs('./dataset')
c = conn.cursor()
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
cap = cv2.VideoCapture(0)
uname = input("Enter your name: ")
c.execute('INSERT INTO users (name) VALUES (?)', (uname,))
uid = c.lastrowid
sampleNum = 0
while True:
  ret, img = cap.read()
  gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  faces = face_cascade.detectMultiScale(gray, 1.3, 5)
  for (x,y,w,h) in faces:
    sampleNum = sampleNum+1
    cv2.imwrite("dataset/User."+str(uid)+"."+str(sampleNum)+".jpg",gray[y:y+h,x:x+w])
    cv2.rectangle(img, (x,y), (x+w, y+h), (255,0,0), 2)
    cv2.waitKey(100)
  cv2.imshow('img',img)
  cv2.waitKey(1);
  if sampleNum > 20:
    break
cap.release()
conn.commit()
conn.close()
cv2.destroyAllWindows()


위 코드가 실행되면 먼저 얼굴 주인의 이름을 입력 받는다. 그 후 haarcascade를 통해서 카메라 촬영 중 얼굴을 찾아낸다. 100ms의 간격으로 20장의 얼굴 샘플을 'dataset'이라는 디렉토리에 저장한다. 이제 Recognizer(인식자)를 훈련시키도록 한다.


3. Recognizer 훈련시키기

OpenCV는 얼굴 인식을 위한 3가지 방법을 제공한다.


- Eigenfaces - 얼굴 이미지를 가지고 얻은 벡터 (주성분분석_Principal Component Analysis)

- Fisherfaces (선형판결분석_Linear Discriminant Analysis)

- Local Binary Patterns Histograms (LBPH)

(*나중에 짚고 넘어가기

참고 : http://darkpgmr.tistory.com/110

       : http://blog.naver.com/PostView.nhn?blogId=i09000&logNo=20041887423)


위 세 방법 모두 기존에 습득한 얼굴의 데이터(training set)와 주어진 얼굴을 비교하는 것으로 인식을 수행한다. Training set에는 얼굴 알고리즘(?)과 해당 얼굴이 누구의 것인지를 준비해 놓아야한다.


Eigenfaces와 Fisherfaces는 모두 주어진 얼굴에서 training set의 주요한 요소의 수학적 표현(mathematical description)을 찾아낸다. LBPH는 training set의 각각의 얼굴을 분리적, 독립적으로 분석한다. 데이터 set의 각각의 이미지를 내부에서 분석(characterize) 한다는데 있어서 새로운 식별되지 않은 이미지가 주어졌을 때 LBPH가 더 간단하다고 할 수 있다. 

( The LBPH method is somewhat simpler, in the sense that we characterize each image in the dataset locally; and when a new unknown image is provided, we perform the same analysis on it and compare the result to each of the images in the dataset. 

여기서는 LBPH를 사용한다. 이를 위해 trainer.py라는 파일을 생성해 아래 코드를 저장한다.

import os
import cv2
import numpy as np 
from PIL import Image
recognizer = cv2.face.LBPHFaceRecognizer_create()
path = 'dataset'
if not os.path.exists('./recognizer'):
    os.makedirs('./recognizer')
def getImagesWithID(path):
  imagePaths = [os.path.join(path,f) for f in os.listdir(path)]
  faces = []
  IDs = []
  for imagePath in imagePaths:
    faceImg = Image.open(imagePath).convert('L')
    faceNp = np.array(faceImg,'uint8')
    ID = int(os.path.split(imagePath)[-1].split('.')[1])
    faces.append(faceNp)
    IDs.append(ID)
    cv2.imshow("training",faceNp)
    cv2.waitKey(10)
  return np.array(IDs), faces
Ids, faces = getImagesWithID(path)
recognizer.train(faces,Ids)
recognizer.save('recognizer/trainingData.yml')
cv2.destroyAllWindows()

trainer.py를 실행하면 recognizer라는 폴더 아래 trainingData.yml이라는 파일이 생긴다.


이로써 얼굴인식 훈련까지 완료되었다. 이 파트에서는 3개의 파일을 생성했다.


- 1. createDB.py : DB 생성

- 2. record_face.py : 얼굴을 캡처하고 상응하는 이름을 DB에 저장

- 3. trainer.py : OpenCV의 LBPH 얼굴 인식을 이용하여 훈련데이터 생성


이제 카메라 상에서 얼굴을 인식하고 DB에서 해당 얼굴의 이름을 찾아오는 일만 남았다.

'AI' 카테고리의 다른 글

training set  (0) 2018.08.03
기계학습 (Machine learning)  (0) 2018.08.03
TO DO. #1-1 OpenCV 라이브러리 설치 등 개발 환경 구축  (0) 2018.06.10
TO DO. #1-0 OpenCV란?  (0) 2018.06.02
Comments