thugCodeNinja commited on
Commit
f518cc5
1 Parent(s): 822d441

Upload 18 files

Browse files
.gitattributes CHANGED
@@ -33,3 +33,11 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ flagged/input_video/3dacc7dca77eb69d6b8c/Very[[:space:]]realistic[[:space:]]Tom[[:space:]]Cruise[[:space:]]Deepfake[[:space:]]_[[:space:]]AI[[:space:]]Tom[[:space:]]Cruise.mp4 filter=lfs diff=lfs merge=lfs -text
37
+ flagged/input_video/c6ffc5c263d26faa4e39/Its[[:space:]]Getting[[:space:]]Harder[[:space:]]to[[:space:]]Spot[[:space:]]a[[:space:]]Deep[[:space:]]Fake[[:space:]]Video.mp4 filter=lfs diff=lfs merge=lfs -text
38
+ flagged/input_video/cdab5533b813e8658e12/videoplayback.mp4 filter=lfs diff=lfs merge=lfs -text
39
+ p1/variables/variables.data-00000-of-00001 filter=lfs diff=lfs merge=lfs -text
40
+ Video1-fake-1-ff.mp4 filter=lfs diff=lfs merge=lfs -text
41
+ Video3-fake-3-ff.mp4 filter=lfs diff=lfs merge=lfs -text
42
+ Video6-real-1-ff.mp4 filter=lfs diff=lfs merge=lfs -text
43
+ Video8-real-3-ff.mp4 filter=lfs diff=lfs merge=lfs -text
Video1-fake-1-ff.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:58262ed5e804069587e393ed06b48e655ca35d7ad58b68c161f5356a14482c48
3
+ size 1746578
Video3-fake-3-ff.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4e9ef4e65483c4152f477803fb083be53ec9311e4006abaacbf9647bf3ae0fa5
3
+ size 9101725
Video6-real-1-ff.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ad4e54db5f1b0c2f556e039d61ec38e7195edbba6257e266244be64af0bda5e3
3
+ size 1771036
Video8-real-3-ff.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:719f49698458abfa2ff25eb617ff03c5e56ddea51d912d65fbfa44c3db94768a
3
+ size 8949516
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("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
+ ['Video1-fake-1-ff.mp4'],
166
+ ['Video6-real-1-ff.mp4'],
167
+ ['Video3-fake-3-ff.mp4'],
168
+ ['Video8-real-3-ff.mp4'],
169
+ ['real-1.mp4'],
170
+ ['fake-1.mp4'],
171
+ ]
172
+
173
+ gr.Interface(deepfakespredict,
174
+ inputs = ["video"],
175
+ outputs=["text","text", gr.Video(label="Detected face sequence")],
176
+ title=title,
177
+ description=description,
178
+ examples=examples
179
+ ).launch()
fake-1.mp4 ADDED
Binary file (622 kB). View file
 
flagged/Detected face sequence/9d4f5a8148dcb75eb98c/video.mp4 ADDED
Binary file (55.1 kB). View file
 
flagged/Detected face sequence/e1d0bd2394b4066789c8/video.mp4 ADDED
Binary file (43.8 kB). View file
 
flagged/input_video/3dacc7dca77eb69d6b8c/Very realistic Tom Cruise Deepfake _ AI Tom Cruise.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c688e96ad9cb5014e70c8774c47383dee2b76bfa983211d7008486ebea69cb11
3
+ size 5928060
flagged/input_video/c6ffc5c263d26faa4e39/Its Getting Harder to Spot a Deep Fake Video.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:01a8ff60ae52b1a32f8deb99438682e96ee330b7696ce2d859118eda046a9b0d
3
+ size 8339801
flagged/input_video/cdab5533b813e8658e12/videoplayback.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:514cc89f84ffa5f3b1929bd1849c47e24bd6e90b2cbd6dad63f4e43f91f6dddf
3
+ size 2109824
flagged/log.csv ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ input_video,output 0,output 1,Detected face sequence,flag,username,timestamp
2
+ "{""video"":{""path"":""flagged\\input_video\\c6ffc5c263d26faa4e39\\Its Getting Harder to Spot a Deep Fake Video.mp4"",""url"":""http://127.0.0.1:7860/file=C:\\Users\\india\\AppData\\Local\\Temp\\gradio\\93abb9f164d75db26c210a7173796d26aab0df0a\\Its Getting Harder to Spot a Deep Fake Video.mp4"",""size"":8339801,""orig_name"":""It’s Getting Harder to Spot a Deep Fake Video.mp4"",""mime_type"":""""},""subtitles"":null}",,,,,,2024-01-22 13:30:49.903650
3
+ "{""video"":{""path"":""flagged\\input_video\\cdab5533b813e8658e12\\videoplayback.mp4"",""url"":""http://127.0.0.1:7860/file=C:\\Users\\india\\AppData\\Local\\Temp\\gradio\\a4326faead875e158915711b82b8d3ff427ce822\\videoplayback.mp4"",""size"":2109824,""orig_name"":""videoplayback.mp4"",""mime_type"":""""},""subtitles"":null}",The video is REAL.,Deepfakes Confidence: 10.0%,"{""video"":{""path"":""flagged\\Detected face sequence\\e1d0bd2394b4066789c8\\video.mp4"",""url"":null,""size"":null,""orig_name"":""video.mp4"",""mime_type"":null},""subtitles"":null}",,,2024-01-22 13:34:58.760403
4
+ "{""video"":{""path"":""flagged\\input_video\\3dacc7dca77eb69d6b8c\\Very realistic Tom Cruise Deepfake _ AI Tom Cruise.mp4"",""url"":""http://127.0.0.1:7860/file=C:\\Users\\india\\AppData\\Local\\Temp\\gradio\\70b191e40d8cbe0c5d3fbac563ff868c0c61cac3\\Very realistic Tom Cruise Deepfake _ AI Tom Cruise.mp4"",""size"":5928060,""orig_name"":""Very realistic Tom Cruise Deepfake _ AI Tom Cruise.mp4"",""mime_type"":""""},""subtitles"":null}",The video is REAL.,Deepfakes Confidence: 10.0%,"{""video"":{""path"":""flagged\\Detected face sequence\\9d4f5a8148dcb75eb98c\\video.mp4"",""url"":null,""size"":null,""orig_name"":""video.mp4"",""mime_type"":null},""subtitles"":null}",,,2024-01-22 13:37:55.028842
p1/keras_metadata.pb ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8411f85bd22de246fee31adc6bbf0a60d403ac22d8f572154fd77eb866b8daf3
3
+ size 202114
p1/saved_model.pb ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ca17aff86eeedbeab2ace0fc42296a1fe11352c6adb418f04f96c5a3607bd28a
3
+ size 10505251
p1/variables/variables.data-00000-of-00001 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6418ccca9c8b62339ccfae9e5e3aae785fbdeed31fa08af7207ad4f0fc94fbbf
3
+ size 23824720
p1/variables/variables.index ADDED
Binary file (21.2 kB). View file
 
real-1.mp4 ADDED
Binary file (631 kB). View file
 
video.mp4 ADDED
Binary file (43.9 kB). View file