clean pcd: switch to size-based method
Browse files- 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 |
-
|
| 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 |
|