def get_bezier_coefficient(self): Mtk = lambda n, t, k: t**k * (1 - t)**(n - k) * n_over_k(n, k) BezierCoeff = lambda ts: [[ Mtk(self.num_point - 1, t, k) for k in range(self.num_point) ] for t in ts] return BezierCoeff
def overlay_bezier(self, image, predictions): """ Adds the predicted bezier on top of the image """ labels = predictions.get_field("labels") # print('predictions', predictions.fields()) beziers = predictions.get_field("beziers") colors = self.compute_colors_for_labels(labels).tolist() Mtk = lambda n, t, k: t**k * (1 - t)**(n - k) * n_over_k(n, k) BezierCoeff = lambda ts: [[Mtk(3, t, k) for k in range(4)] for t in ts] for bez_pts, color in zip(beziers, colors): bez_pts = bez_pts.to(torch.int64) assert ( len(bez_pts) == 16 ), 'The numbr of bezier control points must be 8, but got {}'.format( len(bez_pts)) s1_bezier = bez_pts[:8].reshape((4, 2))[:, [1, 0]] s2_bezier = bez_pts[8:].reshape((4, 2))[:, [1, 0]] tpbtp = tuple(map(tuple, np.int32(s1_bezier))) tpbbm = tuple(map(tuple, np.int32(s2_bezier))) t_plot = np.linspace(0, 1, 81) Bezier_top = np.array(BezierCoeff(t_plot)).dot(s1_bezier) Bezier_bottom = np.array(BezierCoeff(t_plot)).dot(s2_bezier) # use np.int32 for cv2 draw func image = cv2.polylines(image, np.int32([Bezier_top]), False, (0, 0, 255), 3) image = cv2.polylines(image, np.int32([Bezier_bottom]), False, (0, 0, 255), 3) image = cv2.line(image, tpbtp[0], tpbbm[0], (0, 0, 255), 3) image = cv2.line(image, tpbtp[3], tpbbm[3], (0, 0, 255), 3) return image
def bezier_to_poly(bez, rec, rec_type): Mtk = lambda n, t, k: t**k * (1-t)**(n-k) * n_over_k(n,k) BezierCoeff = lambda ts: [[Mtk(3,t,k) for k in range(4)] for t in ts] poly = [] assert(len(bez) == 16), 'The numbr of bezier control points must be 8, but got {}'.format(int(len(bez_pts)/2)) s1_bezier = bez[:8].reshape((4,2))[:, [1, 0]] s2_bezier = bez[8:].reshape((4,2))[:, [1, 0]] tpbtp = tuple(map(tuple, np.int32(s1_bezier))) tpbbm = tuple(map(tuple, np.int32(s2_bezier))) t_plot = np.linspace(0, 1, 20) Bezier_top = np.array(BezierCoeff(t_plot)).dot(s1_bezier) Bezier_bottom = np.array(BezierCoeff(t_plot)).dot(s2_bezier) poly = Bezier_top.tolist() bottom = Bezier_bottom.tolist() bottom.reverse() poly.extend(bottom) if rec_type == "ctc": last_char = False s = '' for c in rec: c = int(c) if c < 95: if last_char != c: s += CTLABELS[c] last_char = c elif c == 95: s += u'口' else: last_char = False elif rec_type == "attention": s = '' for c in rec: c = int(c) if c < 95: s += CTLABELS[c] elif c == 95: s += u'口' return poly, s
@Time : 2020/8/18 下午2:10 @Author : yizuotian @Description : 转换windows_label_tool工具的标注 windows_label_tool 格式eg: """ import math import numpy as np import torch from scipy.special import comb as n_over_k from shapely.geometry import * from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error from torch import nn Mtk = lambda n, t, k: t ** k * (1 - t) ** (n - k) * n_over_k(n, k) BezierCoeff = lambda ts: [[Mtk(3, t, k) for k in range(4)] for t in ts] class Bezier(nn.Module): def __init__(self, ps, ctps): """ ps: numpy array of points """ super(Bezier, self).__init__() self.x1 = nn.Parameter(torch.as_tensor(ctps[0], dtype=torch.float64)) self.x2 = nn.Parameter(torch.as_tensor(ctps[2], dtype=torch.float64)) self.y1 = nn.Parameter(torch.as_tensor(ctps[1], dtype=torch.float64)) self.y2 = nn.Parameter(torch.as_tensor(ctps[3], dtype=torch.float64)) self.x0 = ps[0, 0] self.x3 = ps[-1, 0]