|
|
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) |
|
|
|