Spaces:
Build error
Build error
| import gradio as gr | |
| import torch | |
| import numpy as np | |
| import cv2 | |
| from PIL import Image | |
| from transformers import AutoImageProcessor, AutoModelForVideoClassification, ViTForImageClassification | |
| video_processor = AutoImageProcessor.from_pretrained("facebook/timesformer-base-finetuned-k400") | |
| video_model = AutoModelForVideoClassification.from_pretrained("facebook/timesformer-base-finetuned-k400") | |
| image_processor = AutoImageProcessor.from_pretrained("google/vit-base-patch16-224") | |
| image_model = ViTForImageClassification.from_pretrained("google/vit-base-patch16-224") | |
| def extract_frames(video_path, num_frames=8): | |
| cap = cv2.VideoCapture(video_path) | |
| total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) | |
| frames = [] | |
| if total_frames == 0: | |
| return frames | |
| frame_indices = np.linspace(0, total_frames - 1, num_frames).astype(int) | |
| for idx in frame_indices: | |
| cap.set(cv2.CAP_PROP_POS_FRAMES, idx) | |
| ret, frame = cap.read() | |
| if not ret: | |
| break | |
| frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) | |
| frame = cv2.resize(frame, (224, 224)) | |
| frames.append(frame) | |
| cap.release() | |
| return frames | |
| def format_top_predictions(logits, labels, top_k=3): | |
| probs = torch.nn.functional.softmax(logits, dim=-1)[0] | |
| top_probs, top_idxs = torch.topk(probs, k=top_k) | |
| results = [] | |
| for prob, idx in zip(top_probs, top_idxs): | |
| results.append(f"{labels[idx.item()]} ({prob.item():.2f})") | |
| return results | |
| def predict(file): | |
| if file is None: | |
| return "Please upload an image or video file.", None | |
| file_path = file.name | |
| video_exts = [".mp4", ".avi", ".mov", ".mkv"] | |
| try: | |
| if any(file_path.lower().endswith(ext) for ext in video_exts): | |
| frames = extract_frames(file_path) | |
| if len(frames) == 0: | |
| return "Failed to extract frames from video.", None | |
| inputs = video_processor(frames, return_tensors="pt") | |
| with torch.no_grad(): | |
| outputs = video_model(**inputs) | |
| logits = outputs.logits | |
| labels = video_model.config.id2label | |
| top_preds = format_top_predictions(logits, labels, top_k=3) | |
| top_confidence = float(torch.nn.functional.softmax(logits, dim=-1)[0].max()) | |
| if top_confidence < 0.5: | |
| pred_text = "Uncertain prediction: " + ", ".join(top_preds) | |
| else: | |
| pred_text = "Top Video Predictions: " + ", ".join(top_preds) | |
| return pred_text, file_path | |
| else: | |
| image = Image.open(file_path).convert("RGB") | |
| inputs = image_processor(images=image, return_tensors="pt") | |
| with torch.no_grad(): | |
| outputs = image_model(**inputs) | |
| logits = outputs.logits | |
| labels = image_model.config.id2label | |
| top_preds = format_top_predictions(logits, labels, top_k=3) | |
| top_confidence = float(torch.nn.functional.softmax(logits, dim=-1)[0].max()) | |
| if top_confidence < 0.5: | |
| pred_text = "Uncertain prediction: " + ", ".join(top_preds) | |
| else: | |
| pred_text = "Top Image Predictions: " + ", ".join(top_preds) | |
| return pred_text, None | |
| except Exception as e: | |
| return f"Error: {e}", None | |
| iface = gr.Interface( | |
| fn=predict, | |
| inputs=gr.File(file_types=[".mp4", ".avi", ".mov", ".mkv", ".jpg", ".jpeg", ".png"]), | |
| outputs=[gr.Textbox(label="Prediction"), gr.Video(label="Uploaded Video")], | |
| title="Image and Video Classification", | |
| description="Upload an image or video. Shows top 3 predictions with confidence and a confidence threshold.", | |
| live=False | |
| ) | |
| if __name__ == "__main__": | |
| iface.launch() | |