Seed1.5-VL / visualizer.py
wondervictor's picture
add files
3ed4749
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