Spaces:
Sleeping
Sleeping
# -*- coding: utf-8 -*- | |
import time | |
import json | |
import cv2 | |
import torch | |
import numpy as np | |
import matplotlib.pyplot as plt | |
def setup_logger(log_file_path: str = None): | |
import logging | |
from colorlog import ColoredFormatter | |
logging.basicConfig(filename=log_file_path, | |
format='%(asctime)s %(levelname)-8s %(filename)s[line:%(lineno)d]: %(message)s', | |
# 定义输出log的格式 | |
datefmt='%Y-%m-%d %H:%M:%S', ) | |
"""Return a logger with a default ColoredFormatter.""" | |
formatter = ColoredFormatter( | |
"%(asctime)s %(log_color)s%(levelname)-8s %(reset)s %(filename)s[line:%(lineno)d]: %(message)s", | |
datefmt='%Y-%m-%d %H:%M:%S', | |
reset=True, | |
log_colors={ | |
'DEBUG': 'blue', | |
'INFO': 'green', | |
'WARNING': 'yellow', | |
'ERROR': 'red', | |
'CRITICAL': 'red', | |
}) | |
logger = logging.getLogger('PAN') | |
handler = logging.StreamHandler() | |
handler.setFormatter(formatter) | |
logger.addHandler(handler) | |
logger.setLevel(logging.DEBUG) | |
logger.info('logger init finished') | |
return logger | |
# --exeTime | |
def exe_time(func): | |
def newFunc(*args, **args2): | |
t0 = time.time() | |
back = func(*args, **args2) | |
print("{} cost {:.3f}s".format(func.__name__, time.time() - t0)) | |
return back | |
return newFunc | |
def save_json(data, json_path): | |
with open(json_path, mode='w', encoding='utf8') as f: | |
json.dump(data, f, indent=4) | |
def load_json(json_path): | |
with open(json_path, mode='r', encoding='utf8') as f: | |
data = json.load(f) | |
return data | |
def show_img(imgs: np.ndarray, color=False): | |
if (len(imgs.shape) == 3 and color) or (len(imgs.shape) == 2 and not color): | |
imgs = np.expand_dims(imgs, axis=0) | |
for img in imgs: | |
plt.figure() | |
plt.imshow(img, cmap=None if color else 'gray') | |
def draw_bbox(img_path, result, color=(128, 240, 128), thickness=3): | |
if isinstance(img_path, str): | |
img_path = cv2.imread(img_path) | |
# img_path = cv2.cvtColor(img_path, cv2.COLOR_BGR2RGB) | |
img_path = img_path.copy() | |
for point in result: | |
point = point.astype(int) | |
cv2.line(img_path, tuple(point[0]), tuple(point[1]), color, thickness) | |
cv2.line(img_path, tuple(point[1]), tuple(point[2]), color, thickness) | |
cv2.line(img_path, tuple(point[2]), tuple(point[3]), color, thickness) | |
cv2.line(img_path, tuple(point[3]), tuple(point[0]), color, thickness) | |
return img_path | |
def cal_text_score(texts, gt_texts, training_masks, running_metric_text): | |
training_masks = training_masks.data.cpu().numpy() | |
pred_text = torch.sigmoid(texts).data.cpu().numpy() * training_masks | |
pred_text[pred_text <= 0.5] = 0 | |
pred_text[pred_text > 0.5] = 1 | |
pred_text = pred_text.astype(np.int32) | |
gt_text = gt_texts.data.cpu().numpy() * training_masks | |
gt_text = gt_text.astype(np.int32) | |
running_metric_text.update(gt_text, pred_text) | |
score_text, _ = running_metric_text.get_scores() | |
return score_text | |
def cal_kernel_score(kernel, gt_kernel, gt_texts, training_masks, running_metric_kernel): | |
mask = (gt_texts * training_masks.float()).data.cpu().numpy() | |
pred_kernel = torch.sigmoid(kernel).data.cpu().numpy() | |
pred_kernel[pred_kernel <= 0.5] = 0 | |
pred_kernel[pred_kernel > 0.5] = 1 | |
pred_kernel = (pred_kernel * mask).astype(np.int32) | |
gt_kernel = gt_kernel.data.cpu().numpy() | |
gt_kernel = (gt_kernel * mask).astype(np.int32) | |
running_metric_kernel.update(gt_kernel, pred_kernel) | |
score_kernel, _ = running_metric_kernel.get_scores() | |
return score_kernel | |
def order_points_clockwise(pts): | |
rect = np.zeros((4, 2), dtype="float32") | |
s = pts.sum(axis=1) | |
rect[0] = pts[np.argmin(s)] | |
rect[2] = pts[np.argmax(s)] | |
diff = np.diff(pts, axis=1) | |
rect[1] = pts[np.argmin(diff)] | |
rect[3] = pts[np.argmax(diff)] | |
return rect | |
def order_points_clockwise_list(pts): | |
pts = pts.tolist() | |
pts.sort(key=lambda x: (x[1], x[0])) | |
pts[:2] = sorted(pts[:2], key=lambda x: x[0]) | |
pts[2:] = sorted(pts[2:], key=lambda x: -x[0]) | |
pts = np.array(pts) | |
return pts | |
if __name__ == '__main__': | |
#box = np.array([382, 1080, 443, 999, 423, 1014, 362, 1095]).reshape(-1, 2) | |
box = np.array([0, 4, 2, 2, 0, 8, 4, 4]).reshape(-1, 2) | |
# box = np.array([0, 0, 2, 2, 0, 4, 4, 4]).reshape(-1, 2) | |
from scipy.spatial import ConvexHull | |
print(box) | |
print(order_points_clockwise(box)) | |
print(order_points_clockwise_list(box)) | |