Spaces:
Running
on
Zero
Running
on
Zero
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()
|