Spaces:
Running
on
Zero
Running
on
Zero
Update for ZeroGPU
Browse files- .gitattributes +1 -0
- README.md +2 -1
- app.py +18 -17
- requirements.txt +1 -2
- wheel/diff_gaussian_rasterization-0.0.0-cp310-cp310-linux_x86_64.whl +3 -0
.gitattributes
CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
36 |
+
*.whl filter=lfs diff=lfs merge=lfs -text
|
README.md
CHANGED
@@ -4,7 +4,8 @@ emoji: 🦀
|
|
4 |
colorFrom: red
|
5 |
colorTo: indigo
|
6 |
sdk: gradio
|
7 |
-
sdk_version: 4.
|
|
|
8 |
app_file: app.py
|
9 |
pinned: false
|
10 |
license: mit
|
|
|
4 |
colorFrom: red
|
5 |
colorTo: indigo
|
6 |
sdk: gradio
|
7 |
+
sdk_version: 4.20.1
|
8 |
+
python_version: 3.10.13
|
9 |
app_file: app.py
|
10 |
pinned: false
|
11 |
license: mit
|
app.py
CHANGED
@@ -1,4 +1,6 @@
|
|
1 |
import os
|
|
|
|
|
2 |
import tyro
|
3 |
import imageio
|
4 |
import numpy as np
|
@@ -15,8 +17,7 @@ import gradio as gr
|
|
15 |
from huggingface_hub import hf_hub_download
|
16 |
ckpt_path = hf_hub_download(repo_id="ashawkey/LGM", filename="model_fp16.safetensors")
|
17 |
|
18 |
-
|
19 |
-
os.system("pip install ./diff-gaussian-rasterization")
|
20 |
|
21 |
import kiui
|
22 |
from kiui.op import recenter
|
@@ -66,7 +67,7 @@ model = model.half().to(device)
|
|
66 |
model.eval()
|
67 |
|
68 |
tan_half_fov = np.tan(0.5 * np.deg2rad(opt.fovy))
|
69 |
-
proj_matrix = torch.zeros(4, 4, dtype=torch.float32
|
70 |
proj_matrix[0, 0] = 1 / tan_half_fov
|
71 |
proj_matrix[1, 1] = 1 / tan_half_fov
|
72 |
proj_matrix[2, 2] = (opt.zfar + opt.znear) / (opt.zfar - opt.znear)
|
@@ -127,7 +128,7 @@ def process(input_image, prompt, prompt_neg='', input_elevation=0, input_num_ste
|
|
127 |
image = image.astype(np.float32) / 255.0
|
128 |
image = image[..., :3] * image[..., 3:4] + (1 - image[..., 3:4])
|
129 |
mv_image = pipe_image(prompt, image, negative_prompt=prompt_neg, num_inference_steps=input_num_steps, guidance_scale=5.0, elevation=input_elevation)
|
130 |
-
|
131 |
mv_image_grid = np.concatenate([
|
132 |
np.concatenate([mv_image[1], mv_image[2]], axis=1),
|
133 |
np.concatenate([mv_image[3], mv_image[0]], axis=1),
|
@@ -146,21 +147,21 @@ def process(input_image, prompt, prompt_neg='', input_elevation=0, input_num_ste
|
|
146 |
with torch.autocast(device_type='cuda', dtype=torch.float16):
|
147 |
# generate gaussians
|
148 |
gaussians = model.forward_gaussians(input_image)
|
149 |
-
|
150 |
# save gaussians
|
151 |
model.gs.save_ply(gaussians, output_ply_path)
|
152 |
-
|
153 |
-
# render 360 video
|
154 |
images = []
|
155 |
elevation = 0
|
156 |
if opt.fancy_video:
|
157 |
azimuth = np.arange(0, 720, 4, dtype=np.int32)
|
158 |
for azi in tqdm.tqdm(azimuth):
|
159 |
-
|
160 |
cam_poses = torch.from_numpy(orbit_camera(elevation, azi, radius=opt.cam_radius, opengl=True)).unsqueeze(0).to(device)
|
161 |
|
162 |
cam_poses[:, :3, 1:3] *= -1 # invert up & forward direction
|
163 |
-
|
164 |
# cameras needed by gaussian rasterizer
|
165 |
cam_view = torch.inverse(cam_poses).transpose(1, 2) # [V, 4, 4]
|
166 |
cam_view_proj = cam_view @ proj_matrix # [V, 4, 4]
|
@@ -173,11 +174,11 @@ def process(input_image, prompt, prompt_neg='', input_elevation=0, input_num_ste
|
|
173 |
else:
|
174 |
azimuth = np.arange(0, 360, 2, dtype=np.int32)
|
175 |
for azi in tqdm.tqdm(azimuth):
|
176 |
-
|
177 |
cam_poses = torch.from_numpy(orbit_camera(elevation, azi, radius=opt.cam_radius, opengl=True)).unsqueeze(0).to(device)
|
178 |
|
179 |
cam_poses[:, :3, 1:3] *= -1 # invert up & forward direction
|
180 |
-
|
181 |
# cameras needed by gaussian rasterizer
|
182 |
cam_view = torch.inverse(cam_poses).transpose(1, 2) # [V, 4, 4]
|
183 |
cam_view_proj = cam_view @ proj_matrix # [V, 4, 4]
|
@@ -201,7 +202,7 @@ _DESCRIPTION = '''
|
|
201 |
<a style="display:inline-block; margin-left: .5em" href="https://github.com/3DTopia/LGM"><img src='https://img.shields.io/github/stars/3DTopia/LGM?style=social'/></a>
|
202 |
</div>
|
203 |
|
204 |
-
* Input can be only text, only image, or both image and text.
|
205 |
* Output is a `ply` file containing the 3D Gaussians, please check our [repo](https://github.com/3DTopia/LGM/blob/main/readme.md) for visualization and mesh conversion.
|
206 |
* If you find the output unsatisfying, try using different seeds!
|
207 |
'''
|
@@ -212,7 +213,7 @@ with block:
|
|
212 |
with gr.Column(scale=1):
|
213 |
gr.Markdown('# ' + _TITLE)
|
214 |
gr.Markdown(_DESCRIPTION)
|
215 |
-
|
216 |
with gr.Row(variant='panel'):
|
217 |
with gr.Column(scale=1):
|
218 |
# input image
|
@@ -230,7 +231,7 @@ with block:
|
|
230 |
# gen button
|
231 |
button_gen = gr.Button("Generate")
|
232 |
|
233 |
-
|
234 |
with gr.Column(scale=1):
|
235 |
with gr.Tab("Video"):
|
236 |
# final video results
|
@@ -242,7 +243,7 @@ with block:
|
|
242 |
output_image = gr.Image(interactive=False, show_label=False)
|
243 |
|
244 |
button_gen.click(process, inputs=[input_image, input_text, input_neg_text, input_elevation, input_num_steps, input_seed], outputs=[output_image, output_video, output_file])
|
245 |
-
|
246 |
gr.Examples(
|
247 |
examples=[
|
248 |
"data_test/frog_sweater.jpg",
|
@@ -275,5 +276,5 @@ with block:
|
|
275 |
cache_examples=True,
|
276 |
label='Text-to-3D Examples'
|
277 |
)
|
278 |
-
|
279 |
-
block.launch()
|
|
|
1 |
import os
|
2 |
+
import shlex
|
3 |
+
import subprocess
|
4 |
import tyro
|
5 |
import imageio
|
6 |
import numpy as np
|
|
|
17 |
from huggingface_hub import hf_hub_download
|
18 |
ckpt_path = hf_hub_download(repo_id="ashawkey/LGM", filename="model_fp16.safetensors")
|
19 |
|
20 |
+
subprocess.run(shlex.split("pip install wheel/diff_gaussian_rasterization-0.0.0-cp310-cp310-linux_x86_64.whl"))
|
|
|
21 |
|
22 |
import kiui
|
23 |
from kiui.op import recenter
|
|
|
67 |
model.eval()
|
68 |
|
69 |
tan_half_fov = np.tan(0.5 * np.deg2rad(opt.fovy))
|
70 |
+
proj_matrix = torch.zeros(4, 4, dtype=torch.float32).to(device)
|
71 |
proj_matrix[0, 0] = 1 / tan_half_fov
|
72 |
proj_matrix[1, 1] = 1 / tan_half_fov
|
73 |
proj_matrix[2, 2] = (opt.zfar + opt.znear) / (opt.zfar - opt.znear)
|
|
|
128 |
image = image.astype(np.float32) / 255.0
|
129 |
image = image[..., :3] * image[..., 3:4] + (1 - image[..., 3:4])
|
130 |
mv_image = pipe_image(prompt, image, negative_prompt=prompt_neg, num_inference_steps=input_num_steps, guidance_scale=5.0, elevation=input_elevation)
|
131 |
+
|
132 |
mv_image_grid = np.concatenate([
|
133 |
np.concatenate([mv_image[1], mv_image[2]], axis=1),
|
134 |
np.concatenate([mv_image[3], mv_image[0]], axis=1),
|
|
|
147 |
with torch.autocast(device_type='cuda', dtype=torch.float16):
|
148 |
# generate gaussians
|
149 |
gaussians = model.forward_gaussians(input_image)
|
150 |
+
|
151 |
# save gaussians
|
152 |
model.gs.save_ply(gaussians, output_ply_path)
|
153 |
+
|
154 |
+
# render 360 video
|
155 |
images = []
|
156 |
elevation = 0
|
157 |
if opt.fancy_video:
|
158 |
azimuth = np.arange(0, 720, 4, dtype=np.int32)
|
159 |
for azi in tqdm.tqdm(azimuth):
|
160 |
+
|
161 |
cam_poses = torch.from_numpy(orbit_camera(elevation, azi, radius=opt.cam_radius, opengl=True)).unsqueeze(0).to(device)
|
162 |
|
163 |
cam_poses[:, :3, 1:3] *= -1 # invert up & forward direction
|
164 |
+
|
165 |
# cameras needed by gaussian rasterizer
|
166 |
cam_view = torch.inverse(cam_poses).transpose(1, 2) # [V, 4, 4]
|
167 |
cam_view_proj = cam_view @ proj_matrix # [V, 4, 4]
|
|
|
174 |
else:
|
175 |
azimuth = np.arange(0, 360, 2, dtype=np.int32)
|
176 |
for azi in tqdm.tqdm(azimuth):
|
177 |
+
|
178 |
cam_poses = torch.from_numpy(orbit_camera(elevation, azi, radius=opt.cam_radius, opengl=True)).unsqueeze(0).to(device)
|
179 |
|
180 |
cam_poses[:, :3, 1:3] *= -1 # invert up & forward direction
|
181 |
+
|
182 |
# cameras needed by gaussian rasterizer
|
183 |
cam_view = torch.inverse(cam_poses).transpose(1, 2) # [V, 4, 4]
|
184 |
cam_view_proj = cam_view @ proj_matrix # [V, 4, 4]
|
|
|
202 |
<a style="display:inline-block; margin-left: .5em" href="https://github.com/3DTopia/LGM"><img src='https://img.shields.io/github/stars/3DTopia/LGM?style=social'/></a>
|
203 |
</div>
|
204 |
|
205 |
+
* Input can be only text, only image, or both image and text.
|
206 |
* Output is a `ply` file containing the 3D Gaussians, please check our [repo](https://github.com/3DTopia/LGM/blob/main/readme.md) for visualization and mesh conversion.
|
207 |
* If you find the output unsatisfying, try using different seeds!
|
208 |
'''
|
|
|
213 |
with gr.Column(scale=1):
|
214 |
gr.Markdown('# ' + _TITLE)
|
215 |
gr.Markdown(_DESCRIPTION)
|
216 |
+
|
217 |
with gr.Row(variant='panel'):
|
218 |
with gr.Column(scale=1):
|
219 |
# input image
|
|
|
231 |
# gen button
|
232 |
button_gen = gr.Button("Generate")
|
233 |
|
234 |
+
|
235 |
with gr.Column(scale=1):
|
236 |
with gr.Tab("Video"):
|
237 |
# final video results
|
|
|
243 |
output_image = gr.Image(interactive=False, show_label=False)
|
244 |
|
245 |
button_gen.click(process, inputs=[input_image, input_text, input_neg_text, input_elevation, input_num_steps, input_seed], outputs=[output_image, output_video, output_file])
|
246 |
+
|
247 |
gr.Examples(
|
248 |
examples=[
|
249 |
"data_test/frog_sweater.jpg",
|
|
|
276 |
cache_examples=True,
|
277 |
label='Text-to-3D Examples'
|
278 |
)
|
279 |
+
|
280 |
+
block.launch()
|
requirements.txt
CHANGED
@@ -1,4 +1,3 @@
|
|
1 |
-
--extra-index-url https://download.pytorch.org/whl/cu118
|
2 |
torch==2.0.0
|
3 |
xformers
|
4 |
|
@@ -28,4 +27,4 @@ trimesh
|
|
28 |
kiui >= 0.2.3
|
29 |
xatlas
|
30 |
roma
|
31 |
-
plyfile
|
|
|
|
|
1 |
torch==2.0.0
|
2 |
xformers
|
3 |
|
|
|
27 |
kiui >= 0.2.3
|
28 |
xatlas
|
29 |
roma
|
30 |
+
plyfile
|
wheel/diff_gaussian_rasterization-0.0.0-cp310-cp310-linux_x86_64.whl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:42bf718442ba764469170abc09d99a70b7c1d891dc290f2e1247db09c95a0e88
|
3 |
+
size 3021758
|