|
|
import cv2 |
|
|
import torch |
|
|
import numpy as np |
|
|
|
|
|
|
|
|
def load_img(path, order='RGB'): |
|
|
img = cv2.imread(path, cv2.IMREAD_COLOR | cv2.IMREAD_IGNORE_ORIENTATION) |
|
|
if not isinstance(img, np.ndarray): |
|
|
raise IOError("Fail to read %s" % path) |
|
|
|
|
|
if order=='RGB': img = img[:,:,::-1] |
|
|
img = img.astype(np.float32) |
|
|
return img |
|
|
|
|
|
|
|
|
def get_bbox(joint_img, joint_valid, expansion_factor=1.0): |
|
|
x_img, y_img = joint_img[:,0], joint_img[:,1] |
|
|
x_img = x_img[joint_valid==1]; y_img = y_img[joint_valid==1]; |
|
|
xmin = min(x_img); ymin = min(y_img); xmax = max(x_img); ymax = max(y_img); |
|
|
|
|
|
x_center = (xmin+xmax)/2.; width = (xmax-xmin)*expansion_factor; |
|
|
xmin = x_center - 0.5*width |
|
|
xmax = x_center + 0.5*width |
|
|
|
|
|
y_center = (ymin+ymax)/2.; height = (ymax-ymin)*expansion_factor; |
|
|
ymin = y_center - 0.5*height |
|
|
ymax = y_center + 0.5*height |
|
|
|
|
|
bbox = np.array([xmin, ymin, xmax - xmin, ymax - ymin]).astype(np.float32) |
|
|
return bbox |
|
|
|
|
|
|
|
|
def process_bbox(bbox, target_shape, original_img_shape): |
|
|
|
|
|
|
|
|
w = bbox[2] |
|
|
h = bbox[3] |
|
|
c_x = bbox[0] + w/2. |
|
|
c_y = bbox[1] + h/2. |
|
|
aspect_ratio = target_shape[1]/target_shape[0] |
|
|
if w > aspect_ratio * h: |
|
|
h = w / aspect_ratio |
|
|
elif w < aspect_ratio * h: |
|
|
w = h * aspect_ratio |
|
|
bbox[2] = w*1.25 |
|
|
bbox[3] = h*1.25 |
|
|
bbox[0] = c_x - bbox[2]/2. |
|
|
bbox[1] = c_y - bbox[3]/2. |
|
|
|
|
|
return bbox |
|
|
|
|
|
|
|
|
import re |
|
|
def atoi(text): |
|
|
return int(text) if text.isdigit() else text |
|
|
def natural_keys(text): |
|
|
return [atoi(c) for c in re.split(r'(\d+)', text)] |
|
|
|
|
|
|
|
|
|
|
|
import yaml |
|
|
def load_config(cfg_path): |
|
|
with open(cfg_path, 'r') as f: |
|
|
cfg = yaml.safe_load(f) |
|
|
return cfg |