Spaces:
Runtime error
Runtime error
| # Importing the requirements | |
| from PIL import Image | |
| from decord import VideoReader, cpu | |
| import re | |
| # Maximum number of frames to use | |
| MAX_NUM_FRAMES = 15 # If CUDA OOM, set a smaller number | |
| def parse_string(string, tags): | |
| """ | |
| Extracts the content between the specified HTML tags from the given string. | |
| Args: | |
| string (str): The input string to search for the tag content. | |
| tags (list): A list of HTML tags to search for. | |
| Returns: | |
| dict: A dictionary with tags as keys and lists of content as values. | |
| Example: | |
| >>> parse_string("<code>Hello, World!</code><note>Important</note>", ["code", "note"]) | |
| {'code': ['Hello, World!'], 'note': ['Important']} | |
| """ | |
| results = {} | |
| for tag in tags: | |
| pattern = rf"<{tag}>(.*?)</{tag}>" | |
| matches = re.findall(pattern, string, re.DOTALL) | |
| results[tag] = matches if matches else None | |
| return results | |
| def parse_annotations(annotations_list): | |
| """ | |
| Converts a list of annotations into a dictionary of key-value pairs. | |
| Args: | |
| annotations_list (list): A list of annotations in the format 'key: value'. | |
| Returns: | |
| dict: A dictionary with annotation keys and values. | |
| """ | |
| annotations_dict = {} | |
| for annotation in annotations_list: | |
| key, value = annotation.split(': ') | |
| annotations_dict[key] = int(value) | |
| return annotations_dict | |
| def encode_video(video_path): | |
| """ | |
| Encodes a video file into a list of frames. | |
| Args: | |
| video_path (str): The path to the video file. | |
| Returns: | |
| list: A list of frames, where each frame is represented as an Image object. | |
| """ | |
| def uniform_sample(l, n): | |
| """ | |
| Uniformly samples elements from a list. | |
| Args: | |
| - l (list): The input list. | |
| - n (int): The number of elements to sample. | |
| Returns: | |
| list: A list of sampled elements. | |
| """ | |
| gap = len(l) / n | |
| idxs = [int(i * gap + gap / 2) for i in range(n)] | |
| return [l[i] for i in idxs] | |
| # Read the video file and sample frames | |
| vr = VideoReader(video_path, ctx=cpu(0)) | |
| sample_fps = round(vr.get_avg_fps() / 1) # FPS | |
| frame_idx = [i for i in range(0, len(vr), sample_fps)] | |
| # Uniformly sample frames if the number of frames is too large | |
| if len(frame_idx) > MAX_NUM_FRAMES: | |
| frame_idx = uniform_sample(frame_idx, MAX_NUM_FRAMES) | |
| # Extract frames from the video | |
| frames = vr.get_batch(frame_idx).asnumpy() | |
| frames = [Image.fromarray(v.astype("uint8")) for v in frames] | |
| # Return video frames | |
| return frames | |