dhairyashah commited on
Commit
277c665
1 Parent(s): a5262fc

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +179 -0
app.py ADDED
@@ -0,0 +1,179 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import cv2
3
+ import numpy as np
4
+ import tensorflow as tf
5
+ import tensorflow_addons
6
+
7
+ from facenet_pytorch import MTCNN
8
+ from PIL import Image
9
+ import moviepy.editor as mp
10
+ import os
11
+ import zipfile
12
+
13
+ # local_zip = "FINAL-EFFICIENTNETV2-B0.zip"
14
+ # zip_ref = zipfile.ZipFile(local_zip, 'r')
15
+ # zip_ref.extractall('FINAL-EFFICIENTNETV2-B0')
16
+ # zip_ref.close()
17
+
18
+ # Load face detector
19
+ mtcnn = MTCNN(margin=14, keep_all=True, factor=0.7, device='cpu')
20
+
21
+ #Face Detection function, Reference: (Timesler, 2020); Source link: https://www.kaggle.com/timesler/facial-recognition-model-in-pytorch
22
+ class DetectionPipeline:
23
+ """Pipeline class for detecting faces in the frames of a video file."""
24
+
25
+ def __init__(self, detector, n_frames=None, batch_size=60, resize=None):
26
+ """Constructor for DetectionPipeline class.
27
+
28
+ Keyword Arguments:
29
+ n_frames {int} -- Total number of frames to load. These will be evenly spaced
30
+ throughout the video. If not specified (i.e., None), all frames will be loaded.
31
+ (default: {None})
32
+ batch_size {int} -- Batch size to use with MTCNN face detector. (default: {32})
33
+ resize {float} -- Fraction by which to resize frames from original prior to face
34
+ detection. A value less than 1 results in downsampling and a value greater than
35
+ 1 result in upsampling. (default: {None})
36
+ """
37
+ self.detector = detector
38
+ self.n_frames = n_frames
39
+ self.batch_size = batch_size
40
+ self.resize = resize
41
+
42
+ def __call__(self, filename):
43
+ """Load frames from an MP4 video and detect faces.
44
+
45
+ Arguments:
46
+ filename {str} -- Path to video.
47
+ """
48
+ # Create video reader and find length
49
+ v_cap = cv2.VideoCapture(filename)
50
+ v_len = int(v_cap.get(cv2.CAP_PROP_FRAME_COUNT))
51
+
52
+ # Pick 'n_frames' evenly spaced frames to sample
53
+ if self.n_frames is None:
54
+ sample = np.arange(0, v_len)
55
+ else:
56
+ sample = np.linspace(0, v_len - 1, self.n_frames).astype(int)
57
+
58
+ # Loop through frames
59
+ faces = []
60
+ frames = []
61
+ for j in range(v_len):
62
+ success = v_cap.grab()
63
+ if j in sample:
64
+ # Load frame
65
+ success, frame = v_cap.retrieve()
66
+ if not success:
67
+ continue
68
+ frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
69
+ # frame = Image.fromarray(frame)
70
+
71
+ # Resize frame to desired size
72
+ if self.resize is not None:
73
+ frame = frame.resize([int(d * self.resize) for d in frame.size])
74
+ frames.append(frame)
75
+
76
+ # When batch is full, detect faces and reset frame list
77
+ if len(frames) % self.batch_size == 0 or j == sample[-1]:
78
+
79
+ boxes, probs = self.detector.detect(frames)
80
+
81
+ for i in range(len(frames)):
82
+
83
+ if boxes[i] is None:
84
+ faces.append(face2) #append previous face frame if no face is detected
85
+ continue
86
+
87
+ box = boxes[i][0].astype(int)
88
+ frame = frames[i]
89
+ face = frame[box[1]:box[3], box[0]:box[2]]
90
+
91
+ if not face.any():
92
+ faces.append(face2) #append previous face frame if no face is detected
93
+ continue
94
+
95
+ face2 = cv2.resize(face, (224, 224))
96
+
97
+ faces.append(face2)
98
+
99
+ frames = []
100
+
101
+ v_cap.release()
102
+
103
+ return faces
104
+
105
+
106
+ detection_pipeline = DetectionPipeline(detector=mtcnn,n_frames=20, batch_size=60)
107
+
108
+ model = tf.keras.models.load_model("./EfficientNetV2_Deepfakes_Video_Detector/p1")
109
+
110
+
111
+ def deepfakespredict(input_video):
112
+
113
+ faces = detection_pipeline(input_video)
114
+
115
+ total = 0
116
+ real = 0
117
+ fake = 0
118
+
119
+ for face in faces:
120
+
121
+ face2 = face/255
122
+ pred = model.predict(np.expand_dims(face2, axis=0))[0]
123
+ total+=1
124
+
125
+ pred2 = pred[1]
126
+
127
+ if pred2 > 0.5:
128
+ fake+=1
129
+ else:
130
+ real+=1
131
+
132
+ fake_ratio = fake/total
133
+
134
+ text =""
135
+ text2 = "Deepfakes Confidence: " + str(fake_ratio*100) + "%"
136
+
137
+ if fake_ratio >= 0.5:
138
+ text = "The video is FAKE."
139
+ else:
140
+ text = "The video is REAL."
141
+
142
+ face_frames = []
143
+
144
+ for face in faces:
145
+ face_frame = Image.fromarray(face.astype('uint8'), 'RGB')
146
+ face_frames.append(face_frame)
147
+
148
+ face_frames[0].save('results.gif', save_all=True, append_images=face_frames[1:], duration = 250, loop = 100 )
149
+ clip = mp.VideoFileClip("results.gif")
150
+ clip.write_videofile("video.mp4")
151
+
152
+ return text, text2, "video.mp4"
153
+
154
+
155
+
156
+ title="EfficientNetV2 Deepfakes Video Detector"
157
+ description="This is a demo implementation of EfficientNetV2 Deepfakes Image Detector by using frame-by-frame detection. \
158
+ To use it, simply upload your video, or click one of the examples to load them.\
159
+ This demo and model represent the Final Year Project titled \"Achieving Face Swapped Deepfakes Detection Using EfficientNetV2\" by a CS undergraduate Lee Sheng Yeh. \
160
+ The examples were extracted from Celeb-DF(V2)(Li et al, 2020) and FaceForensics++(Rossler et al., 2019). Full reference details is available in \"references.txt.\" \
161
+ The examples are used under fair use to demo the working of the model only. If any copyright is infringed, please contact the researcher via this email: [email protected].\
162
+ "
163
+
164
+ examples = [
165
+ ['./EfficientNetV2_Deepfakes_Video_Detector/Video1-fake-1-ff.mp4'],
166
+ ['./EfficientNetV2_Deepfakes_Video_Detector/Video6-real-1-ff.mp4'],
167
+ ['./EfficientNetV2_Deepfakes_Video_Detector/Video3-fake-3-ff.mp4'],
168
+ ['./EfficientNetV2_Deepfakes_Video_Detector/Video8-real-3-ff.mp4'],
169
+ ['./EfficientNetV2_Deepfakes_Video_Detector/real-1.mp4'],
170
+ ['./EfficientNetV2_Deepfakes_Video_Detector/fake-1.mp4'],
171
+ ]
172
+
173
+ gr.Interface(deepfakespredict,
174
+ inputs = ["video"],
175
+ outputs=["text","text", gr.outputs.Video(label="Detected face sequence")],
176
+ title=title,
177
+ description=description,
178
+ examples=examples
179
+ ).launch()