kcml commited on
Commit
005ce9a
·
1 Parent(s): 3fc5c6f

clean pcd: switch to size-based method

Browse files
Files changed (1) hide show
  1. handcrafted_solution.py +24 -8
handcrafted_solution.py CHANGED
@@ -253,7 +253,7 @@ def get_smooth_uv_depth(vertices, depth, gest_seg_np, sfm_depth_np, r=5):
253
  vertex_depth = np.array(vertex_depth)
254
  return uv, vertex_depth
255
 
256
-
257
  from numba import njit, prange
258
  @njit(parallel=True)
259
  def fill_range(u, v, z, dilate_r, c, sfm_depth_np, sfm_color_np, H, W):
@@ -267,7 +267,7 @@ def fill_range(u, v, z, dilate_r, c, sfm_depth_np, sfm_color_np, H, W):
267
  if DUMP_IMG:
268
  sfm_color_np[j, i] = c
269
  return sfm_depth_np, sfm_color_np
270
- ''''''
271
 
272
  def get_SfM_depth(XYZ, rgb, depth_np, gest_seg_np, K, R, t, dilate_r = 5):
273
  '''Project 3D sfm pointcloud to the image plane '''
@@ -296,7 +296,7 @@ def get_SfM_depth(XYZ, rgb, depth_np, gest_seg_np, K, R, t, dilate_r = 5):
296
  #checked = 0
297
  #print('dim of us uv zs rgb:', len(us), len(vs), len(zs), len(rgb))
298
  for u,v,z,c in zip(us,vs,zs, rgb):
299
-
300
  sfm_depth_np, sfm_color_np = fill_range(u, v, z, dilate_r, c, sfm_depth_np, sfm_color_np, H, W)
301
  '''
302
  i_range = range(max(0, u - dilate_r), min(W, u + dilate_r))
@@ -310,7 +310,7 @@ def get_SfM_depth(XYZ, rgb, depth_np, gest_seg_np, K, R, t, dilate_r = 5):
310
  sfm_depth_np[j, i] = z
311
  if DUMP_IMG:
312
  sfm_color_np[j, i] = c
313
- '''
314
 
315
 
316
  #print(f'checked {checked} pts')
@@ -780,14 +780,28 @@ def clean_PCD(XYZ, rgb):
780
  center_thr = 500
781
  retain_class_mask = labels == -2
782
 
 
 
783
  for k in unique_labels:
784
- if k == -1:
785
- continue
786
  class_member_mask = labels == k
 
 
 
 
 
 
 
 
 
 
 
787
  pt_k = XYZ[class_member_mask]
788
  Xmean = np.mean(pt_k[:,0])
789
  Ymean = np.mean(pt_k[:,1])
790
- if Xmean < center_thr and Ymean < center_thr:
 
 
 
791
  retain_class_mask = retain_class_mask | class_member_mask
792
 
793
  XYZ = XYZ[retain_class_mask]
@@ -799,7 +813,7 @@ def predict(entry, visualize=False, prune_dist_thr=600, depth_scale=2.5, ) -> Tu
799
  points3D = good_entry['points3d']
800
  XYZ = np.stack([p.xyz for p in points3D.values()])
801
  rgb = np.stack([p.rgb for p in points3D.values()])
802
- #XYZ, rgb = clean_PCD(XYZ, rgb)
803
  vert_edge_per_image = {}
