Spaces:
Sleeping
Sleeping
| import logging | |
| import os | |
| from pathlib import Path | |
| from typing import Tuple | |
| import numpy as np | |
| import cv2 | |
| import torch | |
| def validate_inputs(image_path: str, mask_path: str, motion_path: str) -> None: | |
| for p in [image_path, mask_path, motion_path]: | |
| if not Path(p).exists(): | |
| raise FileNotFoundError(f"Required file not found: {p}") | |
| def compute_hw_from_area( | |
| image_height: int, | |
| image_width: int, | |
| max_area: int, | |
| mod_value: int, | |
| ) -> Tuple[int, int]: | |
| """Compute (height, width) with same math and rounding as original.""" | |
| aspect_ratio = image_height / image_width | |
| height = round(np.sqrt(max_area * aspect_ratio)) // mod_value * mod_value | |
| width = round(np.sqrt(max_area / aspect_ratio)) // mod_value * mod_value | |
| return int(height), int(width) | |
| def load_video_to_tensor(video_path): | |
| """Returns a video tensor from a video file. shape [1, T, C, H, W], [0, 1] range.""" | |
| # load video | |
| cap = cv2.VideoCapture(video_path) | |
| frames = [] | |
| while 1: | |
| ret, frame = cap.read() | |
| if not ret: | |
| break | |
| frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) | |
| frames.append(frame) | |
| cap.release() | |
| # Convert frames to tensor, shape [T, H, W, C], [0, 1] range | |
| frames = np.array(frames) | |
| video_tensor = torch.tensor(frames) | |
| video_tensor = video_tensor.permute(0, 3, 1, 2).float() / 255.0 | |
| video_tensor = video_tensor.unsqueeze(0).permute(0, 2, 1, 3, 4) | |
| return video_tensor | |