DaMsTaR commited on
Commit
0f69c91
1 Parent(s): d4f183b

Upload 10 files

Browse files
.gitattributes CHANGED
@@ -1,35 +1,33 @@
1
  *.7z filter=lfs diff=lfs merge=lfs -text
2
  *.arrow filter=lfs diff=lfs merge=lfs -text
3
  *.bin filter=lfs diff=lfs merge=lfs -text
 
4
  *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
  *.ftz filter=lfs diff=lfs merge=lfs -text
7
  *.gz filter=lfs diff=lfs merge=lfs -text
8
  *.h5 filter=lfs diff=lfs merge=lfs -text
9
  *.joblib filter=lfs diff=lfs merge=lfs -text
10
  *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
  *.model filter=lfs diff=lfs merge=lfs -text
13
  *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
  *.onnx filter=lfs diff=lfs merge=lfs -text
17
  *.ot filter=lfs diff=lfs merge=lfs -text
18
  *.parquet filter=lfs diff=lfs merge=lfs -text
19
  *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
  *.pt filter=lfs diff=lfs merge=lfs -text
23
  *.pth filter=lfs diff=lfs merge=lfs -text
24
  *.rar filter=lfs diff=lfs merge=lfs -text
25
- *.safetensors filter=lfs diff=lfs merge=lfs -text
26
  saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
  *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
  *.tflite filter=lfs diff=lfs merge=lfs -text
30
  *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
  *.xz 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
 
 
 
 
 
 
 
1
  *.7z filter=lfs diff=lfs merge=lfs -text
2
  *.arrow filter=lfs diff=lfs merge=lfs -text
3
  *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bin.* filter=lfs diff=lfs merge=lfs -text
5
  *.bz2 filter=lfs diff=lfs merge=lfs -text
 
6
  *.ftz filter=lfs diff=lfs merge=lfs -text
7
  *.gz filter=lfs diff=lfs merge=lfs -text
8
  *.h5 filter=lfs diff=lfs merge=lfs -text
9
  *.joblib filter=lfs diff=lfs merge=lfs -text
10
  *.lfs.* filter=lfs diff=lfs merge=lfs -text
 
11
  *.model filter=lfs diff=lfs merge=lfs -text
12
  *.msgpack filter=lfs diff=lfs merge=lfs -text
 
 
13
  *.onnx filter=lfs diff=lfs merge=lfs -text
14
  *.ot filter=lfs diff=lfs merge=lfs -text
15
  *.parquet filter=lfs diff=lfs merge=lfs -text
16
  *.pb filter=lfs diff=lfs merge=lfs -text
 
 
17
  *.pt filter=lfs diff=lfs merge=lfs -text
18
  *.pth filter=lfs diff=lfs merge=lfs -text
19
  *.rar filter=lfs diff=lfs merge=lfs -text
 
20
  saved_model/**/* filter=lfs diff=lfs merge=lfs -text
21
  *.tar.* filter=lfs diff=lfs merge=lfs -text
 
22
  *.tflite filter=lfs diff=lfs merge=lfs -text
23
  *.tgz filter=lfs diff=lfs merge=lfs -text
 
24
  *.xz filter=lfs diff=lfs merge=lfs -text
25
  *.zip filter=lfs diff=lfs merge=lfs -text
26
+ *.zstandard filter=lfs diff=lfs merge=lfs -text
27
  *tfevents* filter=lfs diff=lfs merge=lfs -text
28
+ fake-1.mp4 filter=lfs diff=lfs merge=lfs -text
29
+ real-1.mp4 filter=lfs diff=lfs merge=lfs -text
30
+ Video1-fake-1-ff.mp4 filter=lfs diff=lfs merge=lfs -text
31
+ Video3-fake-3-ff.mp4 filter=lfs diff=lfs merge=lfs -text
32
+ Video6-real-1-ff.mp4 filter=lfs diff=lfs merge=lfs -text
33
+ Video8-real-3-ff.mp4 filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -1,3 +1,37 @@
1
  ---
2
- license: mit
 
 
 
 
 
 
3
  ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: Deepfakes_Video_Detector
3
+ emoji: 🔥
4
+ colorFrom: blue
5
+ colorTo: gray
6
+ sdk: gradio
7
+ app_file: app.py
8
+ pinned: false
9
  ---
10
+
11
+ # Configuration
12
+
13
+ `title`: _string_
14
+ Display title for the Space
15
+
16
+ `emoji`: _string_
17
+ Space emoji (emoji-only character allowed)
18
+
19
+ `colorFrom`: _string_
20
+ Color for Thumbnail gradient (red, yellow, green, blue, indigo, purple, pink, gray)
21
+
22
+ `colorTo`: _string_
23
+ Color for Thumbnail gradient (red, yellow, green, blue, indigo, purple, pink, gray)
24
+
25
+ `sdk`: _string_
26
+ Can be either `gradio`, `streamlit`, or `static`
27
+
28
+ `sdk_version` : _string_
29
+ Only applicable for `streamlit` SDK.
30
+ See [doc](https://hf.co/docs/hub/spaces) for more info on supported versions.
31
+
32
+ `app_file`: _string_
33
+ Path to your main application file (which contains either `gradio` or `streamlit` Python code, or `static` html code).
34
+ Path is relative to the root of the repository.
35
+
36
+ `pinned`: _boolean_
37
+ Whether the Space stays on top of your list.
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("./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()
fake-1.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:14d58b019d1d2a2be3c8293654b00a5fe7c3912267885eb8a9d42cfde411f91f
3
+ size 1142692
packages.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ ffmpeg
2
+ libsm6
3
+ libxext6
real-1.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c80effbdbdf7ea5b6b2fab02fa8d4b5dde64aef46c91d6c6911a01e6d03673a4
3
+ size 1152146