jaguarid / app.py
Eshieh2's picture
update to use object detection for heads and pass off classification. Use ImageAnnotation result to annotate detections
f61333d
raw
history blame
1.83 kB
import gradio as gr
import tensorflow as tf
import numpy as np
import requests
import torch
from huggingface_hub import snapshot_download
from huggingface_hub import hf_hub_download
label_count = 51
def readLines(filename):
with open(filename,'r') as f:
return(f.read().splitlines())
labels = ["missing"] * label_count
labels = readLines('labels.txt')
valid = readLines('valid.txt')
model_path = snapshot_download(repo_id="eshieh2/jaguarid_pantanal")
model = tf.saved_model.load(f"{model_path}/saved_model")
serving = model.signatures['serving_default']
detector_path = hf_hub_download(repo_id= "eshieh2/jaguarhead",
filename = "jaguarheadv5.pt")
detector = torch.hub.load('ultralytics/yolov5', 'custom', path = detector_path)
def classify_image(in_image):
width,height = in_image.size
heads = detector(in_image)
masks = [] # tuple of box coords and string
for head in heads.xyxy[0]:
x,y,x2,y2,pct,cls = head.numpy()
w = x2 - x
h = y2 - y
inp = in_image.crop((x,y,x2,y2))
inp = inp.resize((480,480))
inp = np.array(inp)
inp = np.reshape(inp,(-1, 480, 480, 3)).astype(np.float32)
inp = np.divide(inp,255.0)
prediction = serving(tf.convert_to_tensor(inp))['model']
prediction = tf.squeeze(prediction)
pred = {labels[i]: float(prediction[i]) for i in range(label_count)}
#print(pred)
max_key = max(pred, key=pred.get)
rect = (int(x),int(y),int(x2),int(y2))
if max_key.lower() in valid:
masks.append((rect,f"{max_key}:{pct}"))
else:
masks.append((rect,f"unknown",))
return (in_image,masks)
image = gr.Image(type='pil')
output = gr.AnnotatedImage()
gr.Interface(fn=classify_image, inputs=image, outputs=output, examples = [["kasimir.jpg"],["guaraci.jpg"],["marcela.jpg"]]).launch()