perler commited on
Commit
130bb48
1 Parent(s): 045f9a3

nicer UI, catch rec errors, try fix rendering mesh by re-enabling tabs

Browse files
Files changed (1) hide show
  1. app.py +30 -22
app.py CHANGED
@@ -15,7 +15,7 @@ def run_on_gpu(input_point_cloud: gr.utils.NamedString,
15
  gen_resolution_global: int,
16
  padding_factor: float,
17
  gen_subsample_manifold_iter: int,
18
- gen_refine_iter: int):
19
  print('Started inference at {}'.format(datetime.datetime.now()))
20
  print('Inputs:', input_point_cloud, gen_resolution_global, padding_factor,
21
  gen_subsample_manifold_iter, gen_refine_iter)
@@ -32,7 +32,6 @@ def run_on_gpu(input_point_cloud: gr.utils.NamedString,
32
  # splitext_result = os.path.splitext(in_file)
33
  rand_hash = uuid.uuid4().hex
34
  out_dir = '/tmp/outputs/{}'.format(rand_hash)
35
- # out_file = os.path.join(out_dir, in_file, in_file + '.ply')
36
  out_file_basename = os.path.basename(in_file) + '.ply'
37
  out_file = os.path.join(out_dir, os.path.basename(in_file), out_file_basename)
38
  os.makedirs(out_dir, exist_ok=True)
@@ -55,34 +54,41 @@ def run_on_gpu(input_point_cloud: gr.utils.NamedString,
55
  ]
56
 
57
  sys.argv = args
58
- subprocess.run(['python', 'ppsurf/pps.py'] + args[1:]) # need subprocess to spawn workers
 
 
 
 
 
59
  print('Finished inference at {}'.format(datetime.datetime.now()))
60
 
61
  result_3d_model = out_file
62
- progress_text = 'done'
63
 
64
- return result_3d_model, progress_text
65
 
66
 
67
  def main():
68
- description = '''# [PPSurf](https://github.com/cg-tuwien/ppsurf)
69
-
 
70
  Supported file formats:
71
  - PLY, STL, OBJ and other mesh files,
72
  - XYZ as whitespace-separated text file,
73
  - NPY and NPZ (key='arr_0'),
74
  - LAS and LAZ (version 1.0-1.4), COPC and CRS.
75
  Best results for 50k-250k points.
76
-
 
 
77
  This method is meant for scans of single and few objects.
78
  Quality for scenes and landscapes will be lower.
79
 
80
- Inference takes about 2 minutes.
81
  '''
82
 
83
  # can't render many input types directly in Gradio Model3D
84
  # so we need to convert to supported format
85
- # Gradio can't draw point clouds anyway, so we skip this for now
86
  # def convert_to_ply(input_point_cloud_upload: gr.utils.NamedString):
87
  #
88
  # # add absolute path to import dirs
@@ -115,17 +121,18 @@ def main():
115
  # # input_point_cloud_viewer.value = input_shape
116
 
117
  if (SPACE_ID := os.getenv('SPACE_ID')) is not None:
118
- description += (f'\n<p>For faster inference without waiting in queue, '
119
- f'you may duplicate the space and upgrade to GPU in settings. '
120
- f'<a href="https://huggingface.co/spaces/{SPACE_ID}?duplicate=true">'
121
- f'<img style="display: inline; margin-top: 0em; margin-bottom: 0em" '
122
- f'src="https://bit.ly/3gLdBN6" alt="Duplicate Space" /></a></p>')
123
 
124
  with gr.Blocks(css='style.css') as demo:
125
- gr.Markdown(description)
126
  with gr.Row():
127
  with gr.Column():
128
- # with gr.Tabs() as input_tabs:
 
129
  # with gr.TabItem(label='Input Point Cloud Upload', id='pc_upload'):
130
  input_point_cloud_upload = gr.File(show_label=False, file_count='single')
131
  # input_point_cloud_upload.upload(
@@ -151,10 +158,11 @@ def main():
151
  label='Edge Refinement Iterations (larger for more details)',
152
  minimum=3, maximum=30, value=10, step=1)
153
  with gr.Column():
154
- progress_text = gr.Text(label='Progress')
155
- # with gr.Tabs():
156
- # with gr.TabItem(label='Reconstructed 3D model'):
157
- result_3d_model = gr.Model3D(show_label=False)
 
158
  # with gr.TabItem(label='Output mesh file'):
159
  # output_file = gr.File(show_label=False)
160
  # with gr.Row():
