목적
얼굴 유사도를 판별하는 모델을 만들기 위해 얼굴 인식 모델에 대해 조사하게 되었다.
얼굴 인식 과정
- 얼굴 검출 (Face Detection) - 얼굴 영역 찾아 추출
- 얼굴 정렬 (Face Alignment) - 포인트 (눈, 코, 입, 윤곽 등) 추출
- 얼굴 정규화 (Face Normalization) - 얼굴 영역 회전 및 매칭 가능한 상태 변경. 모델
- 1~3 모델 : opencv, ssd, dlib, mtcnn, retinaface, mediapipe, yolov8, yunet, fastmtcnn
- 얼굴 표현 (Face Representation) - 임베딩 과정을 거쳐 N차원 특징 벡터로 표현
- 모델 : VGG-Face, Facenet, Facenet512, OpenFace, DeepFace, DeepID, ArcFace, Dlib, SFace
- 얼굴 비교 (Face Matching) - 벡터 간 유사도 계산
1) Verification 얼굴 검증
2) Indentification 얼굴 식별
얼굴 인식 종류
name | sub | 작업 |
Face Detection | 얼굴감지 | |
Face Recognition | Face Verification | [얼굴 파악] 1:1 파악 서로 같은 사람인지 |
Face Identification | [얼굴 파악] 1:N 파악 입력값이 DB 속 얼굴 중 어디에 해당하는지 |
* 현재 내가 필요한 인식종류는 Face Identification이다.
Deep Face 프레임워크
다양한 모델을 wrapping하고 있는 얼굴 인식(face recognition) 프레임워크
종류
library | 정확도(LFW) | 정확도(YTF) | model | 특징 | 특징2 | 출시년도 |
deepface | 99.65% | FaceNet512 | 기존의 임베딩 차원이 128 -> 512로 증가. 512개의 노드 |
|||
deepface | 99.60% | SFace | Sigmoid-Constrained Hypersphere Loss | |||
deepface | 99.41% | ArcFace | 얼굴 인식의 특성 모방하여 다양한 각도와 조명 조건에서 얼굴 특징 벡터의 유사성 최대화하는 방식으로 학습 |
Angular Margin loss | 2018 | |
deepface | 99.38 % | Dlib | ||||
deepface | 99.20% | FaceNet | 임베딩 학습을 위해 삼중항 손실 임베딩 공간에서 서로 더 가까워지는 방식으로 인코딩하는 방법 학습 |
Triplet loss | 2015 | |
deepface | 98.78% | 97.40% | VGGFace | Triplet loss + softmax loss | 2015 | |
deepface | 93.80% | OpenFace | ||||
deepface | DeepFace | |||||
deepface | 97.05% | deepID | ||||
evoLVE | 중국 | |||||
99.53% | ElasticFace | 고정된 패널티 마진 | softmax |
* 삼중항손실(Triplet loss): 긍정과 부정의 거리를 비교한 후 부정의 거리를 늘리는 것
- LFW(Labeled faces in the Wild : 5,749명 13,233개의 유명인 얼굴 이미지 데이터셋
- YTF(Youtube Face): 1,595명 3,242개의 비디오로 구성된 영상 데이터셋. LFW 데이터세트의 유명인의 하위 집합
- 정확도 출처 : deepface git
ArcFace
- 서로 다른 클래스 사이에 충분한 거리가 있는 임베딩 공간을 만듦. 임베딩 공간이 더 희박해지기 때문에 클래스가 더 잘 분리됨
- 얼굴 이미지 사이의 거리 계산을 위해 softmax 손실을 각도 마진 손실로 대체
- 일반적인 softmax와 달리 ArcFace 모델은 margin 값을 이용하여 클래스 간의 거리를 보다 잘 유지하면서 클래스 내부의 유사도 더욱 강화
- 특징 벡터 크기 512
- 기존 FR에서 DCNN 학습은 두가지 방법이 있었음 (softmax, triplet loss).
하지만 단점이 있었으며 새로 도입한 방법이 ArcFace
클래스 간 각도를 통해 차이를 주어 서로 다른 클래스에는. 더 큰 격차를 만드는 방법
FaceNet
- google에서 만듦
- 이미지 사이의 거리 유사성 (두 이미지가 가까울수록 유사한 것으로 간주)
- 인식이나 검증을 위해 추가 레이어를 사용하는 대신 이미지에서 매핑을 하고 학습하고 직접 임베딩 생성
- 모델이 가벼움. 128바이트의 데이터만 사용하여 각 얼굴 표현
마무리
Deepface 라이브러리는 한번에 설치도 가능하기에 어떤 모델을 사용할 지에 대한 선택이 좀 더 편리해 보인다.
개인적으로 공부를 하기위해서는 직접 모델을 만드는 방향도 고려해 보는 게 좋을 듯하다.
'ML & DL' 카테고리의 다른 글
딥러닝 기본 구조 파악하기 (1) | 2024.04.06 |
---|
댓글