Untitled
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