|
import numpy as np |
|
import math |
|
import cv2 |
|
import matplotlib |
|
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas |
|
from matplotlib.figure import Figure |
|
import numpy as np |
|
import matplotlib.pyplot as plt |
|
import cv2 |
|
|
|
|
|
def padRightDownCorner(img, stride, padValue): |
|
h = img.shape[0] |
|
w = img.shape[1] |
|
|
|
pad = 4 * [None] |
|
pad[0] = 0 |
|
pad[1] = 0 |
|
pad[2] = 0 if (h % stride == 0) else stride - (h % stride) |
|
pad[3] = 0 if (w % stride == 0) else stride - (w % stride) |
|
|
|
img_padded = img |
|
pad_up = np.tile(img_padded[0:1, :, :]*0 + padValue, (pad[0], 1, 1)) |
|
img_padded = np.concatenate((pad_up, img_padded), axis=0) |
|
pad_left = np.tile(img_padded[:, 0:1, :]*0 + padValue, (1, pad[1], 1)) |
|
img_padded = np.concatenate((pad_left, img_padded), axis=1) |
|
pad_down = np.tile(img_padded[-2:-1, :, :]*0 + padValue, (pad[2], 1, 1)) |
|
img_padded = np.concatenate((img_padded, pad_down), axis=0) |
|
pad_right = np.tile(img_padded[:, -2:-1, :]*0 + padValue, (1, pad[3], 1)) |
|
img_padded = np.concatenate((img_padded, pad_right), axis=1) |
|
|
|
return img_padded, pad |
|
|
|
|
|
def transfer(model, model_weights): |
|
transfered_model_weights = {} |
|
for weights_name in model.state_dict().keys(): |
|
transfered_model_weights[weights_name] = model_weights['.'.join(weights_name.split('.')[1:])] |
|
return transfered_model_weights |
|
|
|
|
|
def draw_bodypose(canvas, candidate, subset,show_number=False): |
|
stickwidth = 4 |
|
limbSeq = [[2, 3], [2, 6], [3, 4], [4, 5], [6, 7], [7, 8], [2, 9], [9, 10], \ |
|
[10, 11], [2, 12], [12, 13], [13, 14], [2, 1], [1, 15], [15, 17], \ |
|
[1, 16], [16, 18], [3, 17], [6, 18]] |
|
|
|
colors = [[255, 0, 0], [255, 85, 0], [255, 170, 0], [255, 255, 0], [170, 255, 0], [85, 255, 0], [0, 255, 0], \ |
|
[0, 255, 85], [0, 255, 170], [0, 255, 255], [0, 170, 255], [0, 85, 255], [0, 0, 255], [85, 0, 255], \ |
|
[170, 0, 255], [255, 0, 255], [255, 0, 170], [255, 0, 85]] |
|
for i in range(18): |
|
for n in range(len(subset)): |
|
index = int(subset[n][i]) |
|
if index == -1: |
|
continue |
|
x, y = candidate[index][0:2] |
|
cv2.circle(canvas, (int(x), int(y)), 4, colors[i], thickness=-1) |
|
if show_number: |
|
cv2.putText(canvas, f'{index}', (int(x), int(y)),cv2.FONT_HERSHEY_SIMPLEX, 0.6, |
|
(255,255,0), 1, cv2.LINE_AA) |
|
|
|
for i in range(17): |
|
for n in range(len(subset)): |
|
index = subset[n][np.array(limbSeq[i]) - 1] |
|
if -1 in index: |
|
continue |
|
cur_canvas = canvas.copy() |
|
Y = candidate[index.astype(int), 0] |
|
X = candidate[index.astype(int), 1] |
|
mX = np.mean(X) |
|
mY = np.mean(Y) |
|
length = ((X[0] - X[1]) ** 2 + (Y[0] - Y[1]) ** 2) ** 0.5 |
|
angle = math.degrees(math.atan2(X[0] - X[1], Y[0] - Y[1])) |
|
polygon = cv2.ellipse2Poly((int(mY), int(mX)), (int(length / 2), stickwidth), int(angle), 0, 360, 1) |
|
cv2.fillConvexPoly(cur_canvas, polygon, colors[i]) |
|
canvas = cv2.addWeighted(canvas, 0.4, cur_canvas, 0.6, 0) |
|
|
|
return canvas |
|
|
|
|
|
def npmax(array): |
|
arrayindex = array.argmax(1) |
|
arrayvalue = array.max(1) |
|
i = arrayvalue.argmax() |
|
j = arrayindex[i] |
|
return i, j |
|
|
|
|
|
def npmax_with_score(array): |
|
arrayindex = array.argmax(1) |
|
arrayvalue = array.max(1) |
|
i = arrayvalue.argmax() |
|
j = arrayindex[i] |
|
score =array[i][j] |
|
return i, j,score |
|
|