sudo-soldier commited on
Commit
c1dbba4
·
verified ·
1 Parent(s): c86bde4

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +24 -20
app.py CHANGED
@@ -48,7 +48,7 @@ def process_image(image_path):
48
  except Exception:
49
  gltf_path = create_3d_obj(np.array(image), depth_image, image_path, depth=8)
50
 
51
- return [Image.fromarray(depth_image), gltf_path, gltf_path]
52
 
53
  def create_3d_obj(rgb_image, depth_image, image_path, depth=10):
54
  depth_o3d = o3d.geometry.Image(depth_image)
@@ -60,13 +60,11 @@ def create_3d_obj(rgb_image, depth_image, image_path, depth=10):
60
  camera_intrinsic = o3d.camera.PinholeCameraIntrinsic()
61
  camera_intrinsic.set_intrinsics(w, h, 500, 500, w / 2, h / 2)
62
 
63
-
64
  pcd = o3d.geometry.PointCloud.create_from_rgbd_image(rgbd_image, camera_intrinsic)
65
  pcd.estimate_normals(
66
  search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.01, max_nn=30))
67
  pcd.orient_normals_towards_camera_location(camera_location=np.array([0., 0., 1000.]))
68
 
69
-
70
  with o3d.utility.VerbosityContextManager(o3d.utility.VerbosityLevel.Debug):
71
  mesh_raw, _ = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(
72
  pcd, depth=depth, width=0, scale=1.1, linear_fit=True)
@@ -74,7 +72,6 @@ def create_3d_obj(rgb_image, depth_image, image_path, depth=10):
74
  voxel_size = max(mesh_raw.get_max_bound() - mesh_raw.get_min_bound()) / 256
75
  mesh = mesh_raw.simplify_vertex_clustering(voxel_size=voxel_size)
76
 
77
-
78
  bbox = pcd.get_axis_aligned_bounding_box()
79
  mesh_crop = mesh.crop(bbox)
80
 
@@ -86,22 +83,29 @@ def create_3d_obj(rgb_image, depth_image, image_path, depth=10):
86
  title = "Zero-shot Depth Estimation with DPT + 3D Point Cloud"
87
  description = "DPT model predicts depth from an image, followed by 3D Point Cloud reconstruction."
88
 
89
- iface = gr.Interface(
90
- fn=process_image,
91
- inputs=[gr.Image(type="filepath", label="Input Image")],
92
- outputs=[
93
- gr.Image(label="Predicted Depth", type="pil"),
94
- gr.Model3D(label="3D Mesh Reconstruction", clear_color=[1.0, 1.0, 1.0, 1.0]),
95
- gr.File(label="3D gLTF")
96
- ],
97
- title=title,
98
- description=description,
99
- allow_flagging="never"
100
- )
101
-
102
- if __name__ == "__main__":
103
- iface.launch()
104
-
 
 
 
 
 
 
 
105
 
106
 
107
 
 
48
  except Exception:
49
  gltf_path = create_3d_obj(np.array(image), depth_image, image_path, depth=8)
50
 
51
+ return [Image.fromarray(depth_image), gltf_path]
52
 
53
  def create_3d_obj(rgb_image, depth_image, image_path, depth=10):
54
  depth_o3d = o3d.geometry.Image(depth_image)
 
60
  camera_intrinsic = o3d.camera.PinholeCameraIntrinsic()
61
  camera_intrinsic.set_intrinsics(w, h, 500, 500, w / 2, h / 2)
62
 
 
63
  pcd = o3d.geometry.PointCloud.create_from_rgbd_image(rgbd_image, camera_intrinsic)
64
  pcd.estimate_normals(
65
  search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.01, max_nn=30))
66
  pcd.orient_normals_towards_camera_location(camera_location=np.array([0., 0., 1000.]))
67
 
 
68
  with o3d.utility.VerbosityContextManager(o3d.utility.VerbosityLevel.Debug):
69
  mesh_raw, _ = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(
70
  pcd, depth=depth, width=0, scale=1.1, linear_fit=True)
 
72
  voxel_size = max(mesh_raw.get_max_bound() - mesh_raw.get_min_bound()) / 256
73
  mesh = mesh_raw.simplify_vertex_clustering(voxel_size=voxel_size)
74
 
 
75
  bbox = pcd.get_axis_aligned_bounding_box()
76
  mesh_crop = mesh.crop(bbox)
77
 
 
83
  title = "Zero-shot Depth Estimation with DPT + 3D Point Cloud"
84
  description = "DPT model predicts depth from an image, followed by 3D Point Cloud reconstruction."
85
 
86
+ with gr.Blocks() as iface:
87
+ gr.Markdown("# Zero-shot Depth Estimation with DPT + 3D Point Cloud")
88
+ with gr.Row():
89
+ image_input = gr.Image(type="filepath", label="Input Image")
90
+ depth_output = gr.Image(label="Predicted Depth", type="pil")
91
+ gltf_output = gr.File(label="Download 3D gLTF")
92
+
93
+ # Embed an iframe for previewing the .gltf
94
+ with gr.Row():
95
+ gr.HTML('<iframe id="gltf-viewer" width="100%" height="400px"></iframe>')
96
+
97
+ def update_gltf_viewer(image_path):
98
+ gltf_path = process_image(image_path)[1]
99
+ iframe_html = f'''
100
+ <script>
101
+ document.getElementById('gltf-viewer').src = 'https://gltf-viewer.donmccurdy.com/?url=file://{gltf_path}';
102
+ </script>
103
+ '''
104
+ return process_image(image_path)[0], gltf_path, iframe_html
105
+
106
+ image_input.change(update_gltf_viewer, inputs=[image_input], outputs=[depth_output, gltf_output, gr.HTML()])
107
+
108
+ iface.launch()
109
 
110
 
111