Python Face Recognition in Real Time - 파이썬 얼굴 인식

4 분 소요

사진에서 사람 얼굴을 인식하는 face_recognition이라는, 아주 쓰기 쉬운 파이썬 패키지가 있습니다. 이 패키지를 이용하면 웹캠을 이용하여 실시간으로 사람 얼굴을 인식하는 프로그램을 쉽게 제작할 수 있습니다. 파이썬을 설치하고, 필요한 패키지를 설치하고 소스코드를 다운 받고, knowns 디렉토리에 사람 얼굴이 있는 사진을 넣으면 동작합니다. 바로 아래 화면처럼요.

face-recognition-example-picture

Face_recognition 패키지는 https://github.com/ageitgey/face_recognition에서 운영되고 있습니다.

얼굴 인식 프로그램을 실행하려면 webcam이 연결된 PC가 필요합니다. 노트북에 내장된 webcam도 잘 동작합니다. 이 예제는 Ubuntu 14.04 linux와 Windows 10에서 테스트 되었습니다만, 다른 버전의 linux나 MacOS에서도 잘 동작할 것입니다.

필요 패키지 설치

Linux

Linux를 사용한다면, 패키지를 설치하기 전에 아래와 같이 virtualenv로 환경을 분리시키기를 추천합니다.

$ sudo apt-get install python3 python3-dev python3-venv
$ python3 -m venv py3
$ source py3/bin/activate
(py3) $ pip install --upgrade pip

그 다음, 아래와 같이 필요한 패키지를 설치합니다.

(py3) $ pip install opencv-python
(py3) $ pip install opencv-contrib-python
(py3) $ pip install dlib
(py3) $ pip install face_recognition
(py3) $ pip install flask

Flask 패키지는 face recognition과 직접적인 관련은 없지만, 동영상을 스트리밍하기 위해 설치하는 것입니다.

Windows

Windows 에서는 먼저 https://www.python.org/downloads/ 에서 Python 3을 64버전으로 설치합니다. 그 다음, 커맨드창에서 다음과 같이 필요한 패키지를 설치합니다.

C:\> pip install opencv-python
C:\> pip install opencv-contrib-python
C:\> pip install dlib
C:\> pip install face_recognition
C:\> pip install flask

Windows에서 dlib 설치

Windows에서 dlib 설치시 에러가 발생할 수 있습니다. 이것을 해결하기 위해서 https://pypi.python.org/simple/dlib에 접속하여 가장 최신 버전의 xxx-win_amd64.whl 파일을 다운받습니다.

이 글을 쓰는 시점에는 dlib-19.8.1-cp36-cp36m-win_amd64.whl 파일이 가장 최신 파일이었습니다. 그 다음, 아래 명령으로 파일을 설치합니다.

C:\> pip install dlib-19.8.1-cp36-cp36m-win_amd64.whl