804
  for i, (ade, gest, depth, K, R, t) in enumerate(zip(
805
  good_entry['ade20k'],
@@ -860,7 +874,9 @@ def predict(entry, visualize=False, prune_dist_thr=600, depth_scale=2.5, ) -> Tu
860
  #print('before merge, vertices=', vertices, ' connections=', connections, ' vertices_3d=', vertices_3d)
861
  #all_3d_vertices, connections_3d = merge_vertices_3d(vert_edge_per_image, 3.0) # TODO: 3cm looks too small
862
  all_3d_vertices, connections_3d = merge_vertices_3d(vert_edge_per_image, 150)
 
863
  #print(f'after merge, {len(all_3d_vertices)} 3d vertices and {len(connections_3d)} 3d connections')
 
864
  #all_3d_vertices_clean, connections_3d_clean = prune_not_connected(all_3d_vertices, connections_3d)
865
  all_3d_vertices, connections_3d = prune_tall_short(all_3d_vertices, connections_3d, 1000, 0)
866
 
 
253
  vertex_depth = np.array(vertex_depth)
254
  return uv, vertex_depth
255
 
256
+ '''
257
  from numba import njit, prange
258
  @njit(parallel=True)
259
  def fill_range(u, v, z, dilate_r, c, sfm_depth_np, sfm_color_np, H, W):
 
267
  if DUMP_IMG:
268
  sfm_color_np[j, i] = c
269
  return sfm_depth_np, sfm_color_np
270
+ '''
271
 
272
  def get_SfM_depth(XYZ, rgb, depth_np, gest_seg_np, K, R, t, dilate_r = 5):
273
  '''Project 3D sfm pointcloud to the image plane '''
 
296
  #checked = 0
297
  #print('dim of us uv zs rgb:', len(us), len(vs), len(zs), len(rgb))
298
  for u,v,z,c in zip(us,vs,zs, rgb):
299
+ '''
300
  sfm_depth_np, sfm_color_np = fill_range(u, v, z, dilate_r, c, sfm_depth_np, sfm_color_np, H, W)
301
  '''
302
  i_range = range(max(0, u - dilate_r), min(W, u + dilate_r))
 
310
  sfm_depth_np[j, i] = z
311
  if DUMP_IMG:
312
  sfm_color_np[j, i] = c
313
+
314
 
315
 
316
  #print(f'checked {checked} pts')
 
780
  center_thr = 500
781
  retain_class_mask = labels == -2
782
 
783
+ largest_blob_size = 0
784
+ largest_blob = 0
785
  for k in unique_labels:
 
 
786
  class_member_mask = labels == k
787
+ blob_size = np.count_nonzero(class_member_mask)
788
+ if blob_size>largest_blob_size:
789
+ largest_blob_size = blob_size
790
+ largest_blob = k
791
+
792
+ for k in unique_labels:
793
+ class_member_mask = labels == k
794
+ if k == -1:
795
+ retain_class_mask = retain_class_mask | class_member_mask
796
+ continue
797
+ ''' center prior is not valid
798
  pt_k = XYZ[class_member_mask]
799
  Xmean = np.mean(pt_k[:,0])
800
  Ymean = np.mean(pt_k[:,1])
801
+ if abs(Xmean) < center_thr and abs(Ymean) < center_thr:
802
+ retain_class_mask = retain_class_mask | class_member_mask
803
+ '''
804
+ if k == largest_blob:
805
  retain_class_mask = retain_class_mask | class_member_mask
806
 
807
  XYZ = XYZ[retain_class_mask]
 
813
  points3D = good_entry['points3d']
814
  XYZ = np.stack([p.xyz for p in points3D.values()])
815
  rgb = np.stack([p.rgb for p in points3D.values()])
816
+ XYZ, rgb = clean_PCD(XYZ, rgb)
817
  vert_edge_per_image = {}
818
  for i, (ade, gest, depth, K, R, t) in enumerate(zip(
819
  good_entry['ade20k'],
 
874
  #print('before merge, vertices=', vertices, ' connections=', connections, ' vertices_3d=', vertices_3d)
875
  #all_3d_vertices, connections_3d = merge_vertices_3d(vert_edge_per_image, 3.0) # TODO: 3cm looks too small
876
  all_3d_vertices, connections_3d = merge_vertices_3d(vert_edge_per_image, 150)
877
+ #all_3d_vertices, connections_3d = merge_vertices_3d(vert_edge_per_image, 50)
878
  #print(f'after merge, {len(all_3d_vertices)} 3d vertices and {len(connections_3d)} 3d connections')
879
+ #print(f'after merge, 3d vertices: {all_3d_vertices} and 3d connections: {connections_3d}')
880
  #all_3d_vertices_clean, connections_3d_clean = prune_not_connected(all_3d_vertices, connections_3d)
881
  all_3d_vertices, connections_3d = prune_tall_short(all_3d_vertices, connections_3d, 1000, 0)
882