nexusbert commited on
Commit
1ed5e21
·
1 Parent(s): 32d5b17
Files changed (2) hide show
  1. app.py +15 -10
  2. smpl_generator.py +73 -27
app.py CHANGED
@@ -15,16 +15,21 @@ from beta_regressor import predict_betas
15
  from smpl_generator import generate_mesh
16
  from renderer import render_avatar
17
 
18
- SMPL_MODEL_PATH = os.getenv("SMPL_MODEL_PATH", "smpl/smpl")
19
-
20
- smpl_models_dir = Path("smpl/smpl/models")
21
- if smpl_models_dir.exists():
22
- print(f"Found SMPL models in {smpl_models_dir}")
23
- model_files = list(smpl_models_dir.glob("*.pkl"))
24
- for f in model_files:
25
- print(f" - {f.name}")
26
- else:
27
- print(f"Warning: SMPL models not found in {smpl_models_dir}")
 
 
 
 
 
28
  print(f"Looking in {SMPL_MODEL_PATH}...")
29
 
30
  app = FastAPI(
 
15
  from smpl_generator import generate_mesh
16
  from renderer import render_avatar
17
 
18
+ SMPL_MODEL_PATH = os.getenv("SMPL_MODEL_PATH", "smpl")
19
+
20
+ smpl_models_dirs = [Path("smpl/smpl/models"), Path("smpl/models"), Path(SMPL_MODEL_PATH) / "models"]
21
+ found_models = False
22
+ for models_dir in smpl_models_dirs:
23
+ if models_dir.exists():
24
+ print(f"Found SMPL models in {models_dir}")
25
+ model_files = list(models_dir.glob("*.pkl"))
26
+ for f in model_files:
27
+ print(f" - {f.name}")
28
+ found_models = True
29
+ break
30
+
31
+ if not found_models:
32
+ print(f"Warning: SMPL models not found in expected locations")
33
  print(f"Looking in {SMPL_MODEL_PATH}...")
34
 
35
  app = FastAPI(
smpl_generator.py CHANGED
@@ -7,20 +7,31 @@ import os
7
 
8
 
9
  class SMPLGenerator:
10
- def __init__(self, model_path: str = "smpl/smpl", gender: str = "neutral", device: str = "cpu"):
11
  self.device = torch.device(device)
12
  self.gender = gender
13
 
14
  model_path_obj = Path(model_path)
15
 
16
  if not model_path_obj.exists():
17
- alt_path = Path("smpl/smpl")
18
- if alt_path.exists():
19
- model_path_obj = alt_path
20
- print(f"Using alternative model path: {model_path_obj}")
 
 
21
  else:
22
  model_path_obj.mkdir(parents=True, exist_ok=True)
23
 
 
 
 
 
 
 
 
 
 
24
  self.model_path = model_path_obj
25
  model_path_str = str(self.model_path)
26
 
@@ -28,37 +39,72 @@ class SMPLGenerator:
28
  gender = "male"
29
  print("Note: Neutral gender not available, using male model")
30
 
31
- try:
32
- self.smpl_model = smplx.create(
33
- model_path=model_path_str,
34
- model_type='smpl',
35
- gender=gender,
36
- batch_size=1,
37
- ext='npz'
38
- ).to(self.device)
39
- except Exception as e:
 
 
 
 
 
 
 
 
 
 
 
 
40
  try:
41
  self.smpl_model = smplx.create(
42
- model_path=model_path_str,
43
  model_type='smpl',
44
  gender=gender,
45
  batch_size=1,
46
- ext='pkl'
47
  ).to(self.device)
48
- except Exception as e2:
 
 
 
49
  try:
50
  self.smpl_model = smplx.create(
51
- model_path=model_path_str,
52
  model_type='smpl',
53
  gender=gender,
54
- batch_size=1
 
55
  ).to(self.device)
56
- except Exception as e3:
57
- raise RuntimeError(
58
- f"Failed to load SMPL model. Error: {str(e3)}. "
59
- f"Model path: {model_path_str}. "
60
- f"Please ensure SMPL model files are in {model_path_str}/models/ directory."
61
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
 
63
  def generate_mesh(
64
  self,
@@ -107,7 +153,7 @@ class SMPLGenerator:
107
  _generator_instance = None
108
 
109
 
110
- def get_generator(model_path: str = "smpl/smpl", gender: str = "neutral", device: str = "cpu") -> SMPLGenerator:
111
  global _generator_instance
112
  if _generator_instance is None:
113
  _generator_instance = SMPLGenerator(model_path=model_path, gender=gender, device=device)
@@ -116,7 +162,7 @@ def get_generator(model_path: str = "smpl/smpl", gender: str = "neutral", device
116
 
117
  def generate_mesh(
118
  betas: np.ndarray,
119
- model_path: str = "smpl/smpl",
120
  gender: str = "neutral",
121
  device: str = "cpu"
122
  ) -> Tuple[np.ndarray, np.ndarray]:
 
7
 
8
 
9
  class SMPLGenerator:
10
+ def __init__(self, model_path: str = "smpl", gender: str = "neutral", device: str = "cpu"):
11
  self.device = torch.device(device)
12
  self.gender = gender
13
 
14
  model_path_obj = Path(model_path)
15
 
16
  if not model_path_obj.exists():
17
+ alt_paths = [Path("smpl"), Path("smpl/smpl")]
18
+ for alt_path in alt_paths:
19
+ if alt_path.exists():
20
+ model_path_obj = alt_path
21
+ print(f"Using alternative model path: {model_path_obj}")
22
+ break
23
  else:
24
  model_path_obj.mkdir(parents=True, exist_ok=True)
25
 
26
+ models_source = model_path_obj / "smpl" / "models"
27
+ if not models_source.exists():
28
+ models_source = model_path_obj / "models"
29
+
30
+ if models_source.exists() and (model_path_obj / "smpl").exists():
31
+ expected_models_dir = model_path_obj / "smpl" / "models"
32
+ if not expected_models_dir.exists() and models_source.exists():
33
+ print(f"Models found in {models_source}, smplx may need them in {expected_models_dir}")
34
+
35
  self.model_path = model_path_obj
36
  model_path_str = str(self.model_path)
37
 
 
39
  gender = "male"
40
  print("Note: Neutral gender not available, using male model")
41
 
42
+ models_dir = model_path_obj / "models"
43
+ if not models_dir.exists():
44
+ models_dir = model_path_obj / "smpl" / "models"
45
+
46
+ print(f"Looking for SMPL models in: {model_path_str}")
47
+ if models_dir.exists():
48
+ model_files = list(models_dir.glob("*.pkl"))
49
+ print(f"Found {len(model_files)} model files: {[f.name for f in model_files]}")
50
+
51
+ model_paths_to_try = [
52
+ "smpl",
53
+ model_path_str,
54
+ str(model_path_obj / "smpl"),
55
+ str(models_dir.parent) if models_dir.exists() else None,
56
+ "smpl/smpl"
57
+ ]
58
+ model_paths_to_try = [p for p in model_paths_to_try if p is not None and Path(p).exists()]
59
+
60
+ last_error = None
61
+ for try_path in model_paths_to_try:
62
+ print(f"Trying model path: {try_path}")
63
  try:
64
  self.smpl_model = smplx.create(
65
+ model_path=try_path,
66
  model_type='smpl',
67
  gender=gender,
68
  batch_size=1,
69
+ ext='npz'
70
  ).to(self.device)
71
+ print(f"Successfully loaded model from: {try_path}")
72
+ break
73
+ except Exception as e:
74
+ last_error = e
75
  try:
76
  self.smpl_model = smplx.create(
77
+ model_path=try_path,
78
  model_type='smpl',
79
  gender=gender,
80
+ batch_size=1,
81
+ ext='pkl'
82
  ).to(self.device)
83
+ print(f"Successfully loaded model from: {try_path}")
84
+ break
85
+ except Exception as e2:
86
+ last_error = e2
87
+ try:
88
+ self.smpl_model = smplx.create(
89
+ model_path=try_path,
90
+ model_type='smpl',
91
+ gender=gender,
92
+ batch_size=1
93
+ ).to(self.device)
94
+ print(f"Successfully loaded model from: {try_path}")
95
+ break
96
+ except Exception as e3:
97
+ last_error = e3
98
+ continue
99
+ else:
100
+ error_msg = str(last_error) if last_error else "Unknown error"
101
+ print(f"Error details: {error_msg}")
102
+ raise RuntimeError(
103
+ f"Failed to load SMPL model after trying paths: {model_paths_to_try}. "
104
+ f"Error: {error_msg}. "
105
+ f"Models should be in a 'models' subdirectory. "
106
+ f"Expected files: basicModel_f_lbs_*.pkl (female) or basicmodel_m_lbs_*.pkl (male)"
107
+ )
108
 
109
  def generate_mesh(
110
  self,
 
153
  _generator_instance = None
154
 
155
 
156
+ def get_generator(model_path: str = "smpl", gender: str = "neutral", device: str = "cpu") -> SMPLGenerator:
157
  global _generator_instance
158
  if _generator_instance is None:
159
  _generator_instance = SMPLGenerator(model_path=model_path, gender=gender, device=device)
 
162
 
163
  def generate_mesh(
164
  betas: np.ndarray,
165
+ model_path: str = "smpl",
166
  gender: str = "neutral",
167
  device: str = "cpu"
168
  ) -> Tuple[np.ndarray, np.ndarray]: