Update app.py
Browse files
app.py
CHANGED
@@ -129,13 +129,46 @@ def get_reconstructed_scene(outdir, model, device):
|
|
129 |
torch.cuda.empty_cache()
|
130 |
return splatfile, video, depth_colored
|
131 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
132 |
|
133 |
-
# 2) Handle uploaded video/images --> produce target_dir + images
|
134 |
def extract_frames(input_video, session_id):
|
135 |
-
|
136 |
-
Create a new 'target_dir' + 'images' subfolder, and place user-uploaded
|
137 |
-
images or extracted frames from video into it. Return (target_dir, image_paths).
|
138 |
-
"""
|
139 |
start_time = time.time()
|
140 |
gc.collect()
|
141 |
torch.cuda.empty_cache()
|
@@ -144,9 +177,9 @@ def extract_frames(input_video, session_id):
|
|
144 |
target_dir = base_dir
|
145 |
target_dir_images = os.path.join(target_dir, "images")
|
146 |
|
147 |
-
# Clean up if somehow that folder already exists
|
148 |
if os.path.exists(target_dir):
|
149 |
shutil.rmtree(target_dir)
|
|
|
150 |
os.makedirs(target_dir)
|
151 |
os.makedirs(target_dir_images)
|
152 |
|
@@ -187,18 +220,22 @@ def extract_frames(input_video, session_id):
|
|
187 |
return target_dir, image_paths
|
188 |
|
189 |
|
190 |
-
def
|
191 |
-
|
192 |
-
|
193 |
-
and show in the gallery. Return (target_dir, image_paths).
|
194 |
-
If nothing is uploaded, returns "None" and empty list.
|
195 |
-
"""
|
196 |
-
if not input_video and not input_images:
|
197 |
return None, None, None
|
198 |
|
199 |
target_dir, image_paths = extract_frames(input_video, session_id)
|
200 |
return None, target_dir, image_paths
|
201 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
202 |
@spaces.GPU()
|
203 |
def generate_splats_from_video(video_path, session_id=None):
|
204 |
|
@@ -239,35 +276,14 @@ def generate_splats_from_images(images_folder, session_id=None):
|
|
239 |
return plyfile, video, depth_colored
|
240 |
|
241 |
def cleanup(request: gr.Request):
|
242 |
-
|
243 |
-
Clean up session-specific directories and temporary files when the user session ends.
|
244 |
-
|
245 |
-
This function is triggered when the Gradio demo is unloaded (e.g., when the user
|
246 |
-
closes the browser tab or navigates away). It removes all temporary files and
|
247 |
-
directories created during the user's session to free up storage space.
|
248 |
-
|
249 |
-
Args:
|
250 |
-
request (gr.Request): Gradio request object containing session information
|
251 |
-
"""
|
252 |
sid = request.session_hash
|
253 |
if sid:
|
254 |
d1 = os.path.join(os.environ["ANYSPLAT_PROCESSED"], sid)
|
255 |
shutil.rmtree(d1, ignore_errors=True)
|
256 |
|
257 |
def start_session(request: gr.Request):
|
258 |
-
|
259 |
-
Initialize a new user session and return the session identifier.
|
260 |
-
|
261 |
-
This function is triggered when the Gradio demo loads and creates a unique
|
262 |
-
session hash that will be used to organize outputs and temporary files
|
263 |
-
for this specific user session.
|
264 |
-
|
265 |
-
Args:
|
266 |
-
request (gr.Request): Gradio request object containing session information
|
267 |
-
|
268 |
-
Returns:
|
269 |
-
str: Unique session hash identifier
|
270 |
-
"""
|
271 |
return request.session_hash
|
272 |
|
273 |
|
@@ -322,7 +338,7 @@ if __name__ == "__main__":
|
|
322 |
with gr.Tab("Video"):
|
323 |
input_video = gr.Video(label="Upload Video", sources=["upload"], interactive=True, height=512)
|
324 |
with gr.Tab("Images"):
|
325 |
-
input_images = gr.File(label="Upload Files", height=512)
|
326 |
|
327 |
submit_btn = gr.Button(
|
328 |
"Generate Gaussian Splat", scale=1, variant="primary"
|
@@ -397,11 +413,17 @@ if __name__ == "__main__":
|
|
397 |
outputs=[reconstruction_output, rgb_video, depth_video])
|
398 |
|
399 |
input_video.upload(
|
400 |
-
fn=
|
401 |
inputs=[input_video, session_state],
|
402 |
outputs=[reconstruction_output, target_dir_output, image_gallery],
|
403 |
)
|
404 |
|
|
|
|
|
|
|
|
|
|
|
|
|
405 |
demo.unload(cleanup)
|
406 |
demo.queue()
|
407 |
demo.launch(show_error=True, share=True)
|
|
|
129 |
torch.cuda.empty_cache()
|
130 |
return splatfile, video, depth_colored
|
131 |
|
132 |
+
def extract_images(input_video, session_id):
|
133 |
+
|
134 |
+
start_time = time.time()
|
135 |
+
gc.collect()
|
136 |
+
torch.cuda.empty_cache()
|
137 |
+
|
138 |
+
base_dir = os.path.join(os.environ["ANYSPLAT_PROCESSED"], session_id)
|
139 |
+
target_dir = base_dir
|
140 |
+
target_dir_images = os.path.join(target_dir, "images")
|
141 |
+
|
142 |
+
if os.path.exists(target_dir):
|
143 |
+
shutil.rmtree(target_dir)
|
144 |
+
|
145 |
+
os.makedirs(target_dir)
|
146 |
+
os.makedirs(target_dir_images)
|
147 |
+
|
148 |
+
image_paths = []
|
149 |
+
|
150 |
+
if input_images is not None:
|
151 |
+
for file_data in input_images:
|
152 |
+
if isinstance(file_data, dict) and "name" in file_data:
|
153 |
+
file_path = file_data["name"]
|
154 |
+
else:
|
155 |
+
file_path = file_data
|
156 |
+
dst_path = os.path.join(target_dir_images, os.path.basename(file_path))
|
157 |
+
shutil.copy(file_path, dst_path)
|
158 |
+
image_paths.append(dst_path)
|
159 |
+
|
160 |
+
# Sort final images for gallery
|
161 |
+
image_paths = sorted(image_paths)
|
162 |
+
|
163 |
+
end_time = time.time()
|
164 |
+
print(
|
165 |
+
f"Files copied to {target_dir_images}; took {end_time - start_time:.3f} seconds"
|
166 |
+
)
|
167 |
+
return target_dir, image_paths
|
168 |
+
|
169 |
|
|
|
170 |
def extract_frames(input_video, session_id):
|
171 |
+
|
|
|
|
|
|
|
172 |
start_time = time.time()
|
173 |
gc.collect()
|
174 |
torch.cuda.empty_cache()
|
|
|
177 |
target_dir = base_dir
|
178 |
target_dir_images = os.path.join(target_dir, "images")
|
179 |
|
|
|
180 |
if os.path.exists(target_dir):
|
181 |
shutil.rmtree(target_dir)
|
182 |
+
|
183 |
os.makedirs(target_dir)
|
184 |
os.makedirs(target_dir_images)
|
185 |
|
|
|
220 |
return target_dir, image_paths
|
221 |
|
222 |
|
223 |
+
def update_gallery_on_video_upload(input_video, session_id):
|
224 |
+
|
225 |
+
if not input_video:
|
|
|
|
|
|
|
|
|
226 |
return None, None, None
|
227 |
|
228 |
target_dir, image_paths = extract_frames(input_video, session_id)
|
229 |
return None, target_dir, image_paths
|
230 |
|
231 |
+
def update_gallery_on_images_upload(input_images, session_id):
|
232 |
+
|
233 |
+
if not input_images:
|
234 |
+
return None, None, None
|
235 |
+
|
236 |
+
target_dir, image_paths = extract_images(input_images, session_id)
|
237 |
+
return None, target_dir, image_paths
|
238 |
+
|
239 |
@spaces.GPU()
|
240 |
def generate_splats_from_video(video_path, session_id=None):
|
241 |
|
|
|
276 |
return plyfile, video, depth_colored
|
277 |
|
278 |
def cleanup(request: gr.Request):
|
279 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
280 |
sid = request.session_hash
|
281 |
if sid:
|
282 |
d1 = os.path.join(os.environ["ANYSPLAT_PROCESSED"], sid)
|
283 |
shutil.rmtree(d1, ignore_errors=True)
|
284 |
|
285 |
def start_session(request: gr.Request):
|
286 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
287 |
return request.session_hash
|
288 |
|
289 |
|
|
|
338 |
with gr.Tab("Video"):
|
339 |
input_video = gr.Video(label="Upload Video", sources=["upload"], interactive=True, height=512)
|
340 |
with gr.Tab("Images"):
|
341 |
+
input_images = gr.File(file_count="multiple", label="Upload Files", height=512)
|
342 |
|
343 |
submit_btn = gr.Button(
|
344 |
"Generate Gaussian Splat", scale=1, variant="primary"
|
|
|
413 |
outputs=[reconstruction_output, rgb_video, depth_video])
|
414 |
|
415 |
input_video.upload(
|
416 |
+
fn=update_gallery_on_video_upload,
|
417 |
inputs=[input_video, session_state],
|
418 |
outputs=[reconstruction_output, target_dir_output, image_gallery],
|
419 |
)
|
420 |
|
421 |
+
input_images.upload(
|
422 |
+
fn=update_gallery_on_images_upload,
|
423 |
+
inputs=[input_images, session_state],
|
424 |
+
outputs=[reconstruction_output, target_dir_output, image_gallery],
|
425 |
+
)
|
426 |
+
|
427 |
demo.unload(cleanup)
|
428 |
demo.queue()
|
429 |
demo.launch(show_error=True, share=True)
|