CNN (Image Classification)

Efficient Facial Feature Learning with Wide Ensemble-based Convolutional Neural Networks (ESR-9)

Hongma 2021. 8. 25. 22:56

Efficient Facial Feature Learning with Wide Ensemble-based Convolutional Neural Networks

저자 : Henrique Siqueira, Sven Magg, Stefan Wermter

출간 : 2020-04-03

주제 : Face Emotional Recognition

Framework : Pytorch

 

출처 : https://ojs.aaai.org/index.php/AAAI/article/view/6037/5893

Github : https://github.com/siqueira-hc/Efficient-Facial-Feature-Learning-with-Wide-Ensemble-based-Convolutional-Neural-Networks

 

GitHub - siqueira-hc/Efficient-Facial-Feature-Learning-with-Wide-Ensemble-based-Convolutional-Neural-Networks: Efficient Facial

Efficient Facial Feature Learning with Wide Ensemble-based Convolutional Neural Networks - GitHub - siqueira-hc/Efficient-Facial-Feature-Learning-with-Wide-Ensemble-based-Convolutional-Neural-Netwo...

github.com

 

 

 - 요약

 본 논문은 FER(Face Emotional Recognition) 기술에 관련된 논문입니다. 제목과 같이 앙상블(Ensemble) 기법을 활용하여 정확도를 높인 기술이며, 기존의 앙상블보다 효율적인 앙상블을 만들었다는 내용입니다. (앙상블은 이름 그대로 여러 모델 결과를 종합하여 최종 결과를 내는 기법입니다.) 본 기술은 paperswithcode.com에서 확인하였을 때 FER+ dataset에서는 2위를, AffectNet dataset에서는 11위를 차지하고 있습니다.(2021-08-25 기준) 

https://paperswithcode.com/paper/efficient-facial-feature-learning-with-wide

순위가 더 높은 모델들이 있음에도 불구하고 본 논문을 먼저 공부하게 된 이유는 코드가 잘 짜여있으며 다른 데이터에 테스트해보았을 때 결과가 잘 나온다고 느껴졌기 때문입니다. 또 아주 쉽고 간단한 모델입니다. 다만 앙상블 모델이기 때문에 속도가 다소 느릴 수 있다는 점은 꼭 인지해야 합니다. 

 

논문 Abstract의 가장 핵심은 CNN에서의 더 효율적이고 정확한 앙상블 기법입니다. 모델의 앞단(Feature extraction) 부분은 공통적으로 사용하고, 뒷단을 여러 분기들(braches)로 나눠서 여러 개의 모델을 만들고 난 후, 앙상블 하는 모델입니다. 

 

 - 본문

 본 논문은 이론은 굉장히 간단하지만 뒤에 experiments 부분에서 다양한 시도들에 대한 내용들이 있습니다. 학습시키기가 굉장히 어렵다는 느낌이 듭니다. 저는 모델 구조 위주로 살펴보도록 하겠습니다.

 먼저 Introduction에선 이전의 앙상블 기법들에 대한 간단한 설명이 있습니다. 그다음 본 논문에서 사용한 앙상블 기법인 Ensemble with Shared Representations(ESR)에 대한 설명이 등장합니다. ESR은 Implicit part, Explicit part로 모델을 두 가지 파트로 구분 짓습니다. Implicit part는 기술 이름과 같이 Shared Representations로 모델의 앞단 부분이고, Explicit part는 세부 모델을 구분 짓는 파트로 모델 뒷단입니다. 본 논문에선 Implicit part = Base, Explicit part = Branches로 지칭하고 있으며, 실제 구현 코드도 이와 같은 이름으로 되어있습니다. 여기서 사용한 ESR은 다른 앙상블 기법들에 비해 질적, 양적으로 좋다는 말들이 나옵니다.(redundancy, computational load를 줄이고, affordability와 scalability를 늘리다. 등) ESR을 설명하는 문단 초반에 CNN에 대한 특징들을 간단히 설명하는데 다음과 같습니다.

