| import tensorflow as tf |
| import numpy as np |
| import cv2 |
| import os |
| import gradio as gr |
| from keras.models import load_model |
| from pytube import YouTube |
| import pickle |
|
|
|
|
| def load_video_from_url(youtube_url): |
| visible = True |
| try: |
| |
| yt = YouTube(youtube_url) |
| yt_stream = yt.streams.filter(file_extension='mp4').first() |
| title = yt_stream.title |
| src = yt_stream.download() |
| capture = cv2.VideoCapture(src) |
|
|
| |
| sampled_frames = sample_frames_from_video_file(capture) |
|
|
| |
| example_frames = [ |
| sampled_frames[len(sampled_frames) // 4], |
| sampled_frames[len(sampled_frames) // 2], |
| sampled_frames[3 * len(sampled_frames) // 4], |
| ] |
|
|
| |
| example_frames = swap_color_channels(example_frames) |
|
|
| |
| if os.path.exists(src): |
| os.remove(src) |
|
|
| |
| frames_tensor = tf.expand_dims(tf.convert_to_tensor(sampled_frames, dtype=tf.float32), axis=0) |
|
|
| |
| pickle.dump(frames_tensor, open("frames_tf.pkl", "wb")) |
|
|
| except Exception as e: |
| title = "Error while loading video: " + str(e) |
| visible = False |
| example_frames = [np.zeros((256, 256, 3)) for _ in range(3)] |
|
|
| |
| predVideoBtn = gr.Button(value="Classify Video", visible=visible) |
|
|
| predOutput = gr.Label( |
| label="DETECTED LABEL (AND CONFIDENCE LEVEL)", |
| num_top_classes=2, |
| visible=visible |
| ) |
|
|
| return title, example_frames, predVideoBtn, predOutput |
|
|
|
|
| def detect_deepfake(): |
| |
| frames_tf = pickle.load(open("frames_tf.pkl", "rb")) |
|
|
| |
| if os.path.exists("frames_tf.pkl"): |
| os.remove("frames_tf.pkl") |
|
|
| |
| loaded_model = load_model("MesonetRNN.keras") |
| |
|
|
| |
| out = loaded_model.predict(frames_tf) |
| real_confidence = out[0][0] |
| fake_confidence = 1 - real_confidence |
| confidence_dict = {"FAKE": fake_confidence, "REAL": real_confidence} |
|
|
| |
| flagBtn = gr.Button(value="Flag Output", visible=True) |
|
|
| |
| return confidence_dict, flagBtn |
|
|
|
|
| def sample_frames_from_video_file(capture, sample_count=10, frames_per_sample=10, frame_step=10, |
| output_size=(256, 256)): |
| |
| result = [] |
|
|
| video_length = capture.get(cv2.CAP_PROP_FRAME_COUNT) |
|
|
| need_length = 1 + (frames_per_sample - 1) * frame_step |
|
|
| max_start = video_length - need_length |
|
|
| sample_starts = [] |
|
|
| for sample in range(sample_count): |
| sample_start = int(max_start * sample / sample_count) |
| sample_starts.append(sample_start) |
| |
|
|
| for start in sample_starts: |
| capture.set(cv2.CAP_PROP_POS_FRAMES, start) |
| |
| ret, frame = capture.read() |
| result.append(format_frames(frame, output_size)) |
|
|
| for _ in range(frames_per_sample - 1): |
| for _ in range(frame_step): |
| ret, frame = capture.read() |
| if ret: |
| frame = format_frames(frame, output_size) |
| result.append(frame) |
| else: |
| result.append(np.zeros_like(result[0])) |
| capture.release() |
|
|
| return np.array(result) |
|
|
|
|
| def swap_color_channels(frames): |
| return [cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) for frame in frames] |
|
|
|
|
| def format_frames(frame, output_size): |
| frame = tf.image.convert_image_dtype(frame, tf.float32) |
| frame = tf.image.resize_with_pad(frame, *output_size) |
| return frame |
|
|