* 구현 코드만 확인하고 싶은 경우 맨 아래의 깃허브 링크를 참조.

 

1. Competetion 개요

3년전 캐글에 올라온 주제인 Real and Fake Face Detection이라는 competition이 있다. 소셜 네트워크를 사용할 때 가짜 신분을 사용하는 사람이 있고 이를 탐지하여 WWW을 더 나은 곳으로 만들자는 것이 이 competition의 목적이다.

 

Competetion의 핵심 task는 크게 아래 2가지를 탐지하는 것이다. 

 

1. 데이터셋 내에서 변조된 얼굴 이미지변조되지 않은 얼굴 이미지분류하는 것

 

2. 만약 얼굴 이미지가 변조되었다면 변조된 영역분류하는 것

 

변조된 영역은 아래와 같이 네 부분으로 나뉜다. 왼쪽 눈, 오른쪽 눈, 코, 입이다. 

 

 

2. 데이터셋 구성 및 특징

데이터셋의 경우 포토샵 전문가가 변조/합성한 얼굴 이미지와 변조/합성하지 않은 얼굴 이미지로 구성되어 있다. 이렇게 포토샵으로 만들어진 데이터셋의 경우 GAN 기반의 데이터셋과 비교가될 수 있다. 이 데이터셋을 만든 배경은 GAN으로만은 충분하지 않다는 것이다. GAN은 Fake 이미지를 생성하기 쉬울 뿐더러 포토샵 전문가가 만드는 것과 GAN이 만드는 메커니즘 자체가 다르기 때문에 GAN이 학습한 패턴은 무의미할 수 있다는 것이다.

 

데이터셋 폴더 구성은 아래와 같다. 

 

 

데이터셋은 크게 두 개로 훈련 데이터셋(real_and_fake_face_detection)과 테스트 데이터셋(real_and_fake_face)으로 구성되어 있고, 이는 다시 각각 합성 이미지(training_fake)와 원본 이미지(training_real)로 구성되어 있다. 특히 합성 이미지의 경우 난이도가 크게 3가지로 easy, mid, hard로 나뉜 것이 특징이며 아래와 같이 mid 난이도만 되어도 시각적으로 합성 여부 탐지가 어려운 것이 특징이다.

 

mid_389_1101.jpg

 

라벨링된 이미지를 확인하던 도중 아래와 같이 라벨링이 잘못되어 있어 학습에 사용하기 어려운 이미지를 확인하였고, 따라서 아래의 해당 이미지는 학습에서 제외하였다. 

 

라벨링 오류 데이터셋 (easy_116_111.jpg)

 

따라서 본 Task를 수행하기 위해 아래와 같이 총 4,080장의 데이터셋을 이용하였다.

구분 폴더명 장수 중합 총합
train training_fake 959장 2,040장 4,080장
training_real 1,081장
test training_fake 959장 2,040장
training_real 1,081장

 

캐글에서 배포하는 이 데이터셋에서 아쉬운 점은 크게 두 가지가 있는데 첫 번째는 폴더 구성이 그다지 직관적이지 않다는 것이며, 두 번째는 training set과 test set이 동일한 데이터셋으로 구성되었다는 것이다. 그러다 보니 결과적으로 높은 성능이 나오기 쉬운 구조다. 하지만 본 데이터셋을 통해 캐글에 처음 입문하는 케이스로는 해볼만 하다고 판단된다. 

 

 

 

 

3. 관련 연구

관련 연구를 찾기 위해 SOTA (State Of the Art) 연구를 모아둔 Paperswithcode라는 사이트에서 fake face detection과 관련된 자료를 찾던 도중 아래와 같은 연구를 확인할 수 있었다.

논문을 리뷰해본 결과 위 연구에서 사용하는 데이터셋이 GAN으로 만들어진 것이 아니라 본 competition과 동일하게 포토샵 기반의 데이터셋을 이용하는 것을 확인하였다. 

 

 

위 연구에서 실험을 위해 OpenImage와 Flickr에서 데이터셋을 마련하였으며 크게 변조되지 않은 이미지와 변조된 이미지로 구성하여 훈련, 검증, 테스트 셋으로 나누었다. 변조된 이미지의 변조 방법의 경우 Random FAL(일종의 변조 자동화 포토샵 스크립트)과 Pro Artist가 변조하는 방법을 사용하였다. 

 

