mean depth
Browse files- handcrafted_solution.py +69 -18
handcrafted_solution.py
CHANGED
@@ -122,12 +122,41 @@ def get_uv_depth(vertices, depth):
|
|
122 |
vertex_depth = depth[(uv_int[:, 1] , uv_int[:, 0])]
|
123 |
return uv, vertex_depth
|
124 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
125 |
def get_vertices_and_edges_from_two_segmentations(ade_seg_np, gest_seg_np, edge_th = 50.0):
|
126 |
'''Get the vertices and edges from the gestalt segmentation mask of the house'''
|
127 |
vertices = []
|
128 |
connections = []
|
129 |
|
130 |
-
color_th =
|
131 |
|
132 |
#-------------------------
|
133 |
# combined map from ade
|
@@ -151,7 +180,7 @@ def get_vertices_and_edges_from_two_segmentations(ade_seg_np, gest_seg_np, edge_
|
|
151 |
#print(f'apex_color= {apex_color}')
|
152 |
#apex_mask = cv2.inRange(gest_seg_np, apex_color-0.5, apex_color+0.5)
|
153 |
apex_mask = cv2.inRange(gest_seg_np, apex_color-color_th, apex_color+color_th) # include more pts
|
154 |
-
#
|
155 |
if apex_mask.sum() > 0:
|
156 |
output = cv2.connectedComponentsWithStats(apex_mask, 8, cv2.CV_32S)
|
157 |
(numLabels, labels, stats, centroids) = output
|
@@ -174,17 +203,6 @@ def get_vertices_and_edges_from_two_segmentations(ade_seg_np, gest_seg_np, edge_
|
|
174 |
apex_map_on_ade[uu+ss[0], vv+ss[1]] = (255,255,255)
|
175 |
apex_map_on_gest[uu+ss[0], vv+ss[1]] = (255,255,255)
|
176 |
|
177 |
-
# imsave apex
|
178 |
-
import random
|
179 |
-
rid = random.random()
|
180 |
-
filename_apex_ade = f'apex_map_on_ade_{rid}.jpg'
|
181 |
-
cv2.imwrite(filename_apex_ade, apex_map_on_ade)
|
182 |
-
filename_apex_gest = f'apex_map_on_gest_{rid}.jpg'
|
183 |
-
cv2.imwrite(filename_apex_gest, apex_map_on_gest)
|
184 |
-
filename_apex_map = f'apex_map_{rid}.jpg'
|
185 |
-
cv2.imwrite(filename_apex_map, apex_map)
|
186 |
-
|
187 |
-
|
188 |
|
189 |
eave_end_color = np.array(gestalt_color_mapping['eave_end_point'])
|
190 |
#eave_end_mask = cv2.inRange(gest_seg_np, eave_end_color-0.5, eave_end_color+0.5)
|
@@ -198,7 +216,29 @@ def get_vertices_and_edges_from_two_segmentations(ade_seg_np, gest_seg_np, edge_
|
|
198 |
for i in range(numLabels-1):
|
199 |
vert = {"xy": centroids[i], "type": "eave_end_point"}
|
200 |
vertices.append(vert)
|
201 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
202 |
print(f'{len(vertices)} vertices detected')
|
203 |
# Connectivity
|
204 |
apex_pts = []
|
@@ -360,13 +400,23 @@ def predict(entry, visualize=False) -> Tuple[np.ndarray, List[int]]:
|
|
360 |
good_entry['K'],
|
361 |
good_entry['R'],
|
362 |
good_entry['t']
|
363 |
-
)):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
364 |
ade_seg = ade.resize(depth.size)
|
365 |
ade_seg_np = np.array(ade_seg).astype(np.uint8)
|
366 |
gest_seg = gest.resize(depth.size)
|
367 |
gest_seg_np = np.array(gest_seg).astype(np.uint8)
|
368 |
# Metric3D
|
369 |
-
depth_np = np.array(depth) / 2.5 # 2.5 is the scale estimation coefficient
|
370 |
#vertices, connections = get_vertices_and_edges_from_segmentation(gest_seg_np, edge_th = 20.)
|
371 |
vertices, connections = get_vertices_and_edges_from_two_segmentations(ade_seg_np, gest_seg_np, edge_th = 20.)
|
372 |
|
@@ -374,8 +424,9 @@ def predict(entry, visualize=False) -> Tuple[np.ndarray, List[int]]:
|
|
374 |
print (f'Not enough vertices or connections in image {i}')
|
375 |
vert_edge_per_image[i] = np.empty((0, 2)), [], np.empty((0, 3))
|
376 |
continue
|
377 |
-
uv, depth_vert = get_uv_depth(vertices, depth_np)
|
378 |
-
|
|
|
379 |
# Normalize the uv to the camera intrinsics
|
380 |
xy_local = np.ones((len(uv), 3))
|
381 |
xy_local[:, 0] = (uv[:, 0] - K[0,2]) / K[0,0]
|
|
|
122 |
vertex_depth = depth[(uv_int[:, 1] , uv_int[:, 0])]
|
123 |
return uv, vertex_depth
|
124 |
|
125 |
+
def get_smooth_uv_depth(vertices, depth):
|
126 |
+
'''Get the depth of the vertices from the depth image'''
|
127 |
+
#print(f'max depth = {np.max(depth)}')
|
128 |
+
uv = []
|
129 |
+
for v in vertices:
|
130 |
+
uv.append(v['xy'])
|
131 |
+
uv = np.array(uv)
|
132 |
+
uv_int = uv.astype(np.int32)
|
133 |
+
H, W = depth.shape[:2]
|
134 |
+
a = np.clip( uv_int[:, 0], 0, W-1)
|
135 |
+
b = np.clip( uv_int[:, 1], 0, H-1)
|
136 |
+
def get_local_depth(x,y, H, W, depth, r=5):
|
137 |
+
'''return a smooth version of detph in radius r'''
|
138 |
+
local_depths = []
|
139 |
+
for i in range(max(0, x - r), min(W, x + r + 1)):
|
140 |
+
for j in range(max(0, y - r), min(H, y + r + 1)):
|
141 |
+
if np.sqrt((i - x)**2 + (j - y)**2) <= r:
|
142 |
+
local_depths.append(depth[j, i])
|
143 |
+
return local_depths
|
144 |
+
|
145 |
+
vertex_depth = []
|
146 |
+
for x,y in zip(a,b):
|
147 |
+
local_depths = get_local_depth(x,y, H, W, depth, 5)
|
148 |
+
local_mean = np.mean(local_depths)
|
149 |
+
vertex_depth.append(local_mean)
|
150 |
+
vertex_depth = np.array(vertex_depth)
|
151 |
+
|
152 |
+
return uv, vertex_depth
|
153 |
+
|
154 |
def get_vertices_and_edges_from_two_segmentations(ade_seg_np, gest_seg_np, edge_th = 50.0):
|
155 |
'''Get the vertices and edges from the gestalt segmentation mask of the house'''
|
156 |
vertices = []
|
157 |
connections = []
|
158 |
|
159 |
+
color_th = 10.0 # Cost ->2.6
|
160 |
|
161 |
#-------------------------
|
162 |
# combined map from ade
|
|
|
180 |
#print(f'apex_color= {apex_color}')
|
181 |
#apex_mask = cv2.inRange(gest_seg_np, apex_color-0.5, apex_color+0.5)
|
182 |
apex_mask = cv2.inRange(gest_seg_np, apex_color-color_th, apex_color+color_th) # include more pts
|
183 |
+
#apex_mask = cv2.bitwise_and(apex_mask, ade_mask) # remove pts
|
184 |
if apex_mask.sum() > 0:
|
185 |
output = cv2.connectedComponentsWithStats(apex_mask, 8, cv2.CV_32S)
|
186 |
(numLabels, labels, stats, centroids) = output
|
|
|
203 |
apex_map_on_ade[uu+ss[0], vv+ss[1]] = (255,255,255)
|
204 |
apex_map_on_gest[uu+ss[0], vv+ss[1]] = (255,255,255)
|
205 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
206 |
|
207 |
eave_end_color = np.array(gestalt_color_mapping['eave_end_point'])
|
208 |
#eave_end_mask = cv2.inRange(gest_seg_np, eave_end_color-0.5, eave_end_color+0.5)
|
|
|
216 |
for i in range(numLabels-1):
|
217 |
vert = {"xy": centroids[i], "type": "eave_end_point"}
|
218 |
vertices.append(vert)
|
219 |
+
|
220 |
+
uu = int(centroids[i][1])
|
221 |
+
vv = int(centroids[i][0])
|
222 |
+
# plot a cross
|
223 |
+
apex_map_on_ade[uu, vv] = (255,0,0)
|
224 |
+
shift=[(1,0),(-1,0),(0,1),(0,-1), (2,0),(-2,0),(0,2),(0,-2), (3,0),(-3,0),(0,3),(0,-3)]
|
225 |
+
h,w,_ = apex_map_on_ade.shape
|
226 |
+
for ss in shift:
|
227 |
+
if uu+ss[0] >= 0 and uu+ss[0] < h and vv+ss[1] >= 0 and vv+ss[1] < w:
|
228 |
+
apex_map[uu+ss[0], vv+ss[1]] = (255,0,0)
|
229 |
+
apex_map_on_ade[uu+ss[0], vv+ss[1]] = (255,0,0)
|
230 |
+
apex_map_on_gest[uu+ss[0], vv+ss[1]] = (255,0,0)
|
231 |
+
|
232 |
+
# imsave apex and eave_end
|
233 |
+
import random
|
234 |
+
rid = random.random()
|
235 |
+
filename_apex_ade = f'apex_map_on_ade_{rid}.jpg'
|
236 |
+
cv2.imwrite(filename_apex_ade, apex_map_on_ade)
|
237 |
+
filename_apex_gest = f'apex_map_on_gest_{rid}.jpg'
|
238 |
+
cv2.imwrite(filename_apex_gest, apex_map_on_gest)
|
239 |
+
filename_apex_map = f'apex_map_{rid}.jpg'
|
240 |
+
cv2.imwrite(filename_apex_map, apex_map)
|
241 |
+
|
242 |
print(f'{len(vertices)} vertices detected')
|
243 |
# Connectivity
|
244 |
apex_pts = []
|
|
|
400 |
good_entry['K'],
|
401 |
good_entry['R'],
|
402 |
good_entry['t']
|
403 |
+
)):
|
404 |
+
''' entry 0 suggests:
|
405 |
+
depth_scale = 1
|
406 |
+
if i==1:
|
407 |
+
depth_scale = 2.5
|
408 |
+
elif i==2: # only visualize view 0,1
|
409 |
+
continue
|
410 |
+
'''
|
411 |
+
depth_scale = 2.5
|
412 |
+
|
413 |
+
|
414 |
ade_seg = ade.resize(depth.size)
|
415 |
ade_seg_np = np.array(ade_seg).astype(np.uint8)
|
416 |
gest_seg = gest.resize(depth.size)
|
417 |
gest_seg_np = np.array(gest_seg).astype(np.uint8)
|
418 |
# Metric3D
|
419 |
+
depth_np = np.array(depth) / depth_scale # / 2.5 # 2.5 is the scale estimation coefficient # don't use 2.5...
|
420 |
#vertices, connections = get_vertices_and_edges_from_segmentation(gest_seg_np, edge_th = 20.)
|
421 |
vertices, connections = get_vertices_and_edges_from_two_segmentations(ade_seg_np, gest_seg_np, edge_th = 20.)
|
422 |
|
|
|
424 |
print (f'Not enough vertices or connections in image {i}')
|
425 |
vert_edge_per_image[i] = np.empty((0, 2)), [], np.empty((0, 3))
|
426 |
continue
|
427 |
+
#uv, depth_vert = get_uv_depth(vertices, depth_np)
|
428 |
+
uv, depth_vert = get_smooth_uv_depth(vertices, depth_np)
|
429 |
+
|
430 |
# Normalize the uv to the camera intrinsics
|
431 |
xy_local = np.ones((len(uv), 3))
|
432 |
xy_local[:, 0] = (uv[:, 0] - K[0,2]) / K[0,0]
|