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