|
- """TODO: Add docstring."""
-
- import json
- import os
-
- import numpy as np
- import pyarrow as pa
- from dora import Node
-
- node = Node()
-
- IMAGE_RESIZE_RATIO = float(os.getenv("IMAGE_RESIZE_RATIO", "1.0"))
-
-
- def extract_bboxes(json_text):
- """Extract bounding boxes from a JSON string with markdown markers and return them as a NumPy array.
-
- Parameters
- ----------
- json_text : str
- JSON string containing bounding box data, including ```json markers.
-
- Returns
- -------
- np.ndarray: NumPy array of bounding boxes.
-
- """
- # Ensure all lines are stripped of whitespace and markers
- lines = json_text.strip().splitlines()
-
- # Filter out lines that are markdown markers
- clean_lines = [line for line in lines if not line.strip().startswith("```")]
-
- # Join the lines back into a single string
- clean_text = "\n".join(clean_lines)
- # Parse the cleaned JSON text
- try:
- data = json.loads(clean_text)
-
- # Extract bounding boxes
- bboxes = [item["bbox_2d"] for item in data]
- labels = [item["label"] for item in data]
-
- return np.array(bboxes), np.array(labels)
- except Exception as _e: # noqa
- pass
- return None, None
-
-
- for event in node:
- if event["type"] == "INPUT":
- if len(event["value"]) == 0:
- node.send_output("bbox_track", pa.array([]))
- continue
-
- text = event["value"][0].as_py()
- metadata = event["metadata"]
- image_id = event["metadata"]["image_id"]
-
- bboxes, labels = extract_bboxes(text)
- if bboxes is not None and len(bboxes) > 0:
- bboxes = bboxes * int(1 / IMAGE_RESIZE_RATIO)
- metadata["image_id"] = image_id
- metadata["encoding"] = "xyxy"
- metadata["labels"] = labels
- node.send_output(
- "bbox",
- pa.array(bboxes.ravel()),
- metadata,
- )
|