Seed1.5-VL / visualizer.py
wondervictor's picture
add files
3ed4749
raw
history blame
3.92 kB
import os
import cv2
import numpy as np
import supervision as sv
from PIL import Image, ImageDraw, ImageFont
from supervision.annotators.utils import resolve_color
# visualization toos based on supervision
BOUNDING_BOX_ANNOTATOR = sv.BoundingBoxAnnotator(thickness=2)
class LabelAnnotator(sv.LabelAnnotator):
@staticmethod
def resolve_text_background_xyxy(
center_coordinates,
text_wh,
position,
):
center_x, center_y = center_coordinates
text_w, text_h = text_wh
return center_x, center_y, center_x + text_w, center_y + text_h
def _draw_labels(
self,
scene: np.ndarray,
labels: list[str],
label_properties: np.ndarray,
detections,
custom_color_lookup,
) -> None:
assert len(labels) == len(label_properties) == len(detections), (
f"Number of label properties ({len(label_properties)}), "
f"labels ({len(labels)}) and detections ({len(detections)}) "
"do not match."
)
color_lookup = (
custom_color_lookup
if custom_color_lookup is not None
else self.color_lookup
)
font = ImageFont.truetype("simhei.ttf", int(30 * self.text_scale))
for idx, label_property in enumerate(label_properties):
background_color = resolve_color(
color=self.color,
detections=detections,
detection_idx=idx,
color_lookup=color_lookup,
)
text_color = resolve_color(
color=self.text_color,
detections=detections,
detection_idx=idx,
color_lookup=color_lookup,
)
box_xyxy = label_property[:4]
text_height_padded = label_property[4]
self.draw_rounded_rectangle(
scene=scene,
xyxy=box_xyxy,
color=background_color.as_bgr(),
border_radius=self.border_radius,
)
text_x = box_xyxy[0] + self.text_padding
text_y = box_xyxy[1]
scene_pil = Image.fromarray(cv2.cvtColor(scene, cv2.COLOR_BGR2RGB))
draw = ImageDraw.Draw(scene_pil)
draw.text(
(text_x, text_y),
labels[idx],
font=font,
fill=(text_color.r, text_color.g, text_color.b),
)
scene[:] = cv2.cvtColor(np.array(scene_pil), cv2.COLOR_RGB2BGR)
LABEL_ANNOTATOR = LabelAnnotator(text_padding=4,
text_scale=0.5,
text_thickness=1)
POINT_ANNOTATOR = sv.DotAnnotator(radius=6)
def draw_boxes_points_with_labels(
cv2_image,
boxes=None,
points=None,
classes=None,
output_path=None,
):
annotated_image = cv2.cvtColor(cv2_image, cv2.COLOR_BGR2RGB)
if boxes is not None and boxes.size:
detections = sv.Detections(
xyxy=boxes,
class_id=np.arange(len(boxes)),
confidence=np.ones(len(boxes))
)
annotated_image = BOUNDING_BOX_ANNOTATOR.annotate(
annotated_image, detections)
if points is not None and points.size:
points = np.concatenate([points, points], axis=1)
detections = sv.Detections(
xyxy=points,
class_id=np.arange(len(points)),
confidence=np.ones(len(points))
)
annotated_image = POINT_ANNOTATOR.annotate(
annotated_image, detections,
)
if classes:
annotated_image = LABEL_ANNOTATOR.annotate(
annotated_image, detections, labels=classes
)
if output_path:
cv2.imwrite(
output_path,
cv2.cvtColor(annotated_image, cv2.COLOR_RGB2BGR)
)
return annotated_image