clearml-serving/examples/keras/preprocess.py

45 lines
1.7 KiB
Python
Raw Normal View History

import io
from typing import Any, Union
import numpy as np
from PIL import Image, ImageOps
from clearml import StorageManager
2022-03-30 17:30:50 +00:00
# Notice Preprocess class Must be named "Preprocess"
class Preprocess(object):
def __init__(self):
# set internal state, this will be called only once. (i.e. not per request)
pass
def preprocess(self, body: Union[bytes, dict], state: dict, collect_custom_statistics_fn=None) -> Any:
# we expect to get two valid on the dict x0, and x1
if isinstance(body, bytes):
# we expect to get a stream of encoded image bytes
try:
image = Image.open(io.BytesIO(body)).convert("RGB")
except Exception:
2022-10-07 23:12:18 +00:00
# value error would return 404, we want to return 500 so any other exception
raise RuntimeError("Image could not be decoded")
if isinstance(body, dict) and "url" in body.keys():
# image is given as url, and is fetched
url = body.get("url")
local_file = StorageManager.get_local_copy(remote_url=url)
image = Image.open(local_file)
image = ImageOps.grayscale(image).resize((28, 28))
2023-04-11 06:15:54 +00:00
return np.array([np.array(image)])
def postprocess(self, data: Any, state: dict, collect_custom_statistics_fn=None) -> dict:
# post process the data returned from the model inference engine
# data is the return value from model.predict we will put is inside a return value as Y
if not isinstance(data, np.ndarray):
# this should not happen
return dict(digit=-1)
# data is returned as probability per class (10 class/digits)
return dict(digit=int(data.flatten().argmax()))