Spaces:
Sleeping
Sleeping
| import torch # type: ignore | |
| import cv2 # type: ignore | |
| from transformers import VideoMAEForVideoClassification, VideoMAEImageProcessor | |
| import numpy as np # type: ignore | |
| # Set device to GPU if available | |
| device = torch.device("cuda" if torch.cuda.is_available() else "cpu") | |
| print("Using device:", device) | |
| # Load model and processor | |
| model = VideoMAEForVideoClassification.from_pretrained("OPear/videomae-large-finetuned-UCF-Crime") | |
| processor = VideoMAEImageProcessor.from_pretrained("OPear/videomae-large-finetuned-UCF-Crime") | |
| model = model.to(device) | |
| model.eval() | |
| # Load frames from video | |
| def load_video(path, max_frames=16, sample_every_n_frames=4): | |
| cap = cv2.VideoCapture(path) | |
| frames = [] | |
| frame_count = 0 | |
| while len(frames) < max_frames: | |
| ret, frame = cap.read() | |
| if not ret: | |
| break | |
| if frame_count % sample_every_n_frames == 0: | |
| frame = cv2.resize(frame, (224, 224)) | |
| frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) | |
| frames.append(frame) | |
| frame_count += 1 | |
| cap.release() | |
| return frames | |
| # Classify video | |
| def classify_video(path): | |
| video = load_video(path) | |
| if len(video) == 0: | |
| return "Error: No frames extracted from video." | |
| inputs = processor(video, return_tensors="pt") | |
| inputs = {k: v.to(device) for k, v in inputs.items()} | |
| with torch.no_grad(): | |
| outputs = model(**inputs) | |
| predicted_class = outputs.logits.argmax().item() | |
| label = model.config.id2label[predicted_class] | |
| return label | |
| # Classify video | |
| def classify_video_from_path(video_path): | |
| result = classify_video(video_path) | |
| return result |