from typing import List, Sequence import numpy as np import onnxruntime as rt from src.app.configurations import _ModelConfigurations from src.app.constants import MODEL_RUNTIME from src.app.ml.base_predictor import BaseData, BaseDataInterface, BaseDataConverter, BasePredictor from src.app.ml.save_helper import load_labels import logging logger = logging.getLogger(__name__) LABELS = load_labels(_ModelConfigurations().options["label_filepath"]) class _Data(BaseData): test_data: List[List[int]] = [[5.1, 3.5, 1.4, 0.2]] labels: List[str] = LABELS class _DataInterface(BaseDataInterface): pass class _DataConverter(BaseDataConverter): pass class _Classifier(BasePredictor): def __init__(self, model_runners): self.model_runners = model_runners
def main(): modelname = "resnet50_onnx" interface_filename = f"{modelname}.yaml" model = resnet50(pretrained=True) x_dummy = torch.rand((1, 3, 224, 224), device="cpu") model.eval() torch.onnx.export( model, x_dummy, MODEL_FILEPATH, export_params=True, opset_version=10, do_constant_folding=True, input_names=["input"], output_names=["output"], verbose=False, ) labels = load_labels(LABEL_FILEPATH) preprocess = PytorchImagePreprocessTransformer() image = Image.open(SAMPLE_IMAGE) np_image = preprocess.transform(image) print(np_image.shape) preprocess_name = f"{modelname}_preprocess_transformer" preprocess_filename = f"{preprocess_name}.pkl" preprocess_filepath = os.path.join(MODEL_DIR, preprocess_filename) dump_sklearn(preprocess, preprocess_filepath) sess = rt.InferenceSession(MODEL_FILEPATH) inp, out = sess.get_inputs()[0], sess.get_outputs()[0] print(f"input name='{inp.name}' shape={inp.shape} type={inp.type}") print(f"output name='{out.name}' shape={out.shape} type={out.type}") pred_onx = sess.run([out.name], {inp.name: np_image}) postprocess = SoftmaxTransformer() postprocess_name = f"{modelname}_softmax_transformer" postprocess_filename = f"{postprocess_name}.pkl" postprocess_filepath = os.path.join(MODEL_DIR, postprocess_filename) dump_sklearn(postprocess, postprocess_filepath) prediction = postprocess.transform(np.array(pred_onx)) print(prediction.shape) print(labels[np.argmax(prediction[0])]) save_interface( modelname, os.path.join(MODEL_DIR, interface_filename), [1, 3, 224, 224], "float32", [1, 1000], "float32", DATA_TYPE.IMAGE, [{ preprocess_filepath: MODEL_RUNTIME.SKLEARN }, { MODEL_FILEPATH: MODEL_RUNTIME.ONNX_RUNTIME }, { postprocess_filepath: MODEL_RUNTIME.SKLEARN }], PREDICTION_TYPE.CLASSIFICATION, "src.app.ml.resnet50_onnx.resnet50_predictor", label_filepath=LABEL_FILEPATH, )
from src.app.ml.save_helper import save_interface, load_labels, dump_sklearn from src.app.ml.transformers import TFImagePreprocessTransformer, SoftmaxTransformer from src.app.ml.extract_from_tfhub import get_model WORK_DIR = './src/app/ml/inceptionv3/' MODEL_DIR = os.path.join(WORK_DIR, 'model') SAVEDMODEL_DIR = os.path.join(MODEL_DIR, 'savedmodel/inceptionv3/4') PB_FILE = os.path.join(SAVEDMODEL_DIR, 'saved_model.pb') HUB_URL = 'https://tfhub.dev/google/imagenet/inception_v3/classification/4' DATA_DIR = os.path.join(WORK_DIR, 'data') SAMPLE_IMAGE = os.path.join(DATA_DIR, 'good_cat.jpg') LABEL_FILEPATH = os.path.join(DATA_DIR, 'imagenet_labels_1001.json') LABELS = load_labels(LABEL_FILEPATH) def validate(image, preprocess, predictor, postprocess): np_image = preprocess.transform(image) result = predictor.predict(np_image) result_proba = postprocess.transform(result) print(result_proba) top1_index = np.argmax(result_proba[0], axis=-1) print(top1_index) print(LABELS[top1_index]) def main(): os.makedirs(SAVEDMODEL_DIR, exist_ok=True)
import os from onnx import numpy_helper from google.protobuf.json_format import MessageToJson from src.app.configurations import ModelConfigurations from src.app.constants import MODEL_RUNTIME from src.app.ml.base_predictor import BaseData, BaseDataInterface, BaseDataConverter, BasePredictor from src.app.ml.transformers import PytorchImagePreprocessTransformer, SoftmaxTransformer from src.app.ml.save_helper import load_labels from src.app.ml.resnet50_onnx_server.proto import predict_pb2, onnx_ml_pb2 import logging logger = logging.getLogger(__name__) LABELS = load_labels(ModelConfigurations.options['label_filepath']) ONNX_RUNTIME_SERVER_HTTP = os.getenv('ONNX_RUNTIME_SERVER_HTTP', 'prep_pred_onnx_resnet50:8001') MODEL_NAME = os.getenv('MODEL_NAME', 'default') VERSION = int(os.getenv('VERSION', 1)) TIMEOUT_SECOND = int(os.getenv('TIMEOUT_SECOND', 5.0)) class _Data(BaseData): image_data: Any = None test_data: str = os.path.join('./src/app/ml/resnet50_onnx/data', 'good_cat.jpg') labels: List[str] = LABELS class _DataInterface(BaseDataInterface):