Spaces:
Running
Running
File size: 2,808 Bytes
9d1ee0a |
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 |
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("MuGeminorum/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 = "未知"
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]["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=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__":
iface = 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="图像文件格式支持 PNG, JPG, JPEG 和 BMP, 且文件大小不超过 10M<br>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",
],
allow_flagging="never",
cache_examples=False,
)
iface.launch()
|