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
Beispiel #3
0
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]