File size: 4,873 Bytes
7bed26b
3627bcb
dc51cfe
36e4f2e
acb05a8
 
72af4b9
36e4f2e
acb05a8
e1d655d
acb05a8
7bed26b
5f4dc46
8a4f0ad
 
 
 
3627bcb
92e4785
8a4f0ad
3627bcb
acb05a8
7065ee0
 
 
 
3627bcb
 
 
7dee543
3627bcb
acb05a8
 
 
 
 
3627bcb
acb05a8
7bed26b
acb05a8
 
 
36e4f2e
acb05a8
 
 
 
 
3627bcb
acb05a8
 
70c7fbf
acb05a8
8a4f0ad
 
 
 
 
 
 
 
 
 
 
acb05a8
 
8a4f0ad
 
acb05a8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3627bcb
 
 
70c7fbf
 
 
3627bcb
 
acb05a8
 
70c7fbf
acb05a8
3627bcb
acb05a8
 
 
 
 
 
3627bcb
acb05a8
 
 
 
 
 
1238eb5
 
 
 
 
 
 
 
acb05a8
a93f30b
3627bcb
acb05a8
 
3627bcb
acb05a8
 
 
 
 
 
3627bcb
acb05a8
 
 
 
 
 
 
 
3627bcb
acb05a8
 
e7b97f5
acb05a8
 
3627bcb
 
b4b957f
 
 
 
 
 
3627bcb
 
 
36e4f2e
3627bcb
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
import gradio as gr
import spaces
import supervision as sv
import PIL.Image as Image
from ultralytics import YOLO, YOLOv10
from huggingface_hub import hf_hub_download


def download_models(model_id):
    hf_hub_download("atalaydenknalbant/asl-models", filename=f"{model_id}", local_dir=f"./")
    return f"./{model_id}"

def get_model_filenames(repo_id="atalaydenknalbant/asl-models", file_extension=".pt"):
    api = HfApi()
    files = api.list_repo_files(repo_id)
    model_filenames = [file for file in files if file.endswith(file_extension)]
    return model_filenames

model_filenames = get_model_filenames("atalaydenknalbant/asl-models")
print("Model filenames:", model_filenames)

box_annotator = sv.BoxAnnotator()
category_dict = {0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E', 5: 'F', 6: 'G', 7: 'H', 8: 'I',
                 9: 'J', 10: 'K', 11: 'L', 12: 'M', 13: 'N', 14: 'O', 15: 'P', 16: 'Q',
                 17: 'R', 18: 'S', 19: 'T', 20: 'U', 21: 'V', 22: 'W', 23: 'X', 24: 'Y', 25: 'Z'}




@spaces.GPU
def yolo_inference(image, model_id, conf_threshold, iou_threshold, max_detection):
    model_path = download_models(model_id)
    if model_id[:7] == 'yolov10':
        model = YOLOv10(model_path)
    else:
        model = YOLO(model_path)
    results = model(source=image, imgsz=416, iou=iou_threshold, conf=conf_threshold, verbose=False, max_det=max_detection)[0]
    detections = sv.Detections.from_ultralytics(results)
    
    labels = [
        f"{category_dict[class_id]} {confidence:.2f}"
        for class_id, confidence in zip(detections.class_id, detections.confidence)
    ]
    annotated_image = box_annotator.annotate(image, detections=detections, labels=labels)

    return annotated_image

def app():
    with gr.Blocks():
        with gr.Row():
            with gr.Column():
                image = gr.Image(type="pil", label="Image", interactive=True)
                
                # model_id = gr.Dropdown(
                #     label="Model",
                #     choices=[
                #         "yolov10x.pt",
                #         "yolov10s.pt",
                #         "yolov9e.pt",
                #         "yolov9s.pt",
                #         "yolov8x.pt",
                #     ],
                #     value="yolov10s.pt",
                # )
                model_id = gr.Dropdown(
                    label="Model",
                    choices=model_filenames,
                    value=model_filenames[0] if model_filenames else "",
                )
                conf_threshold = gr.Slider(
                    label="Confidence Threshold",
                    minimum=0.1,
                    maximum=1.0,
                    step=0.1,
                    value=0.25,
                )
                iou_threshold = gr.Slider(
                    label="IoU Threshold",
                    minimum=0.1,
                    maximum=1.0,
                    step=0.1,
                    value=0.45,
                )
                
                max_detection = gr.Slider(
                    label="Max Detection",
                    minimum=1,
                    step=1,
                    value=1,
                )
                yolov_infer = gr.Button(value="Detect Objects")

            with gr.Column():
                output_image = gr.Image(type="pil", label="Annotated Image", interactive=False)

        yolov_infer.click(
            fn=yolo_inference,
            inputs=[
                image,
                model_id,
                conf_threshold,
                iou_threshold,
                max_detection,
            ],
            outputs=[output_image],
        )

        gr.Examples(
            examples=[
                [
                    "b.jpg",
                    "yolov10x.pt",
                    0.25,
                    0.45,
                    1,
                ],
                
                [
                    "a.jpg",
                    "yolov10s.pt",
                    0.25,
                    0.45,
                    1,
                ],
                [
                    "y.jpg",
                    "yolov10x.pt",
                    0.25,
                    0.45,
                    1,
                ],
            ],
            fn=yolo_inference,
            inputs=[
                image,
                model_id,
                conf_threshold,
                iou_threshold,
                max_detection,
            ],
            outputs=[output_image],
            cache_examples="lazy",
        )

gradio_app = gr.Blocks()
with gradio_app:
    gr.HTML(
        """
    <h1 style='text-align: center'>
    YOLO Powered ASL(American Sign Language) Letter Detector PSA: It can't detect J or Z
    </h1>
        """)
    with gr.Row():
        with gr.Column():
            app()

gradio_app.launch(debug=True)