dhairyashah commited on
Commit
44d6ec1
1 Parent(s): 7bfeab3
Files changed (1) hide show
  1. app.py +1 -177
app.py CHANGED
@@ -1,179 +1,3 @@
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: tp054565@mail.apu.edu.my.\
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()
 
1
  import gradio as gr
 
 
 
 
2
 
3
+ gr.load("models/DaMsTaR/Detecto-DeepFake_Video_Detector").launch()