insecta / app.py
George
Update app.py
1f88ee5
raw
history blame
2.39 kB
import cv2
import khandy
import numpy as np
import gradio as gr
from PIL import Image
from insectid import InsectDetector
from insectid import InsectIdentifier
def inference(filename):
detector = InsectDetector()
identifier = InsectIdentifier()
image = khandy.imread(filename)
if image is None:
return None
if max(image.shape[:2]) > 1280:
image = khandy.resize_image_long(image, 1280)
image_for_draw = image.copy()
image_height, image_width = image.shape[:2]
boxes, confs, classes = detector.detect(image)
for box, _, _ in zip(boxes, confs, classes):
box = box.astype(np.int32)
box_width = box[2] - box[0] + 1
box_height = box[3] - box[1] + 1
if box_width < 30 or box_height < 30:
continue
cropped = khandy.crop_or_pad(image, box[0], box[1], box[2], box[3])
results = identifier.identify(cropped)
print(results[0])
prob = results[0]['probability']
if prob < 0.10:
text = 'Unknown'
else:
text = '{} {}: {:.2f}%'.format(
results[0]['chinese_name'],
results[0]['latin_name'],
100.0 * results[0]['probability']
)
position = [box[0] + 2, box[1] - 20]
position[0] = min(max(position[0], 0), image_width)
position[1] = min(max(position[1], 0), image_height)
cv2.rectangle(
image_for_draw,
(box[0], box[1]),
(box[2], box[3]),
(0, 255, 0),
2
)
image_for_draw = khandy.draw_text(
image_for_draw,
text,
position,
font='simsun.ttc',
font_size=15
)
return Image.fromarray(image_for_draw[:, :, ::-1], mode='RGB')
with gr.Blocks() as demo:
with gr.Tab("Image"):
gr.Markdown("## Insect Inference on Image")
with gr.Row():
image_input = gr.Image(
type='filepath',
label="Input Image",
source="upload"
)
image_output = gr.Image(
type='pil',
label="Output Image",
source="canvas"
)
text_button = gr.Button("Detect")
text_button.click(inference, inputs=image_input, outputs=image_output)
demo.launch()