|
|
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) |
|
|
|