videoclassifier / app.py
Rujit's picture
Upload 3 files
782a5b8 verified
import gradio as gr
import numpy as np
import cv2
import onnxruntime as ort
# Load ONNX model
session = ort.InferenceSession("model.onnx", providers=["CPUExecutionProvider"])
def preprocess_video(video_path):
cap = cv2.VideoCapture(video_path)
frames = []
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
# Sample 16 frames uniformly
indices = np.linspace(0, total_frames - 1, 16).astype(int)
for idx in indices:
cap.set(cv2.CAP_PROP_POS_FRAMES, idx)
ret, frame = cap.read()
if not ret:
continue
frame = cv2.resize(frame, (224, 224))
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
frame = frame / 255.0
frames.append(frame)
cap.release()
# Pad if less than 16 frames
while len(frames) < 16:
frames.append(frames[-1])
frames = np.array(frames, dtype=np.float32)
frames = np.transpose(frames, (0, 3, 1, 2)) # (16, H, W, C) → (16, C, H, W)
frames = np.expand_dims(frames, axis=0) # → (1, 16, C, H, W)
return frames
def softmax(x):
e_x = np.exp(x - np.max(x))
return e_x / e_x.sum()
def predict(video):
if video is None:
return "No video uploaded.", "N/A"
input_data = preprocess_video(video)
outputs = session.run(None, {"input": input_data})
logits = outputs[0]
probs = softmax(logits[0])
label = "REAL" if probs[1] > probs[0] else "FAKE"
confidence = f"REAL: {probs[0]:.2%} | FAKE: {probs[1]:.2%}"
return label, confidence
interface = gr.Interface(
fn=predict,
inputs=gr.Video(label="Upload Video"),
outputs=[
gr.Textbox(label="Prediction"),
gr.Textbox(label="Confidence Scores")
],
title="AI Generated Video Detector",
description="Upload a video to classify it as REAL or FAKE."
)
interface.launch()