Spaces:
Running
Running
File size: 3,524 Bytes
e469eba ee83b99 e469eba ee83b99 e469eba ee83b99 e469eba ee83b99 e469eba ee83b99 e469eba ee83b99 e469eba ee83b99 e469eba ee83b99 e469eba ee83b99 e469eba ee83b99 e469eba ee83b99 e469eba ee83b99 e469eba ac9fd9c 5f3d947 e469eba 5f3d947 e469eba 5f3d947 |
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 |
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
import tensorflow as tf
import tf_bodypix
from tf_bodypix.api import download_model, load_model, BodyPixModelPaths
from tf_bodypix.draw import draw_poses
from tensorflow.keras import preprocessing
import cv2
import json
from matplotlib import pyplot as plt
import numpy as np
from calculations import measure_body_sizes
import gradio as gr
import pandas as pd
# Load BodyPix model
bodypix_model = load_model(download_model(BodyPixModelPaths.MOBILENET_FLOAT_50_STRIDE_16))
rainbow = [
[110, 64, 170], [143, 61, 178], [178, 60, 178], [210, 62, 167],
[238, 67, 149], [255, 78, 125], [255, 94, 99], [255, 115, 75],
[255, 140, 56], [239, 167, 47], [217, 194, 49], [194, 219, 64],
[175, 240, 91], [135, 245, 87], [96, 247, 96], [64, 243, 115],
[40, 234, 141], [28, 219, 169], [26, 199, 194], [33, 176, 213],
[47, 150, 224], [65, 125, 224], [84, 101, 214], [99, 81, 195]
]
def process_images(front_img, side_img, real_height_cm):
fimage_array = preprocessing.image.img_to_array(front_img)
simage_array = preprocessing.image.img_to_array(side_img)
# bodypix prediction
frontresult = bodypix_model.predict_single(fimage_array)
sideresult = bodypix_model.predict_single(simage_array)
front_mask = frontresult.get_mask(threshold=0.75)
side_mask = sideresult.get_mask(threshold=0.75)
# preprocessing.image.save_img(f'{output_path}/frontbodypix-mask.jpg',front_mask)
# preprocessing.image.save_img(f'{output_path}/sidebodypix-mask.jpg',side_mask)
front_colored_mask = frontresult.get_colored_part_mask(front_mask, rainbow)
side_colored_mask = sideresult.get_colored_part_mask(side_mask, rainbow)
# preprocessing.image.save_img(f'{output_path}/frontbodypix-colored-mask.jpg',front_colored_mask)
# preprocessing.image.save_img(f'{output_path}/sidebodypix-colored-mask.jpg',side_colored_mask)
frontposes = frontresult.get_poses()
front_image_with_poses = draw_poses(
fimage_array.copy(), # create a copy to ensure we are not modifing the source image
frontposes,
keypoints_color=(255, 100, 100),
skeleton_color=(100, 100, 255)
)
sideposes = sideresult.get_poses()
side_image_with_poses = draw_poses(
simage_array.copy(), # create a copy to ensure we are not modifing the source image
sideposes,
keypoints_color=(255, 100, 100),
skeleton_color=(100, 100, 255)
)
# print(np.array(simage).shape)
# print(np.array(side_colored_mask).shape)
# preprocessing.image.save_img(f'{output_path}/frontbodypix-poses.jpg', front_image_with_poses)
# preprocessing.image.save_img(f'{output_path}/sidebodypix-poses.jpg', side_image_with_poses)
body_sizes = measure_body_sizes(side_colored_mask, front_colored_mask, sideposes, frontposes, real_height_cm, rainbow)
measurements_df = pd.DataFrame([body_sizes[0]])
return measurements_df
# Create the Gradio interface
interface = gr.Interface(
fn=process_images,
inputs=[
gr.Image(source="webcam", type="numpy", label="Front Pose"),
gr.Image(source="webcam", type="numpy", label="Side Pose"),
gr.Number(label="Enter Your Height (cm)")
],
outputs=[
gr.DataFrame(label="Body Size 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=True) |