Spaces:
Running
Running
File size: 2,993 Bytes
67a9b5d 662135a c1688c1 662135a 67a9b5d c1688c1 67a9b5d c1688c1 67a9b5d c1688c1 67a9b5d 850d541 c1688c1 850d541 c1688c1 850d541 c1688c1 850d541 662135a 850d541 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
import cv2
import khandy
import numpy as np
import gradio as gr
from PIL import Image
from modelscope import snapshot_download
from insectid import InsectDetector, InsectIdentifier
MODEL_DIR = snapshot_download(
"Genius-Society/insecta",
cache_dir="./insectid/__pycache__",
)
def infer(filename: str):
if not filename:
None, "Please upload a picture"
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)
text = "Unknown"
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 = "{}: {:.2f}%".format(
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=f"{MODEL_DIR}/simsun.ttc",
font_size=15,
)
outxt = text.split(":")[0] if ":" in text else text
return Image.fromarray(image_for_draw[:, :, ::-1], mode="RGB"), outxt
if __name__ == "__main__":
with gr.Blocks() as demo:
gr.Interface(
fn=infer,
inputs=gr.Image(label="Upload insect picture", type="filepath"),
outputs=[
gr.Image(label="Recognition result"),
gr.Textbox(label="Best match", show_copy_button=True),
],
title="Image file format support PNG, JPG, JPEG and BMP, and the file size does not exceed 10M.",
examples=[
f"{MODEL_DIR}/examples/butterfly.jpg",
f"{MODEL_DIR}/examples/beetle.jpg",
],
flagging_mode="never",
cache_examples=False,
)
gr.HTML(
"""
<iframe src="//player.bilibili.com/player.html?bvid=BV14krgYJE4B&autoplay=0" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true" width="100%" style="aspect-ratio: 16 / 9;"></iframe>
"""
)
demo.launch()
|