| from flask import Flask, render_template, request, redirect, url_for |
| import gradio as gr |
| import cv2 |
| import numpy as np |
| import tensorflow as tf |
| from facenet_pytorch import MTCNN |
| import moviepy.editor as mp |
| from PIL import Image |
| import os |
| import zipfile |
| import json |
| import base64 |
| from tensorflow_addons.optimizers import RectifiedAdam |
| from keras.utils import get_custom_objects |
| get_custom_objects().update({"RectifiedAdam": RectifiedAdam}) |
|
|
| app = Flask(__name__) |
|
|
| |
| mtcnn = MTCNN(margin=14, keep_all=True, factor=0.7, device='cpu') |
|
|
| |
| class DetectionPipeline: |
| def __init__(self, detector, n_frames=None, batch_size=60, resize=None): |
| self.detector = detector |
| self.n_frames = n_frames |
| self.batch_size = batch_size |
| self.resize = resize |
|
|
| def __call__(self, filename): |
| v_cap = cv2.VideoCapture(filename) |
| v_len = int(v_cap.get(cv2.CAP_PROP_FRAME_COUNT)) |
|
|
| if self.n_frames is None: |
| sample = np.arange(0, v_len) |
| else: |
| sample = np.linspace(0, v_len - 1, self.n_frames).astype(int) |
|
|
| faces = [] |
| frames = [] |
|
|
| for j in range(v_len): |
| success = v_cap.grab() |
| if j in sample: |
| success, frame = v_cap.retrieve() |
| if not success: |
| continue |
| frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) |
|
|
| if self.resize is not None: |
| frame = frame.resize([int(d * self.resize) for d in frame.size]) |
|
|
| frames.append(frame) |
|
|
| if len(frames) % self.batch_size == 0 or j == sample[-1]: |
| boxes, probs = self.detector.detect(frames) |
|
|
| for i in range(len(frames)): |
| if boxes[i] is None: |
| faces.append(face2) |
| continue |
|
|
| box = boxes[i][0].astype(int) |
| frame = frames[i] |
| face = frame[box[1]:box[3], box[0]:box[2]] |
|
|
| if not face.any(): |
| faces.append(face2) |
| continue |
|
|
| face2 = cv2.resize(face, (224, 224)) |
| faces.append(face2) |
|
|
| frames = [] |
|
|
| v_cap.release() |
|
|
| return faces |
|
|
| detection_pipeline = DetectionPipeline(detector=mtcnn, n_frames=20, batch_size=60) |
|
|
| model = tf.keras.models.load_model("./Detecto-DeepFake_Video_Detector/p1") |
|
|
| def deepfakespredict(input_video): |
| faces = detection_pipeline(input_video) |
| total = 0 |
| real = 0 |
| fake = 0 |
|
|
| for face in faces: |
| face2 = face / 255 |
| pred = model.predict(np.expand_dims(face2, axis=0))[0] |
| total += 1 |
| pred2 = pred[1] |
|
|
| if pred2 > 0.5: |
| fake += 1 |
| else: |
| real += 1 |
|
|
| fake_ratio = fake / total |
| text = "" |
| text2 = f"Deepfakes Confidence: {fake_ratio * 100:.2f}%" |
|
|
| if fake_ratio >= 0.5: |
| text = "The video is FAKE." |
| else: |
| text = "The video is REAL." |
|
|
| face_frames = [] |
| |
| for face in faces: |
| face_frame = Image.fromarray(face.astype('uint8'), 'RGB') |
| face_frames.append(face_frame) |
| |
| face_frames[0].save('results.gif', save_all=True, append_images=face_frames[1:], duration=250, loop=100) |
| clip = mp.VideoFileClip("results.gif") |
| clip.write_videofile("video.mp4") |
|
|
| return text, text2, "video.mp4" |
|
|
| iface = gr.Interface( |
| fn=deepfakespredict, |
| inputs=gr.inputs.Video(type="mp4"), |
| outputs=[ |
| gr.outputs.Text(label="Detection Result"), |
| gr.outputs.Text(label="Confidence"), |
| gr.outputs.File(label="Result Video") |
| ], |
| live=True, |
| title="EfficientNetV2 Deepfakes Video Detector", |
| description="This is a demo implementation of EfficientNetV2 Deepfakes Image Detector ", |
| examples=[ |
| [open('./Detecto-DeepFake_Video_Detector/Video1-fake-1-ff.mp4', 'rb')], |
| [open('./Detecto-DeepFake_Video_Detector/Video6-real-1-ff.mp4', 'rb')], |
| [open('./Detecto-DeepFake_Video_Detector/Video3-fake-3-ff.mp4', 'rb')], |
| [open('./Detecto-DeepFake_Video_Detector/Video8-real-3-ff.mp4', 'rb')], |
| [open('./Detecto-DeepFake_Video_Detector/real-1.mp4', 'rb')], |
| [open('./Detecto-DeepFake_Video_Detector/fake-1.mp4', 'rb')] |
| ] |
| ) |
|
|
| @app.route('/') |
| def index(): |
| iface.launch(share=True) |
| return iface.ui() |
|
|
| if __name__ == '__main__': |
| app.run(debug=True) |
|
|