Spaces:
Build error
Build error
"""Utilities for optimization and OpenVINO conversion.""" | |
# Copyright (C) 2020 Intel Corporation | |
# | |
# Licensed under the Apache License, Version 2.0 (the "License"); | |
# you may not use this file except in compliance with the License. | |
# You may obtain a copy of the License at | |
# | |
# http://www.apache.org/licenses/LICENSE-2.0 | |
# | |
# Unless required by applicable law or agreed to in writing, | |
# software distributed under the License is distributed on an "AS IS" BASIS, | |
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
# See the License for the specific language governing permissions | |
# and limitations under the License. | |
import json | |
import os | |
from pathlib import Path | |
from typing import Dict, List, Tuple, Union | |
import numpy as np | |
import torch | |
from torch import Tensor | |
from anomalib.models.components import AnomalyModule | |
def get_model_metadata(model: AnomalyModule) -> Dict[str, Tensor]: | |
"""Get meta data related to normalization from model. | |
Args: | |
model (AnomalyModule): Anomaly model which contains metadata related to normalization. | |
Returns: | |
Dict[str, Tensor]: metadata | |
""" | |
meta_data = {} | |
cached_meta_data = { | |
"image_threshold": model.image_threshold.cpu().value, | |
"pixel_threshold": model.pixel_threshold.cpu().value, | |
"pixel_mean": model.training_distribution.pixel_mean.cpu(), | |
"image_mean": model.training_distribution.image_mean.cpu(), | |
"pixel_std": model.training_distribution.pixel_std.cpu(), | |
"image_std": model.training_distribution.image_std.cpu(), | |
"min": model.min_max.min.cpu(), | |
"max": model.min_max.max.cpu(), | |
} | |
# Remove undefined values by copying in a new dict | |
for key, val in cached_meta_data.items(): | |
if not np.isinf(val).all(): | |
meta_data[key] = val | |
del cached_meta_data | |
return meta_data | |
def export_convert( | |
model: AnomalyModule, | |
input_size: Union[List[int], Tuple[int, int]], | |
onnx_path: Union[str, Path], | |
export_path: Union[str, Path], | |
): | |
"""Export the model to onnx format and convert to OpenVINO IR. | |
Args: | |
model (AnomalyModule): Model to convert. | |
input_size (Union[List[int], Tuple[int, int]]): Image size used as the input for onnx converter. | |
onnx_path (Union[str, Path]): Path to output onnx model. | |
export_path (Union[str, Path]): Path to exported OpenVINO IR. | |
""" | |
height, width = input_size | |
torch.onnx.export( | |
model.model, | |
torch.zeros((1, 3, height, width)).to(model.device), | |
onnx_path, | |
opset_version=11, | |
input_names=["input"], | |
output_names=["output"], | |
) | |
optimize_command = "mo --input_model " + str(onnx_path) + " --output_dir " + str(export_path) | |
os.system(optimize_command) | |
with open(Path(export_path) / "meta_data.json", "w", encoding="utf-8") as metadata_file: | |
meta_data = get_model_metadata(model) | |
# Convert metadata from torch | |
for key, value in meta_data.items(): | |
if isinstance(value, Tensor): | |
meta_data[key] = value.numpy().tolist() | |
json.dump(meta_data, metadata_file, ensure_ascii=False, indent=4) | |