DRAPEa / utils /body_shape_detector.py
andevs's picture
Upload 18 files
9c1053c verified
Raw
History Blame Contribute Delete
4.13 kB
class BodyShapeDetector:
def __init__(self):
self.shape_characteristics = {
'hourglass': {
'characteristics': ['Balanced shoulders and hips', 'Defined waist', 'Curvy silhouette'],
'flattering_styles': ['Wrap dresses', 'Belted waists', 'Tailored fits'],
'avoid_styles': ['Boxy cuts', 'Sack dresses', 'Oversized shapes'],
'celebrities': ['Beyoncé', 'Scarlett Johansson', 'Sofia Vergara']
},
'pear': {
'characteristics': ['Narrower shoulders', 'Wider hips', 'Smaller bust'],
'flattering_styles': ['A-line skirts', 'Boat necks', 'Statement sleeves'],
'avoid_styles': ['Skinny jeans', 'Low-rise pants', 'Pencil skirts'],
'celebrities': ['Rihanna', 'Jennifer Lopez', 'Kim Kardashian']
},
'apple': {
'characteristics': ['Broader shoulders', 'Fuller midsection', 'Slimmer legs'],
'flattering_styles': ['Empire waist', 'V-necklines', 'Flowy tops'],
'avoid_styles': ['Crop tops', 'Tight waistbands', 'Belted waists'],
'celebrities': ['Adele', 'Oprah', 'Melissa McCarthy']
},
'rectangle': {
'characteristics': ['Straight silhouette', 'Balanced proportions', 'Athletic build'],
'flattering_styles': ['Peplum tops', 'Belted jackets', 'Layered looks'],
'avoid_styles': ['Straight cuts', 'Monochrome outfits', 'Baggy clothes'],
'celebrities': ['Cameron Diaz', 'Natalie Portman', 'Keira Knightley']
},
'inverted triangle': {
'characteristics': ['Broad shoulders', 'Narrower hips', 'Athletic build'],
'flattering_styles': ['V-necks', 'Flared pants', 'Pencil skirts'],
'avoid_styles': ['Shoulder pads', 'Boat necks', 'Halter tops'],
'celebrities': ['Naomi Campbell', 'Demi Moore', 'Angelina Jolie']
}
}
self.fit_recommendations = {
'hourglass': 'Highlight your waist with fitted pieces',
'pear': 'Balance your proportions with volume on top',
'apple': 'Create definition with V-necklines and empire waists',
'rectangle': 'Add curves with peplum and belted styles',
'inverted triangle': 'Add volume to lower half with A-line skirts'
}
def detect(self, measurements: dict) -> dict:
shoulders = measurements.get('shoulders', 0)
chest = measurements.get('chest', 0)
waist = measurements.get('waist', 0)
hips = measurements.get('hips', 0)
shoulder_hip_ratio = shoulders / hips if hips > 0 else 1
waist_hip_ratio = waist / hips if hips > 0 else 1
shape = self._classify_shape(shoulder_hip_ratio, waist_hip_ratio)
shape_data = self.shape_characteristics.get(shape, self.shape_characteristics['rectangle'])
return {
"shape": shape,
"confidence": 0.85,
"characteristics": shape_data['characteristics'],
"flattering_styles": shape_data['flattering_styles'],
"avoid_styles": shape_data['avoid_styles'],
"fit_recommendations": self.fit_recommendations.get(shape, 'Choose styles that balance your proportions'),
"celebrities": shape_data['celebrities']
}
def _classify_shape(self, shoulder_hip_ratio: float, waist_hip_ratio: float) -> str:
if 0.95 <= shoulder_hip_ratio <= 1.05 and waist_hip_ratio < 0.75:
return 'hourglass'
elif shoulder_hip_ratio < 0.95 and waist_hip_ratio > 0.75:
return 'pear'
elif shoulder_hip_ratio > 1.05 and waist_hip_ratio > 0.85:
return 'apple'
elif 0.95 <= shoulder_hip_ratio <= 1.05 and 0.75 <= waist_hip_ratio <= 0.85:
return 'rectangle'
elif shoulder_hip_ratio > 1.05 and waist_hip_ratio < 0.75:
return 'inverted triangle'
else:
return 'rectangle'