File size: 2,121 Bytes
e469eba
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import pandas as pd
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

import tensorflow as tf
from tf_bodypix.api import download_model, load_model, BodyPixModelPaths
from tf_bodypix.draw import draw_poses  # utility function using OpenCV
from tensorflow.keras import preprocessing
import cv2
import json
import numpy as np
from calculations import measure_body_sizes

# Load BodyPix model
bodypix_model = load_model(download_model(BodyPixModelPaths.MOBILENET_FLOAT_50_STRIDE_16))

def process_images(front_img, side_img, height):
    # Convert images to image arrays
    front_image_array = preprocessing.image.img_to_array(front_img)
    side_image_array = preprocessing.image.img_to_array(side_img)

    # BodyPix prediction
    result = bodypix_model.predict_single(front_image_array)
    mask = result.get_mask(threshold=0.75)
    # colored_mask = result.get_colored_part_mask(mask)

    poses = result.get_poses()
    print(f'shape of poses: {np.shape(poses)}')
    print(poses)
    # image_with_poses = draw_poses(
    #     front_image_array.copy(),  # create a copy to ensure we are not modifying the source image
    #     poses,
    #     keypoints_color=(255, 100, 100),
    #     skeleton_color=(100, 100, 255)
    # )

    # Measure body sizes using poses and real height
    body_sizes = measure_body_sizes(poses, height)
    print(f'Body sizes: {body_sizes}')

    # Prepare the output images
    # front_image_with_poses = preprocessing.image.array_to_img(image_with_poses)

    # Convert measurements to DataFrame for display
    measurements_df = pd.DataFrame(body_sizes)

    return measurements_df

# Create the Gradio interface
interface = gr.Interface(
    fn=process_images,
    inputs=[
        gr.Image(label="Upload Front Pose"),
        gr.Image(label="Upload Side Pose"),
        gr.Number(label="Enter Height (cm)")
    ],
    outputs=[
        gr.DataFrame(label="Body Measurements")
    ],
    title="Body Sizing System Demo",
    description="Upload two images: Front View and Side View, and input the height in cm."
)

# Launch the app
interface.launch(share=False)