jens commited on
Commit
2a1828c
·
1 Parent(s): c93bd34

depth mapping and n_samples

Browse files
Files changed (3) hide show
  1. app.py +8 -2
  2. inference.py +7 -4
  3. utils.py +25 -0
app.py CHANGED
@@ -62,6 +62,8 @@ with block:
62
  with gr.Column():
63
  pcl_figure = gr.Model3D(label="3-D Reconstruction", clear_color=[1.0, 1.0, 1.0, 1.0])
64
  with gr.Row():
 
 
65
  n_samples = gr.Slider(minimum=1e3, maximum=1e6, step=1e3, default=1e3, label='Number of Samples')
66
  cube_size = gr.Slider(minimum=0.00001, maximum=0.001, step=0.000001, default=0.00001, label='Cube size')
67
  depth_reconstruction_btn = gr.Button('Depth Reconstruction', variant = 'primary')
@@ -153,8 +155,12 @@ with block:
153
 
154
  def on_depth_reconstruction_btn_click(inputs):
155
  print("depth reconstruction")
156
- image = inputs[input_image]
157
- path = dpt.generate_obj_masks2(image=image, cube_size=inputs[cube_size], masks=inputs[masks]) #
 
 
 
 
158
  return {pcl_figure: path}
159
  depth_reconstruction_btn.click(on_depth_reconstruction_btn_click, components, [pcl_figure], queue=False)
160
 
 
62
  with gr.Column():
63
  pcl_figure = gr.Model3D(label="3-D Reconstruction", clear_color=[1.0, 1.0, 1.0, 1.0])
64
  with gr.Row():
65
+ max_depth = gr.Slider(minimum=0, maximum=10, step=0.01, default=1, label='Number of Samples')
66
+ min_depth = gr.Slider(minimum=0, maximum=10, step=0.01, default=0.1, label='Number of Samples')
67
  n_samples = gr.Slider(minimum=1e3, maximum=1e6, step=1e3, default=1e3, label='Number of Samples')
68
  cube_size = gr.Slider(minimum=0.00001, maximum=0.001, step=0.000001, default=0.00001, label='Cube size')
69
  depth_reconstruction_btn = gr.Button('Depth Reconstruction', variant = 'primary')
 
155
 
156
  def on_depth_reconstruction_btn_click(inputs):
157
  print("depth reconstruction")
158
+ path = dpt.generate_obj_masks2(image=inputs[input_image],
159
+ cube_size=inputs[cube_size],
160
+ n_samples=inputs[n_samples],
161
+ masks=inputs[masks],
162
+ min_depth=inputs[min_depth],
163
+ max_depth=inputs[max_depth]) #
164
  return {pcl_figure: path}
165
  depth_reconstruction_btn.click(on_depth_reconstruction_btn_click, components, [pcl_figure], queue=False)
166
 
inference.py CHANGED
@@ -10,6 +10,7 @@ import open3d as o3d
10
  import pandas as pd
11
  import plotly.express as px
12
  import matplotlib.pyplot as plt
 
13
 
14
 
15
 
@@ -60,9 +61,8 @@ class DepthPredictor:
60
  align_corners=False,
61
  ).squeeze()
62
 
63
- output = prediction.cpu().numpy()
64
- formatted = 255 - (output * 255 / np.max(output)).astype('uint8')
65
-
66
  #img = Image.fromarray(formatted)
67
  return output
68
 
@@ -144,15 +144,18 @@ class DepthPredictor:
144
  o3d.io.write_triangle_mesh(output_file, mesh)
145
  return output_file
146
 
147
- def generate_obj_masks2(self, image, masks, cube_size):
148
  # Generate a point cloud
149
  depth = self.predict(image)
 
150
  image = np.array(image)
151
  mesh = o3d.geometry.TriangleMesh()
152
  # Create cubes and add them to the mesh
153
  cs = [(255,0,0),(0,255,0),(0,0,255)]
154
  for c,(mask, _) in zip(cs, masks):
155
  points, _ = PCL(mask, depth)
 
 
156
  for point in points:
157
  cube = o3d.geometry.TriangleMesh.create_box(width=cube_size, height=cube_size, depth=cube_size)
158
  cube.translate(-point)
 
10
  import pandas as pd
11
  import plotly.express as px
12
  import matplotlib.pyplot as plt
13
+ from utils import map_image_range
14
 
15
 
16
 
 
61
  align_corners=False,
62
  ).squeeze()
63
 
64
+ output = 1 - (prediction.cpu().numpy() / np.max(output))
65
+ #formatted = 255 - (output * 255 / np.max(output)).astype('uint8')
 
66
  #img = Image.fromarray(formatted)
67
  return output
68
 
 
144
  o3d.io.write_triangle_mesh(output_file, mesh)
145
  return output_file
146
 
147
+ def generate_obj_masks2(self, image, masks, cube_size, n_samples, min_depth, max_depth):
148
  # Generate a point cloud
149
  depth = self.predict(image)
150
+ depth = map_image_range(depth, min_depth, max_depth)
151
  image = np.array(image)
152
  mesh = o3d.geometry.TriangleMesh()
153
  # Create cubes and add them to the mesh
154
  cs = [(255,0,0),(0,255,0),(0,0,255)]
155
  for c,(mask, _) in zip(cs, masks):
156
  points, _ = PCL(mask, depth)
157
+ idxs = np.random.choice(len(points), int(n_samples))
158
+ points = points[idxs]
159
  for point in points:
160
  cube = o3d.geometry.TriangleMesh.create_box(width=cube_size, height=cube_size, depth=cube_size)
161
  cube.translate(-point)
utils.py CHANGED
@@ -195,3 +195,28 @@ def PCL3(image):
195
 
196
  return fig
197
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
195
 
196
  return fig
197
 
198
+ import numpy as np
199
+
200
+ def map_image_range(image, min_value, max_value):
201
+ """
202
+ Maps the values of a numpy image array to a specified range.
203
+
204
+ Args:
205
+ image (numpy.ndarray): Input image array with values ranging from 0 to 1.
206
+ min_value (float): Minimum value of the new range.
207
+ max_value (float): Maximum value of the new range.
208
+
209
+ Returns:
210
+ numpy.ndarray: Image array with values mapped to the specified range.
211
+ """
212
+ # Ensure the input image is a numpy array
213
+ if not isinstance(image, np.ndarray):
214
+ raise ValueError("Input image must be a numpy array.")
215
+
216
+ # Ensure the image values are within the valid range (0 to 1)
217
+ if not (0 <= np.min(image) <= 1) or not (0 <= np.max(image) <= 1):
218
+ raise ValueError("Input image values must be in the range [0, 1].")
219
+
220
+ # Map the values to the specified range
221
+ mapped_image = (image - 0) * (max_value - min_value) / (1 - 0) + min_value
222
+ return mapped_image