VfiTest / datasets /data_utils.py
SuyeonJ's picture
Upload folder using huggingface_hub
8d015d4 verified
raw
history blame
4.62 kB
import cv2
import numpy as np
import random
perm = [(0, 1, 2), (0, 2, 1), (1, 0, 2), (1, 2, 0), (2, 0, 1), (2, 1, 0)]
rotate = [cv2.ROTATE_90_CLOCKWISE, cv2.ROTATE_180, cv2.ROTATE_90_COUNTERCLOCKWISE]
def random_crop(img0, imgt, img1, crop_size, flowt0=None, flowt1=None, distance=None):
im_h, im_w = img0.shape[:2]
crop_h, crop_w = crop_size, crop_size
i = random.randint(0, im_h - crop_h)
j = random.randint(0, im_w - crop_w)
img0 = img0[i:i + crop_h, j:j + crop_w]
imgt = imgt[i:i + crop_h, j:j + crop_w]
img1 = img1[i:i + crop_h, j:j + crop_w]
if flowt0 is not None and flowt1 is not None:
flowt0 = flowt0[i:i + crop_h, j:j + crop_w]
flowt1 = flowt1[i:i + crop_h, j:j + crop_w]
if distance is not None:
distance = distance[i:i + crop_h, j:j + crop_w]
return img0, imgt, img1, flowt0, flowt1, distance
def random_hor_flip(img0, imgt, img1, flowt0=None, flowt1=None, distance=None):
img0, imgt, img1 = img0[::-1, :, :], imgt[::-1, :, :], img1[::-1, :, :]
if flowt0 is not None and flowt1 is not None:
flowt0, flowt1 = flowt0[::-1, :, :] * np.array([1, -1]).reshape(1, 1, 2), \
flowt1[::-1, :, :] * np.array([1, -1]).reshape(1, 1, 2)
if distance is not None:
distance = distance[::-1, :, :]
return img0, imgt, img1, flowt0, flowt1, distance
def random_ver_flip(img0, imgt, img1, flowt0=None, flowt1=None, distance=None):
img0, imgt, img1 = img0[:, ::-1, :], imgt[:, ::-1, :], img1[:, ::-1, :]
if flowt0 is not None and flowt1 is not None:
flowt0, flowt1 = flowt0[:, ::-1, :] * np.array([-1, 1]).reshape(1, 1, 2), \
flowt1[:, ::-1, :] * np.array([-1, 1]).reshape(1, 1, 2)
if distance is not None:
distance = distance[:, ::-1, :]
return img0, imgt, img1, flowt0, flowt1, distance
def random_color_permutation(img0, imgt, img1):
perm_idx = random.randint(0, 5)
img0, imgt, img1 = img0[:, :, perm[perm_idx]], imgt[:, :, perm[perm_idx]], img1[:, :, perm[perm_idx]]
return img0, imgt, img1
def random_temporal_flip(img0, imgt, img1, time_step, flowt0=None, flowt1=None):
tmp = img1
img1 = img0
img0 = tmp
time_step = 1 - time_step
if flowt0 is not None and flowt1 is not None:
tmp = flowt0
flowt0 = flowt1
flowt1 = tmp
return img0, imgt, img1, time_step, flowt0, flowt1
def random_rotation(img0, imgt, img1, degree, flowt0=None, flowt1=None, distance=None):
if degree != 3:
img0 = cv2.rotate(img0, rotate[degree])
imgt = cv2.rotate(imgt, rotate[degree])
img1 = cv2.rotate(img1, rotate[degree])
if flowt0 is not None and flowt1 is not None:
flowt0 = cv2.rotate(flowt0, rotate[degree])
flowt1 = cv2.rotate(flowt1, rotate[degree])
if degree == 0:
flowt0 = np.concatenate((-flowt0[:, :, 1:2], flowt0[:, :, 0:1]), 2)
flowt1 = np.concatenate((-flowt1[:, :, 1:2], flowt1[:, :, 0:1]), 2)
elif degree == 1:
flowt0 = -flowt0
flowt1 = -flowt1
elif degree == 2:
flowt0 = np.concatenate((flowt0[:, :, 1:2], -flowt0[:, :, 0:1]), 2)
flowt1 = np.concatenate((flowt1[:, :, 1:2], -flowt1[:, :, 0:1]), 2)
if distance is not None:
H,W,_ = distance.shape
distance = cv2.rotate(distance, rotate[degree]).reshape(H,W,1)
return img0, imgt, img1, flowt0, flowt1, distance
def random_resize(img0, imgt, img1, flowt0=None, flowt1=None, distance=None):
'''
img0 = cv2.resize(img0, dsize=None, fx=2.0, fy=2.0, interpolation=cv2.INTER_LINEAR)
imgt = cv2.resize(imgt, dsize=None, fx=2.0, fy=2.0, interpolation=cv2.INTER_LINEAR)
img1 = cv2.resize(img1, dsize=None, fx=2.0, fy=2.0, interpolation=cv2.INTER_LINEAR)
if flowt0 is not None and flowt1 is not None:
flowt0 = cv2.resize(flowt0, dsize=None, fx=2.0, fy=2.0, interpolation=cv2.INTER_LINEAR) * 2.0
flowt1 = cv2.resize(flowt1, dsize=None, fx=2.0, fy=2.0, interpolation=cv2.INTER_LINEAR) * 2.0
'''
return img0, imgt, img1, flowt0, flowt1, distance
def read_flow(name):
with open(name, "rb") as f:
header = f.read(4)
if header.decode("utf-8") != 'PIEH':
raise Exception('Flow file header does not contain PIEH')
width = np.fromfile(f, np.int32, 1).squeeze()
height = np.fromfile(f, np.int32, 1).squeeze()
flow = np.fromfile(f, np.float32, width * height * 2).reshape((height, width, 2))
return flow.astype(np.float32)