import cv2 import numpy as np from util.utils import renorm from util.misc import color_sys _color_getter = color_sys(100) # plot known and unknown box def add_box_to_img(img, boxes, colorlist, brands=None): """[summary] Args: img ([type]): np.array, H,W,3 boxes ([type]): list of list(4) colorlist: list of colors. brands: text. Return: img: np.array. H,W,3. """ H, W = img.shape[:2] for _i, (box, color) in enumerate(zip(boxes, colorlist)): x, y, w, h = box[0] * W, box[1] * H, box[2] * W, box[3] * H img = cv2.rectangle(img.copy(), (int(x-w/2), int(y-h/2)), (int(x+w/2), int(y+h/2)), color, 2) if brands is not None: brand = brands[_i] org = (int(x-w/2), int(y+h/2)) font = cv2.FONT_HERSHEY_SIMPLEX fontScale = 0.5 thickness = 1 img = cv2.putText(img.copy(), str(brand), org, font, fontScale, color, thickness, cv2.LINE_AA) return img def plot_dual_img(img, boxes, labels, idxs, probs=None): """[summary] Args: img ([type]): 3,H,W. tensor. boxes (): tensor(Kx4) or list of tensor(1x4). labels ([type]): list of ints. idxs ([type]): list of ints. probs (optional): listof floats. Returns: img_classcolor: np.array. H,W,3. img with class-wise label. img_seqcolor: np.array. H,W,3. img with seq-wise label. """ boxes = [i.cpu().tolist() for i in boxes] img = (renorm(img.cpu()).permute(1,2,0).numpy() * 255).astype(np.uint8) # plot with class class_colors = [_color_getter(i) for i in labels] if probs is not None: brands = ["{},{:.2f}".format(j,k) for j,k in zip(labels, probs)] else: brands = labels img_classcolor = add_box_to_img(img, boxes, class_colors, brands=brands) # plot with seq seq_colors = [_color_getter((i * 11) % 100) for i in idxs] img_seqcolor = add_box_to_img(img, boxes, seq_colors, brands=idxs) return img_classcolor, img_seqcolor def plot_raw_img(img, boxes, labels): """[summary] Args: img ([type]): 3,H,W. tensor. boxes ([type]): Kx4. tensor labels ([type]): K. tensor. return: img: np.array. H,W,3. img with bbox annos. """ img = (renorm(img.cpu()).permute(1,2,0).numpy() * 255).astype(np.uint8) H, W = img.shape[:2] for box, label in zip(boxes.tolist(), labels.tolist()): x, y, w, h = box[0] * W, box[1] * H, box[2] * W, box[3] * H img = cv2.rectangle(img.copy(), (int(x-w/2), int(y-h/2)), (int(x+w/2), int(y+h/2)), _color_getter(label), 2) # add text org = (int(x-w/2), int(y+h/2)) font = cv2.FONT_HERSHEY_SIMPLEX fontScale = 1 thickness = 1 img = cv2.putText(img.copy(), str(label), org, font, fontScale, _color_getter(label), thickness, cv2.LINE_AA) return img