밑줄을 겁나 못 쳤죠...? 공부를 시작하시는 분들이 보면 아주 좋을 것 같은 기본 지식이라고 생각하여 캡처해봤습니다. CNN 앞단에서 local pattern들을 구분하고, 그 특징들을 이용하여 뒷단에선 더 복잡한 pattern들을 구분한다고 하네요. ESR-9 또한 위의 내용들을 바탕으로 잘 변하지 않는 앞단의 layer는 다 같이 공유(share)하고 뒷단에 여러 모델로 분기(braches)시켜 앙상블을 하게 됩니다.

 

모델 구조를 그려보면 다음과 같습니다.

앞단에 BASE는 모든 braches가 공유하는 block입니다. 간단하게 (Conv + BN) x4 + Maxpooling(2)로 구성되어있습니다. 뒤에 Branch도 같은 구성이지만 마지막에 Global pooling으로 shape을 맞추고 FC에 들어갑니다. FC-1 은 감정 8개를 계산하는 레이어입니다. 그리고 마지막은 FC-dimentional이라는 이름의 layer로 앞의 8개의 감정을 input으로 받아 arousal & valence를 계산하는 layer입니다. 그래서 각 branch의 output은 [8개의 emotions] + [arousal & valence]가 산출됩니다. Emotions의 결과를 모아 투표를 하여 최종 Emotion이 나오고, arousal & valence는 평균을 내어 최종 결과를 냅니다.

 

Loss 또한 한 줄로 굉장히 간단합니다.

 

$L _{esr} = \sum _b \sum _i \mathit{L}[P({f(x_i)}=y_i\mid x_i, \theta_{shared}, \theta_b ), y_i]$

 

$\theta_{shared}$는 Base의 weights이고, $\theta_b$는 branches의 weights이겠죠? 그냥 일반 Classification loss에서 condition만 붙여준 모양입니다.

학습 알고리즘은 다음과 같습니다.

Base layer 깔아 두고 Branch를 하나씩 더해가며 학습한다는 내용입니다. 저는 이 표보다 코드로 보는 게 더 직관적인 것 같네요..ㅎ dataset마다 학습 과정이 조금씩 다르지만, 그래도 마지막 fine-tuning 학습 코드 main_fer_plus.py를 보는게 쉽게 이해하기 편한 것 같습니다.

 

Experiments부분에서 핵심적인 내용은 in-the-lab dataset과 in-the-wild dataset을 구분지어서 학습한다는 점입니다. 말 그대로 연구실 같은 정제된 환경의 데이터셋과 영화나 바깥의 다양한 환경에서 촬영된 데이터셋입니다. CK는 in-the-lab dataset이고 수가 적은 반면, AffectNet은 in-the-wild dataset이며 수가 굉장히 많습니다. FER+도 in-the-wild dataset이네요. 8개의 감정들이 들어있으며 AffectNet에는 Arousal & Valence가 추가로 들어있습니다. Arousal, Valence는 심리학적으로 감정을 두 가지 척도로 구분해낸 지표인데 저는 각성 정도와 정적인 정도로 보고 있습니다.

Anger, Contempt, Disgust, Fear, Happiness, Neutral, Sadness, Surprise

Dataset에 따라 체계적으로 학습하였으며, CK+ dataset을 먼저 학습하고, AffectNet 학습, 마지막으로 FER+로 fine tuning을 했다고 합니다. GradCam도 써서 학습에 대한 과정들을 잘 설명하고 있네요. 이 부분은 넘어가도록 하겠습니다.

 

 - Code

Demo 코드가 잘 짜여있으니 FER주제에 관한 과제가 있으신 디버깅 한번 해보셔도 좋을 것 같습니다.

바로 사용해보기에 좋은 코드인 것 같네요.

환경은 requirements.txt 에 나와있는 버전들 말고 모든 패키지들을 전부 다 최신 버전으로 설치해도 저는 잘 돌아갔습니다. (pytorch==1.9, ...)

다만 전처리 과정에서 얼굴을 Detection하기 위해 dlib 패키지를 사용하는데, 이 패키지가 저는 설치가 잘 안되더라고요.

잘 안되시는 분들은 가상 환경 만드시고, dlib부터 설치하신 다음에 다른 패키지를 설치하시면 좋을 것 같습니다.

(conda install -c conda-forge dlib 후 여타 패키지 설치)

 

모두 파이팅