jmliu's picture
Add app
0742dfe
# -*- 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))