code to clean pcd, but roof points seem critical
Browse files- handcrafted_solution.py +31 -4
handcrafted_solution.py
CHANGED
|
@@ -8,6 +8,8 @@ import cv2
|
|
| 8 |
from typing import Tuple, List
|
| 9 |
|
| 10 |
from scipy.spatial.distance import cdist
|
|
|
|
|
|
|
| 11 |
|
| 12 |
from hoho.read_write_colmap import read_cameras_binary, read_images_binary, read_points3D_binary
|
| 13 |
from hoho.color_mappings import gestalt_color_mapping, ade20k_color_mapping
|
|
@@ -267,14 +269,14 @@ def fill_range(u, v, z, dilate_r, c, sfm_depth_np, sfm_color_np, H, W):
|
|
| 267 |
return sfm_depth_np, sfm_color_np
|
| 268 |
''''''
|
| 269 |
|
| 270 |
-
def get_SfM_depth(
|
| 271 |
'''Project 3D sfm pointcloud to the image plane '''
|
| 272 |
H, W = depth_np.shape[:2]
|
| 273 |
sfm_depth_np = np.zeros(depth_np.shape)
|
| 274 |
sfm_color_np = np.zeros(gest_seg_np.shape)
|
| 275 |
#XYZ1 = np.stack([(p.xyz, 1) for p in points3D.values()])
|
| 276 |
-
XYZ = np.stack([p.xyz for p in points3D.values()])
|
| 277 |
-
rgb = np.stack([p.rgb for p in points3D.values()])
|
| 278 |
#print('XYZ is ', XYZ.shape)
|
| 279 |
XYZ1 = np.concatenate((XYZ, np.ones((len(XYZ), 1))), axis=1)
|
| 280 |
#print('XYZ1 is ', XYZ1.shape)
|
|
@@ -770,9 +772,34 @@ def clean_gest(gest_seg_np):
|
|
| 770 |
|
| 771 |
return gest_seg_np
|
| 772 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 773 |
def predict(entry, visualize=False, prune_dist_thr=600, depth_scale=2.5, ) -> Tuple[np.ndarray, List[int]]:
|
| 774 |
good_entry = convert_entry_to_human_readable(entry)
|
| 775 |
points3D = good_entry['points3d']
|
|
|
|
|
|
|
|
|
|
| 776 |
vert_edge_per_image = {}
|
| 777 |
for i, (ade, gest, depth, K, R, t) in enumerate(zip(
|
| 778 |
good_entry['ade20k'],
|
|
@@ -816,7 +843,7 @@ def predict(entry, visualize=False, prune_dist_thr=600, depth_scale=2.5, ) -> Tu
|
|
| 816 |
continue
|
| 817 |
|
| 818 |
#uv, depth_vert = get_uv_depth(vertices, depth_np)
|
| 819 |
-
sfm_depth_np = get_SfM_depth(
|
| 820 |
uv, depth_vert = get_smooth_uv_depth(vertices, depth_np, gest_seg_np, sfm_depth_np, 75)
|
| 821 |
#uv, depth_vert = get_smooth_uv_depth(vertices, depth_np, gest_seg_np, None)
|
| 822 |
#print('uv:', uv, ' d:', depth_vert)
|
|
|
|
| 8 |
from typing import Tuple, List
|
| 9 |
|
| 10 |
from scipy.spatial.distance import cdist
|
| 11 |
+
from sklearn import metrics
|
| 12 |
+
from sklearn.cluster import DBSCAN
|
| 13 |
|
| 14 |
from hoho.read_write_colmap import read_cameras_binary, read_images_binary, read_points3D_binary
|
| 15 |
from hoho.color_mappings import gestalt_color_mapping, ade20k_color_mapping
|
|
|
|
| 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 '''
|
| 274 |
H, W = depth_np.shape[:2]
|
| 275 |
sfm_depth_np = np.zeros(depth_np.shape)
|
| 276 |
sfm_color_np = np.zeros(gest_seg_np.shape)
|
| 277 |
#XYZ1 = np.stack([(p.xyz, 1) for p in points3D.values()])
|
| 278 |
+
#XYZ = np.stack([p.xyz for p in points3D.values()])
|
| 279 |
+
#rgb = np.stack([p.rgb for p in points3D.values()])
|
| 280 |
#print('XYZ is ', XYZ.shape)
|
| 281 |
XYZ1 = np.concatenate((XYZ, np.ones((len(XYZ), 1))), axis=1)
|
| 282 |
#print('XYZ1 is ', XYZ1.shape)
|
|
|
|
| 772 |
|
| 773 |
return gest_seg_np
|
| 774 |
|
| 775 |
+
def clean_PCD(XYZ, rgb):
|
| 776 |
+
db = DBSCAN(eps=150, min_samples=20).fit(XYZ)
|
| 777 |
+
labels = db.labels_
|
| 778 |
+
unique_labels = set(labels)
|
| 779 |
+
core_samples_mask = np.zeros_like(labels, dtype=bool)
|
| 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]
|
| 794 |
+
rgb = rgb[retain_class_mask]
|
| 795 |
+
return XYZ, rgb
|
| 796 |
+
|
| 797 |
def predict(entry, visualize=False, prune_dist_thr=600, depth_scale=2.5, ) -> Tuple[np.ndarray, List[int]]:
|
| 798 |
good_entry = convert_entry_to_human_readable(entry)
|
| 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'],
|
|
|
|
| 843 |
continue
|
| 844 |
|
| 845 |
#uv, depth_vert = get_uv_depth(vertices, depth_np)
|
| 846 |
+
sfm_depth_np = get_SfM_depth(XYZ, rgb, depth_np, gest_seg_np, K, R, t, 5) # Sensitive. 10 is worse than 0 in testset
|
| 847 |
uv, depth_vert = get_smooth_uv_depth(vertices, depth_np, gest_seg_np, sfm_depth_np, 75)
|
| 848 |
#uv, depth_vert = get_smooth_uv_depth(vertices, depth_np, gest_seg_np, None)
|
| 849 |
#print('uv:', uv, ' d:', depth_vert)
|