(이 방법은 https://github.com/charlielito/install-dlib-python-windows 를 참고했습니다.)

소스 코드 다운로드

먼저, https://github.com/ukayzm/opencv/tree/master/face_recognition 또는 다음 zip 파일을 다운로드 받습니다. face_recognition.zip 압축을 풀면 아래와 같은 파일과 디렉토리가 생성됩니다.

$ tree
.
├── camera.py
├── face_recog.py
├── knowns
├── live_streaming.py
└── templates
    └── index.html

knowns 디렉토리에 아래와 같이 주변 사람의 사진을 복사합니다.

$ ls knowns/
HyoRi.jpg  Lenna.jpg  DongGun.jpg
  • 사진에는 한 사람의 얼굴만 들어 있어야 합니다.
  • 파일 이름은 “사람이름.jpg”으로 합니다. 파일 이름은 비디오상에 출력되는 이름으로 사용됩니다.
  • 스마트폰으로 찍은 사진을 사용하는 경우에는, 회전 속성이 들어있지 않은 사진을 사용해야 합니다. 얼굴 인식이 잘 되지 않을 때는, 사진을 그림판에서 읽은 후, 90/180도 좌/우로 회전 시킨 다음 저장하세요.
  • 사진에서 얼굴이 인식되지 않으면 에러가 발생합니다.

zip 파일에는 3개의 파이썬 파일이 들어 있습니다. 각 파이썬 파일의 기능은 아래와 같습니다.

  • camera.py - 웹캠의 동영상을 모니터로 출력합니다. 카메라가 정상적으로 동작하는지 검사하기 위해 실행합니다.
  • face_recog.py - 웹캠 동영상에 있는 얼굴을 감지하여 knowns 디렉토리에 있는 얼굴과 비교하고 감지되는 이름을 출력합니다.
  • live_streaming.py - 위 동영상을 네트워크 상으로 전송합니다. 파이썬이 실행되는 머신에 모니터가 달려있지 않은 경우에 사용할 수 있습니다. 임의의 PC의 웹브라우저에서 http://IP_addr:5000 으로 접속이 가능합니다.

실행하기

터미널에서 아래 명령으로 각 파이썬 파일을 하나씩 실행시켜 보세요. 리눅스의 경우에는 먼저 virtualenv를 활성화시키는 것을 잊지 마세요.

(py3) $ python camera.py             # 카메라가 정상적으로 동작하는지 검사하기 위해 실행
(py3) $ python face_recog.py         # knowns 디렉토리에 있는 얼굴을 감지하여 출력
(py3) $ python live_streaming.py     # 비디오를 네트워크 상으로 전송. 웹브라우저에서 http://IP_addr:5000 으로 접속하여 확인

얼굴 아래에 이름이 잘 표시 되나요? Unknown이라고 나오면 jpg 파일이 회전되어 있는 것은 아닌지 그림판으로 열어보세요.

윈도우에서 ‘q’ 키를 누르거나 터미널에서 ^C를 누르면 종료됩니다.

소스코드 설명

얼굴 인식의 핵심 역할을 하는 face_recog.py 파일을 좀 더 깊게 알아보겠습니다.

face_recog.py는 많은 머신 러닝 알고리즘이 구현되어 있는 dlib와 그것을 얼굴 인식 기능에 촛점을 맞춘 wrapper인 face_recognition 패키지를 이용하여 구현되어 있습니다.

Line 20-25

knowns 디렉토리에서 사진 파일을 읽습니다. 파일 이름으로부터 사람 이름을 추출합니다.

Line 27-29

사진에서 얼굴 영역을 알아내고, face landmarks라 불리는 68개 얼굴 특징의 위치를 분석한 데이터를 known_face_encodings에 저장합니다. 이 작업의 원리는 이 사이트에 잘 설명되어 있습니다. 아주 쉽게 설명되어 있으므로, 꼭 한 번 읽어보시길 강력 추천 드립니다.

Line 42-45

카메라로부터 frame을 읽어서 1/4 크기로 줄입니다. 이것은 계산양을 줄이기 위해서 입니다.

Line 51

계산 양을 더 줄이기 위해서 두 frame당 1번씩만 계산합니다.

Line 53-54

읽은 frame에서 얼굴 영역과 특징을 추출합니다.

Line 59-60

Frame에서 추출한 얼굴 특징과 knowns에 있던 사진 얼굴의 특징을 비교하여, (얼마나 비슷한지) 거리 척도로 환산합니다. 거리(distance)가 가깝다는 (작다는) 것은 서로 비슷한 얼굴이라는 의미 입니다.

Line 64-65

실험상, 거리가 0.6 이면 다른 사람의 얼굴입니다. 이런 경우의 이름은 Unknown 입니다.

Line 65-67

거리가 0.6 이하이고, 최소값을 가진 사람의 이름을 찾습니다.

Line 74-87

찾은 사람의 얼굴 영역과 이름을 비디오 화면에 그립니다.

얼굴 인식 기능의 확장과 활용

이 글에서는 인식된 얼굴을 이미 알고 있는 사람의 얼굴과 비교해서 이름을 표시했습니다. 이것을 확장해서 두 개의 재미있는 프로그램을 파이썬으로 구현 했습니다.

Unknown Face Classifier

여기에서는 누구인지 모르는 사람의 얼굴은 단순히 unknown으로 표시했습니다. 그런데, 모르는 사람의 얼굴도 처리하는 방법은 없을까요?

Unknown Face Classifier에서는 여기에서 구현한 것을 확장해서,

  1. 모르는 얼굴을 모으고
  2. 모르는 얼굴 중에서 비슷한 얼굴을 골라내어 새로 출현한 사람을 찾아내고
  3. 사람 정보를 저장했다가 재활용하고
  4. 얼굴을 재분류하여 정확도를 높이는

방법을 구현했습니다.

Visitor Alarm Telegram Bot

이것을 더 확장해서, 웹캠에서 인식된 사람의 사진을 실시간으로 사용자의 스마트폰으로 보내면 어떨까요? 텔레그램 봇을 이용하면 이 기능을 쉽게 구현할 수 있습니다.

Visitor Alarm Telegram Bot에서는 인식된 사람의 사진을 실시간으로 전송하는 텔레그램 봇을 만들었습니다. 스마트폰에 설치된 텔레그램으로 실시간 알람을 받고 실시간 모니터링을 할 수 있습니다. 웹캠을 집의 현관이나 복도 등 주요 장소에 설치하면 스마트 초인종, 스마트 CCTV 등을 만들 수 있습니다.

참고 사이트