File size: 1,242 Bytes
2b2808e
dbe3f97
b636403
dbe3f97
2b2808e
b636403
2b2808e
b636403
2b2808e
 
 
 
b636403
fa3b1cb
2b2808e
 
 
 
 
dbe3f97
2b2808e
dbe3f97
 
b636403
dbe3f97
 
 
 
 
2b2808e
 
 
 
 
dbe3f97
 
 
 
2b2808e
b636403
2b2808e
 
dbe3f97
2b2808e
dbe3f97
2b2808e
 
 
 
 
 
dbe3f97
 
2b2808e
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
import gradio as gr
import torch
import cv2
import numpy as np
from model import GenConViT

device = "cuda" if torch.cuda.is_available() else "cpu"

# Load model
model = GenConViT().to(device)
state = torch.load("genconvit_ed_inference.pth", map_location=device)
model.load_state_dict(state)
model.eval()

def preprocess(frame):
    frame = cv2.resize(frame, (224, 224))
    frame = frame[:, :, ::-1] / 255.0
    frame = torch.tensor(frame, dtype=torch.float32).permute(2, 0, 1)
    return frame.unsqueeze(0)

def predict(video):
    cap = cv2.VideoCapture(video)
    scores = []

    while True:
        ret, frame = cap.read()
        if not ret:
            break

        inp = preprocess(frame).to(device)
        with torch.no_grad():
            pred = model(inp)
            prob = torch.softmax(pred, dim=1)[0, 1].item()
            scores.append(prob)

    cap.release()

    if len(scores) == 0:
        return "No frames detected."

    deepfake_prob = float(np.mean(scores))
    label = "Deepfake" if deepfake_prob > 0.5 else "Real"

    return f"{label} (score: {deepfake_prob:.4f})"

# UI
demo = gr.Interface(
    fn=predict,
    inputs=gr.Video(),
    outputs="text",
    title="GenConViT Deepfake Detector",
)

demo.launch()