저자는 실험을 위해 크게 두 가지 모델을 만들었다. 이는 얼굴이 합성되었는지를 여부를 식별하는 글로벌 분류 모델과 합성된 위치를 예측하는 로컬 분류 모델이다. 따라서 위 연구를 기반으로 본 competetion에서도 합성 탐지 여부 모델과 합성 부위 예측 모델을 만들었다.

 

저자들은 실험을 위해 ImageNet 데이터셋으로부터 Pretrained된 DRN(Dialted Residual Network)의 변형인 DRN-C-26 모델을 사용하였다. 이를 통해 얻은 실험 결과는 다음과 같다.

 

 

저자들은 모델에 대해 스크립트를 통해 랜덤으로 변조한 Random FAL 방식과 프로 아티스트가 변조한 Professional Artist 방식에 대해 모델의 성능을 측정하였다. 성능 측정 결과, 고해상도의 인풋이 들어가면 더 높은 성능을 보이는 것을 확인하였다. 또한 augmentation이 없이 학습된 것이 더 뛰어난 것을 보였으나 augmentation을 적용한 것이 반대로 조금 더 모델이 robust한 결과를 보인다 하였다.

 

4. 모델 구현

4.1 원본/합성 판별 모델

위 관련 연구의 실험에 기반하여 이미지의 원본/합성 판별을 위한 모델과 합성된 위치를 예측하는 모델로 크게 두 개를 구현하였다. Pretrained Model을 사용하지 않고 학습을 위해 두 모델 모두 이미지 처리에 효율적이라 판단되는 Convolution Neural Network를 사용하였다.

 

4.1.1 레이어 구성

원본/합성 판별 모델 (syn_detect_model)

모델에 입력되는 이미지의 사이즈는 원본의 경우 600x600이나 원본 그대로 모델 학습시켜본 결과 시간이 오래 걸린다는 단점이 있어 300x300으로 축소하여 모델의 Input으로 지정하였다. 이후 Convolution 2D, Max Pooling, Batch Normalization, flatten, Dense 레이어로 모델을 구성하였고 출력 부분에는 sigmoid 함수를 통해 이진 분류가 가능하도록 하였다.

 

4.1.2 모델 학습 결과

 

학습 초반에는 위와 같이 loss 값이 0.9013, accuracy 0.5162로 시작하는 것을 확인할 수 있었고, 학습 종료 시점에는 아래와 같이 loss 값이 0.0479, accuracy가 0.9931임을 확인할 수 있었다. 또한 추가적인 다른 metric을 통해서도 학습이 전반적으로 잘 이루어지는 것을 확인할 수 있었다.

 

4.2 합성 위치 예측 모델

4.2.1 레이어 구성

합성 위치 예측 모델 (loc_detect_model)

합성 위치 예측 모델 또한 원본/합성 탐지 모델과 거의 동일한 구조를 가지고 있다. 차이점은 학습 과정에서 빠른 과적합이 이루어지는 것을 확인하였다. 따라서 Dropout 레이어를 추가하였고 출력 부분에는 라벨을 15개로 지정하여 softmax 함수를 통해 출력되도록 하였다. 라벨에 대한 구체적인 내용은 실험 부분에 기술하였다.

 

4.2.2 모델 학습 결과

학습 종료 시점에 아래와 같이 loss 값이 0.0586, accuracy가 0.9875임을 확인할 수 있었고 추가적인 다른 metric을 통해서 학습이 전반적으로 잘 이루어져 있음을 확인할 수 있었다.

 

 

5. 실험

5.1 원본/합성 판별 모델

5.1.1 이미지 어그멘테이션 (Image Augmentation)

어그멘테이션을 진행하지 않고 원본/합성 탐지 모델을 학습한 결과 충분한 성능이 도출되지 않았다. 때문에 어그멘테이션 작업을 필요로 했고 아래와 같은 옵션을 사용하여 어그멘테이션을 진행하였다.

 

구분 옵션 비고
훈련 데이터셋 horizontal_flip True 수평 플립
vertical_flip False 수직 플립
shear_range 0.2 기울기 비율
zoom_range 0.2 확대 비율
rescale 1/255. 이미지 스케일링
테스트 데이터셋 rescale 1/255. 이미지 스케일링
validation_split 0.2 훈련/평가 분할 비율

 

