Spaces:
Build error
Build error
| 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 | |