oguzakif's picture
init repo
d4b77ac
raw
history blame
8.44 kB
import os
import argparse
import shutil
from glob import glob
import numpy as np
from PIL import Image
from utils.logging_config import logger
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument(
'-v', '--video_dir',
type=str,
help="Video directory name"
)
parser.add_argument(
'-fl', '--flow_dir',
type=str,
help="Optical flow ground truth directory name"
)
parser.add_argument(
'-od', '--output_dir',
type=str,
help="Output directory name"
)
parser.add_argument(
'-o', '--output_filename',
type=str,
help="Output output filename"
)
args = parser.parse_args()
return args
def make_dirs(dir_name):
if not os.path.exists(dir_name):
os.makedirs(dir_name)
logger.info(f"Directory {dir_name} made")
ensure_dir = make_dirs
def make_dir_under_root(root_dir, name):
full_dir_name = os.path.join(root_dir, name)
make_dirs(full_dir_name)
return full_dir_name
def rm_dirs(dir_name, ignore_errors=False):
if os.path.exists(dir_name):
shutil.rmtree(dir_name, ignore_errors)
logger.info(f"Directory {dir_name} removed")
def read_dirnames_under_root(root_dir, skip_list=[]):
dirnames = [
name for i, name in enumerate(sorted(os.listdir(root_dir)))
if (os.path.isdir(os.path.join(root_dir, name))
and name not in skip_list
and i not in skip_list)
]
logger.info(f"Reading directories under {root_dir}, exclude {skip_list}, num: {len(dirnames)}")
return dirnames
def bbox_offset(bbox, location):
x0, y0 = location
(x1, y1), (x2, y2) = bbox
return ((x1 + x0, y1 + y0), (x2 + x0, y2 + y0))
def cover2_bbox(bbox1, bbox2):
x1 = min(bbox1[0][0], bbox2[0][0])
y1 = min(bbox1[0][1], bbox2[0][1])
x2 = max(bbox1[1][0], bbox2[1][0])
y2 = max(bbox1[1][1], bbox2[1][1])
return ((x1, y1), (x2, y2))
def extend_r_bbox(bbox, w, h, r):
(x1, y1), (x2, y2) = bbox
x1 = max(x1 - r, 0)
x2 = min(x2 + r, w)
y1 = max(y1 - r, 0)
y2 = min(y2 + r, h)
return ((x1, y1), (x2, y2))
def mean_squared_error(A, B):
return np.square(np.subtract(A, B)).mean()
def bboxes_to_mask(size, bboxes):
mask = Image.new("L", size, 255)
mask = np.array(mask)
for bbox in bboxes:
try:
(x1, y1), (x2, y2) = bbox
except Exception:
(x1, y1, x2, y2) = bbox
mask[y1:y2, x1:x2] = 0
mask = Image.fromarray(mask.astype("uint8"))
return mask
def get_extended_from_box(img_size, box, patch_size):
def _decide_patch_num(box_width, patch_size):
num = np.ceil(box_width / patch_size).astype(np.int)
if (num * patch_size - box_width) < (patch_size // 2):
num += 1
return num
x1, y1 = box[0]
x2, y2 = box[1]
new_box = (x1, y1, x2 - x1, y2 - y1)
box_x_start, box_y_start, box_x_size, box_y_size = new_box
patchN_x = _decide_patch_num(box_x_size, patch_size)
patchN_y = _decide_patch_num(box_y_size, patch_size)
extend_x = (patch_size * patchN_x - box_x_size) // 2
extend_y = (patch_size * patchN_y - box_y_size) // 2
img_x_size = img_size[0]
img_y_size = img_size[1]
x_start = max(0, box_x_start - extend_x)
x_end = min(box_x_start - extend_x + patchN_x * patch_size, img_x_size)
y_start = max(0, box_y_start - extend_y)
y_end = min(box_y_start - extend_y + patchN_y * patch_size, img_y_size)
x_start, y_start, x_end, y_end = int(x_start), int(y_start), int(x_end), int(y_end)
extented_box = ((x_start, y_start), (x_end, y_end))
return extented_box
# code modified from https://github.com/WonwoongCho/Generative-Inpainting-pytorch/blob/master/util.py
def spatial_discounting_mask(mask_width, mask_height, discounting_gamma):
"""Generate spatial discounting mask constant.
Spatial discounting mask is first introduced in publication:
Generative Image Inpainting with Contextual Attention, Yu et al.
Returns:
np.array: spatial discounting mask
"""
gamma = discounting_gamma
mask_values = np.ones((mask_width, mask_height), dtype=np.float32)
for i in range(mask_width):
for j in range(mask_height):
mask_values[i, j] = max(
gamma**min(i, mask_width - i),
gamma**min(j, mask_height - j))
return mask_values
def bboxes_to_discounting_loss_mask(img_size, bboxes, discounting_gamma=0.99):
mask = np.zeros(img_size, dtype=np.float32) + 0.5
for bbox in bboxes:
try:
(x1, y1), (x2, y2) = bbox
except Exception:
(x1, y1, x2, y2) = bbox
mask_width, mask_height = y2 - y1, x2 - x1
mask[y1:y2, x1:x2] = spatial_discounting_mask(mask_width, mask_height, discounting_gamma)
return mask
def find_proper_window(image_size, bbox_point):
'''
parameters:
image_size(2-tuple): (height, width)
bbox_point(2-2-tuple): (first_point, last_point)
return values:
window left-up point, (2-tuple)
window right-bottom point, (2-tuple)
'''
bbox_height = bbox_point[1][0] - bbox_point[0][0]
bbox_width = bbox_point[1][1] - bbox_point[0][1]
window_size = min(
max(bbox_height, bbox_width) * 2,
image_size[0], image_size[1]
)
# Limit min window size due to the requirement of VGG16
window_size = max(window_size, 32)
horizontal_span = window_size - (bbox_point[1][1] - bbox_point[0][1])
vertical_span = window_size - (bbox_point[1][0] - bbox_point[0][0])
top_bound, bottom_bound = bbox_point[0][0] - \
vertical_span // 2, bbox_point[1][0] + vertical_span // 2
left_bound, right_bound = bbox_point[0][1] - \
horizontal_span // 2, bbox_point[1][1] + horizontal_span // 2
if left_bound < 0:
right_bound += 0 - left_bound
left_bound += 0 - left_bound
elif right_bound > image_size[1]:
left_bound -= right_bound - image_size[1]
right_bound -= right_bound - image_size[1]
if top_bound < 0:
bottom_bound += 0 - top_bound
top_bound += 0 - top_bound
elif bottom_bound > image_size[0]:
top_bound -= bottom_bound - image_size[0]
bottom_bound -= bottom_bound - image_size[0]
return (top_bound, left_bound), (bottom_bound, right_bound)
def drawrect(drawcontext, xy, outline=None, width=0, partial=None):
(x1, y1), (x2, y2) = xy
if partial is None:
points = (x1, y1), (x2, y1), (x2, y2), (x1, y2), (x1, y1)
drawcontext.line(points, fill=outline, width=width)
else:
drawcontext.line([(x1, y1), (x1, y1 + partial)], fill=outline, width=width)
drawcontext.line([(x1 + partial, y1), (x1, y1)], fill=outline, width=width)
drawcontext.line([(x2, y1), (x2, y1 + partial)], fill=outline, width=width)
drawcontext.line([(x2, y1), (x2 - partial, y1)], fill=outline, width=width)
drawcontext.line([(x1, y2), (x1 + partial, y2)], fill=outline, width=width)
drawcontext.line([(x1, y2), (x1, y2 - partial)], fill=outline, width=width)
drawcontext.line([(x2 - partial, y2), (x2, y2)], fill=outline, width=width)
drawcontext.line([(x2, y2), (x2, y2 - partial)], fill=outline, width=width)
def get_everything_under(root_dir, pattern='*', only_dirs=False, only_files=False):
assert not(only_dirs and only_files), 'You will get nothnig '\
'when "only_dirs" and "only_files" are both set to True'
everything = sorted(glob(os.path.join(root_dir, pattern)))
if only_dirs:
everything = [f for f in everything if os.path.isdir(f)]
if only_files:
everything = [f for f in everything if os.path.isfile(f)]
return everything
def read_filenames_from_dir(dir_name, reader, max_length=None):
logger.debug(
f"{reader} reading files from {dir_name}")
filenames = []
for root, dirs, files in os.walk(dir_name):
assert len(dirs) == 0, f"There are direcories: {dirs} in {root}"
assert len(files) != 0, f"There are no files in {root}"
filenames = [os.path.join(root, name) for name in sorted(files)]
for name in filenames:
logger.debug(name)
if max_length is not None:
return filenames[:max_length]
return filenames