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

  1. 변환 후 사람의 identity가 불변인지 체크 필요.
  2. 변환 target인 정서에 제대로 입혀졌는지 검증 필요.
  3. Human Rating
  4. AI Rating
    1. confusion matrix by emotion classification
    2. emotion intensity
    3. arousal
    4. valence
    5. 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

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)



facial expression analysis에 사용되는 Wrapper.

다루는 주요 feature:

  • age, gender emotion, race…

주요 모델들인 아래를 불러다 쓸 수 있음.

Multi column

Verification 표정 변환간 identity 보존 여부 check

Analysis 변환된 표정이 실제로 그 표정인지 check.

Trial


Example


Models


Face Detection


  • mtcnn
  • RetinaFace

Face Embedding Models


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