Spaces:
Sleeping
Sleeping
File size: 2,802 Bytes
6d0cf13 086e367 f6ee5ca 42ce81c 6d0cf13 debb82a 6d0cf13 f6ee5ca 086e367 6d0cf13 f6ee5ca 6d0cf13 a540a43 debb82a 42ce81c 086e367 42ce81c 086e367 f6ee5ca 6d0cf13 f6ee5ca 42ce81c 086e367 42ce81c 6d0cf13 a540a43 6d0cf13 bbe970a 6d0cf13 bbe970a 6d0cf13 bbe970a debb82a 61cca59 bbe970a debb82a 6d0cf13 debb82a 6d0cf13 a540a43 6d0cf13 a540a43 6d0cf13 a540a43 61cca59 |
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 |
import gradio as gr
import torch
import numpy as np
import cv2
import matplotlib.pyplot as plt
from PIL import Image
from transformers import AutoImageProcessor, SiglipForImageClassification
# β
Load model from Hugging Face (no manual files)
model_name = "prithivMLmods/deepfake-detector-model-v1"
processor = AutoImageProcessor.from_pretrained(model_name)
model = SiglipForImageClassification.from_pretrained(model_name)
model.eval()
# β
Haar cascade for face detection
face_detector = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
# β
Deepfake analysis logic
def detect_deepfake(video_path):
if video_path is None:
return "β Please upload a valid .mp4 video", None
cap = cv2.VideoCapture(video_path)
preds = []
count = 0
max_frames = 20
while True:
ret, frame = cap.read()
if not ret or count >= max_frames:
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_detector.detectMultiScale(gray, 1.1, 4)
if len(faces) > 0:
x, y, w, h = faces[0] # Take first detected face
face = frame[y:y+h, x:x+w]
if face.size == 0:
continue
face_rgb = cv2.cvtColor(face, cv2.COLOR_BGR2RGB)
pil_img = Image.fromarray(face_rgb)
inputs = processor(images=pil_img, return_tensors="pt")
with torch.no_grad():
logits = model(**inputs).logits
prob = torch.softmax(logits, dim=-1)[0][1].item()
preds.append(prob)
count += 1
cap.release()
if not preds:
return "β No faces detected. Try a clearer video.", None
avg_conf = np.mean(preds)
label = "**FAKE**" if avg_conf > 0.5 else "**REAL**"
result = f"""
π― **Result:** {label}
π’ Avg Confidence: {avg_conf:.2f}
π Frames Analyzed: {len(preds)}
"""
# β
Create histogram
fig, ax = plt.subplots()
ax.hist(preds, bins=10, color="red" if avg_conf > 0.5 else "green", edgecolor="black")
ax.set_title("Fake Confidence per Frame")
ax.set_xlabel("Fake Probability (0 = Real, 1 = Fake)")
ax.set_ylabel("Frames")
ax.grid(True)
return result, fig
# β
Gradio interface
with gr.Blocks() as demo:
gr.Markdown("## π Deepfake Detector (Transformer-based)")
gr.Markdown("Upload a short `.mp4` video. The app will detect faces and classify the video as **REAL** or **FAKE**.")
video_input = gr.Video(label="π€ Upload your video")
result_output = gr.Markdown()
graph_output = gr.Plot()
analyze_button = gr.Button("π Analyze")
analyze_button.click(fn=detect_deepfake, inputs=video_input, outputs=[result_output, graph_output])
demo.queue().launch()
|