File size: 4,614 Bytes
f5a2b99 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
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 # Import the RectifiedAdam optimizer
from keras.utils import get_custom_objects # Use tensorflow.keras.utils instead
get_custom_objects().update({"RectifiedAdam": RectifiedAdam})
app = Flask(__name__)
# Load face detector
mtcnn = MTCNN(margin=14, keep_all=True, factor=0.7, device='cpu')
# DetectionPipeline class
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)
|