[ML] Deepfake Detection 성능 분석
0. 프로젝트 소개
빅데이터응용 보안 수업시간에 팀 프로젝트로 진행했던 프로젝트를 소개해본다.
프로젝트 주제는 Deepfake Detection 성능을 분석하는 것으로, 총 4명의 팀원들과 협력하여 진행하였다.
우선 deepfake detection과 관련된 논문을 분석한 뒤, 사용할만한 데이터셋을 탐색하고 전처리, 학습, 최적화 등의 과정을 거쳐 프로젝트를 진행하였다.
1. Introduction
최근 딥러닝 기술의 발전으로 Deepfake 와 같이 동영상에 특정 인물의 얼굴을 합성하는 사례가 증가하고 있다. Deepfake 기술은 다양한 분야에 적용될 수 있어 앞으로 그 수요가 증가할 것으로 예상된다.
하지만 deepfake 기술을 이용해 사기, 허위 음란물, 가짜 뉴스 등의 새로운 범죄에 악용될 위험 역시 증가하고 있다.
본 프로젝트에서는 악의적으로 조작된 deepfake 영상을 정확하고 빠르게 탐지하는 최적의 Model 과 Hyper parameter를 찾는 것을 목표로 한다.
2. Dataset
본 프로젝트에 사용된 데이터셋은 FaceForensics++ 의 데이터셋을 사용하였다.
FaceForensics++ 데이터 셋은 Andreas Rossler et al.의 연구에서 제작한 데이터 셋이다. 현재 딥페이크 영상 생성 기술은 크게 컴퓨터 그래픽스 기반 방법(computer graphics-based methods)과 학습 기반 방법(learning-based approaches)으로 나눌 수 있다. FaceForensics++ 데이터 셋은 컴퓨터 그래픽스 기반 방법으로 Face2Face와 FaceSwap을 사용했고 학습 기반 방법은 DeepFakes와 NeuralTextures를 사용했다.
언급한 생성 방법들은 모두 한 쌍의 원본 영상과 타겟 영상을 입력하면 합성 이미지 또는 비디오를 출력한다. 실제와 유사한 환경을 위해 유튜브에서 데이터를 수집하였으며 수집한 영상 속 얼굴이 가려지는 문제를 피하기 위해 비디오를 수동 선별 하였다.
최종적으로 약 30000개의 이미지를 포함하는 700개의 비디오를 선택하여 훈련/검증/테스트에 사용하였다.
3. Preprocessing
3.1. Image Extraction
데이터 셋이 동영상으로 이루어져 있기 때문에 Preprocessing을 위해 동영상을 캡쳐하여 이미지 데이터셋을 만들었다.
총 700개의 동영상에서 10 프레임 단위로 이미지를 추출을 수행하였으며, 데이터 셋으로 사용한 이미지의 개수는 [그림 1]과 같다.
[그림 2]는 데이터 셋의 동영상을 캡처한 후에 크기를 동일하게 만들어 주는 코드이다. 동영상을 캡쳐한 후 이미지의 크기를 동일하게 만들기 위해 cv2의 resize를 이용하여 이미지를 960x540 사이즈로 통일해주었다. 또한 original과 manipulated 이미지를 확인하기 위해 real은 0, fake는 1로 라벨링해주었다.
3.2. Cropping
전처리 된 이미지에 따른 정확도를 비교하기 위해 이미지를 Center crop과 Face crop, Masking 유무로 나누어 전처리를 수행하였다.
Center crop은 이미지의 중앙을 기준으로 크기를 자르는 것이다. Resize한 이미지를 기준으로 Center crop을 하기 위해, 가로와 세로를 2로 나누어 가운데를 정하고, 사이즈를 300 X 300으로 지정해주었다.
Face crop은 [그림 3]과 같이, 프레임 단위로 추출한 이미지에서 감지된 얼굴을 중심으로 crop한 방식이다. 이미지에서 얼굴을 감지하는 것은 이미지에서 얼굴에 관련된 알고리즘을 편하게 사용할 수 있는 dlib 라이브러리를 활용하였다. 그림 8서 볼 수 있듯이, 감지된 얼굴 영역을 기준으로 crop을 진행하였으며, 만약 해당 프레임에서 얼굴이 감지되지 않았을 경우에는 예외처리를 통해 별도의 처리를 하지 않도록 하였다.
Masking은 사진의 일부분을 검은색으로 처리하는 것을 의미한다. [그림 4]는이미지의 masking 처리를 수행하는 코드이다. 사진의 일부분을 masking 하기 위해 입력받은 크기의 정사각 배열을 만들고 8등분하여, 한 부분만 1로 바꾸어 주었다. 그림 10은 masking 처리의 예시로 masking 시켜줄 부분만 1로 표시를 해주었다.
3.3. Preprocessing result
전처리된 이미지에 따른 정확도 비교를 위해 위에서 사용한 방식을 이용하여 이미지를 네가지로 나누어 전처리를 수행하였다.
Image extraction까지는 동일하게 진행하였고, 이미지 crop 방식과 masking 적용 유무를 네가지의 경우로 나누어서 데이터 전처리를 하고, Deepfake detection에 특화된 Xception 모델을 사용해 학습하였다.
[그림 5] 는 네가지로 나눈 전처리 이미지이며, [그림 6]은 네가지 전처리 방식과 그에 따른 train data와 validation data에서의 정확도를 각각 정리한 것이다.
그 결과, 본 프로젝트에서는 정확도가 제일 높은 “Only face crop”, 즉, face crop은 사용하되 masking은 적용하지 않는 전처리 방식을 선택하였다.
4. Model Evaluation
데이터 셋이 이미지이므로, 학습 모델로 CNN(Convolutional Neural Networks)를 사용하였다.
학습에 총 5개 모델을 사용하였으며, 정확한 비교를 위해 파라미터를 동일하게 사용하였다. 또한 Classification을 하는 모델이 얼마나 잘 작동하는지 통계적으로 확인하기 위해 Accuracy와 Recall, Precision, F1 Score, ROC Curve를 사용하였다.
4.1. Xception
Xception은 2017년 구글에서 개발한 딥러닝 모델로 2014년 개발된 inception 모듈을 변형한 것이다. Xception은 기존 inception에서 cross channel correlation과 spatial correlation을 독립적으로 계산하기 위해 고안된 extreme inception 모델 형식을 띈다.
Xception의 accuracy, precision, recall, f1 score, ROC curve, confusion matrix 결과는 [그림 7], [그림 8], [그림 9]와 같다. 테스트 정확도는 약 86 퍼센트로 다섯가지 학습 모델 중 가장 정확도가 높았다.
4.2. MesoNet
CNN 모델중 하나인 Meso-4는 4개의 convolution layer, pooling으로 구성된 sequence로 이루어져 있다.
MesoNet의 accuracy, precision, recall, f1 score, ROC curve, confusion matrix는 [그림 10], [그림 11], [그림12] 와 같다. 테스트의 정확도가 약 56%로 탐지 정확도가 낮은 편이다.
4.3. DenseNet
DenseNet은 2017년 발표된 “Densely Connected Convolutional Networks” 라는 논문에서 처음 소개된 CNN 모델이다. Densenet의 가장 큰 특징으로는 모든 layer들이 연결되어 있다는 점인데, 이는 데이터의 흐름을 최대화 해주기 위함이다.
DenseNet의 accuracy, precision, recall, f1 score, ROC curve는 [그림 13], [그림 14], [그림 15]와 같다. 테스트 정확도가 약 57 퍼센트로 딥페이크 탐지 정확도가 낮은 편에 속하였다.
4.4. GoogleNet
GoogLeNet은 inception 모듈을 사용한 딥러닝 모델이다. Deep Neural Network의 성능을 개선시킬 수 있는 방법은 depth와 width를 증가시키는 것이다. 하지만 이는 파라미터 수의 증가와 컴퓨터 자원 사용량 증가라는 문제점이 발생한다.
두가지 문제를 해결하기 위해서는 Dense fully connected 구조를 sparsely connected 구조로 변경하여 해결할 수 있다. inception은 depth와 width 증가를 위해 네트워크를 sparse하게 구성하여 크기를 증가시키고 1x1 convolution을 이용하여 channel을 축소시킨다.
GoogLeNet의 accuracy, precision, recall, f1 score, ROC curve는 [그림 16], [그림 17], [그림 18]과 같다. 약 73 퍼센트의 정확도를 가져 Xception 다음으로 정확도가 가장 높았다. 정확도가 높아 이후 Ensemble에서도 GoogLeNet을 사용하였다.
4.5. ResNet
ResNet은 Residual block의 identity mapping을 통해 학습 과정을 보다 효율적이고 정확하게 될 수 있도록 만든 모델이다. 구조는 VGG의 구조를 뼈대로 하며, convolution layer들을 추가해서 깊게 만든 후에, shortcut들을 추가하면 ResNet의 구조가 된다.
ResNet의 accuracy, precision, recall, f1 score, ROC curve, Confusion matrix는 [그림 19], [그림 20], [그림 21]과 같다. 약 56 퍼센트의 낮은 딥페이크 탐지 정확도를 보였다.
위 5개의 모델 전체적인 평가 결과를 [그림 22]와 같이 정리하였다.
결과적으로 Xception의 정확도가 가장 높았으며 MesoNet의 정확도가 가장 낮았다. Xception과 GoogLeNet을 제외한 나머지 모델은 딥페이크 탐지 시 모든 데이터를 딥페이크로 인식하였기 때문에 정확도가 약 50 퍼센트가 나왔다.
정확도가 높은 모델 또한 약 86 퍼센트의 정확도로 정확도가 많이 높지 않았다. 따라서 정확도가 높은 새로운 모델 탐지를 위해 정확도가 가장 높았던 모델을 이용하여 추가적으로 Ensemble과 CNN-SVM을 수행하였다.
5. Additional Model Evaluation
5.1. Ensemble
Ensemble을 적용하기 위해 위의 다섯 가지 모델 중 정확도가 높았던 Xception과 GoogLeNet을 이용하였다. 적용 방식은 기존에 모델 하나에서 학습을 시키고 softmax를 이용하여 prediction 결과를 가져온 방식을 응용하였다.
모델 두 개에서 동일한 이미지를 학습시키고 각 모델의 probability를 더해 평균을 구하여 softmax를 통해서 prediction 결과를 가져왔다. [그림 23]은 ensemble 적용 방식을 실제 코드로 구현한 것이다.
Xception과 GoogLeNet 모델 모두 dropout을 0으로 주어 학습을 수행하였기 때문에 ensemble에서도 그림 41과 같이 dropout을 0으로 지정하고 학습을 수행하였다.
테스트를 진행할 때에도, 학습시킬 때와 동일하게 모델을 구성하여 하였으며 테스트 결과인 accuracy, precision, recall, f1 score, ROC curve는 [그림 24]과 같다. Xception과 GoogLeNet에 ensemble을 적용하여도 약 79 퍼센트의 정확도로 Xception보다 정확도가 낮았다.
5.2. CNN-SVM
SVM(Support Vector Machine) 모델은 마진을 최대화할 수 있는 최대의 초평면을 찾음으로써 classification을 수행하는 모델이다.
일반적인 CNN 모델과 같이, Xception 모델에서는 마지막 layer에서 logistic regression을 통해 classification을 수행한다.
이에 반해 CNN-SVM 모델은 CNN 모델의 결과에 SVM 분류기를 결합한 구조이다. CNN-SVM 모델은 [그림 25]과 같이 손실 함수를 CrossEntropyLoss 대신 MultiMarginLoss를 사용하여 구현하였다.
dropout 값을 0으로 설정해주어 학습을 진행하였다.
accuracy, precision, recall, f1 score, ROC curve, confusion matrix 결과는 [그림 26]과 같다. 약 84 퍼센트의 정확도로 Xception과 유사하였지만 Xception의 정확도가 더 높기 때문에 추후 딥페이크 탐지에서는 Xception만을 이용하여 딥페이크 탐지를 수행하였다.
6. Optimization - Xception
여러가지 모델을 사용하여 학습을 시켰을 때, Xception 모델의 테스트 결과가 가장 좋게 나왔다. 하지만 약 86 퍼센트의 정확도로 정확도가 높지 않았기 때문에 학습에 사용한 하이퍼 파라미터들을 변형 정확도를 더 높이는 과정을 수행하였다.
batch_size는 학습에 큰 영향을 미치지 않아서 모두 동일하게 8로 두고 학습을 시켰고, model의 dropout과 epoch 값을 변경하여 학습을 진행하였다.
dropout과 epoch 값을 변경하여 학습을 수행할 때 Xception의 optimizer는 기본적으로 Adam optimizer로 사용을 하였다. Adam optimizer는 현재 가장 많이 사용되는 optimizer로 많은 사용을 통해 검증된 알고리즘이다.
dropout과 epoch 값을 변경하여 학습을 시킨 후에 가장 정확도가 높은 dropout과 epoch 값을 이용하여 optimizer에 대해 변경하여 학습을 수행하였다.
메인 코드는 [그림 27]과 같으며 수행 학습을 시키는 함수(main())을 만들어 사용하였고, 필수적인 인자들은 argpase를 이용하여 main에서 parsing 하여 넣어주었다.
7. Result
다양한 하이퍼 파라미터를 적용하여 학습을 시키고 테스트를 수행한 결과를 정리한 표는 [그림 28], [그림 29]와 같다.
[그림 28]의 내용에서 알 수 있듯이, dropout을 0.3, epoch를 10으로 설정하였을 경우 가장 성능이 좋게 측정되었다. 또한 epoch가 증가함에 따라 train accuracy와 validation accuracy 모두 증가하는 것을 확인할 수 있었으며, epoch 11 이상으로 늘렸을 경우에는 오히려 성능이 떨어졌다.
dropout 0.3, epoch 10일 때에 가장 좋은 성능을 보여주어 optimizer도 변경하여 테스트를 수행하였다. [그림 29]는 optimizer를 변경하였을 때 성능 평가 결과로 기존에 사용한 Adam optimizer로 학습시켰을 때의 성능이 가장 좋게 측정된 것을 확인할 수 있다.
Xception 모델을 이용한 테스트에서 가장 좋은 결과를 보인 하이퍼 파라미터 값과 optimizer를 사용하여 학습시킨 학습 곡선은 [그림 30]과 같다.
validation accuracy와 train accuracy가 차이가 많지 않고 train accuracy의 정확도가 점점 증가하고 있기 때문에 overfitting 이 발생하지 않았음을 추론할 수 있다.
8. Conclusion
Deepfake 탐지를 위해 Faceforensic++ 데이터 셋을 이용하였고, 수집한 데이터의 학습을 위해 전처리 하였다.
전처리는 DropOut / CenterCrop / FaceCrop 방식을 조합하여 테스트하였고, 가장 성능이 좋았던 FaceCrop을 선택하여 진행했다.
모델 선정을 위해 여러 개의 CNN 모델과 앙상블 기법, CNN과 SVM을 결합시키는 방법을 이용하여 테스트를 진행하였고, 그 결과 Xception 단일 모델의 성능이 약 85 퍼센트의 정확도로 가장 좋았다.
따라서 우리는 딥페이크 탐지를 위한 딥러닝 수행 최종 모델을 Xception으로 선택하였다. 설정하는 파라미터 값에 따라서 Xception의 정확도가 달라지기 때문에 성능이 좋은지 판단하기 위하여 dropout 비율, epoch, optimizer와 같은 하이퍼 파라미터를 다르게 적용시키며 테스트를 진행하였다.
테스트 결과는 dropout이 0.3, epoch는 10, Adam optimizer를 사용하였을 때 정확도가 약 85퍼센트의 정확도로 가장 높게 나왔다.
학습시킨 모델을 통해 실제 동영상에서도 탐지가 가능하다. 동영상에서 딥페이크를 탐지하는 방식은 동영상을 프레임 단위로 나누고, Face Crop을 진행하여 추출된 얼굴 부분의 이미지로 딥페이크 여부를 판단한다. [그림 31]을 보면 원본 이미지와 딥페이크 이미지를 구분하는 것을 확인할 수 있다.
10. Reference
model structure - https://github.com/HongguLiu/Deepfake-Detection