Intro
안녕하세요 빵꾸아빠입니다.
지난 글을 시작으로 제가 이미 제작해 본 딥러닝을 활용한 얼굴 인식 프로젝트와 데모를 통한 시연 프로그래밍을 다시 한번 정리하면서 진행하려고 합니다.
이 프로젝트를 진행하기 위해서는 파이썬 프로그래밍 언어에 대한 기본적인 지식이 있어야 되고 딥러닝에 대해 자세한 설명을 하지 않으므로 구글에 모두의 딥러닝이라고 검색하시면 좋은 무료 강의 들이 많으니 2~4주 정도 기초 지식이나 기술을 배워 오시면 프로젝트를 따라 진행하는 데 있어 많은 도움이 될 것입니다.
얼굴 인식
이 프로젝트는 딥러닝으로 학습한 얼굴 인식 네트워크를 실제로 어떻게 활용하는지 따라 하거나 학습할 수 있도록 정리할 예정입니다.
Computer Vision 분야에서 얼굴 인식은 크게 2가지의 Task로 나눠지는데 하나는 Verification, 다른 하나는 Identification이라고 합니다.
인식을 하려면 우선 데이터, 즉 우리가 비교하고자 하는 사람의 얼굴이 있어야 합니다. 보통 인식을 하고자 하는 얼굴을 Probe라고 부르며 비교할 대상들을 Gallery라고 합니다. Probe와 Gallery를 어떻게 비교할 지에 따라 task가 구분됩니다.
Gallery에는 각 사람별로 ID(또는 class)가 있고 각 ID별로 여러 장의 얼굴 사진들이 저장되어 있을 것입니다.
Verification은 Probe(입력이라고 생각하시면 됩니다.)로 들어온 얼굴 사진과 Gallery의 한 ID의 한 장의 얼굴 사진과 어떠한 얼굴의 값을 나타내는 벡터 값의 차이를 계산하여 Probe가 Gallery의 ID와 동일하냐 아니냐를 판단하는 task입니다.
Identification은 Probe로 들어온 얼굴 사진이 Gallery의 모든 ID의 모든 얼굴 사진과 얼굴의 값을 나타내는 벡터 값을 비교했을 때 가장 차이가 적은 ID를 Gallery에서 찾아내는 task입니다.
쉽게 설명하자면 A라는 사람의 얼굴이 새로 입력으로 들어왔을 때 Verification은 A가 맞냐 아니냐를 맞추는 것이고, Identification은 A부터 Z까지의 사람들 중에 이 사람이 A라는 것을 맞추는 것입니다.
딥러닝
우리가 현재 흔히 말하고 있는 인공지능 기술은 딥러닝을 통해 학습한 네트워크의 결과물을 가지고 분석하여 여러 분야에 활용하고 있는 기술을 말합니다.
딥러닝 또한 머신러닝의 일부이며 머신러닝은 과거 오래전부터 계속 연구되어 왔습니다. 그래픽카드의 발전으로 딥러닝 네트워크라고 부르는 deep neural network를 효과적이며 빠르게 학습할 수 있게 되었습니다.
현재 2020년에는 python이라는 언어를 통해 코딩의 장벽이 매우 낮아져 쉽게 자신만의 딥러닝 네트워크를 만들어 볼 수 있습니다.
얼굴인식+딥러닝
이 프로젝트의 목적은 얼굴인식을 딥러닝을 통해 진행하고 그것을 화면으로 보여줄 수 있는 데모까지 만드는 것입니다.
프로젝트는 크게 데이터 준비, 딥러닝 모델 준비, 학습 및 테스트 준비, 데모 프로그램 개발의 단계로 구분이 됩니다.
데이터 준비
딥러닝은 대용량의 데이터를 통해 원하는 task를 할 수 있도록 딥러닝 네트워크의 값을 계속해서 수정해가며 학습하는 것을 말합니다.
그렇다면 딥러닝을 활용하고 싶다면 먼저 대용량의 데이터가 있는지 먼저 조사를 해봐야 합니다.
1) 학습용 데이터셋
얼굴의 경우 매우 다양한 데이터셋이 존재하는데 저는 학습용으로 VGGFace2라는 데이터를 이용할 예정입니다.
아마 검색을 해보시면 무료로 다운이 가능할 텐데 대략 9000명 이상의 사람이 있고 300만 장 정도의 얼굴 사진이 저장되어 있습니다.
2) 테스트용 데이터셋
딥러닝을 통해 학습을 하면 네트워크가 학습용 데이터셋만 잘 맞추는 오버 피팅이라는 문제가 생길 수 있습니다. 따라서 주기적으로 테스트용 데이터셋을 이용해 우리의 네트워크가 학습이 잘 진행되고 있는지 확인할 필요성이 있습니다.
일반적으로 LFW라는 데이터셋을 많이 사용하니 LFW Dataset을 준비하도록 하겠습니다.
딥러닝 모델(NEURAL NETWORK) 준비
저는 얼굴 인식을 위해서 경량화니 성능이 더 좋다니 하는 네트워크들을 준비해서 사용했지만 여기서는 ResNet이라는 네트워크를 사용할 예정입니다. python에서 사용 가능한 딥러닝용 패키지들에는 몇 가지 기본적인 네트워크를 쉽게 사용할 수 있도록 제공해주는 데 ResNet이 바로 그 기본적인 네트워크입니다.
학습 환경 준비
1) CPU
인텔 CPU 추천(AMD CPU보다 인텔 CPU가 그래픽카드를 사용하지 않는 수학 연산이 훨씬 빠르다고 들었습니다)
2) GPU
NVIDIA 그래픽 카드만 사용, CUDA 지원 여부 확인해야 하며 최소 GRAM 4GB 이상은 되어야 학습이 가능합니다.
Batch Size라고 한 번에 몇 장의 이미지를 학습하는 지에 대한 크기와 우리가 학습하려는 딥러닝 모델의 구조에 따라 그래픽 카드 메모리 사용량이 변하게 됩니다.
실제 테스트를 위한 그래픽카드 메모리는 2GB~4GB 사이라 NVIDIA 9XX대 그래픽카드들로도 충분히 데모프로그램을 만들 수 있습니다.
하지만 그래픽카드 메모리가 적으면 학습이 불가능할 수도 있으니 추천은 6GB 이상을 추천 합니다.
3) 저장장치(SSD, HDD)
딥러닝 좀 해보신 분들 중에 의외로 모르는 분들이 많은데 학습 시간이 좀 길다고 느껴지는 분들은 한 번 확인해봐야 하는 부분입니다.
요약 정리를 해드리자면 학습에 사용할 DB는 SSD, 학습한 모델이나 중간중간 테스트 로그 등을 저장할 곳은 HDD 이렇게 나눠서 저장하시면 좀 더 빠르게 학습이 가능합니다.
학습은 저장장치 공간 => 시스템 메모리 => GPU 메모리 이런식으로 학습에 사용할 이미지들을 불러오면서 진행됩니다. 우리는 300만장이라는 이미지를 GPU 메모리에 한 번에 올릴만큼 GPU 메모리가 큰 것이 아니므로 Batch라는 방식으로 32장, 64장, 128장 등 (대부분 2의의 n제곱)의 형태로 데이터를 불러와 학습하는 것을 반복하게 됩니다.
이 과정에서 이미지를 불러오는 시간이 은근히 오래 걸리는데 DB 위치를 HDD에 저장하고 사용하다가 SSD에 저장하는 것으로 바꿔보면 2배 이상 빨라진 것을 체감하실 수 있을 것입니다.
4) 메모리
메모리 크기는 8GB만 넘으면 충분합니다.
5) OS
개인 서버를 만들 수 있다면 서버는 Linux를 추천합니다.
만약 그게 힘들고 집에 있는 컴퓨터로 딥러닝을 개발하고 싶으면 Window 그대로 사용해도 됩니다.
Mac은 제가 사용 안해봐서 잘 모르겠습니다.
저는 연구실에 서버가 있어 서버는 Linux로 되어 있고 코드 작성이랑 실행 등은 윈도우에서 진행합니다.