-
Notifications
You must be signed in to change notification settings - Fork 2
/
util.py
101 lines (86 loc) · 4.34 KB
/
util.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import numpy as np
import cv2
from collections import deque
pts = [deque(maxlen=30) for _ in range(1000)]
COLORS_10 =[(144,238,144),(178, 34, 34),(221,160,221),( 0,255, 0),( 0,128, 0),(210,105, 30),(220, 20, 60),
(192,192,192),(255,228,196),( 50,205, 50),(139, 0,139),(100,149,237),(138, 43,226),(238,130,238),
(255, 0,255),( 0,100, 0),(127,255, 0),(255, 0,255),( 0, 0,205),(255,140, 0),(255,239,213),
(199, 21,133),(124,252, 0),(147,112,219),(106, 90,205),(176,196,222),( 65,105,225),(173,255, 47),
(255, 20,147),(219,112,147),(186, 85,211),(199, 21,133),(148, 0,211),(255, 99, 71),(144,238,144),
(255,255, 0),(230,230,250),( 0, 0,255),(128,128, 0),(189,183,107),(255,255,224),(128,128,128),
(105,105,105),( 64,224,208),(205,133, 63),( 0,128,128),( 72,209,204),(139, 69, 19),(255,245,238),
(250,240,230),(152,251,152),( 0,255,255),(135,206,235),( 0,191,255),(176,224,230),( 0,250,154),
(245,255,250),(240,230,140),(245,222,179),( 0,139,139),(143,188,143),(255, 0, 0),(240,128,128),
(102,205,170),( 60,179,113),( 46,139, 87),(165, 42, 42),(178, 34, 34),(175,238,238),(255,248,220),
(218,165, 32),(255,250,240),(253,245,230),(244,164, 96),(210,105, 30)]
def draw_bbox(img, box, cls_name, identity=None, offset=(0,0)):
'''
draw box of an id
'''
x1,y1,x2,y2 = [int(i+offset[idx%2]) for idx,i in enumerate(box)]
# set color and label text
color = COLORS_10[identity%len(COLORS_10)] if identity is not None else COLORS_10[0]
label = '{} {}'.format(cls_name, identity)
# box text and bar
t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 1 , 1)[0]
cv2.rectangle(img,(x1, y1),(x2,y2),color,2)
cv2.rectangle(img,(x1, y1),(x1+t_size[0]+3,y1+t_size[1]+4), color,-1)
cv2.putText(img,label,(x1,y1+t_size[1]+4), cv2.FONT_HERSHEY_PLAIN, 1, [255,255,255], 1)
return img
def draw_bboxes(img, bbox, identities, binary_masks=[], alpha = 0.33, offset=(0,0)):
for i,box in enumerate(bbox):
x1,y1,x2,y2 = [int(i) for i in box]
x1 += offset[0]
x2 += offset[0]
y1 += offset[1]
y2 += offset[1]
# box text and bar
id = int(identities[i]) if identities is not None else 0
color = COLORS_10[id%len(COLORS_10)]
label = '{}{:d}'.format("", id)
t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2 , 2)[0]
cv2.rectangle(img,(x1, y1),(x2,y2),color,3)
cv2.rectangle(img,(x1, y1),(x1+t_size[0]+3,y1+t_size[1]+4), color,-1)
cv2.putText(img,label,(x1,y1+t_size[1]+4), cv2.FONT_HERSHEY_PLAIN, 2, [255,255,255], 2)
#draw trajectories
center = (int((x1+x2)/2), int((y1+y2)/2))
pts[id].append(center)
cv2.circle(img, (center), 1, color, 5)
#draw motion path
for j in range(1, len(pts[id])):
if pts[id][j-1] is None or pts[id][j] is None:
continue
thickness = int(np.sqrt(64/float(j+1))*2)
#print((pts[id][j-1]), (pts[id][j]), (color), thickness)
cv2.line(img, (pts[id][j-1]), (pts[id][j]), (color), thickness)
# draw mask
if i < len(binary_masks):
mask = binary_masks[i]
color = COLORS_10[0] #make all masks same color
for c in range(3):
img[:, :, c] = np.where(mask > 0, img[:, :, c] * (1-alpha) + alpha*color[c]*255, img[:, :, c])
return img
def draw_polys(im, polys):
for poly in polys:
cv2.polylines(im, [poly], True, (255,255,255))
return im
def draw_detections(detections, img):
for det in detections:
bbox = det.to_tlbr()
if len(bbox):
cv2.rectangle(img, (int(bbox[0]), int(bbox[1])), (int(bbox[2]), int(bbox[3])), (255, 255, 255), 2)
return img
def softmax(x):
assert isinstance(x, np.ndarray), "expect x be a numpy array"
x_exp = np.exp(x*5)
return x_exp/x_exp.sum()
def softmin(x):
assert isinstance(x, np.ndarray), "expect x be a numpy array"
x_exp = np.exp(-x)
return x_exp/x_exp.sum()
if __name__ == '__main__':
x = np.arange(10)/10.
x = np.array([0.5,0.5,0.5,0.6,1.])
y = softmax(x)
z = softmin(x)
import ipdb; ipdb.set_trace()