my deepface github : [https://github.com/irregular6612/AI-Face-DB-recognition]
my emonet github : []
Summary
정리해보자면, neutral face는 openArt를 이용하여 제작된 상태이고, 이를 Gemini 2.5 Flash Image(nano-banana)를 사용해 표정을 바꾼 상황. 변환한 정서는 총 6종으로
- angry
- sad
- happy
- disgust
- surprised
- neutral
임.
Todo
- 변환 후 사람의 identity가 불변인지 체크 필요.
- 변환 target인 정서에 제대로 입혀졌는지 검증 필요.
- Human Rating
- AI Rating
- confusion matrix by emotion classification
- emotion intensity
- arousal
- valence
- naturalness
Processing Pipeilne
- 아래의 procedure를 따라 img는 처리된다.
background:
Face Detection
Face Detection
Summary
전체 input image에 대해서 얼굴 영역만 찾아내는 task
원본 링크Example
대표 모델들로는 아래 같은 모델들이 있음.
- opencv
- ssd
- dlib
- mtcnn, fastmtcnn
- retinaface
- yolo
- etc
Face Alignment
Face Alignment
Summary
face area만 crop된 image에서 얼굴의 keypoint로 rotation or alignment.
- 눈, 코, 입 landmark로 좌표 수정.
원본 링크Example
일반적으로 전 단계에서 사용되는 모델들인 아래와 같은 모델들에서 같이 return하여 사용.
- dlib
- 좀 오래 되었다고,,
- mtcnn, fastmtcnn (landmark based alignment)
- 눈, 코, 입 emd 5-point landmark를 반환하여 이를 사용해 alignment.
- retinaface
- 5-point or dense landmark return.
- 보통 이걸 많이 사용한다고 한다
- mtcnn보다 안정적.
- etc..
Face Embedding
Face Embedding
Summary
alignment 된 데이터를 embedding model에 넣어서 얼굴에 개한 representation을 획득하는 단계.
이후, 이 출력 embedding을 사용하여 다른 downstream task를 진행.Example
일반적으로 전 단계에서 사용되는 모델들인 아래와 같은 모델들에서 같이 return하여 사용.
- VGG-Face(2015) : stable, oldest baseline
- FaceNet(2015) : consine metric에 최적화, 해상도에 취약.
- ArcFace(2019): SOTA?? 현재도??, 연구에서 많이 사용됨.
- MagFace(2021): 구현 난도는 올라가지만, quality score오 함께 embedding을 return.
- AdaFace(2022): AI-generated face, noisy에 robust.
- etc..
원본 링크Tip
metric은 cosine을 사용하는게 업계 standard.
Key features(tasks)
- 아래의 3가지 feature들을 분석하는 것이 목표
- 현존하는 모델들의 output이 다 다르기 때문에 section 별 다른 모델 적용.
- 모든 이후 진행하는 downstream task에서도 face-detection이 우선되어야 하므로, RetinaFace 고정해서 사용.
Identity consistency(이 이름은 그냥 제가 붙인 겁니다,,)
Summary
Aim : neutral 이미지 - (다른 표정 중 하나) 의 쌍에 대해 얼굴 유사도 값을 계산.
즉, 다른 표정 사진 간 계산한 인물 유사도 값이 recognition 모델에 robust하다는 것을 보여주고 싶은 part.
- deepface lib에서 제공하는 deepface.verify(img1, img2)를 사용함.
- neutral은 fix하고 nano-banana가 tranform한 얼굴들에 대해 1-1 pair similarity comparison을 진행하는 거니까, 혹시 다른 architecture를 사용한 모델들에 대해서 cosine. 값이 다르게 나왔을 가능성은? 기술이 in-painting 기반인지 아닌지도 볼 관건 중 하나겠네,,
Final setting
- face detection model : RetinaFace
- embedding model: face img를 embedding vector로 변환
deepface.verify()의 return 중, confidence를 정리.
Emotion Recognition
Summary
각 사진의 emotion을 classification 하는 task.
마찬가지로 face detection model은 RetinaFace. recognition model만 아래와 같이 바꿔서 사용.models:
Valence, Arousal Regression
Summary
각 사진의 arousal, valence를 regression 하는 task.
마찬가지로 face detection model은 RetinaFace. regression model만 아래와 같이 바꿔서 사용.models:
DeepFace(Wrapper)
Multi column
Verification
표정 변환간 identity 보존 여부 check
Analysis
변환된 표정이 실제로 그 표정인지 check.
Trial
Example
Models
Face Detection
- mtcnn
- RetinaFace
Face Embedding Models
- FaceNet - A Unified Embedding for Face Recognition and Clustering
- ArcFace
- VGG-Face
Face Analyze
- deepface.analyze()의 return은 (age, emotion, gender, race) 등
Summary
Age, race, gender는 아래와 같이 예상됨.
- VGG-Face base로 한 backbone에
- age : backbone + 101-class output classifier
- race: backbone + 6-class classifier
- (“asian”, “indian”, “black”, “white”, “middle eastern”, “latino hispanic”)
- gender: backbone + 2-class classifier
Summary
Emotion 같은 경우는 custom model을 사용한 것으로 추정.
소형 CNN
- input dimension으로 보아, 48 x 48로 cropping 혹은 resizing을 거친 뒤, gray-scaling도 거친 듯
model = Sequential() # 1st convolution layer model.add(Conv2D(64, (5, 5), activation="relu", input_shape=(48, 48, 1))) model.add(MaxPooling2D(pool_size=(5, 5), strides=(2, 2))) # 2nd convolution layer model.add(Conv2D(64, (3, 3), activation="relu")) model.add(Conv2D(64, (3, 3), activation="relu")) model.add(AveragePooling2D(pool_size=(3, 3), strides=(2, 2))) # 3rd convolution layer model.add(Conv2D(128, (3, 3), activation="relu")) model.add(Conv2D(128, (3, 3), activation="relu")) model.add(AveragePooling2D(pool_size=(3, 3), strides=(2, 2))) model.add(Flatten()) # fully connected neural networks model.add(Dense(1024, activation="relu")) model.add(Dropout(0.2)) model.add(Dense(1024, activation="relu")) model.add(Dropout(0.2)) model.add(Dense(num_classes, activation="softmax"))
Warning
Reliable 하냐?? 솔직히 공식 github에도 이에 대한 데이터는 없기도 해서,,
EmoNet 에서 제안한 EmoNet을 사용하자. (Nature Machine Intelligence 잖아,,)
Similarity Metric
Summary
- 실험 상으로는 어떠한 지표를 쓰던 차이는 없다고 한다.
Results
- emotion, arousal, valence : EmoNet

표정 변환간 identity 보존 여부 check
변환된 표정이 실제로 그 표정인지 check.

