| import json | |
| from typing import Any, Dict, List | |
| import tensorflow as tf | |
| from tensorflow import keras | |
| import base64 | |
| import io | |
| import os | |
| import numpy as np | |
| from PIL import Image | |
| class PreTrainedPipeline(): | |
| def __init__(self, path: str): | |
| self.model = keras.models.load_model(os.path.join(path, "tf_model.h5")) | |
| def __call__(self, inputs: "Image.Image")-> List[Dict[str, Any]]: | |
| with Image.open(inputs) as img: | |
| img = np.array(img) | |
| im = tf.image.resize(img, (128, 128)) | |
| im = tf.cast(im, tf.float32) / 255.0 | |
| pred_mask = model.predict(im[tf.newaxis, ...]) | |
| pred_mask_arg = tf.argmax(pred_mask, axis=-1) | |
| labels = [] | |
| binary_masks = {} | |
| mask_codes = {} | |
| for cls in range(pred_mask.shape[-1]): | |
| binary_masks[f"mask_{cls}"] = np.zeros(shape = (pred_mask.shape[1], pred_mask.shape[2])) | |
| for row in range(pred_mask_arg[0][1].get_shape().as_list()[0]): | |
| for col in range(pred_mask_arg[0][2].get_shape().as_list()[0]): | |
| if pred_mask_arg[0][row][col] == cls: | |
| binary_masks[f"mask_{cls}"][row][col] = 1 | |
| else: | |
| binary_masks[f"mask_{cls}"][row][col] = 0 | |
| mask = binary_masks[f"mask_{cls}"] | |
| mask *= 255 | |
| img = Image.fromarray(mask.astype(np.int8), mode="L") | |
| with io.BytesIO() as out: | |
| img.save(out, format="PNG") | |
| png_string = out.getvalue() | |
| mask = base64.b64encode(png_string).decode("utf-8") | |
| mask_codes[f"mask_{cls}"] = mask | |
| labels.append({ | |
| "label": f"LABEL_{cls}", | |
| "mask": mask_codes[f"mask_{cls}"], | |
| "score": 1.0, | |
| }) | |
| return labels |