3D / measurement_processor.py
nexusbert's picture
push
6a9bf88
from typing import Dict, Optional
import numpy as np
class MeasurementProcessor:
NORMALIZATION_FACTORS = {
"height": 200.0,
"weight": 100.0,
"chest": 150.0,
"waist": 150.0,
"hips": 150.0,
"shoulder_width": 60.0,
"arm_length": 80.0,
"leg_length": 120.0,
"inseam": 100.0,
}
REQUIRED_MEASUREMENTS = [
"height",
"weight",
"chest",
"waist",
"hips",
]
OPTIONAL_MEASUREMENTS = {
"shoulder_width": 40.0,
"arm_length": 60.0,
"leg_length": 90.0,
"inseam": 75.0,
}
@classmethod
def validate_measurements(cls, measurements: Dict) -> Dict[str, str]:
errors = []
for field in cls.REQUIRED_MEASUREMENTS:
if field not in measurements:
errors.append(f"Missing required measurement: {field}")
elif not isinstance(measurements[field], (int, float)):
errors.append(f"Invalid type for {field}: must be number")
elif measurements[field] <= 0:
errors.append(f"Invalid value for {field}: must be positive")
for field, default in cls.OPTIONAL_MEASUREMENTS.items():
if field in measurements:
if not isinstance(measurements[field], (int, float)):
errors.append(f"Invalid type for {field}: must be number")
elif measurements[field] <= 0:
errors.append(f"Invalid value for {field}: must be positive")
return {
"valid": len(errors) == 0,
"errors": errors
}
@classmethod
def normalize_measurements(cls, measurements: Dict) -> np.ndarray:
processed = measurements.copy()
for field, default in cls.OPTIONAL_MEASUREMENTS.items():
if field not in processed:
processed[field] = default
normalized = []
measurement_order = [
"height", "weight", "chest", "waist", "hips",
"shoulder_width", "arm_length", "leg_length", "inseam"
]
for field in measurement_order:
value = processed[field]
factor = cls.NORMALIZATION_FACTORS[field]
normalized.append(value / factor)
return np.array(normalized, dtype=np.float32)
@classmethod
def process(cls, measurements: Dict) -> np.ndarray:
validation = cls.validate_measurements(measurements)
if not validation["valid"]:
raise ValueError(f"Invalid measurements: {', '.join(validation['errors'])}")
return cls.normalize_measurements(measurements)
def process_measurements(measurements: Dict) -> np.ndarray:
return MeasurementProcessor.process(measurements)