@@ -192,7 +200,7 @@ def main():
192
  outputs=[
193
  result_3d_model,
194
  # output_file,
195
- progress_text,
196
  ])
197
 
198
  demo.queue(max_size=5)
 
15
  gen_resolution_global: int,
16
  padding_factor: float,
17
  gen_subsample_manifold_iter: int,
18
+ gen_refine_iter: int) -> str:
19
  print('Started inference at {}'.format(datetime.datetime.now()))
20
  print('Inputs:', input_point_cloud, gen_resolution_global, padding_factor,
21
  gen_subsample_manifold_iter, gen_refine_iter)
 
32
  # splitext_result = os.path.splitext(in_file)
33
  rand_hash = uuid.uuid4().hex
34
  out_dir = '/tmp/outputs/{}'.format(rand_hash)
 
35
  out_file_basename = os.path.basename(in_file) + '.ply'
36
  out_file = os.path.join(out_dir, os.path.basename(in_file), out_file_basename)
37
  os.makedirs(out_dir, exist_ok=True)
 
54
  ]
55
 
56
  sys.argv = args
57
+ try:
58
+ subprocess.run(['python', 'ppsurf/pps.py'] + args[1:]) # need subprocess to spawn workers
59
+ except Exception as e:
60
+ print('Error:', e) # print to console
61
+ gr.Warning("Reconstruction failed, see console log for details.") # notify user
62
+
63
  print('Finished inference at {}'.format(datetime.datetime.now()))
64
 
65
  result_3d_model = out_file
 
66
 
67
+ return result_3d_model
68
 
69
 
70
  def main():
71
+ description_header = '# PPSurf [Github](https://github.com/cg-tuwien/ppsurf) [Project](https://www.cg.tuwien.ac.at/research/publications/2024/erler_2024_ppsurf/)'
72
+
73
+ description_col0 = '''
74
  Supported file formats:
75
  - PLY, STL, OBJ and other mesh files,
76
  - XYZ as whitespace-separated text file,
77
  - NPY and NPZ (key='arr_0'),
78
  - LAS and LAZ (version 1.0-1.4), COPC and CRS.
79
  Best results for 50k-250k points.
80
+ '''
81
+
82
+ description_col1 = '''
83
  This method is meant for scans of single and few objects.
84
  Quality for scenes and landscapes will be lower.
85
 
86
+ Inference takes up to 180 seconds.
87
  '''
88
 
89
  # can't render many input types directly in Gradio Model3D
90
  # so we need to convert to supported format
91
+ # Gradio can't draw point clouds anyway (2024-03-04), so we skip this for now
92
  # def convert_to_ply(input_point_cloud_upload: gr.utils.NamedString):
93
  #
94
  # # add absolute path to import dirs
 
121
  # # input_point_cloud_viewer.value = input_shape
122
 
123
  if (SPACE_ID := os.getenv('SPACE_ID')) is not None:
124
+ description_col1 += (f'\n<p>For faster inference without waiting in queue, '
125
+ f'you may duplicate the space and upgrade to GPU in settings. '
126
+ f'<a href="https://huggingface.co/spaces/{SPACE_ID}?duplicate=true">'
127
+ f'<img style="display: inline; margin-top: 0em; margin-bottom: 0em" '
128
+ f'src="https://bit.ly/3gLdBN6" alt="Duplicate Space" /></a></p>')
129
 
130
  with gr.Blocks(css='style.css') as demo:
131
+ gr.Markdown(description_header)
132
  with gr.Row():
133
  with gr.Column():
134
+ gr.Markdown(description_col0)
135
+ # with gr.Tabs() as input_tabs: # re-enable when Gradio supports point clouds
136
  # with gr.TabItem(label='Input Point Cloud Upload', id='pc_upload'):
137
  input_point_cloud_upload = gr.File(show_label=False, file_count='single')
138
  # input_point_cloud_upload.upload(
 
158
  label='Edge Refinement Iterations (larger for more details)',
159
  minimum=3, maximum=30, value=10, step=1)
160
  with gr.Column():
161
+ gr.Markdown(description_col1)
162
+ # progress_text = gr.Text(label='Progress')
163
+ with gr.Tabs():
164
+ with gr.TabItem(label='Reconstructed 3D model'):
165
+ result_3d_model = gr.Model3D(show_label=False)
166
  # with gr.TabItem(label='Output mesh file'):
167
  # output_file = gr.File(show_label=False)
168
  # with gr.Row():
 
200
  outputs=[
201
  result_3d_model,
202
  # output_file,
203
+ # progress_text,
204
  ])
205
 
206
  demo.queue(max_size=5)