Spaces:
Running
Running
File size: 3,196 Bytes
e469eba ee83b99 e469eba ee83b99 e469eba ee83b99 e469eba ee83b99 e469eba ee83b99 e469eba ee83b99 7d84eee ee83b99 7d84eee ee83b99 7d84eee ee83b99 7d84eee ee83b99 7d84eee ee83b99 7d84eee ee83b99 7d84eee ee83b99 7d84eee ee83b99 aa06746 ab0a82e 7c5739b e469eba 7d84eee 5f3d947 7c5739b e469eba 7d84eee 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 |
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)
front_colored_mask = frontresult.get_colored_part_mask(front_mask, rainbow)
side_colored_mask = sideresult.get_colored_part_mask(side_mask, rainbow)
frontposes = frontresult.get_poses()
front_image_with_poses = draw_poses(
fimage_array.copy(),
frontposes,
keypoints_color=(255, 100, 100),
skeleton_color=(100, 100, 255)
)
sideposes = sideresult.get_poses()
side_image_with_poses = draw_poses(
simage_array.copy(),
sideposes,
keypoints_color=(255, 100, 100),
skeleton_color=(100, 100, 255)
)
body_sizes = measure_body_sizes(side_colored_mask, front_colored_mask, sideposes, frontposes, real_height_cm, rainbow)
measurements_df = pd.DataFrame([body_sizes]) if isinstance(body_sizes, dict) else pd.DataFrame(body_sizes)
csv_file = "Body-measurement.csv"
if not os.path.exists(csv_file):
# Save as a new file if it doesn't exist
measurements_df.to_csv(csv_file, index=False)
else:
# Append to the existing file
measurements_df.to_csv(csv_file, mode='a', header=False, index=False)
return "Your body part measured and saved to the database."
# Create the Gradio interface
interface = gr.Interface(
fn=process_images,
inputs=[
gr.Image(sources="webcam", type="numpy", label="Front Pose"),
gr.Image(sources="webcam", type="numpy", label="Side Pose"),
gr.Number(label="Enter Your Height (cm)")
],
outputs=gr.Textbox(label="Confirmation Message"), # Confirmation message output
title="Body Sizing System Demo",
description="Capture two webcam images: Front View and Side View, and input your height in cm."
)
# Launch the app
interface.launch(share=True) |