| import gradio as gr |
| import tensorflow as tf |
| import numpy as np |
|
|
| |
| model = tf.keras.applications.MobileNetV2(weights='imagenet') |
|
|
| |
| exercise_ranges = { |
| '스쿼트': {'nose': (0.4, 0.6), 'left_shoulder': (0.35, 0.55), 'right_shoulder': (0.35, 0.55), |
| 'left_hip': (0.45, 0.65), 'right_hip': (0.45, 0.65)}, |
| '푸시업': {'nose': (0.3, 0.5), 'left_shoulder': (0.25, 0.45), 'right_shoulder': (0.25, 0.45), |
| 'left_hip': (0.35, 0.55), 'right_hip': (0.35, 0.55)} |
| } |
|
|
| def detect_and_correct_pose(image): |
| |
| img = tf.image.resize(image, (224, 224)) |
| img = tf.keras.applications.mobilenet_v2.preprocess_input(img) |
| img = np.expand_dims(img, axis=0) |
| |
| |
| predictions = model.predict(img) |
| predicted_class = tf.keras.applications.mobilenet_v2.decode_predictions(predictions, top=1)[0][0][1] |
| |
| |
| exercise_type = predicted_class.lower() |
| |
| |
| if exercise_type in exercise_ranges: |
| pose_keypoints = {} |
| correct_pose = True |
| for keypoint, (min_range, max_range) in exercise_ranges[exercise_type].items(): |
| if keypoint not in pose_keypoints or pose_keypoints[keypoint] < min_range or pose_keypoints[keypoint] > max_range: |
| correct_pose = False |
| break |
| if correct_pose: |
| return f"입력된 {exercise_type} 운동 자세가 올바릅니다." |
| else: |
| return f"입력된 {exercise_type} 운동 자세가 올바르지 않습니다. 자세를 교정하세요." |
| else: |
| return "운동 종류를 인식할 수 없습니다." |
|
|
| |
| input_image = gr.inputs.Image(shape=(224, 224)) |
| gr.Interface(detect_and_correct_pose, input_image, "text").launch() |
|
|