pose-detection / app.py
lukassso's picture
feat: add complete Gradio pose detection app using MoveNet
d3e8abf
import gradio as gr
import PIL.Image
from poser import draw_bones, movenet
import tensorflow as tf
import numpy as np
def predict(image: PIL.Image.Image):
input_size = 256
image = image.resize((1280, 1280))
image_tf = tf.keras.preprocessing.image.img_to_array(image)
# Prepare input for the model
input_image = tf.expand_dims(image_tf, axis=0)
input_image = tf.image.resize_with_pad(input_image, input_size, input_size)
# Run MoveNet pose estimation
keypoints = movenet(input_image)
# Draw bones on the image
joints = draw_bones(image, keypoints)
# Format points as text
points = [f"{label} → ({int(float(x))}, {int(float(y))})" for label, x, y in joints]
return image, joints, points
with gr.Blocks(title="MoveNet Pose Estimation") as demo:
gr.Markdown("# 🧍‍♀️ Human Pose Estimation with MoveNet")
gr.Markdown("Upload an image to detect body keypoints and view the skeleton overlay.")
with gr.Row():
with gr.Column():
input_image = gr.Image(type="pil", label="Input Image")
run_button = gr.Button("Detect Pose", variant="primary")
with gr.Column():
output_image = gr.Image(type="numpy", label="Skeleton Output")
joints_table = gr.Dataframe(headers=["Label", "X", "Y"], row_count=17, col_count=(3, "fixed"))
point_text = gr.Textbox(label="Formatted Keypoints", lines=8)
run_button.click(
fn=predict,
inputs=[input_image],
outputs=[output_image, joints_table, point_text]
)
demo.launch()