| import os |
| import cv2 |
| import torch |
| import zipfile |
| import librosa |
| import numpy as np |
| import tensorflow as tf |
| from facenet_pytorch import MTCNN |
| from rawnet import RawNet |
|
|
| tf.random.set_seed(42) |
|
|
| if not os.path.exists("efficientnet-b0"): |
| local_zip = "./efficientnet-b0.zip" |
| if os.path.exists(local_zip): |
| zip_ref = zipfile.ZipFile(local_zip, 'r') |
| zip_ref.extractall() |
| zip_ref.close() |
| print("Model extracted successfully!") |
|
|
| model = tf.keras.models.load_model("efficientnet-b0/", compile=False) |
|
|
| class DetectionPipeline: |
| def __init__(self, n_frames=None, batch_size=60, resize=None, input_modality='video'): |
| self.n_frames = n_frames |
| self.batch_size = batch_size |
| self.resize = resize |
| self.input_modality = input_modality |
|
|
| def __call__(self, filename): |
| if self.input_modality == 'video': |
| v_cap = cv2.VideoCapture(filename) |
| v_len = int(v_cap.get(cv2.CAP_PROP_FRAME_COUNT)) |
|
|
| sample = np.arange(0, v_len) if self.n_frames is None \ |
| else 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]: |
| face2 = cv2.resize(frame, (224, 224)) |
| faces.append(face2) |
|
|
| v_cap.release() |
| return faces |
|
|
| elif self.input_modality == 'image': |
| image = cv2.cvtColor(filename, cv2.COLOR_BGR2RGB) |
| image = cv2.resize(image, (224, 224)) |
| return image |
|
|
| elif self.input_modality == 'audio': |
| x, sr = librosa.load(filename) |
| x_pt = torch.Tensor(x) |
| x_pt = torch.unsqueeze(x_pt, dim=0) |
| return x_pt |
|
|
| else: |
| raise ValueError("Invalid modality") |
|
|
| detection_video_pipeline = DetectionPipeline(n_frames=5, batch_size=1, input_modality='video') |
| detection_image_pipeline = DetectionPipeline(batch_size=1, input_modality='image') |
|
|
| def deepfakes_video_predict(input_video): |
| faces = detection_video_pipeline(input_video) |
|
|
| real_res, fake_res = [], [] |
|
|
| for face in faces: |
| face2 = face / 255 |
| pred = model.predict(np.expand_dims(face2, axis=0))[0] |
| real, fake = pred[0], pred[1] |
| real_res.append(real) |
| fake_res.append(fake) |
|
|
| real_mean = np.mean(real_res) |
| fake_mean = np.mean(fake_res) |
|
|
| if real_mean >= 0.5: |
| return "The video is REAL. Confidence: " + str(round(100 - real_mean*100, 3)) + "%" |
| else: |
| return "The video is FAKE. Confidence: " + str(round(fake_mean*100, 3)) + "%" |
|
|
| def deepfakes_image_predict(input_image): |
| face = detection_image_pipeline(input_image) |
| face2 = face / 255 |
|
|
| pred = model.predict(np.expand_dims(face2, axis=0))[0] |
| real, fake = pred[0], pred[1] |
|
|
| if real > 0.5: |
| return "The image is REAL." |
| else: |
| return "The image is FAKE." |
|
|