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)) | |