모델의 Robustness를 위해 수평 플립을 True로 설정하였고 기울기와 확대 비율에 대해 주로 사용되는 값인 0.2를 설정하였다. 또한 훈련 데이터셋과 테스트 데이터셋에 대해 각각 이미지 스케일링을 적용하였고 테스트 데이터셋에 대해서는 0.2 비율로 평가와 테스트 데이터셋으로 나누었다. 어그멘테이션 옵션을 적용한 결과는 다음과 같다.

 

 

Training 데이터셋 2,040장 Validation 데이터셋 1,633장 Test 데이터셋 407장에 대해 어그멘테이션을 진행하였다.

 

5.1.2 모델 레이어 구성

 

6개의 Convolution 2D 레이어와 3개의 Maxpooling 2D 레이어, 그리고 3개의 Batch Normalization 레이어를 구성하고 출력부분에는 활성화 함수로 sigmoid를 사용하여 합성 여부를 탐지할 수 있도록 만들었다. Dropout의 경우 모델이 과적합되지 않아, 별도로 적용하지 않았다. 모델의 옵티마이저는 RMSProp을 사용하였고 learning rate 값으로 0.00001을 사용하였다.

 

모델 구성의 순서에서 CS231n 강의 기준으로 Conv2D → BatchNorm → MaxPool2D 순으로 쌓는 것이 적합하다 하였으나 Conv2D → MaxPool2D → BatchNorm 형태로 구성하는 것이 더 학습 성능이 좋은 것을 실험적으로 확인하였다.

 

 

5.1.3 모델 학습 결과

100회의 에폭을 통해 학습한 결과는 아래와 같다.

학습 과정

Early Stop을 적용하여 58번째 에폭에서 종료되었고, 점진적으로 loss가 줄고, accuracy가 증가하는 양상을 확인할 수 있었다. 부가적으로 precision, recall, auc에 대한 평가 metric을 추가하여 확인할 수 있도록 하였다. 학습된 모델에 대해 validation set으로 평가한 결과 아래와 같다.

 

 

결과 값으로 Loss값 5.6%, Accuracy값 98.7%, Precision 99.4%, Recall 98.0%, AUC 99.9%을 확인할 수 있다.

 

또한 별도의 인퍼런스 모듈을 생성하여 아래와 같이 확인하였다.

Inference 과정

 

최종적으로 합성 여부 탐지를 위해 Test 데이터셋의 모든 fake 이미지를 넣은 결과 위와 같이 대부분의 이미지가 올바르게 Inference되는 것을 확인할 수 있고, 일부 Real로 오분류 되는 것 또한 확인할 수 있다. Inference를 통해 최종적인 F1 Score의 경우 98.8%의 성능을 보임을 확인하였다.

 

F1 Score

 

5.1.4 손실함수 및 정확도 그래프 시각화

 

모델 학습의 초반부에 변화가 심한 양상을 보이기도 하나 점차 변화 폭이 좁아지면서 안정적으로 학습되는 것을 확인할 수 있다. Loss는 약 0.9에서 시작하여 0.05까지 줄어들며, Accuracy는 약 0.55부터 시작하여 0.99에 근접하게 학습되는 것을 확인할 수 있다.

 

5.2 합성 위치 예측 모델

5.2.1 데이터 프레임 생성

합성 여부와 달리 합성 위치에 대한 예측 모델을 만들기 위해서는 별도의 formal한 구조로 만들어 두어야 학습에 용이할 것이라 판단되어 아래와 같이 판다스(Pandas) 라이브러리를 이용하여 데이터프레임을 생성하였다.

Dataframe 생성

파일 이름의 합성 부위를 나타내는 4자리의 숫자만 추출하여 각각의 필드로 나타내었다. 특이한점은 label이라는 컬럼을 만들었는데 이는 기존 left_eye, right_eye, nose, mouth와 같이 별개의 컬럼을 라벨로 지정하여 학습을 시도한 결과, 방법론을 잘못 적용한 것인지 학습 결과가 좋지 않았다. 마지막 레이어에 sigmoid 또는 softmax로 Unit을 4로 설정하여도 학습 결과가 미미한 것을 확인하였다. 전반적으로 모델 설계 방식에 대한 방법론 조사를 시도했으나 크게 찾지 못하였다. 하지만 조사 도중 일부 예시에서 위와 같이 개개 별로 나누는 것이 아닌 하나로 통합하여 라벨로 두는 방법을 찾아 있는 것을 확인하였고, 이를 적용하였더니 학습 결과가 개선되는 것을 확인할 수 있었다.

 

5.2.2 이미지 어그멘테이션 (Image Augmentation)

