-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvisualize.py
117 lines (97 loc) · 4.2 KB
/
visualize.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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
'''
The script to visualize
'''
import cv2
import torch
import os
import numpy as np
import colorsys
import seaborn as sns
platte = sns.color_palette("Spectral", 100, as_cmap=True) # doesn't work
from typing import Iterable, Tuple
import colorsys
import itertools
from fractions import Fraction
from pprint import pprint
######## The code to generate high-contrastive colors for visualization ##########
def zenos_dichotomy() -> Iterable[Fraction]:
"""
http://en.wikipedia.org/wiki/1/2_%2B_1/4_%2B_1/8_%2B_1/16_%2B_%C2%B7_%C2%B7_%C2%B7
"""
for k in itertools.count():
yield Fraction(1,2**k)
def fracs() -> Iterable[Fraction]:
"""
[Fraction(0, 1), Fraction(1, 2), Fraction(1, 4), Fraction(3, 4), Fraction(1, 8), Fraction(3, 8), Fraction(5, 8), Fraction(7, 8), Fraction(1, 16), Fraction(3, 16), ...]
[0.0, 0.5, 0.25, 0.75, 0.125, 0.375, 0.625, 0.875, 0.0625, 0.1875, ...]
"""
yield Fraction(0)
for k in zenos_dichotomy():
i = k.denominator # [1,2,4,8,16,...]
for j in range(1,i,2):
yield Fraction(j,i)
# can be used for the v in hsv to map linear values 0..1 to something that looks equidistant
# bias = lambda x: (math.sqrt(x/3)/Fraction(2,3)+Fraction(1,3))/Fraction(6,5)
HSVTuple = Tuple[Fraction, Fraction, Fraction]
RGBTuple = Tuple[float, float, float]
def hue_to_tones(h: Fraction) -> Iterable[HSVTuple]:
for s in [Fraction(6,10)]: # optionally use range
for v in [Fraction(8,10),Fraction(5,10)]: # could use range too
yield (h, s, v) # use bias for v here if you use range
def hsv_to_rgb(x: HSVTuple) -> RGBTuple:
return colorsys.hsv_to_rgb(*map(float, x))
flatten = itertools.chain.from_iterable
def hsvs() -> Iterable[HSVTuple]:
return flatten(map(hue_to_tones, fracs()))
def rgbs() -> Iterable[RGBTuple]:
return map(hsv_to_rgb, hsvs())
def rgb_to_css(x: RGBTuple) -> str:
uint8tuple = map(lambda y: int(y*255), x)
rgb_str = "{},{},{}".format(*uint8tuple)
rgb_value = rgb_str.split(",")
rgb_value = [int(d) for d in rgb_value]
return (rgb_value[0], rgb_value[1], rgb_value[2])
def css_colors() -> Iterable[str]:
return map(rgb_to_css, rgbs())
sample_colors = list(itertools.islice(css_colors(), 400))
########## ########## ########## ########## ########## ########## ##########
def draw_box(im, box, thickness=1, color=(255,0,0), trackids=[]):
x1, y1, w, h = box
x2 = x1+w
y2 = y1+h
cv2.rectangle(im, (x1, y1), (x2, y2), color=color, thickness=thickness)
trackids = [str(id) for id in trackids]
cv2.putText(im, ",".join(trackids), (int(x1+2), int(y1+12)), cv2.FONT_HERSHEY_COMPLEX, 0.6, color, 2)
return im
def draw_pieces(pieces_annos, img_dir, save_dir):
os.makedirs(save_dir, exist_ok=True)
frames = torch.unique(pieces_annos[:,:,0])
for frame in frames:
frame_bboxes = pieces_annos[pieces_annos[:, :, 0]==frame]
img = os.path.join(img_dir, "%06d.jpg" % frame)
im = cv2.imread(img)
for bbox in frame_bboxes:
trackid = bbox[1]
if trackid == 0:
continue
else:
coord = bbox[2:6]
occupy_indices = (frame_bboxes[:, 2:6] == coord)[:,0]
bboxes = frame_bboxes[occupy_indices]
trackids = torch.unique(bboxes[:, 1]).int().tolist()
im = draw_box(im, coord.numpy(), thickness=2, color=sample_colors[int(trackid)], trackids=trackids)
save_path = os.path.join(save_dir, "vis_%06d.jpg" % frame)
cv2.imwrite(save_path, im)
if __name__ == "__main__":
seq_name = "MOT17-02-DPM"
img_dir = "data/MOT17/train/{}/img1".format(seq_name)
anno = "data/MOT17/train_pieces/{}".format(seq_name)
index = 2895
piece_anno = torch.load("{}/{}_pieces.pth".format(anno, index))
# import pdb; pdb.set_trace()
for i in range(piece_anno.shape[0]):
piece_anno[i, piece_anno[i, :, 1] !=0, 1] = i+1
tracklet_anno = torch.load("{}/{}_tracklets.pth".format(anno, index))
draw_pieces(piece_anno, img_dir, "visualizations/{}/{}".format(seq_name, index))
cmd = "ffmpeg -y -r 10 -i visualizations/{}/{}/vis_%06d.jpg vis_{}_{}.mp4".format(seq_name, index, seq_name, index)
os.system(cmd)