|
|
|
import base64 |
|
from io import BytesIO |
|
import os |
|
from typing import Dict, List, Any |
|
import cv2 |
|
import groundingdino |
|
from groundingdino.util.inference import load_model, load_image, predict, annotate |
|
import tempfile |
|
|
|
|
|
HOME = os.getcwd() |
|
|
|
|
|
PACKAGE_HOME = os.path.dirname(groundingdino.__file__) |
|
CONFIG_PATH = os.path.join(PACKAGE_HOME, "config", "GroundingDINO_SwinT_OGC.py") |
|
|
|
class EndpointHandler(): |
|
def __init__(self, path): |
|
|
|
|
|
self.model = load_model(CONFIG_PATH, os.path.join(path, "weights", "groundingdino_swint_ogc.pth")) |
|
|
|
self.box_threshold = 0.35 |
|
self.text_threshold = 0.25 |
|
|
|
def __call__(self, data: Dict[str, Any]) -> List[Dict[str, Any]]: |
|
""" |
|
data args: |
|
inputs (:obj: `str` | `PIL.Image` | `np.array`) |
|
kwargs |
|
Return: |
|
A :obj:`list` | `dict`: will be serialized and returned |
|
""" |
|
inputs = data.pop("inputs") |
|
image_base64 = inputs.pop("image") |
|
prompt = inputs.pop("prompt") |
|
|
|
image_data = base64.b64decode(image_base64) |
|
|
|
with tempfile.NamedTemporaryFile(suffix=".jpg", delete=True) as f: |
|
f.write(image_data) |
|
image_source, image = load_image(f.name) |
|
boxes, logits, phrases = predict( |
|
model=self.model, |
|
image=image, |
|
caption=prompt, |
|
box_threshold=self.box_threshold, |
|
text_threshold=self.text_threshold |
|
) |
|
annotated_frame = annotate(image_source=image_source, boxes=boxes, logits=logits, phrases=phrases) |
|
_, annotated_image = cv2.imencode(".jpg", annotated_frame) |
|
annotated_image_b64 = base64.b64encode(annotated_image).decode("utf-8") |
|
num_found = boxes.size[0] |
|
|
|
return [{ |
|
"image": annotated_image_b64, |
|
"prompt": prompt, |
|
"num_found": num_found, |
|
}] |
|
|