File size: 2,969 Bytes
48787b8
 
7f06e77
0ce54aa
 
 
 
 
 
7f06e77
48787b8
 
7f06e77
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48787b8
 
7f06e77
48787b8
7f06e77
 
 
 
48787b8
7f06e77
 
 
48787b8
 
 
 
7f06e77
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from PIL import Image
import numpy as np
import cv2
import gradio as gr
from ultralytics import YOLO

MODEL_PATH = "best.pt"
model = YOLO(MODEL_PATH)

def draw_pose_clean(image, conf=0.25, show_labels=False, point_size=3):
    if image is None:
        return None

    img = np.array(image.convert("RGB"))
    results = model.predict(source=img, conf=conf, imgsz=640, verbose=False)[0]

    out = img.copy()
    if results.keypoints is None or len(results.keypoints.xy) == 0:
        return Image.fromarray(out)

    kpts_xy = results.keypoints.xy.cpu().numpy()
    kpts_conf = results.keypoints.conf.cpu().numpy() if results.keypoints.conf is not None else None

    for det_i, det_kpts in enumerate(kpts_xy):
        confs = kpts_conf[det_i] if kpts_conf is not None else np.ones(len(det_kpts))
        for i, (x, y) in enumerate(det_kpts):
            score = float(confs[i])
            if score < conf:
                continue

            x_i, y_i = int(x), int(y)
            cv2.circle(out, (x_i, y_i), int(point_size), (0, 255, 0), -1, lineType=cv2.LINE_AA)

            # Optional: only label every 5th keypoint to reduce clutter
            if show_labels and (i % 5 == 0):
                cv2.putText(
                    out,
                    f"{i+1}",
                    (x_i + 4, y_i - 4),
                    cv2.FONT_HERSHEY_SIMPLEX,
                    0.35,
                    (255, 255, 0),
                    1,
                    cv2.LINE_AA,
                )

    return Image.fromarray(out)

demo = gr.Interface(
    fn=draw_pose_clean,
    inputs=[
        gr.Image(type="pil", label="Input image"),
        gr.Slider(0.05, 0.9, value=0.25, step=0.05, label="Confidence threshold"),
        gr.Checkbox(value=False, label="Show keypoint index labels (sparser)"),
        gr.Slider(1, 8, value=3, step=1, label="Point size"),
    ],
    outputs=gr.Image(type="pil", label="Output"),
    title="DogFLW Pose (Clean View)",
    description="Less cluttered output: points only by default. Toggle sparse labels if needed.",
)

if __name__ == "__main__":
    demo.launch()

# from PIL import Image
# import numpy as np
# import gradio as gr
# from ultralytics import YOLO

# MODEL_PATH = "best.pt"
# model = YOLO(MODEL_PATH)

# def predict(image, conf):
#     if image is None:
#         return None
#     results = model.predict(source=np.array(image), conf=conf, imgsz=640, verbose=False)[0]
#     plotted = results.plot()  # BGR numpy array
#     plotted = plotted[:, :, ::-1]  # BGR -> RGB
#     return Image.fromarray(plotted)

# demo = gr.Interface(
#     fn=predict,
#     inputs=[
#         gr.Image(type="pil", label="Input Image"),
#         gr.Slider(0.05, 0.9, value=0.25, step=0.05, label="Confidence"),
#     ],
#     outputs=gr.Image(type="pil", label="Pose Result"),
#     title="DogFLW YOLOv8 Pose",
#     description="Upload a dog image to detect 46 facial landmarks."
# )

# if __name__ == "__main__":
#     demo.launch()