Stable-X commited on
Commit
ee7fb00
·
verified ·
1 Parent(s): 724fc00

Upload app_fine.py

Browse files
Files changed (1) hide show
  1. 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, fxy, target_extrinsic, rend_depth, target_pointmap):
 
 
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
- return transformation_matrix, result.fitness
 
 
 
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
- voxel_size = 1/64
 
 
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], rend_depth_eroded, point_map_perframe[k].cpu().numpy())
 
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.01, np.eye(4),
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) * 63).to(torch.int32)
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,