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()