합성 여부 탐지 모델과 달리 변조 부위 탐지 모델의 경우 합성된 이미지만 사용해야 했기에 충분한 학습을 위해 이미지 어그멘테이션 작업을 진행하였다. 다음은 이미지 어그멘테이션을 위해 사용한 옵션의 종류와 값을 나타내었다.

 

구분 옵션 비고
학습 데이터셋 horizontal_flip False 수평 플립
vertical_flip False 수직 플립
shear_range 0.2 기울기 비율
zoom_range 0.2 확대 비율
테스트 데이터셋 validation_split 0.2 훈련/평가 분할 비율

 

왼쪽 눈과 오른쪽 눈의 예측 위치가 바뀌어선 되지 않기에 수평 플립을 False로 주었고, 적은 데이터셋이기에 학습 데이터셋의 일부를 수직 플립하는 옵션 또한 False로 적용하였다. 나머지 옵션인 기울기, 확대, 분할 비율의 경우 일반적으로 0.2를 설정한다고 판단하여 값을 설정하였다.

 

Training Set의 경우 총 959개를 사용하였고, Validation Set과 Test Set은 0.2 비율로 각각 768개, 191개로 나누어 어그멘테이션을 진행하였다.

 

5.2.3 모델 레이어 구성 (Model Layer Structure)

 

합성 여부 탐지 모델과 동일하게 레이어를 구성하였으며 달라진 부분은 출력 부분에 합성의 경우의 수인 15가지에 대해 softmax 함수를 적용한 것이다. 15가지는 합성 부위 별로 나올 수 있는 경우의 수인 $2^4$에서 합성되지 않은 0000에 대한 경우를 제외한 것이다. 또한 Dropout 레이어를 추가하여 학습이 과적합 되지 않도록 하였다. Dropout을 0.1로 모두 적용하여 진행한 결과 적용하지 않은 것과 비슷하게 대부분의 평가 메트릭에서 99%대를 확인할 수 있었고, Dropout을 0.2로 적용한 결과 조금 더 느슨하게 학습되는 것을 확인할 수 있었다. 다음은 모델학습 결과이다.

 

5.2.4 모델 학습 결과

모델 학습 결과 (epoch: 61 종료)

 

61번째 에폭에서 Early stop이 적용되어 종료되었다. 점진적으로 loss가 줄고, accuracy가 증가하는 양상을 확인할 수 있었고, 부가적으로 precision, recall, auc에 대한 평가 metric을 추가하여 확인할 수 있도록 하였다. (그림의 가시성을 위해 val_precision, val_recall, val_auc 정보를 담지 않았다) 모델에 대해 Validation Set을 사용하여 평가한 결과 다음과 같다.

 

모델 Evaluation 결과

모델 성능 평가 결과 값으로 Loss 값 16%, Accuracy 값 96.9%, Precision 99.0%, Recall 94.0%, AUC 99.9%를 확인할 수 있다. 다음으로 학습한 합성 부위 예측 탐지 모델에 대해 합성 이미지 전체를 입력으로 넣어 추론을 진행하는 과정을 아래와 같이 진행하였다.

 

Inference 진행 과정

0 ~ 15사이의 값을 0001, 0010, 0011 ~ 1111 값으로 딕셔너리로 아래와 같이 매핑 해두었다.

 

 

실제 합성 이미지가 들어 갔을 때 실제 값과 예측 값을 출력하였으며 만약 다를 경우 Fail이라는 문자열을 출력하도록 하여 구분하도록 하였다. 올바르게 합성 부위를 탐지한 결과의 경우 부위를 합성 부위를 True/False로 표현하여 확인할 수 있도록 하였다. 전체 959장의 합성 이미지에서 Inference를 통해 F1 Score를 계산한 결과는 다음과 같다.

 

 

Inference 진행 결과, F1 Score 97.0%로 학습이 매우 잘 이루어졌음을 확인할 수 있다.

 

5.2.5 손실함수 및 정확도 그래프 시각화

 

합성 여부 탐지 모델과 달리 초반 변화폭이 큰 양상이 없으며 전반적으로 loss 값이 줄어들고 accuracy가 증가하는 추세를 확인할 수 있다. 이와 같은 추세와 F1 Score를 통해 모델 학습 잘 이루어졌음을 알 수 있다.

 

코드: https://github.com/roytravel/fake-face-detection/

 

[1] 『Detecting Photoshopped Faces by Scripting Photoshop』 - ICCV 2019

+ Recent posts