|
from ultralytics import YOLO |
|
import numpy as np |
|
from PIL import Image |
|
import io |
|
import base64 |
|
import torch |
|
|
|
def hf_predict(image_bytes): |
|
""" |
|
Inference function for Hugging Face Inference API |
|
|
|
Args: |
|
image_bytes: Image file bytes from a POST request |
|
|
|
Returns: |
|
dict: Detection results in a format compatible with the Inference API |
|
""" |
|
|
|
image = Image.open(io.BytesIO(image_bytes)).convert('RGB') |
|
|
|
|
|
model = YOLO('best.pt') |
|
|
|
|
|
results = model(image) |
|
|
|
|
|
result = results[0] |
|
boxes = result.boxes.xyxy.cpu().numpy() |
|
scores = result.boxes.conf.cpu().numpy() |
|
class_ids = result.boxes.cls.cpu().numpy() |
|
|
|
|
|
class_names = ["card"] |
|
labels = [class_names[int(i)] for i in class_ids] |
|
|
|
|
|
detections = [] |
|
for box, score, label in zip(boxes, scores, labels): |
|
x1, y1, x2, y2 = box |
|
detections.append({ |
|
"box": { |
|
"xmin": int(x1), |
|
"ymin": int(y1), |
|
"xmax": int(x2), |
|
"ymax": int(y2) |
|
}, |
|
"score": float(score), |
|
"label": label |
|
}) |
|
|
|
return {"detections": detections} |
|
|
|
def visualize(image_bytes, detections): |
|
""" |
|
Visualize the detections on the image |
|
|
|
Args: |
|
image_bytes: Image file bytes |
|
detections: Detection results |
|
|
|
Returns: |
|
str: Base64 encoded image with visualizations |
|
""" |
|
try: |
|
import cv2 |
|
|
|
|
|
nparr = np.frombuffer(image_bytes, np.uint8) |
|
image = cv2.imdecode(nparr, cv2.IMREAD_COLOR) |
|
|
|
|
|
for det in detections["detections"]: |
|
box = det["box"] |
|
score = det["score"] |
|
label = det["label"] |
|
|
|
x1, y1 = box["xmin"], box["ymin"] |
|
x2, y2 = box["xmax"], box["ymax"] |
|
|
|
cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2) |
|
cv2.putText(image, f"{label}: {score:.2f}", (x1, y1 - 10), |
|
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) |
|
|
|
|
|
_, buffer = cv2.imencode('.jpg', image) |
|
return base64.b64encode(buffer).decode('utf-8') |
|
except: |
|
return None |
|
|