Untitled

 avatar
unknown
python
2 years ago
2.3 kB
11
Indexable
import json
import base64
import io
from PIL import Image
import yaml
from ultralytics import YOLO
from json import JSONEncoder
import numpy as np


class NumpyFloatValuesEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, np.float32):
            return float(obj)
        return JSONEncoder.default(self, obj)


def convert_predictions_to_cvat_json(predictions, labels):
    result = []
    if predictions:
        boxes = predictions[0].boxes

        label_ids = boxes.cls.cpu().numpy().tolist()
        confidence_scores = boxes.conf.cpu().numpy().tolist()
        points = predictions[0].masks.xy
        masks = predictions[0].masks.data.cpu().numpy()

        for i in range(len(label_ids)):
            result.append(
                {
                    "confidence": confidence_scores[i],
                    "label": labels.get(label_ids[i], "unknown"),
                    "points": points[i].flatten().tolist(),
                    "mask": masks[i].tolist(),
                    "type": "mask",
                }
            )

    return result


def init_context(context):
    global labels

    context.logger.info("Init context...  0%")

    # Read labels
    with open("/opt/nuclio/function-gpu.yaml", 'rb') as function_file:
        functionconfig = yaml.safe_load(function_file)

    labels_spec = functionconfig['metadata']['annotations']['spec']
    labels = {item['id']: item['name'] for item in json.loads(labels_spec)}

    model = YOLO("/opt/nuclio/model/best.pt")
    context.user_data.model = model

    context.logger.info("Init context...100%")

def handler(context, event):
    context.logger.info("Run Yolo model")
    data = event.body
    buf = io.BytesIO(base64.b64decode(data["image"]))
    threshold = float(data.get("threshold", 0.5))
    image = Image.open(buf)

    predictions = context.user_data.model(image)

    results = convert_predictions_to_cvat_json(predictions, labels)

    # context.logger.info("Results: " + json.dumps(results))
    context.logger.info("Sending results to user...")

    return context.Response(
        body=json.dumps(results),
        headers={},
        content_type='application/json',
        status_code=200
    )
Editor is loading...
Leave a Comment