Spaces:
Running
on
Zero
Running
on
Zero
Upload app_fine.py
Browse files- app_fine.py +26 -8
app_fine.py
CHANGED
|
@@ -263,7 +263,9 @@ def refine_pose_mast3r(rend_image_pil, target_image_pil, original_size, fxy, tar
|
|
| 263 |
target_extrinsic_final = torch.tensor(predict_c2w_refine).inverse().cuda()[None].float()
|
| 264 |
return target_extrinsic_final
|
| 265 |
|
| 266 |
-
def pointcloud_registration(rend_image_pil, target_image_pil, original_size,
|
|
|
|
|
|
|
| 267 |
images_mast3r = load_images_new([rend_image_pil, target_image_pil], size=512, square_ok=True)
|
| 268 |
with torch.no_grad():
|
| 269 |
output = inference([tuple(images_mast3r)], mast3r_model, device, batch_size=1, verbose=False)
|
|
@@ -359,7 +361,10 @@ def pointcloud_registration(rend_image_pil, target_image_pil, original_size, fxy
|
|
| 359 |
)
|
| 360 |
transformation_matrix = result.transformation.copy()
|
| 361 |
transformation_matrix[:3,:3] = transformation_matrix[:3,:3] * (scale_1 / scale_2)
|
| 362 |
-
|
|
|
|
|
|
|
|
|
|
| 363 |
|
| 364 |
@spaces.GPU(duration=120)
|
| 365 |
def generate_and_extract_glb(
|
|
@@ -465,7 +470,9 @@ def generate_and_extract_glb(
|
|
| 465 |
cl, ind = pcd.remove_statistical_outlier(nb_neighbors=30, std_ratio=3.0)
|
| 466 |
inlier_cloud = pcd.select_by_index(ind)
|
| 467 |
outlier_cloud = pcd.select_by_index(ind, invert=True)
|
| 468 |
-
|
|
|
|
|
|
|
| 469 |
down_pcd = inlier_cloud.voxel_down_sample(voxel_size)
|
| 470 |
torch.cuda.empty_cache()
|
| 471 |
|
|
@@ -476,6 +483,16 @@ def generate_and_extract_glb(
|
|
| 476 |
target_intrinsics = []
|
| 477 |
target_transforms = []
|
| 478 |
target_fitnesses = []
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 479 |
for k in range(len(image_files)):
|
| 480 |
images = torch.stack([TF.ToTensor()(render_image) for render_image in video['color']] + [TF.ToTensor()(image_files[k].convert("RGB"))], dim=0)
|
| 481 |
# if len(images) == 0:
|
|
@@ -536,7 +553,8 @@ def generate_and_extract_glb(
|
|
| 536 |
|
| 537 |
idx = iou_list.index(max(iou_list))
|
| 538 |
target_extrinsic[j:j+1] = target_extrinsic_list[idx]
|
| 539 |
-
target_transform, fitness = pointcloud_registration(rend_image_pil, target_image_pil, original_size, fxy[j:j+1], target_extrinsic[j:j+1],
|
|
|
|
| 540 |
target_transforms.append(target_transform)
|
| 541 |
target_fitnesses.append(fitness)
|
| 542 |
|
|
@@ -549,15 +567,15 @@ def generate_and_extract_glb(
|
|
| 549 |
idx = target_fitnesses.index(max(target_fitnesses_filtered))
|
| 550 |
target_transform = target_transforms[idx]
|
| 551 |
down_pcd_align = copy.deepcopy(down_pcd).transform(target_transform)
|
| 552 |
-
pcd = o3d.geometry.PointCloud()
|
| 553 |
-
pcd.points = o3d.utility.Vector3dVector(coords[:,1:].cpu().numpy() / 64 - 0.5)
|
| 554 |
reg_p2p = o3d.pipelines.registration.registration_icp(
|
| 555 |
-
down_pcd_align, pcd, 0.
|
| 556 |
o3d.pipelines.registration.TransformationEstimationPointToPoint(with_scaling=True),
|
| 557 |
o3d.pipelines.registration.ICPConvergenceCriteria(max_iteration = 10000))
|
| 558 |
down_pcd_align_2 = copy.deepcopy(down_pcd_align).transform(reg_p2p.transformation)
|
| 559 |
input_points = torch.tensor(np.asarray(down_pcd_align_2.points)).to(extrinsic.device).float()
|
| 560 |
-
input_points = ((input_points + 0.5).clip(0, 1) *
|
| 561 |
|
| 562 |
outputs = pipeline.run_refine(
|
| 563 |
image=image_files,
|
|
|
|
| 263 |
target_extrinsic_final = torch.tensor(predict_c2w_refine).inverse().cuda()[None].float()
|
| 264 |
return target_extrinsic_final
|
| 265 |
|
| 266 |
+
def pointcloud_registration(rend_image_pil, target_image_pil, original_size,
|
| 267 |
+
fxy, target_extrinsic, rend_depth, target_pointmap,
|
| 268 |
+
down_pcd, pcd):
|
| 269 |
images_mast3r = load_images_new([rend_image_pil, target_image_pil], size=512, square_ok=True)
|
| 270 |
with torch.no_grad():
|
| 271 |
output = inference([tuple(images_mast3r)], mast3r_model, device, batch_size=1, verbose=False)
|
|
|
|
| 361 |
)
|
| 362 |
transformation_matrix = result.transformation.copy()
|
| 363 |
transformation_matrix[:3,:3] = transformation_matrix[:3,:3] * (scale_1 / scale_2)
|
| 364 |
+
evaluation = o3d.pipelines.registration.evaluate_registration(
|
| 365 |
+
down_pcd, pcd, 0.02, transformation_matrix
|
| 366 |
+
)
|
| 367 |
+
return transformation_matrix, evaluation.fitness
|
| 368 |
|
| 369 |
@spaces.GPU(duration=120)
|
| 370 |
def generate_and_extract_glb(
|
|
|
|
| 470 |
cl, ind = pcd.remove_statistical_outlier(nb_neighbors=30, std_ratio=3.0)
|
| 471 |
inlier_cloud = pcd.select_by_index(ind)
|
| 472 |
outlier_cloud = pcd.select_by_index(ind, invert=True)
|
| 473 |
+
distance = np.array(inlier_cloud.points) - np.array(inlier_cloud.points).mean(axis=0)[None]
|
| 474 |
+
scale = np.percentile(np.linalg.norm(distance, axis=1), 97)
|
| 475 |
+
voxel_size = 1/64*scale*2
|
| 476 |
down_pcd = inlier_cloud.voxel_down_sample(voxel_size)
|
| 477 |
torch.cuda.empty_cache()
|
| 478 |
|
|
|
|
| 483 |
target_intrinsics = []
|
| 484 |
target_transforms = []
|
| 485 |
target_fitnesses = []
|
| 486 |
+
pcd = o3d.geometry.PointCloud()
|
| 487 |
+
mesh = outputs['mesh'][0]
|
| 488 |
+
idxs = torch.randperm(mesh.vertices.shape[0])[:min(50000, pointcloud.shape[0])]
|
| 489 |
+
pcd.points = o3d.utility.Vector3dVector(mesh.vertices[idxs].cpu().numpy())
|
| 490 |
+
distance = np.array(pcd.points) - np.array(pcd.points).mean(axis=0)[None]
|
| 491 |
+
scale = np.linalg.norm(distance, axis=1).max()
|
| 492 |
+
voxel_size = 1/64*scale*2
|
| 493 |
+
pcd = pcd.voxel_down_sample(voxel_size)
|
| 494 |
+
# pcd.points = o3d.utility.Vector3dVector((coords[:,1:].cpu().numpy() + 0.5) / 64 - 0.5)
|
| 495 |
+
|
| 496 |
for k in range(len(image_files)):
|
| 497 |
images = torch.stack([TF.ToTensor()(render_image) for render_image in video['color']] + [TF.ToTensor()(image_files[k].convert("RGB"))], dim=0)
|
| 498 |
# if len(images) == 0:
|
|
|
|
| 553 |
|
| 554 |
idx = iou_list.index(max(iou_list))
|
| 555 |
target_extrinsic[j:j+1] = target_extrinsic_list[idx]
|
| 556 |
+
target_transform, fitness = pointcloud_registration(rend_image_pil, target_image_pil, original_size, fxy[j:j+1], target_extrinsic[j:j+1], \
|
| 557 |
+
rend_depth_eroded, point_map_perframe[k].cpu().numpy(), down_pcd, pcd)
|
| 558 |
target_transforms.append(target_transform)
|
| 559 |
target_fitnesses.append(fitness)
|
| 560 |
|
|
|
|
| 567 |
idx = target_fitnesses.index(max(target_fitnesses_filtered))
|
| 568 |
target_transform = target_transforms[idx]
|
| 569 |
down_pcd_align = copy.deepcopy(down_pcd).transform(target_transform)
|
| 570 |
+
# pcd = o3d.geometry.PointCloud()
|
| 571 |
+
# pcd.points = o3d.utility.Vector3dVector(coords[:,1:].cpu().numpy() / 64 - 0.5)
|
| 572 |
reg_p2p = o3d.pipelines.registration.registration_icp(
|
| 573 |
+
down_pcd_align, pcd, 0.02, np.eye(4),
|
| 574 |
o3d.pipelines.registration.TransformationEstimationPointToPoint(with_scaling=True),
|
| 575 |
o3d.pipelines.registration.ICPConvergenceCriteria(max_iteration = 10000))
|
| 576 |
down_pcd_align_2 = copy.deepcopy(down_pcd_align).transform(reg_p2p.transformation)
|
| 577 |
input_points = torch.tensor(np.asarray(down_pcd_align_2.points)).to(extrinsic.device).float()
|
| 578 |
+
input_points = ((input_points + 0.5).clip(0, 1) * 64 - 0.5).to(torch.int32)
|
| 579 |
|
| 580 |
outputs = pipeline.run_refine(
|
| 581 |
image=image_files,
|