Real-time Facial Recognition using YOLO and FaceNet
Description
We implemented a small real-time facial recognition system using a camera to take pictures and render real-time visuals to tell if the people in front of the camera are someone in our database (with their name as labels) or someone unknown. The main algorithms we used are YOLO v3 (You Only Look Once) and FaceNet.

YOLO v3 is a state-of-the-art, real-time object detection algorithm. The published model recognizes 80 different objects in images and videos. However, we only use YOLO to detect faces in our project. For more details about YOLO v3, you check this paper.
FaceNet develops a deep convolutional network to learn a mapping from face images to a compact Euclidean space where distances directly correspond to a measure of face similarity. It uses triplet-loss as its loss function. If you want to know more about the details of FaceNet and triplet-loss.
This is a final project of course EECS-496 (Advanced Deep Learning) at Northwestern University.

Available Funtions
Face Alignment: We have two versions of algorithms to detect and crop the faces in a picture — MTCNN and YOLO v3.
Training on FaceNet: You can either train your model from scratch or use a pre-trained model for transfer learning. The loss function we use is triplet-loss.
Real-time Facial Recognition: We use opencv to render a real-time video after facial recognition and labeling.
Configuration
OS: Windows 10
GPU: NVIDIA GeForce GTX 1060
CUDA TOOLKIT: v10.0
cuDNN SDK: v7.5 (corresponding to CUDA TOOLKIT v10.0)
Python: 3.x
tensorflow-gpu: 1.13.1
We have successfully built this system in windows, but we are not sure if it will work under other operating system like Linux or Mac OS. However, all the repos we refer to can work under Linux, so we think Linux is also available.

Usage
We only provide Windows version here, you can change the command for Linux. Remenber to check the dependencies in requirement.txt.

Face Alignment.

You can use either align\_dataset\_mtcnn.py or align\_dataset\_yolo\_gpu.py.

First, use get\_models.sh in \align\yolo\_weights\ to get the pre-trained model of YOLO if you want to use YOLO version. (The bash file only work under Linux, I will provide link for downloading directly later.)

Then create a folder in \align and name it as "unaligned\_faces", put all your images in this folder. In \align\unaligned\_faces, one person has one folder with his/her name as folder name and all his/her images should be put in the corresponding folder.

Finally run

$ python align\_dataset\_mtcnn.py
or

$ python align\_dataset\_yolo\_gpu.py
The result will be generated in \aligned\_faces folder, copy all the results to /output folder for later use.

Training FaceNet Model

If you want to directly use a pre-trained model for facial recognition, just skip this step.

If you want to implement a tranfer learning with a pre-trained model and your own dataset, you need to first download this pre-trained model, put it in /models and unzip it. Make sure that the directory /models/20170512-110547 has 4 files.

Then run

$ python train\_tripletloss.py
The trained model will be in the /models/facenet.

If you want to train your own model from scratch. In train\_tripletloss.py line 433, there is an optional argument named "--pretrained\_model", delete its default value.

Then run again

$ python train\_tripletloss.py
The trained model will also be in the /models/facenet.

Training SVM Model

In Make\_classifier.py line 25, change the "modeldir" variable to your own FaceNet model path. If you have trained a model already, just use the corresponding path, otherwise there are several pre-trained model you can use:

CASIA-WebFace: 20180408-102900

VGGFace2: 20180402-114759

Then run

 $ python Make\_classifier.py
The SVM model will be generated in \myclassifier.

Real-time Facial Recognition

There are two versions — MTCNN realtime\_facenet.py and YOLO realtime\_facenet\_yolo\_gpu.py, you can also use realtime\_facenet\_yolo.py, but the fps of this one is pretty low.

First Modify the "modeldir" variable to your own path the same as step 3.

Then run

 $ python realtime\_facenet.py
