|
import json |
|
import numpy as np |
|
|
|
from matplotlib import cm |
|
import matplotlib |
|
from PIL import Image, ImageColor, ImageFont, ImageDraw |
|
import numpy as np |
|
import pdb |
|
from datetime import date |
|
today = date.today() |
|
FONTS = {'amiko': "fonts/Amiko-Regular.ttf", |
|
'nature': "fonts/LoveNature.otf", |
|
'painter':"fonts/PainterDecorator.otf", |
|
'animals': "fonts/UncialAnimals.ttf", |
|
'zen': "fonts/ZEN.TTF"} |
|
|
|
|
|
|
|
def draw_keypoints_on_image(image, |
|
keypoints, |
|
map_label_id_to_str, |
|
flag_show_str_labels, |
|
use_normalized_coordinates=True, |
|
font_style='amiko', |
|
font_size=8, |
|
keypt_color="#ff0000", |
|
marker_size=2, |
|
): |
|
"""Draws keypoints on an image. |
|
Modified from: |
|
https://www.programcreek.com/python/?code=fjchange%2Fobject_centric_VAD%2Fobject_centric_VAD-master%2Fobject_detection%2Futils%2Fvisualization_utils.py |
|
Args: |
|
image: a PIL.Image object. |
|
keypoints: a numpy array with shape [num_keypoints, 2]. |
|
map_label_id_to_str: dict with keys=label number and values= label string |
|
flag_show_str_labels: boolean to select whether or not to show string labels |
|
color: color to draw the keypoints with. Default is red. |
|
radius: keypoint radius. Default value is 2. |
|
use_normalized_coordinates: if True (default), treat keypoint values as |
|
relative to the image. Otherwise treat them as absolute. |
|
|
|
|
|
""" |
|
|
|
draw = ImageDraw.Draw(image,"RGBA") |
|
|
|
im_width, im_height = image.size |
|
keypoints_x = [k[0] for k in keypoints] |
|
keypoints_y = [k[1] for k in keypoints] |
|
alpha = [k[2] for k in keypoints] |
|
norm = matplotlib.colors.Normalize(vmin=0, vmax=255) |
|
|
|
|
|
print (keypoints) |
|
|
|
names_for_color = [i for i in map_label_id_to_str.keys()] |
|
colores = np.linspace(0, 255, num=len(names_for_color),dtype= int) |
|
|
|
|
|
if use_normalized_coordinates: |
|
keypoints_x = tuple([im_width * x for x in keypoints_x]) |
|
keypoints_y = tuple([im_height * y for y in keypoints_y]) |
|
|
|
|
|
cmap2 = matplotlib.cm.get_cmap('Greys') |
|
|
|
for i, (keypoint_x, keypoint_y) in enumerate(zip(keypoints_x, keypoints_y)): |
|
round_fill = list(cm.viridis(norm(colores[i]),bytes=True)) |
|
|
|
if np.isnan(keypoint_x).any(): |
|
continue |
|
|
|
if np.isnan(alpha[i]) == False : |
|
round_fill[3] = round(alpha[i] *255) |
|
|
|
|
|
draw.ellipse([(keypoint_x - marker_size, keypoint_y - marker_size), |
|
(keypoint_x + marker_size, keypoint_y + marker_size)], |
|
fill=tuple(round_fill), outline= 'black', width=1) |
|
|
|
|
|
if flag_show_str_labels: |
|
font = ImageFont.truetype(FONTS[font_style], |
|
font_size) |
|
draw.text((keypoint_x + marker_size, keypoint_y + marker_size), |
|
map_label_id_to_str[i], |
|
ImageColor.getcolor(keypt_color, "RGB"), |
|
font=font) |
|
|
|
|
|
|
|
def draw_bbox_w_text(img, |
|
results, |
|
font_style='amiko', |
|
font_size=8): |
|
|
|
bbxyxy = results |
|
w, h = bbxyxy[2], bbxyxy[3] |
|
shape = [(bbxyxy[0], bbxyxy[1]), (w , h)] |
|
imgR = ImageDraw.Draw(img) |
|
imgR.rectangle(shape, outline ="red",width=5) |
|
|
|
confidence = bbxyxy[4] |
|
string_bb = 'animal ' + str(round(confidence, 2)) |
|
font = ImageFont.truetype(FONTS[font_style], font_size) |
|
|
|
text_size = font.getbbox(string_bb) |
|
position = (bbxyxy[0],bbxyxy[1] - text_size[1] -2 ) |
|
left, top, right, bottom = imgR.textbbox(position, string_bb, font=font) |
|
imgR.rectangle((left, top-5, right+5, bottom+5), fill="red") |
|
imgR.text((bbxyxy[0] + 3 ,bbxyxy[1] - text_size[1] -2 ), string_bb, font=font, fill="black") |
|
|
|
return imgR |
|
|
|
|
|
def save_results_as_json(md_results, dlc_outputs, map_dlc_label_id_to_str, thr,model,mega_model_input, path_to_output_file = 'download_predictions.json'): |
|
|
|
""" |
|
Output detections as json file |
|
|
|
""" |
|
|
|
info = {} |
|
info['date'] = str(today) |
|
info['MD_model'] = str(mega_model_input) |
|
|
|
info['file']= md_results.files[0] |
|
number_bb = len(md_results.xyxy[0].tolist()) |
|
info['number_of_bb'] = number_bb |
|
|
|
number_bb_thr = len(dlc_outputs) |
|
labels = [n for n in map_dlc_label_id_to_str.values()] |
|
|
|
|
|
new_index = [] |
|
for i in range(number_bb): |
|
corner_x1,corner_y1,corner_x2,corner_y2,confidence, _ = md_results.xyxy[0].tolist()[i] |
|
|
|
if confidence > thr: |
|
new_index.append(i) |
|
|
|
|
|
for i in range(number_bb_thr): |
|
aux={} |
|
|
|
corner_x1,corner_y1,corner_x2,corner_y2,confidence, _ = md_results.xyxy[0].tolist()[new_index[i]] |
|
aux['corner_1'] = (corner_x1,corner_y1) |
|
aux['corner_2'] = (corner_x2,corner_y2) |
|
aux['predict MD'] = md_results.names[0] |
|
aux['confidence MD'] = confidence |
|
|
|
|
|
info['dlc_model'] = model |
|
kypts = [] |
|
for s in dlc_outputs[i]: |
|
aux1 = [] |
|
for j in s: |
|
aux1.append(float(j)) |
|
|
|
kypts.append(aux1) |
|
aux['dlc_pred'] = dict(zip(labels,kypts)) |
|
info['bb_' + str(new_index[i]) ]=aux |
|
|
|
|
|
with open(path_to_output_file, 'w') as f: |
|
json.dump(info, f, indent=1) |
|
print('Output file saved at {}'.format(path_to_output_file)) |
|
|
|
return path_to_output_file |
|
|
|
|
|
def save_results_only_dlc(dlc_outputs,map_label_id_to_str,model,output_file = 'dowload_predictions_dlc.json'): |
|
|
|
""" |
|
write json dlc output |
|
""" |
|
info = {} |
|
info['date'] = str(today) |
|
labels = [n for n in map_label_id_to_str.values()] |
|
info['dlc_model'] = model |
|
kypts = [] |
|
for s in dlc_outputs: |
|
aux1 = [] |
|
for j in s: |
|
aux1.append(float(j)) |
|
|
|
kypts.append(aux1) |
|
info['dlc_pred'] = dict(zip(labels,kypts)) |
|
|
|
with open(output_file, 'w') as f: |
|
json.dump(info, f, indent=1) |
|
print('Output file saved at {}'.format(output_file)) |
|
|
|
return output_file |
|
|
|
|
|
|