교내 열람실 출석부를 얼굴인식을 통해 구현하려고 한다.
선행 연구로 관련된 오픈소스와 논문을 찾는 중 파이썬 라이브러리로 DeepFace라는 라이브러리가 있는 것을 알게 되었다.
오늘은 DeepFace 라이브러리를 활용하여 얼굴 인식을 체험해보려 한다.
당연하게도 파이썬은 미리 준비되어 있어야 하고 웹캠이 꼭 필요하다.
프로젝트 폴더를 만들고 폴더에 터미널을 열어 아래와 같이 입력해서 DeepFace 라이브러리를 설치한다.
pip install deepface
추가로 OpenCV라는 파이썬으로 제작된 컴퓨터 비전 라이브러리를 설치하여 카메라를 활용할 것이다.
pip install opencv
이제 모든 준비가 완료되었고 프로젝트 폴더는 다음과 같이 구성하였다.
루트폴더/database에는 매칭시킬 얼굴 사진들이 들어가야 한다.
루트폴더에는 main.py 파일만 존재하면 된다.
이후 얼굴 사진들은 코드를 통해서 구할 수 있기 때문이다.
바로 DeepFace를 사용하기보다 OpenCV에 대해 어느정도 알아가야 수월하게 진행할 수 있다.
다음은 실시간 카메라 영상을 송출하는 코드이다.
import cv2 # opencv 가져오기
capture = cv2.VideoCapture(0) # 0번째 카메라를 사용하겠다는 뜻으로 0 이후 숫자는 외부 카메라를 의미한다.
capture.set(cv2.CAP_PROP_FRAME_WIDTH,640) # 카메라의 가로 길이를 640px로 설정한다.
capture.set(cv2.CAP_PROP_FRAME_HEIGHT,480) # 카메라의 세로 길이를 480px로 설정한다.
while cv2.waitKey(30) < 0: # 30ms마다 입력 감지 갱신하고 입력되는 키가 있을때 까지 기다리기
ret,frame = capture.read() # 카메라 화면 읽어드리기
cv2.imshow("face",frame) # 카메라 화면을 띄우기 (새창 만들어짐)
capture.release() # 카메라를 사용하기 위해 할당된 메모리를 해제
cv2.destroyAllWindows() # 카메라 화면을 띄우기 위해 만들어진 창 삭제하기
위 코드를 통해 실시간으로 현재 카메라 화면을 새 창을 띄워 송출할 수 있다.
이해가 안될 수 있기에 필요한 함수만 다시 설명한다.
while cv2.waitKey(30) < 0:
위 구문은 cv2.waitKey(30)
을 이해해야 한다.
위 함수는 30ms마다 키 입력을 감지하는데 입력된 키 값이 해당 함수로 반환된다.
따라서 0 미만으로 조건식을 작성한 이유는 아무키도 입력되지 않았을 경우 0 미만의 값이 반환되기 때문이다.
ret,frame = capture.read()
위 capture.read()
함수는 ret과 frame을 반환 받도록 하였는데 ret에는 카메라의 정상작동 유무에 대해서 참과 거짓을 반환하고 frame에는 현재 카메라에 촬영되는 모습을 담는다.
이제 DeepFace를 사용하기 위한 OpenCV 함수들에 대해서 이해하였으니 DeepFace를 직접 사용해본다.
먼저 비교할 사진들이 집합되어 있는 폴더(database)에 비교할 얼굴 사진들을 넣어야 한다.
비교할 얼굴 사진을 촬영하여 저장시켰다.
import cv2
capture = cv2.VideoCapture(0)
capture.set(CV_PROP_FRAME_WIDTH,640)
capture.set(CV_PROP_FRAME_HEIGHT,480)
while True:
command = input("명령 입력 : ")
if command == "c":
ret,frame = capture.read()
cv2.imwrite("database/jiwon.jpg",frame) # 사진을 database 폴더에 jiwon.jpg 이름으로 저장하는 함수
elif command == "exit":
break
capture.release()
cv2.destoryAllWindows()
여러 사진을 촬영할 수 있도록 명령을 입력하여 작동되도록 만들어보았다.
실행창에 c를 입력하면 사진이 촬영되어 database 폴더에 jiwon.jpg 이름으로 저장된다.
이후 이름을 바꾸고 여러 사진을 촬영하여도 된다.
얼굴을 비교하기 위해서 루트 폴더에 temp.jpg라는 이름으로 비교용 얼굴 사진을 저장시키고 database 폴더의 모든 얼굴을 탐색하여 얼굴을 비교하는 방식을 사용할 것이다.
import cv2
from deepface import DeepFace
capture = cv2.VideoCapture(0)
capture.set(CV_PROP_FRAME_WIDTH,640)
capture.set(CV_PROP_FRAME_HEIGHT,480)
while True:
command = input("명령 입력 : ")
if command == "c":
captureImage("database/jiwon.jpg")
elif command == "d":
captureImage("temp.jpg")
detect = DeepFace.find(
img_path="temp.jpg",
db_path="database",
detector_backend="retinaface",
model_name="ArcFace"
)
print(detect)
elif command == "exit":
break
capture.release()
cv2.destoryAllWindows()
def captureImage(path):
ret,frame = capture.read()
cv2.imwrite(path,frame)
위 코드를 실행하고 d를 입력하면 카메라를 통해 사진을 촬영하고 저장 후 다음과 같이 모델을 학습하는 과정을 거친다.
이후 database 폴더에 pkl이라는 모델이 만들어지고
일치하는 얼굴 사진 목록을 보여준다.
만약 일치하는 사진이 없다면 아래와 같이 빈 배열이 출력되는 것을 볼 수 있다.
위 과정을 통해서 얼굴 매칭을 통해 일치하는 얼굴을 인식하는 프로그램을 제작해보았다.
이후 과정에서는 출석부 시스템을 구현할때 DeepFace 오픈소스를 활용하여 제작할 것이다.