🎨 [Update] drawer
Browse files- yolo/tools/drawer.py +24 -6
yolo/tools/drawer.py
CHANGED
@@ -1,5 +1,6 @@
|
|
1 |
import os
|
2 |
-
|
|
|
3 |
|
4 |
import numpy as np
|
5 |
import torch
|
@@ -15,6 +16,7 @@ def draw_bboxes(
|
|
15 |
scaled_bbox: bool = True,
|
16 |
save_path: str = "",
|
17 |
save_name: str = "visualize.png",
|
|
|
18 |
):
|
19 |
"""
|
20 |
Draw bounding boxes on an image.
|
@@ -32,20 +34,36 @@ def draw_bboxes(
|
|
32 |
bboxes = bboxes[0]
|
33 |
img = to_pil_image(img)
|
34 |
|
35 |
-
draw = ImageDraw.Draw(img)
|
36 |
width, height = img.size
|
37 |
-
|
|
|
|
|
|
|
38 |
|
39 |
for bbox in bboxes:
|
40 |
-
class_id, x_min, y_min, x_max, y_max, *conf = bbox
|
41 |
if scaled_bbox:
|
42 |
x_min = x_min * width
|
43 |
x_max = x_max * width
|
44 |
y_min = y_min * height
|
45 |
y_max = y_max * height
|
46 |
shape = [(x_min, y_min), (x_max, y_max)]
|
47 |
-
|
48 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
49 |
|
50 |
save_image_path = os.path.join(save_path, save_name)
|
51 |
img.save(save_image_path) # Save the image with annotations
|
|
|
1 |
import os
|
2 |
+
import random
|
3 |
+
from typing import List, Optional, Union
|
4 |
|
5 |
import numpy as np
|
6 |
import torch
|
|
|
16 |
scaled_bbox: bool = True,
|
17 |
save_path: str = "",
|
18 |
save_name: str = "visualize.png",
|
19 |
+
idx2label: Optional[list],
|
20 |
):
|
21 |
"""
|
22 |
Draw bounding boxes on an image.
|
|
|
34 |
bboxes = bboxes[0]
|
35 |
img = to_pil_image(img)
|
36 |
|
37 |
+
draw = ImageDraw.Draw(img, "RGBA")
|
38 |
width, height = img.size
|
39 |
+
try:
|
40 |
+
font = ImageFont.truetype("arial.ttf", 15)
|
41 |
+
except IOError:
|
42 |
+
font = ImageFont.load_default()
|
43 |
|
44 |
for bbox in bboxes:
|
45 |
+
class_id, x_min, y_min, x_max, y_max, *conf = [float(val) for val in bbox]
|
46 |
if scaled_bbox:
|
47 |
x_min = x_min * width
|
48 |
x_max = x_max * width
|
49 |
y_min = y_min * height
|
50 |
y_max = y_max * height
|
51 |
shape = [(x_min, y_min), (x_max, y_max)]
|
52 |
+
random.seed(int(class_id))
|
53 |
+
color_map = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
|
54 |
+
draw.rounded_rectangle(shape, outline=(*color_map, 170), radius=5)
|
55 |
+
draw.rounded_rectangle(shape, fill=(*color_map, 50), radius=5)
|
56 |
+
|
57 |
+
text_class = str(idx2label[int(class_id)] if idx2label else class_id)
|
58 |
+
label_text = f"{text_class}" + (f" {conf[0]: .0%}" if conf else "")
|
59 |
+
|
60 |
+
text_bbox = font.getbbox(label_text)
|
61 |
+
text_width = text_bbox[2] - text_bbox[0]
|
62 |
+
text_height = (text_bbox[3] - text_bbox[1]) * 1.25
|
63 |
+
|
64 |
+
text_background = [(x_min, y_min), (x_min + text_width, y_min + text_height)]
|
65 |
+
draw.rounded_rectangle(text_background, fill=(*color_map, 175), radius=2)
|
66 |
+
draw.text((x_min, y_min), label_text, fill="white", font=font)
|
67 |
|
68 |
save_image_path = os.path.join(save_path, save_name)
|
69 |
img.save(save_image_path) # Save the image with annotations
|