kcml commited on
Commit
e510cdf
·
1 Parent(s): 2c29df9

(1)vertex and connection color_thr; (2)skip pruning

Browse files
Files changed (1) hide show
  1. 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
- print(f'gest_seg_np[0,0]= {gest_seg_np[0,0]}')
 
 
 
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
- # apex_mask = cv2.inRange(gest_seg_np, apex_color-10, apex_color+10) # include more pts
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.bitwise_and(eave_end_mask, ade_mask)
 
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-0.5,
212
- edge_color+0.5),
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
- all_3d_vertices_clean, connections_3d_clean = prune_not_connected(all_3d_vertices, connections_3d)
 
 
 
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())