Spaces:
Sleeping
Sleeping
""" | |
Comprehensive Body Measurements Predictor with Brand Comparisons | |
Created by: RohanVashisht1234 | |
Created on: 2025-02-22 21:26:00 UTC | |
This application provides: | |
1. Body measurements predictions based on height | |
2. Brand-specific size recommendations | |
""" | |
import gradio as gr | |
import pandas as pd | |
import numpy as np | |
from sklearn.preprocessing import LabelEncoder, StandardScaler | |
from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier | |
from sklearn.metrics import r2_score, accuracy_score | |
import json | |
import logging | |
from datetime import datetime | |
# Constants | |
# Constants | |
CURRENT_TIME = "2025-02-22 21:39:09" | |
CURRENT_USER = "RohanVashisht1234" | |
CSV_PATH = 'bdm.csv' | |
SHIRT_SIZE_CHARTS_PATH = 'shirt_size_charts.json' | |
PANTS_SIZE_CHARTS_PATH = 'pants_size_charts.json' | |
# Set up logging | |
logging.basicConfig( | |
level=logging.INFO, | |
format='%(asctime)s - %(levelname)s - %(message)s' | |
) | |
logger = logging.getLogger(__name__) | |
class ShirtPredictor: | |
def __init__(self): | |
self.models = {} | |
self.encoders = {} | |
self.scaler = StandardScaler() | |
self.categorical_columns = ['Size', 'Fit'] | |
self.numerical_columns = [ | |
'ChestWidth', 'ShoulderWidth', 'ArmLength', | |
'ShoulderToWaist', 'Belly', 'Waist' | |
] | |
self.accuracies = {} | |
self.units = { | |
'ChestWidth': 'cm', | |
'ShoulderWidth': 'cm', | |
'ArmLength': 'cm', | |
'ShoulderToWaist': 'cm', | |
'Belly': 'cm', | |
'Waist': 'cm', | |
'Weight': 'kg', | |
'TotalHeight': 'cm' | |
} | |
def train(self): | |
logger.info("Loading and preparing data...") | |
df = pd.read_csv(CSV_PATH) | |
# Prepare input features | |
base_features = ['TotalHeight'] | |
X = df[base_features].values | |
self.scaler.fit(X) | |
X_scaled = self.scaler.transform(X) | |
# Train models for categorical columns | |
for col in self.categorical_columns: | |
self.encoders[col] = LabelEncoder() | |
encoded_values = self.encoders[col].fit_transform(df[col]) | |
self.models[col] = RandomForestClassifier(n_estimators=100, random_state=42) | |
self.models[col].fit(X_scaled, encoded_values) | |
predictions = self.models[col].predict(X_scaled) | |
self.accuracies[col] = round(accuracy_score(encoded_values, predictions), 4) | |
# Train models for numerical columns | |
for col in self.numerical_columns: | |
self.models[col] = RandomForestRegressor(n_estimators=100, random_state=42) | |
self.models[col].fit(X_scaled, df[col]) | |
predictions = self.models[col].predict(X_scaled) | |
self.accuracies[col] = round(r2_score(df[col], predictions), 4) | |
logger.info("Training completed successfully") | |
def predict(self, height, weight=None, body_type=None): | |
features = np.array([[height]]) | |
features_scaled = self.scaler.transform(features) | |
predictions = { | |
"input": { | |
"height": float(height), | |
"unit": "cm", | |
"timestamp_utc": CURRENT_TIME, | |
"user": CURRENT_USER | |
}, | |
"shirt_predictions": {}, | |
"model_accuracies": {} | |
} | |
if weight is not None: | |
predictions["input"]["weight"] = float(weight) | |
predictions["input"]["weight_unit"] = "kg" | |
if body_type is not None: | |
predictions["input"]["body_type"] = body_type | |
# Predict categorical values | |
for col in self.categorical_columns: | |
pred = self.encoders[col].inverse_transform( | |
self.models[col].predict(features_scaled) | |
)[0] | |
predictions["shirt_predictions"][col] = { | |
"value": str(pred) | |
} | |
predictions["model_accuracies"][col] = self.accuracies[col] | |
# Predict numerical values | |
for col in self.numerical_columns: | |
pred = self.models[col].predict(features_scaled)[0] | |
predictions["shirt_predictions"][col] = { | |
"value": round(float(pred), 2), | |
"unit": self.units.get(col, "") | |
} | |
predictions["model_accuracies"][col] = self.accuracies[col] | |
return predictions | |
class BrandSizePredictor: | |
def __init__(self): | |
with open(SHIRT_SIZE_CHARTS_PATH, 'r') as f: | |
self.brand_charts = json.load(f) | |
def find_matching_sizes(self, measurements): | |
results = { | |
"input_measurements": { | |
"chest": measurements["chest"], | |
"waist": measurements["waist"], | |
"shoulder": measurements["shoulder"], | |
"unit": "cm" | |
}, | |
"brand_recommendations": [], | |
"timestamp_utc": CURRENT_TIME, | |
"user": CURRENT_USER | |
} | |
for brand in self.brand_charts: | |
brand_result = { | |
"brand": brand["brand"], | |
"matching_sizes": [] | |
} | |
for size in brand["sizes"]: | |
if (size["chest"][0] <= measurements["chest"] <= size["chest"][1] and | |
size["waist"][0] <= measurements["waist"] <= size["waist"][1] and | |
size["shoulder"][0] <= measurements["shoulder"] <= size["shoulder"][1]): | |
brand_result["matching_sizes"].append({ | |
"size": size["label"], | |
"fit_details": { | |
"chest_range": size["chest"], | |
"waist_range": size["waist"], | |
"shoulder_range": size["shoulder"] | |
} | |
}) | |
if brand_result["matching_sizes"]: | |
results["brand_recommendations"].append(brand_result) | |
return results | |
# Initialize predictors | |
shirt_predictor = ShirtPredictor() | |
shirt_predictor.train() | |
brand_predictor = BrandSizePredictor() | |
def predict_shirt_measurements(height, weight=None, body_type=None): | |
"""Gradio interface function for shirt predictions""" | |
try: | |
predictions = shirt_predictor.predict(height, weight, body_type) | |
return json.dumps(predictions, indent=2) | |
except Exception as e: | |
return json.dumps({ | |
"error": str(e), | |
"timestamp_utc": CURRENT_TIME, | |
"user": CURRENT_USER | |
}, indent=2) | |
def predict_brand_sizes(chest, waist, shoulder): | |
"""Gradio interface function for brand size predictions""" | |
try: | |
measurements = { | |
"chest": float(chest), | |
"waist": float(waist), | |
"shoulder": float(shoulder) | |
} | |
predictions = brand_predictor.find_matching_sizes(measurements) | |
return json.dumps(predictions, indent=2) | |
except Exception as e: | |
return json.dumps({ | |
"error": str(e), | |
"timestamp_utc": CURRENT_TIME, | |
"user": CURRENT_USER | |
}, indent=2) | |
# pants | |
class PantsPredictor: | |
def __init__(self): | |
self.models = {} | |
self.encoders = {} | |
self.scaler = StandardScaler() | |
self.categorical_columns = ['Size', 'Fit'] | |
self.numerical_columns = [ | |
'Waist', 'Hips', 'LegLength', | |
'WaistToKnee', 'Belly' | |
] | |
self.accuracies = {} | |
self.units = { | |
'Waist': 'cm', | |
'Hips': 'cm', | |
'LegLength': 'cm', | |
'WaistToKnee': 'cm', | |
'Belly': 'cm', | |
'Weight': 'kg', | |
'TotalHeight': 'cm' | |
} | |
def train(self): | |
logger.info("Loading and preparing pants prediction models...") | |
df = pd.read_csv(CSV_PATH) | |
# Prepare input features | |
base_features = ['TotalHeight'] | |
X = df[base_features].values | |
self.scaler.fit(X) | |
X_scaled = self.scaler.transform(X) | |
# Train models for categorical columns | |
for col in self.categorical_columns: | |
self.encoders[col] = LabelEncoder() | |
encoded_values = self.encoders[col].fit_transform(df[col]) | |
self.models[col] = RandomForestClassifier(n_estimators=100, random_state=42) | |
self.models[col].fit(X_scaled, encoded_values) | |
predictions = self.models[col].predict(X_scaled) | |
self.accuracies[col] = round(accuracy_score(encoded_values, predictions), 4) | |
# Train models for numerical columns | |
for col in self.numerical_columns: | |
self.models[col] = RandomForestRegressor(n_estimators=100, random_state=42) | |
self.models[col].fit(X_scaled, df[col]) | |
predictions = self.models[col].predict(X_scaled) | |
self.accuracies[col] = round(r2_score(df[col], predictions), 4) | |
logger.info("Pants prediction models trained successfully") | |
def predict(self, height, weight=None, body_type=None): | |
features = np.array([[height]]) | |
features_scaled = self.scaler.transform(features) | |
predictions = { | |
"input": { | |
"height": float(height), | |
"unit": "cm", | |
"timestamp_utc": CURRENT_TIME, | |
"user": CURRENT_USER | |
}, | |
"pants_predictions": {}, | |
"model_accuracies": {} | |
} | |
if weight is not None: | |
predictions["input"]["weight"] = float(weight) | |
predictions["input"]["weight_unit"] = "kg" | |
if body_type is not None: | |
predictions["input"]["body_type"] = body_type | |
# Predict categorical values | |
for col in self.categorical_columns: | |
pred = self.encoders[col].inverse_transform( | |
self.models[col].predict(features_scaled) | |
)[0] | |
predictions["pants_predictions"][col] = { | |
"value": str(pred) | |
} | |
predictions["model_accuracies"][col] = self.accuracies[col] | |
# Predict numerical values | |
for col in self.numerical_columns: | |
pred = self.models[col].predict(features_scaled)[0] | |
predictions["pants_predictions"][col] = { | |
"value": round(float(pred), 2), | |
"unit": self.units.get(col, "") | |
} | |
predictions["model_accuracies"][col] = self.accuracies[col] | |
return predictions | |
class PantsSizePredictor: | |
def __init__(self, size_charts_path=PANTS_SIZE_CHARTS_PATH): | |
try: | |
with open(size_charts_path, 'r') as f: | |
self.brand_charts = json.load(f) | |
logger.info(f"Successfully loaded {len(self.brand_charts)} brands from size charts") | |
# Add debug logging for loaded size charts | |
for brand in self.brand_charts: | |
logger.info(f"Loaded size chart for {brand['brand']}") | |
except Exception as e: | |
logger.error(f"Failed to load pants size charts: {str(e)}") | |
self.brand_charts = [] | |
def find_matching_sizes(self, measurements): | |
logger.info(f"Finding sizes for measurements: {measurements}") | |
results = { | |
"input_measurements": { | |
"waist": measurements["waist"], | |
"hips": measurements["hips"], | |
"leg_length": measurements["leg_length"], | |
"unit": "cm", | |
"timestamp_utc": CURRENT_TIME, | |
"user": CURRENT_USER | |
}, | |
"brand_recommendations": [] | |
} | |
for brand in self.brand_charts: | |
brand_result = { | |
"brand": brand["brand"], | |
"matching_sizes": [] | |
} | |
for size in brand["sizes"]: | |
# Add tolerance of ±2cm for better matching | |
waist_min = size["waist"][0] - 2 | |
waist_max = size["waist"][1] + 2 | |
hips_min = size["hips"][0] - 2 | |
hips_max = size["hips"][1] + 2 | |
leg_min = size["leg_length"][0] - 2 | |
leg_max = size["leg_length"][1] + 2 | |
# Debug logging for size checks | |
logger.debug(f""" | |
Checking {brand['brand']} size {size['label']}: | |
Waist: {measurements['waist']} in range {waist_min}-{waist_max} | |
Hips: {measurements['hips']} in range {hips_min}-{hips_max} | |
Leg: {measurements['leg_length']} in range {leg_min}-{leg_max} | |
""") | |
# Check if measurements fall within the size ranges (with tolerance) | |
if (waist_min <= measurements["waist"] <= waist_max and | |
hips_min <= measurements["hips"] <= hips_max and | |
leg_min <= measurements["leg_length"] <= leg_max): | |
size_match = { | |
"size": size["label"], | |
"fit_details": { | |
"waist_range": f"{size['waist'][0]}-{size['waist'][1]} cm", | |
"hips_range": f"{size['hips'][0]}-{size['hips'][1]} cm", | |
"leg_length_range": f"{size['leg_length'][0]}-{size['leg_length'][1]} cm" | |
}, | |
"fit_quality": { | |
"waist": "Perfect" if size["waist"][0] <= measurements["waist"] <= size["waist"][1] else "Slightly loose/tight", | |
"hips": "Perfect" if size["hips"][0] <= measurements["hips"] <= size["hips"][1] else "Slightly loose/tight", | |
"leg_length": "Perfect" if size["leg_length"][0] <= measurements["leg_length"] <= size["leg_length"][1] else "Slightly long/short" | |
} | |
} | |
brand_result["matching_sizes"].append(size_match) | |
logger.info(f"Found matching size {size['label']} for {brand['brand']}") | |
if brand_result["matching_sizes"]: | |
results["brand_recommendations"].append(brand_result) | |
# Add debugging information | |
if not results["brand_recommendations"]: | |
logger.warning(f"No matching sizes found for measurements: {measurements}") | |
results["debug_info"] = { | |
"message": "No exact matches found. Consider these suggestions:", | |
"suggestions": [ | |
"Try measurements within these ranges:", | |
"Waist: 72-91 cm", | |
"Hips: 90-110 cm", | |
"Leg Length: 97-106 cm" | |
], | |
"closest_matches": self._find_closest_matches(measurements) | |
} | |
return results | |
def _find_closest_matches(self, measurements): | |
closest_matches = [] | |
for brand in self.brand_charts: | |
for size in brand["sizes"]: | |
# Calculate how close this size is to the measurements | |
waist_diff = min(abs(measurements["waist"] - size["waist"][0]), | |
abs(measurements["waist"] - size["waist"][1])) | |
hips_diff = min(abs(measurements["hips"] - size["hips"][0]), | |
abs(measurements["hips"] - size["hips"][1])) | |
leg_diff = min(abs(measurements["leg_length"] - size["leg_length"][0]), | |
abs(measurements["leg_length"] - size["leg_length"][1])) | |
if waist_diff <= 5 and hips_diff <= 5 and leg_diff <= 5: | |
closest_matches.append({ | |
"brand": brand["brand"], | |
"size": size["label"], | |
"adjustments_needed": { | |
"waist": f"{waist_diff:+.1f} cm", | |
"hips": f"{hips_diff:+.1f} cm", | |
"leg_length": f"{leg_diff:+.1f} cm" | |
} | |
}) | |
return closest_matches[:3] # Return top 3 closest matches | |
# Initialize pants predictors | |
pants_predictor = PantsPredictor() | |
pants_predictor.train() | |
pants_size_predictor = PantsSizePredictor() | |
def predict_pants_measurements(height, weight=None, body_type=None): | |
"""Gradio interface function for pants predictions based on height""" | |
try: | |
predictions = pants_predictor.predict(height, weight, body_type) | |
return json.dumps(predictions, indent=2) | |
except Exception as e: | |
return json.dumps({ | |
"error": str(e), | |
"timestamp_utc": CURRENT_TIME, | |
"user": CURRENT_USER | |
}, indent=2) | |
def predict_pants_sizes(waist, leg_length, hips): | |
"""Gradio interface function for pants size predictions""" | |
try: | |
measurements = { | |
"waist": float(waist), | |
"leg_length": float(leg_length), | |
"hips": float(hips) | |
} | |
predictions = pants_size_predictor.find_matching_sizes(measurements) | |
return json.dumps(predictions, indent=2) | |
except Exception as e: | |
return json.dumps({ | |
"error": str(e), | |
"timestamp_utc": CURRENT_TIME, | |
"user": CURRENT_USER | |
}, indent=2) | |
def format_shirt_predictions(predictions): | |
formatted = "### Shirt Measurements Predictions\n" | |
formatted += f"**Height:** {predictions['input']['height']} cm\n" | |
if 'weight' in predictions['input']: | |
formatted += f"**Weight:** {predictions['input']['weight']} kg\n" | |
if 'body_type' in predictions['input']: | |
formatted += f"**Body Type:** {predictions['input']['body_type']}\n" | |
formatted += "\n**Predictions:**\n" | |
for key, value in predictions['shirt_predictions'].items(): | |
formatted += f"- **{key}:** {value['value']} {value.get('unit', '')}\n" | |
return formatted | |
def format_brand_predictions(predictions): | |
formatted = "### Brand Size Recommendations\n" | |
formatted += f"**Chest:** {predictions['input_measurements']['chest']} cm\n" | |
formatted += f"**Waist:** {predictions['input_measurements']['waist']} cm\n" | |
formatted += f"**Shoulder:** {predictions['input_measurements']['shoulder']} cm\n" | |
formatted += "\n**Recommendations:**\n" | |
for brand in predictions['brand_recommendations']: | |
formatted += f"- **Brand:** {brand['brand']}\n" | |
for size in brand['matching_sizes']: | |
formatted += f" - **Size:** {size['size']}\n" | |
formatted += f" - **Chest Range:** {size['fit_details']['chest_range']}\n" | |
formatted += f" - **Waist Range:** {size['fit_details']['waist_range']}\n" | |
formatted += f" - **Shoulder Range:** {size['fit_details']['shoulder_range']}\n" | |
return formatted | |
def format_pants_predictions(predictions): | |
formatted = "### Pants Measurements Predictions\n" | |
formatted += f"**Height:** {predictions['input']['height']} cm\n" | |
if 'weight' in predictions['input']: | |
formatted += f"**Weight:** {predictions['input']['weight']} kg\n" | |
if 'body_type' in predictions['input']: | |
formatted += f"**Body Type:** {predictions['input']['body_type']}\n" | |
formatted += "\n**Predictions:**\n" | |
for key, value in predictions['pants_predictions'].items(): | |
formatted += f"- **{key}:** {value['value']} {value.get('unit', '')}\n" | |
return formatted | |
def format_pants_brand_predictions(predictions): | |
formatted = "### Pants Size Recommendations\n" | |
formatted += f"**Waist:** {predictions['input_measurements']['waist']} cm\n" | |
formatted += f"**Hips:** {predictions['input_measurements']['hips']} cm\n" | |
formatted += f"**Leg Length:** {predictions['input_measurements']['leg_length']} cm\n" | |
formatted += "\n**Recommendations:**\n" | |
for brand in predictions['brand_recommendations']: | |
formatted += f"- **Brand:** {brand['brand']}\n" | |
for size in brand['matching_sizes']: | |
formatted += f" - **Size:** {size['size']}\n" | |
formatted += f" - **Waist Range:** {size['fit_details']['waist_range']}\n" | |
formatted += f" - **Hips Range:** {size['fit_details']['hips_range']}\n" | |
formatted += f" - **Leg Length Range:** {size['fit_details']['leg_length_range']}\n" | |
return formatted | |
# Update Gradio interface to use formatted predictions | |
with gr.Blocks(title="Body Measurements Predictor") as demo: | |
gr.Markdown(f""" | |
# Body Measurements Predictor | |
Created by: {CURRENT_USER} | |
Last Updated: {CURRENT_TIME} | |
""") | |
with gr.Tabs(): | |
# First Tab - Shirt Measurements | |
with gr.Tab("Shirt Measurements"): | |
with gr.Row(): | |
with gr.Column(): | |
height_input = gr.Number( | |
label="Height (cm) *", | |
minimum=50, | |
maximum=250, | |
step=1, | |
value=170 | |
) | |
weight_input = gr.Number( | |
label="Weight (kg) (optional)", | |
minimum=30, | |
maximum=200, | |
step=0.1 | |
) | |
body_type_input = gr.Dropdown( | |
label="Body Type (optional)", | |
choices=["Slim", "Regular", "Athletic", "Large"], | |
value=None | |
) | |
predict_button = gr.Button("Predict Shirt Measurements") | |
with gr.Column(): | |
output_markdown = gr.Markdown(label="Shirt Measurements Predictions") | |
with gr.Column(scale=2, min_width=300): | |
model3d = gr.Model3D( | |
value="jacket.glb", # Path to your .glb file on server | |
clear_color=[0.0, 0.0, 0.0, 0.0], # Transparent background | |
camera_position=[0, 0, 5], # Initial camera position | |
visible=False # Initially hidden | |
) | |
def update_model_visibility(height, weight, body_type): | |
predictions = format_shirt_predictions( | |
json.loads(predict_shirt_measurements(height, weight, body_type)) | |
) | |
return predictions, gr.update(visible=True) | |
predict_button.click( | |
fn=update_model_visibility, | |
inputs=[height_input, weight_input, body_type_input], | |
outputs=[output_markdown, model3d] | |
) | |
gr.Markdown(""" | |
### Instructions: | |
1. Enter your height (required) | |
2. Optionally enter your weight and select your body type | |
3. Click "Predict Shirt Measurements" to get detailed predictions | |
""") | |
# Second Tab - Brand Size Finder (Shirts) | |
with gr.Tab("Shirt Size Finder"): | |
with gr.Row(): | |
with gr.Column(): | |
chest_input = gr.Number( | |
label="Chest Circumference (cm)", | |
minimum=80, | |
maximum=120, | |
step=0.5, | |
value=95 | |
) | |
waist_input = gr.Number( | |
label="Waist Circumference (cm)", | |
minimum=60, | |
maximum=110, | |
step=0.5, | |
value=80 | |
) | |
shoulder_input = gr.Number( | |
label="Shoulder Width (cm)", | |
minimum=35, | |
maximum=55, | |
step=0.5, | |
value=43 | |
) | |
brand_predict_button = gr.Button("Find Matching Sizes") | |
with gr.Column(): | |
brand_output_markdown = gr.Markdown(label="Brand Size Recommendations") | |
with gr.Column(scale=2, min_width=300): | |
model3d = gr.Model3D( | |
value="jacket.glb", # Path to your .glb file on server | |
clear_color=[0.0, 0.0, 0.0, 0.0], # Transparent background | |
camera_position=[0, 0, 5], # Initial camera position | |
visible=False # Initially hidden | |
) | |
def update_model_visibility(chest, waist, shoulder): | |
predictions = format_brand_predictions( | |
json.loads(predict_brand_sizes(chest, waist, shoulder)) | |
) | |
return predictions, gr.update(visible=True) | |
brand_predict_button.click( | |
fn=update_model_visibility, | |
inputs=[chest_input, waist_input, shoulder_input], | |
outputs=[brand_output_markdown, model3d] | |
) | |
gr.Markdown(""" | |
### Instructions: | |
1. Enter your measurements: | |
- Chest circumference | |
- Waist circumference | |
- Shoulder width | |
2. Click "Find Matching Sizes" to see which sizes fit you across different brands | |
""") | |
# Third Tab - Pants Measurements | |
with gr.Tab("Pants Measurements"): | |
with gr.Row(): | |
with gr.Column(): | |
pants_height_input = gr.Number( | |
label="Height (cm) *", | |
minimum=50, | |
maximum=250, | |
step=1, | |
value=170 | |
) | |
pants_weight_input = gr.Number( | |
label="Weight (kg) (optional)", | |
minimum=30, | |
maximum=200, | |
step=0.1 | |
) | |
pants_body_type_input = gr.Dropdown( | |
label="Body Type (optional)", | |
choices=["Slim", "Regular", "Athletic", "Large"], | |
value=None | |
) | |
pants_predict_button = gr.Button("Predict Pants Measurements") | |
with gr.Column(): | |
pants_output_markdown = gr.Markdown(label="Pants Measurements Predictions") | |
with gr.Column(): | |
model3d = gr.Model3D( | |
value="pants.glb", # Path to your .glb file on server | |
clear_color=[0.0, 0.0, 0.0, 0.0], # Transparent background | |
camera_position=[0, 0, 5], # Initial camera position | |
visible=False # Initially hidden | |
) | |
def update_model_visibility(height, weight, body_type): | |
predictions = format_pants_predictions( | |
json.loads(predict_pants_measurements(height, weight, body_type)) | |
) | |
return predictions, gr.update(visible=True) | |
pants_predict_button.click( | |
fn=update_model_visibility, | |
inputs=[pants_height_input, pants_weight_input, pants_body_type_input], | |
outputs=[pants_output_markdown, model3d] | |
) | |
gr.Markdown(""" | |
### Instructions: | |
1. Enter your height (required) | |
2. Optionally enter your weight and select your body type | |
3. Click "Predict Pants Measurements" to get detailed predictions | |
""") | |
# Fourth Tab - Pants Size Finder | |
with gr.Tab("Pants Size Finder"): | |
with gr.Row(): | |
with gr.Column(): | |
pants_waist_input = gr.Number( | |
label="Waist Circumference (cm)", | |
minimum=60, | |
maximum=120, | |
step=0.5, | |
value=80 | |
) | |
pants_leg_input = gr.Number( | |
label="Leg Length (cm)", | |
minimum=60, | |
maximum=120, | |
step=0.5, | |
value=98 | |
) | |
pants_hips_input = gr.Number( | |
label="Hips Circumference (cm)", | |
minimum=80, | |
maximum=140, | |
step=0.5, | |
value=102 | |
) | |
pants_brand_predict_button = gr.Button("Find Matching Pants Sizes") | |
with gr.Column(): | |
pants_brand_output_markdown = gr.Markdown(label="Pants Size Recommendations") | |
with gr.Column(): | |
model3d = gr.Model3D( | |
value="pants.glb", # Path to your .glb file on server | |
clear_color=[0.0, 0.0, 0.0, 0.0], # Transparent background | |
camera_position=[0, 0, 5], # Initial camera position | |
visible=False # Initially hidden | |
) | |
def update_model_visibility(waist, leg_length, hips): | |
predictions = format_pants_brand_predictions( | |
json.loads(predict_pants_sizes(waist, leg_length, hips)) | |
) | |
return predictions, gr.update(visible=True) # Fixed syntax error here | |
pants_brand_predict_button.click( | |
fn=update_model_visibility, | |
inputs=[pants_waist_input, pants_leg_input, pants_hips_input], | |
outputs=[pants_brand_output_markdown, model3d] | |
) | |
gr.Markdown(""" | |
### Instructions: | |
1. Enter your measurements: | |
- Waist circumference | |
- Leg length | |
- Hips circumference | |
2. Click "Find Matching Pants Sizes" to see which sizes fit you across different brands | |
""") | |
if __name__ == "__main__": | |
logger.info("Starting Gradio interface...") | |
demo.launch() | |