| import os |
| import glob |
| import cv2 |
|
|
| from tqdm import tqdm |
| from torchvision.transforms import ( |
| Compose, |
| Resize, |
| CenterCrop, |
| ToTensor, |
| Normalize, |
| InterpolationMode, |
| ) |
| from PIL import Image |
| import torch |
| import numpy as np |
| import pandas as pd |
|
|
|
|
| def convert_avi_to_mp4(input_path, output_path): |
| |
|
|
| |
| cap = cv2.VideoCapture(input_path) |
| if not cap.isOpened(): |
| raise IOError(f"Cannot open {input_path}") |
|
|
| fourcc = cv2.VideoWriter_fourcc(*"mp4v") |
| fps = cap.get(cv2.CAP_PROP_FPS) |
| width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) |
| height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) |
|
|
| out = cv2.VideoWriter(output_path, fourcc, fps, (width, height)) |
|
|
| while True: |
| ret, frame = cap.read() |
| if not ret: |
| break |
| out.write(frame) |
|
|
| cap.release() |
| out.release() |
|
|
|
|
| def create_images(video_path, output_dir): |
| if os.path.isdir(output_dir): |
| pass |
| else: |
| os.makedirs(output_dir, exist_ok=True) |
| cap = cv2.VideoCapture(video_path) |
| frame_idx = 0 |
|
|
| while cap.isOpened(): |
| ret, frame = cap.read() |
| if not ret: |
| break |
| frame_path = os.path.join(output_dir, f"{frame_idx:05d}.jpg") |
| cv2.imwrite(frame_path, frame) |
| frame_idx += 1 |
|
|
|
|
| def create_videos(video_path, output_dir): |
| |
| base_path = video_path |
| mp4_path = video_path.replace("/Data/", "/Video_data/") |
| if mp4_path.endswith(".avi") or mp4_path.endswith(".webm"): |
| mp4_path = mp4_path.rsplit(".", 1)[0] + ".mp4" |
| else: |
| mp4_path = mp4_path.replace(".mp4", ".mp4") |
|
|
| os.makedirs(output_dir, exist_ok=True) |
|
|
| if not os.path.exists(mp4_path): |
| |
| avi_path = video_path.replace(".mp4", ".avi") |
| if os.path.exists(avi_path): |
| convert_avi_to_mp4(avi_path, mp4_path) |
| else: |
| |
| webm_path = video_path.replace(".mp4", ".webm") |
| if os.path.exists(webm_path): |
| convert_avi_to_mp4(webm_path, mp4_path) |
| else: |
| raise FileNotFoundError( |
| f"Neither .avi nor .webm found for {video_path}" |
| ) |
|
|
|
|
| |
| def video2image(video_path, frame_rate=1.0, size=224): |
| def preprocess(size, n_px): |
| return Compose( |
| [ |
| Resize(size, interpolation=InterpolationMode.BICUBIC), |
| CenterCrop(size), |
| lambda image: image.convert("RGB"), |
| ToTensor(), |
| Normalize( |
| (0.48145466, 0.4578275, 0.40821073), |
| (0.26862954, 0.26130258, 0.27577711), |
| ), |
| ] |
| )(n_px) |
|
|
| cap = cv2.VideoCapture(video_path) |
| cap = cv2.VideoCapture(video_path, cv2.CAP_FFMPEG) |
| frameCount = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) |
| fps = int(cap.get(cv2.CAP_PROP_FPS)) |
| if fps < 1: |
| images = np.zeros([3, size, size], dtype=np.float32) |
| print("ERROR: problem reading video file: ", video_path) |
| else: |
| total_duration = (frameCount + fps - 1) // fps |
| start_sec, end_sec = 0, total_duration |
| interval = fps / frame_rate |
| frames_idx = np.floor(np.arange(start_sec * fps, end_sec * fps, interval)) |
| ret = True |
| images = np.zeros([len(frames_idx), 3, size, size], dtype=np.float32) |
|
|
| for i, idx in enumerate(frames_idx): |
| cap.set(cv2.CAP_PROP_POS_FRAMES, idx) |
| ret, frame = cap.read() |
| if not ret: |
| break |
| frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) |
| last_frame = i |
| images[i, :, :, :] = preprocess(size, Image.fromarray(frame).convert("RGB")) |
|
|
| images = images[: last_frame + 1] |
| cap.release() |
| video_frames = torch.tensor(images) |
| return video_frames |
|
|
|
|
| |
|
|
|
|
| def create_images_breakfast(gobal_path, start_end=15): |
| sub_dirs = sorted(glob.glob(gobal_path + "*/")) |
|
|
| def get_folder_name(local_path): |
| return local_path.split("/")[-2].replace("P", "") |
|
|
| part_dirs = [] |
|
|
| for i in sub_dirs: |
| if int(get_folder_name(i)) <= start_end: |
| part_dirs.append(i) |
|
|
| for i in tqdm(part_dirs, desc="Processing avi to images"): |
| video_dirs = sorted(glob.glob(i + "*/")) |
| for j in video_dirs: |
| avi_files = sorted(glob.glob(j + "*.avi")) |
| for k in avi_files: |
| output_dir = k.replace("/Data/", "/Image_data/").replace(".avi", "") |
| create_images(k, output_dir) |
|
|
|
|
| def create_videos_breakfast(gobal_path, start_end=15): |
| sub_dirs = sorted(glob.glob(gobal_path + "*/")) |
|
|
| def get_folder_name(local_path): |
| return local_path.split("/")[-2].replace("P", "") |
|
|
| part_dirs = [] |
|
|
| for i in sub_dirs: |
| if int(get_folder_name(i)) <= start_end: |
| part_dirs.append(i) |
|
|
| for i in tqdm(part_dirs, desc="Processing avi to mp4"): |
| video_dirs = sorted(glob.glob(i + "*/")) |
| for j in video_dirs: |
| avi_files = sorted(glob.glob(j + "*.avi")) |
| for k in avi_files: |
| output_dir = j.replace("/Data/", "/Video_data/") |
| create_videos(k, output_dir) |
|
|
|
|
| def create_images_ucf(global_path, files): |
|
|
| path_list = pd.read_csv(files, sep=" ", header=None) |
|
|
| for i in tqdm(path_list.values): |
| video_path = os.path.join(global_path, i[0]) |
| output_dir = video_path.replace("/Data/", "/Image_data/").replace(".avi", "") |
| create_images(video_path, output_dir) |
|
|
|
|
| def create_videos_ucf(global_path, files): |
| path_list = pd.read_csv(files, sep=" ", header=None) |
|
|
| for i in tqdm(path_list.values): |
| video_path = os.path.join(global_path, i[0]) |
| output_dir = os.path.dirname( |
| video_path.replace("/Data/", "/Video_data/").replace(".avi", "") |
| ) |
| create_videos(video_path, output_dir) |
|
|
|
|
| def create_images_hmdb(global_path, path_list): |
| for i in tqdm(path_list): |
| local_name = i.split("/")[1] |
| video_path = global_path + i |
| output_dir = ( |
| video_path.replace("/Data/", "/Image_data/") |
| .replace(".avi", "") |
| .replace("//", "/") |
| ) |
| video_path = global_path + local_name + i |
| create_images(video_path, output_dir) |
|
|
|
|
| def create_videos_hmdb(global_path, path_list): |
| for i in tqdm(path_list): |
| local_name = i.split("/")[1] |
| video_path = global_path + local_name + i |
| output_dir = ( |
| video_path.replace("/Data/", "/Video_data/") |
| .replace(".avi", "") |
| .replace("//", "/") |
| ) |
| |
| output_dir = os.path.dirname(output_dir) |
| video_path = global_path + local_name + i |
| create_videos(video_path, output_dir) |
|
|
|
|
| def create_images_sth2(global_path, files): |
| for i in tqdm(files): |
| video_path = global_path + str(i) + ".webm" |
| output_dir = video_path.replace("/Data/", "/Image_data/").replace(".webm", "") |
| create_images(video_path, output_dir) |
|
|
|
|
| def create_videos_sth2(global_path, files): |
| for i in tqdm(files): |
| video_path = global_path + str(i) + ".webm" |
| output_dir = os.path.dirname( |
| video_path.replace("/Data/", "/Video_data/").replace(".webm", "") |
| ) |
| create_videos(video_path, output_dir) |
|
|