(1)vertex and connection color_thr; (2)skip pruning
Browse files- handcrafted_solution.py +25 -15
handcrafted_solution.py
CHANGED
|
@@ -126,9 +126,12 @@ def get_vertices_and_edges_from_two_segmentations(ade_seg_np, gest_seg_np, edge_
|
|
| 126 |
'''Get the vertices and edges from the gestalt segmentation mask of the house'''
|
| 127 |
vertices = []
|
| 128 |
connections = []
|
| 129 |
-
|
|
|
|
|
|
|
|
|
|
| 130 |
# combined map from ade
|
| 131 |
-
print(gest_seg_np.shape, ade_seg_np.shape)
|
| 132 |
ade_color0 = np.array([0,0,0])
|
| 133 |
ade_mask0 = cv2.inRange(ade_seg_np, ade_color0-0.5, ade_color0+0.5)
|
| 134 |
ade_color1 = np.array([120,120,120])
|
|
@@ -139,15 +142,15 @@ def get_vertices_and_edges_from_two_segmentations(ade_seg_np, gest_seg_np, edge_
|
|
| 139 |
ade_mask3 = cv2.inRange(ade_seg_np, ade_color3-0.5, ade_color3+0.5)
|
| 140 |
ade_mask = cv2.bitwise_or(ade_mask3, ade_mask2)
|
| 141 |
ade_mask = cv2.bitwise_or(ade_mask1, ade_mask)
|
| 142 |
-
print(ade_mask.any())
|
| 143 |
apex_map = np.zeros(ade_seg_np.shape)
|
| 144 |
apex_map_on_ade = ade_seg_np
|
| 145 |
apex_map_on_gest = gest_seg_np
|
| 146 |
# Apex
|
| 147 |
apex_color = np.array(gestalt_color_mapping['apex'])
|
| 148 |
-
print(f'apex_color= {apex_color}')
|
| 149 |
-
apex_mask = cv2.inRange(gest_seg_np, apex_color-0.5, apex_color+0.5)
|
| 150 |
-
|
| 151 |
# apex_mask = cv2.bitwise_and(apex_mask, ade_mask) # remove pts
|
| 152 |
if apex_mask.sum() > 0:
|
| 153 |
output = cv2.connectedComponentsWithStats(apex_mask, 8, cv2.CV_32S)
|
|
@@ -158,7 +161,7 @@ def get_vertices_and_edges_from_two_segmentations(ade_seg_np, gest_seg_np, edge_
|
|
| 158 |
vert = {"xy": centroids[i], "type": "apex"}
|
| 159 |
vertices.append(vert)
|
| 160 |
|
| 161 |
-
print(f'centroids[i]={centroids[i]}')
|
| 162 |
uu = int(centroids[i][1])
|
| 163 |
vv = int(centroids[i][0])
|
| 164 |
# plot a cross
|
|
@@ -184,8 +187,9 @@ def get_vertices_and_edges_from_two_segmentations(ade_seg_np, gest_seg_np, edge_
|
|
| 184 |
|
| 185 |
|
| 186 |
eave_end_color = np.array(gestalt_color_mapping['eave_end_point'])
|
| 187 |
-
eave_end_mask = cv2.inRange(gest_seg_np, eave_end_color-0.5, eave_end_color+0.5)
|
| 188 |
-
eave_end_mask = cv2.
|
|
|
|
| 189 |
if eave_end_mask.sum() > 0:
|
| 190 |
output = cv2.connectedComponentsWithStats(eave_end_mask, 8, cv2.CV_32S)
|
| 191 |
(numLabels, labels, stats, centroids) = output
|
|
@@ -204,14 +208,15 @@ def get_vertices_and_edges_from_two_segmentations(ade_seg_np, gest_seg_np, edge_
|
|
| 204 |
apex_pts_idxs.append(j)
|
| 205 |
apex_pts = np.array(apex_pts)
|
| 206 |
|
| 207 |
-
# Ridge connects two apex points
|
|
|
|
| 208 |
for edge_class in ['eave', 'ridge', 'rake', 'valley']:
|
| 209 |
edge_color = np.array(gestalt_color_mapping[edge_class])
|
| 210 |
mask = cv2.morphologyEx(cv2.inRange(gest_seg_np,
|
| 211 |
-
edge_color-
|
| 212 |
-
edge_color+
|
| 213 |
cv2.MORPH_DILATE, np.ones((11, 11)))
|
| 214 |
-
line_img = np.copy(gest_seg_np) * 0
|
| 215 |
if mask.sum() > 0:
|
| 216 |
output = cv2.connectedComponentsWithStats(mask, 8, cv2.CV_32S)
|
| 217 |
(numLabels, labels, stats, centroids) = output
|
|
@@ -226,7 +231,7 @@ def get_vertices_and_edges_from_two_segmentations(ade_seg_np, gest_seg_np, edge_
|
|
| 226 |
x_right = x[xright_idx]
|
| 227 |
y_right = y[xright_idx]
|
| 228 |
edges.append((x_left, y_left, x_right, y_right))
|
| 229 |
-
cv2.line(line_img, (x_left, y_left), (x_right, y_right), (255, 255, 255), 2)
|
| 230 |
edges = np.array(edges)
|
| 231 |
if (len(apex_pts) < 2) or len(edges) <1:
|
| 232 |
continue
|
|
@@ -239,6 +244,8 @@ def get_vertices_and_edges_from_two_segmentations(ade_seg_np, gest_seg_np, edge_
|
|
| 239 |
for a_i, a in enumerate(connected_verts):
|
| 240 |
for b in connected_verts[a_i+1:]:
|
| 241 |
connections.append((a, b))
|
|
|
|
|
|
|
| 242 |
return vertices, connections
|
| 243 |
|
| 244 |
def get_uv_dept_category(vertices, depth, ade_seg):
|
|
@@ -383,7 +390,10 @@ def predict(entry, visualize=False) -> Tuple[np.ndarray, List[int]]:
|
|
| 383 |
vertices_3d = cv2.convertPointsFromHomogeneous(vertices_3d).reshape(-1, 3)
|
| 384 |
vert_edge_per_image[i] = vertices, connections, vertices_3d
|
| 385 |
all_3d_vertices, connections_3d = merge_vertices_3d(vert_edge_per_image, 3.0)
|
| 386 |
-
|
|
|
|
|
|
|
|
|
|
| 387 |
if (len(all_3d_vertices_clean) < 2) or len(connections_3d_clean) < 1:
|
| 388 |
print (f'Not enough vertices or connections in the 3D vertices')
|
| 389 |
return (good_entry['__key__'], *empty_solution())
|
|
|
|
| 126 |
'''Get the vertices and edges from the gestalt segmentation mask of the house'''
|
| 127 |
vertices = []
|
| 128 |
connections = []
|
| 129 |
+
|
| 130 |
+
color_th = 10.0 # Cost ->2.6
|
| 131 |
+
|
| 132 |
+
#-------------------------
|
| 133 |
# combined map from ade
|
| 134 |
+
#print(gest_seg_np.shape, ade_seg_np.shape)
|
| 135 |
ade_color0 = np.array([0,0,0])
|
| 136 |
ade_mask0 = cv2.inRange(ade_seg_np, ade_color0-0.5, ade_color0+0.5)
|
| 137 |
ade_color1 = np.array([120,120,120])
|
|
|
|
| 142 |
ade_mask3 = cv2.inRange(ade_seg_np, ade_color3-0.5, ade_color3+0.5)
|
| 143 |
ade_mask = cv2.bitwise_or(ade_mask3, ade_mask2)
|
| 144 |
ade_mask = cv2.bitwise_or(ade_mask1, ade_mask)
|
| 145 |
+
#print(ade_mask.any())
|
| 146 |
apex_map = np.zeros(ade_seg_np.shape)
|
| 147 |
apex_map_on_ade = ade_seg_np
|
| 148 |
apex_map_on_gest = gest_seg_np
|
| 149 |
# Apex
|
| 150 |
apex_color = np.array(gestalt_color_mapping['apex'])
|
| 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 |
# apex_mask = cv2.bitwise_and(apex_mask, ade_mask) # remove pts
|
| 155 |
if apex_mask.sum() > 0:
|
| 156 |
output = cv2.connectedComponentsWithStats(apex_mask, 8, cv2.CV_32S)
|
|
|
|
| 161 |
vert = {"xy": centroids[i], "type": "apex"}
|
| 162 |
vertices.append(vert)
|
| 163 |
|
| 164 |
+
#print(f'centroids[i]={centroids[i]}')
|
| 165 |
uu = int(centroids[i][1])
|
| 166 |
vv = int(centroids[i][0])
|
| 167 |
# plot a cross
|
|
|
|
| 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)
|
| 191 |
+
eave_end_mask = cv2.inRange(gest_seg_np, eave_end_color-color_th, eave_end_color+color_th)
|
| 192 |
+
#eave_end_mask = cv2.bitwise_and(eave_end_mask, ade_mask)
|
| 193 |
if eave_end_mask.sum() > 0:
|
| 194 |
output = cv2.connectedComponentsWithStats(eave_end_mask, 8, cv2.CV_32S)
|
| 195 |
(numLabels, labels, stats, centroids) = output
|
|
|
|
| 208 |
apex_pts_idxs.append(j)
|
| 209 |
apex_pts = np.array(apex_pts)
|
| 210 |
|
| 211 |
+
# Ridge connects two apex points
|
| 212 |
+
line_img = np.copy(gest_seg_np) * 0
|
| 213 |
for edge_class in ['eave', 'ridge', 'rake', 'valley']:
|
| 214 |
edge_color = np.array(gestalt_color_mapping[edge_class])
|
| 215 |
mask = cv2.morphologyEx(cv2.inRange(gest_seg_np,
|
| 216 |
+
edge_color-color_th,
|
| 217 |
+
edge_color+color_th),
|
| 218 |
cv2.MORPH_DILATE, np.ones((11, 11)))
|
| 219 |
+
#line_img = np.copy(gest_seg_np) * 0
|
| 220 |
if mask.sum() > 0:
|
| 221 |
output = cv2.connectedComponentsWithStats(mask, 8, cv2.CV_32S)
|
| 222 |
(numLabels, labels, stats, centroids) = output
|
|
|
|
| 231 |
x_right = x[xright_idx]
|
| 232 |
y_right = y[xright_idx]
|
| 233 |
edges.append((x_left, y_left, x_right, y_right))
|
| 234 |
+
cv2.line(line_img, (x_left, y_left), (x_right, y_right), (255, 255, 255), 2)
|
| 235 |
edges = np.array(edges)
|
| 236 |
if (len(apex_pts) < 2) or len(edges) <1:
|
| 237 |
continue
|
|
|
|
| 244 |
for a_i, a in enumerate(connected_verts):
|
| 245 |
for b in connected_verts[a_i+1:]:
|
| 246 |
connections.append((a, b))
|
| 247 |
+
filename_edges_map = f'edges_map_{rid}.jpg'
|
| 248 |
+
cv2.imwrite(filename_edges_map, line_img)
|
| 249 |
return vertices, connections
|
| 250 |
|
| 251 |
def get_uv_dept_category(vertices, depth, ade_seg):
|
|
|
|
| 390 |
vertices_3d = cv2.convertPointsFromHomogeneous(vertices_3d).reshape(-1, 3)
|
| 391 |
vert_edge_per_image[i] = vertices, connections, vertices_3d
|
| 392 |
all_3d_vertices, connections_3d = merge_vertices_3d(vert_edge_per_image, 3.0)
|
| 393 |
+
print(f'after merge, {len(all_3d_vertices)} 3d vertices and {len(connections_3d)} 3d connections')
|
| 394 |
+
#all_3d_vertices_clean, connections_3d_clean = prune_not_connected(all_3d_vertices, connections_3d)
|
| 395 |
+
all_3d_vertices_clean, connections_3d_clean = all_3d_vertices, connections_3d # don't prune -> cost:2.0
|
| 396 |
+
#print(f'after pruning, {len(all_3d_vertices_clean)} 3d clean vertices and {len(connections_3d_clean)} 3d clean connections')
|
| 397 |
if (len(all_3d_vertices_clean) < 2) or len(connections_3d_clean) < 1:
|
| 398 |
print (f'Not enough vertices or connections in the 3D vertices')
|
| 399 |
return (good_entry['__key__'], *empty_solution())
|