Spaces:
Paused
Paused
save the mesh
Browse files
src/pixel3dmm/tracking/tracker.py
CHANGED
|
@@ -201,7 +201,7 @@ class Tracker(object):
|
|
| 201 |
self.save_folder = env_paths.TRACKING_OUTPUT
|
| 202 |
self.output_folder = os.path.join(self.save_folder, self.actor_name)
|
| 203 |
self.checkpoint_folder = os.path.join(self.save_folder, self.actor_name, "checkpoint")
|
| 204 |
-
self.mesh_folder = os.path.join(self.save_folder, self.
|
| 205 |
self.create_output_folders()
|
| 206 |
self.writer = SummaryWriter(log_dir=self.save_folder + self.actor_name + '/logs')
|
| 207 |
|
|
@@ -1288,6 +1288,28 @@ class Tracker(object):
|
|
| 1288 |
normals = np.transpose(normals, (1, 2, 0))
|
| 1289 |
# scale to uint8
|
| 1290 |
arr = (normals * 255).clip(0,255).astype(np.uint8)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1291 |
return arr
|
| 1292 |
|
| 1293 |
mask = (self.parse_mask(ops, batch, visualization=True) > 0).float()
|
|
|
|
| 201 |
self.save_folder = env_paths.TRACKING_OUTPUT
|
| 202 |
self.output_folder = os.path.join(self.save_folder, self.actor_name)
|
| 203 |
self.checkpoint_folder = os.path.join(self.save_folder, self.actor_name, "checkpoint")
|
| 204 |
+
self.mesh_folder = os.path.join(self.save_folder, self.video_name, "mesh")
|
| 205 |
self.create_output_folders()
|
| 206 |
self.writer = SummaryWriter(log_dir=self.save_folder + self.actor_name + '/logs')
|
| 207 |
|
|
|
|
| 1288 |
normals = np.transpose(normals, (1, 2, 0))
|
| 1289 |
# scale to uint8
|
| 1290 |
arr = (normals * 255).clip(0,255).astype(np.uint8)
|
| 1291 |
+
|
| 1292 |
+
if visualizations == [[View.SHAPE]]:
|
| 1293 |
+
# build your normal‐map preview as before
|
| 1294 |
+
normals = ops['normal_images'][0].cpu().numpy() # [3,H,W]
|
| 1295 |
+
normals = (normals + 1.0) / 2.0 # → [0,1]
|
| 1296 |
+
normals = np.transpose(normals, (1,2,0)) # H×W×3
|
| 1297 |
+
arr = (normals * 255).clip(0,255).astype(np.uint8)
|
| 1298 |
+
|
| 1299 |
+
# --- new: export the *non*-canonical mesh ---
|
| 1300 |
+
os.makedirs(self.mesh_folder, exist_ok=True)
|
| 1301 |
+
frame_id = str(self.frame).zfill(5)
|
| 1302 |
+
ply_path = os.path.join(self.mesh_folder, f"{frame_id}.ply")
|
| 1303 |
+
|
| 1304 |
+
# faces is the same face list you loaded in setup_renderer
|
| 1305 |
+
faces_np = self.faces.cpu().numpy()
|
| 1306 |
+
# vertices is your posed mesh from above:
|
| 1307 |
+
# vertices = … # torch.Tensor of shape (1, V, 3)
|
| 1308 |
+
verts_np = vertices[0].detach().cpu().numpy()
|
| 1309 |
+
|
| 1310 |
+
trimesh.Trimesh(faces=faces_np, vertices=verts_np, process=False) \
|
| 1311 |
+
.export(ply_path)
|
| 1312 |
+
|
| 1313 |
return arr
|
| 1314 |
|
| 1315 |
mask = (self.parse_mask(ops, batch, visualization=True) > 0).float()
|