KB Teo
Update app.py
32f1589
raw
history blame
2.3 kB
from typing import *
import importlib
from pathlib import Path
import cv2
import gradio as gr
import numpy as np
available_modes = []
inferencer = None
last_model_path: str = None
if importlib.util.find_spec("openvino"):
available_modes.append("OpenVINO")
from inference.openvino import OpenVINOInferencer
def predict_openvino(
image: Union[str, Path, np.ndarray],
model_path: Union[str, Path],
device: str,
threshold: float) -> Dict[str, np.ndarray]:
global inferencer, last_model_path
if not isinstance(inferencer, OpenVINOInferencer) or last_model_path != str(model_path):
inferencer = OpenVINOInferencer(
path = model_path,
device=device.upper()
)
last_model_path = str(model_path)
inferencer.metadata["pixel_threshold"] = threshold
return inferencer(image)
def draw_contour(image, mask, color=(255,0,0), thickness=3):
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
return cv2.drawContours(image.copy(), contours, -1, color, thickness)
def convert_to_heatmap(heatmap):
heatmap = cv2.applyColorMap((heatmap*255).astype("uint8"), cv2.COLORMAP_HSV)
return heatmap
def predict(image, threshold, device, model_dir):
outputs = predict_openvino(image, model_dir, device, threshold)
out_image = draw_contour(image, outputs["pred_mask"])
heatmap = convert_to_heatmap(outputs["anomaly_map"])
return out_image, heatmap
def launch():
input_image = gr.Image(
label="Input image",
value="images/171436008_Fail.jpeg"
)
threshold = gr.Slider(value=5.5, step=0.1, label="Threshold")
devices = gr.Radio(
label="Device",
choices=["AUTO", "CPU", "GPU"],
value="CPU",
interactive=False
)
output_image = gr.Image(label="Output image")
output_heatmap = gr.Image(label="Heatmap")
model = gr.Text(label="Model", interactive=False, value="models/glass-tr-5-ov")
intf = gr.Interface(
title="Anomaly Detection",
fn=predict,
inputs=[input_image, threshold, devices, model],
outputs=[output_image, output_heatmap]
)
intf.launch()
if __name__ == "__main__":
launch()