Realcat
fix: eloftr
63f3cf2
raw
history blame
4.56 kB
# -*- coding: UTF-8 -*-
'''=================================================
@Project -> File pram -> common
@IDE PyCharm
@Author fx221@cam.ac.uk
@Date 29/01/2024 15:05
=================================================='''
import os
import torch
import json
import yaml
import cv2
import numpy as np
from typing import Tuple
from copy import deepcopy
def load_args(args, save_path):
with open(save_path, "r") as f:
args.__dict__ = json.load(f)
def save_args_yaml(args, save_path):
with open(save_path, 'w') as f:
yaml.dump(args, f)
def merge_tags(tags: list, connection='_'):
out = ''
for i, t in enumerate(tags):
if i == 0:
out = out + t
else:
out = out + connection + t
return out
def torch_set_gpu(gpus):
if type(gpus) is int:
gpus = [gpus]
cuda = all(gpu >= 0 for gpu in gpus)
if cuda:
os.environ['CUDA_VISIBLE_DEVICES'] = ','.join([str(gpu) for gpu in gpus])
# print(os.environ['CUDA_VISIBLE_DEVICES'])
assert cuda and torch.cuda.is_available(), "%s has GPUs %s unavailable" % (
os.environ['HOSTNAME'], os.environ['CUDA_VISIBLE_DEVICES'])
torch.backends.cudnn.benchmark = True # speed-up cudnn
torch.backends.cudnn.fastest = True # even more speed-up?
print('Launching on GPUs ' + os.environ['CUDA_VISIBLE_DEVICES'])
else:
print('Launching on CPU')
return cuda
def resize_img(img, nh=-1, nw=-1, rmax=-1, mode=cv2.INTER_NEAREST):
assert nh > 0 or nw > 0 or rmax > 0
if nh > 0:
return cv2.resize(img, dsize=(int(img.shape[1] / img.shape[0] * nh), nh), interpolation=mode)
if nw > 0:
return cv2.resize(img, dsize=(nw, int(img.shape[0] / img.shape[1] * nw)), interpolation=mode)
if rmax > 0:
oh, ow = img.shape[0], img.shape[1]
if oh > ow:
return cv2.resize(img, dsize=(int(img.shape[1] / img.shape[0] * rmax), rmax), interpolation=mode)
else:
return cv2.resize(img, dsize=(rmax, int(img.shape[0] / img.shape[1] * rmax)), interpolation=mode)
return cv2.resize(img, dsize=(nw, nh), interpolation=mode)
def resize_image_with_padding(image: np.array, nw: int, nh: int, padding_color: Tuple[int] = (0, 0, 0)) -> np.array:
"""Maintains aspect ratio and resizes with padding.
Params:
image: Image to be resized.
new_shape: Expected (width, height) of new image.
padding_color: Tuple in BGR of padding color
Returns:
image: Resized image with padding
"""
original_shape = (image.shape[1], image.shape[0]) # (w, h)
ratio_w = nw / original_shape[0]
ratio_h = nh / original_shape[1]
if ratio_w == ratio_h:
image = cv2.resize(image, (nw, nh), interpolation=cv2.INTER_NEAREST)
ratio = ratio_w if ratio_w < ratio_h else ratio_h
new_size = tuple([int(x * ratio) for x in original_shape])
image = cv2.resize(image, new_size, interpolation=cv2.INTER_NEAREST)
delta_w = nw - new_size[0] if nw > new_size[0] else new_size[0] - nw
delta_h = nh - new_size[1] if nh > new_size[1] else new_size[1] - nh
left, right = delta_w // 2, delta_w - (delta_w // 2)
top, bottom = delta_h // 2, delta_h - (delta_h // 2)
# print('top, bottom, left, right: ', top, bottom, left, right)
image = cv2.copyMakeBorder(image, top, bottom, left, right, cv2.BORDER_CONSTANT, value=padding_color)
return image
def puttext_with_background(image, text, org=(0, 0), fontFace=cv2.FONT_HERSHEY_SIMPLEX,
fontScale=1, text_color=(0, 0, 255),
thickness=2, lineType=cv2.LINE_AA, bg_color=None):
out_img = deepcopy(image)
if bg_color is not None:
(text_width, text_height), baseline = cv2.getTextSize(text,
fontFace,
fontScale=fontScale,
thickness=thickness)
box_coords = (
(org[0], org[1] + baseline),
(org[0] + text_width + 2, org[1] - text_height - 2))
cv2.rectangle(out_img, box_coords[0], box_coords[1], bg_color, cv2.FILLED)
out_img = cv2.putText(img=out_img, text=text,
org=org,
fontFace=fontFace,
fontScale=fontScale, color=text_color,
thickness=thickness, lineType=lineType)
return out_img