YOLO 및 FaceNet을 사용한 실시간 얼굴 인식설명카메라로 사진을 찍고 실시간 비주얼을 렌더링하여 카메라 앞에 있는 사람이 데이터베이스에 있는 사람인지(이름이 레이블로 표시된 사람인지) 알 수 있는 작은 실시간 얼굴 인식 시스템을 구현했습니다. 우리가 사용한 주요 알고리즘은 YOLO v3(You Only Look Once)와 FaceNet입니다.YOLO v3는 최첨단 실시간 객체 감지 알고리즘입니다. 공개된 모델은 이미지와 동영상에서 80개의 서로 다른 객체를 인식합니다. 하지만 저희는 프로젝트에서 얼굴만 감지하는 데 YOLO를 사용합니다. YOLO v3에 대한 자세한 내용은 이 백서에서 확인할 수 있습니다.FaceNet은 딥 컨볼루션 네트워크를 개발하여 얼굴 이미지에서 거리가 얼굴 유사성의 척도에 직접적으로 대응하는 컴팩트한 유클리드 공간으로의 매핑을 학습합니다. 이 네트워크는 손실 함수로 삼중 손실을 사용합니다. FaceNet과 삼중 손실에 대해 더 자세히 알고 싶으시다면 이 글을 참조하세요.이 프로젝트는 노스웨스턴 대학교의 EECS-496(고급 딥러닝) 과목의 최종 프로젝트입니다.사용 가능한 기능얼굴 정렬: 사진에서 얼굴을 감지하고 자르는 두 가지 버전의 알고리즘, 즉 MTCNN과 YOLO v3가 있습니다.FaceNet에서 훈련: 모델을 처음부터 훈련하거나 전이 학습을 위해 미리 훈련된 모델을 사용할 수 있습니다. 우리가 사용하는 손실 함수는 삼중 손실입니다.실시간 얼굴 인식: 얼굴 인식 및 라벨링 후 실시간 비디오를 렌더링하기 위해 오픈V를 사용합니다.구성OS: Windows 10GPU: NVIDIA GeForce GTX 1060CUDA 툴킷: v10.0cuDNN SDK: v7.5(CUDA TOOLKIT v10.0에 해당)Python: 3.x텐서플로우-gpu: 1.13.1이 시스템은 Windows에서 성공적으로 빌드되었지만 Linux 또는 Mac OS와 같은 다른 운영 체제에서 작동할지 여부는 확실하지 않습니다. 그러나 우리가 참조하는 모든 리포지토리는 Linux에서 작동할 수 있으므로 Linux에서도 사용할 수 있을 것으로 생각합니다.사용법여기서는 Windows 버전만 제공하므로 Linux용 명령어를 변경할 수 있습니다. requirement.txt에서 종속성을 확인하는 것을 잊지 마세요.얼굴 정렬.align\_dataset\_mtcnn.py 또는 align\_dataset\_yolo\_gpu.py를 사용할 수 있습니다.먼저, YOLO 버전을 사용하려면 \align\yolo\_weights\에서 get\_models.sh를 사용하여 사전 학습된 YOLO 모델을 가져옵니다. (bash 파일은 Linux에서만 작동하며, 나중에 직접 다운로드할 수 있는 링크를 제공하겠습니다.)그런 다음 \align에 폴더를 만들고 이름을 "unaligned\_faces"로 지정하고 모든 이미지를 이 폴더에 넣습니다. align\unaligned\_faces에서 한 사람이 자신의 이름을 폴더 이름으로 한 폴더를 가지고 있으며 모든 이미지를 해당 폴더에 넣어야 합니다.마지막으로 다음을 실행합니다.python align\_dataset\_mtcnn.py또는python align\_dataset\_yolo\_gpu.py결과는 \aligned\_faces 폴더에 생성되며, 나중에 사용할 수 있도록 모든 결과를 /output 폴더에 복사합니다.FaceNet 모델 훈련얼굴 인식에 미리 학습된 모델을 직접 사용하려면 이 단계를 건너뛰세요.사전 학습된 모델과 자체 데이터 세트를 사용하여 전이 학습을 구현하려면 먼저 이 사전 학습된 모델을 다운로드하여 / models에 넣고 압축을 풀어야 합니다. models/20170512-110547 디렉터리에 4개의 파일이 있는지 확인합니다.그런 다음 다음을 실행합니다.python train\_tripletloss.py훈련된 모델은 /models/facenet에 있습니다.나만의 모델을 처음부터 훈련하려면 다음과 같이 하세요. train\_tripletloss.py 433줄에 "--pretrained\_model"이라는 선택적 인수가 있는데, 기본값을 삭제하세요.그런 다음 다시 실행합니다.python train\_tripletloss.py훈련된 모델은 /models/facenet에도 저장됩니다.SVM 모델 훈련하기Make\_classifier.py 25줄에서 "modeldir" 변수를 고유한 FaceNet 모델 경로로 변경합니다. 이미 모델을 훈련한 경우 해당 경로를 사용하면 되고, 그렇지 않은 경우 미리 훈련된 여러 모델을 사용할 수 있습니다:CASIA-WebFace: 20180408-102900VGGFace2: 20180402-114759그런 다음 다음을 실행합니다. python Make\_classifier.pySVM 모델이 \myclassifier에 생성됩니다.실시간 얼굴 인식두 가지 버전이 있습니다 - MTCNN 실시간\_facenet.py와 YOLO 실시간\_facenet\_yolo\_gpu.py, 실시간\_facenet\_yolo.py를 사용할 수도 있지만 이 버전은 fps가 매우 낮습니다.먼저 3단계와 동일하게 "modeldir" 변수를 자신의 경로로 수정합니다.그런 다음 다음을 실행합니다. 파이썬 실시간\_facenet.py