Spaces:
Running
on
Zero
Running
on
Zero
app.py
CHANGED
@@ -177,7 +177,7 @@ def _default_render_cameras(batch_size: int = 1):
|
|
177 |
return render_cameras.unsqueeze(0).repeat(batch_size, 1, 1)
|
178 |
|
179 |
@spaces.GPU
|
180 |
-
def generate_mesh(image, source_size=512, render_size=384, mesh_size=512, export_mesh=False, export_video=
|
181 |
image = preprocess_image(image, source_size).to(model_wrapper.device)
|
182 |
source_camera = _default_source_camera(batch_size=1).to(model_wrapper.device)
|
183 |
|
@@ -196,7 +196,7 @@ def generate_mesh(image, source_size=512, render_size=384, mesh_size=512, export
|
|
196 |
mesh_path = "xiaoxis_mesh.obj"
|
197 |
mesh.export(mesh_path, 'obj')
|
198 |
|
199 |
-
return
|
200 |
|
201 |
if export_video:
|
202 |
render_cameras = _default_render_cameras(batch_size=1).to(model_wrapper.device)
|
@@ -220,23 +220,20 @@ def generate_mesh(image, source_size=512, render_size=384, mesh_size=512, export
|
|
220 |
video_path = "xiaoxis_video.mp4"
|
221 |
imageio.mimwrite(video_path, frames, fps=fps)
|
222 |
|
223 |
-
return
|
224 |
-
|
225 |
-
return planes, None
|
226 |
|
227 |
return None, None
|
228 |
|
229 |
-
def
|
230 |
-
|
231 |
-
return
|
232 |
-
|
233 |
-
def step_2_generate_obj(image):
|
234 |
-
_, mesh_path = generate_mesh(image, export_mesh=True)
|
235 |
-
return planes_path.shape, mesh_path, mesh_path
|
236 |
|
237 |
-
def
|
238 |
_, video_path = generate_mesh(image, export_video=True)
|
239 |
-
return
|
|
|
|
|
|
|
240 |
|
241 |
# 从 assets 文件夹中设置示例文件,并限制最多读取 10 个文件
|
242 |
example_folder = "assets"
|
@@ -255,27 +252,21 @@ with gr.Blocks() as demo:
|
|
255 |
with gr.Row():
|
256 |
with gr.Column():
|
257 |
img_input = gr.Image(type="pil", label="输入图像")
|
258 |
-
examples_component = gr.Examples(examples=examples, inputs=img_input, outputs=None, examples_per_page=
|
259 |
-
generate_planes_button = gr.Button("生成平面图")
|
260 |
generate_mesh_button = gr.Button("生成模型")
|
261 |
generate_video_button = gr.Button("生成视频")
|
262 |
with gr.Column():
|
263 |
-
planes_output = gr.Image(
|
264 |
-
label="平面图",
|
265 |
-
type="pil",
|
266 |
-
interactive=False
|
267 |
-
)
|
268 |
model_output = LitModel3D(
|
269 |
clear_color=[0, 0, 0, 0], # 可调整背景颜色,以获得更好的对比度
|
270 |
label="模型可视化",
|
271 |
scale=1.0,
|
272 |
-
tonemapping="aces",
|
273 |
-
exposure=1.1,
|
274 |
-
contrast=1.1,
|
275 |
-
camera_position=(0, 0, 2),
|
276 |
-
zoom_speed=0.5,
|
277 |
-
pan_speed=0.5,
|
278 |
-
interactive=False
|
279 |
)
|
280 |
|
281 |
with gr.Row():
|
@@ -287,18 +278,20 @@ with gr.Blocks() as demo:
|
|
287 |
|
288 |
# 清除输出
|
289 |
def clear_model_viewer():
|
290 |
-
"""在加载新模型前重置
|
291 |
-
|
292 |
-
|
|
|
|
|
|
|
293 |
|
294 |
-
#
|
295 |
-
img_input.change(clear_model_viewer, inputs=None, outputs=
|
296 |
|
297 |
# 然后生成模型和视频
|
298 |
-
|
299 |
-
|
300 |
-
generate_video_button.click(step_3_generate_video, inputs=img_input, outputs=[planes_output, video_file_output])
|
301 |
|
302 |
demo.launch(
|
303 |
auth=(os.environ.get('AUTH_USERNAME'), os.environ.get('AUTH_PASSWORD'))
|
304 |
-
)
|
|
|
177 |
return render_cameras.unsqueeze(0).repeat(batch_size, 1, 1)
|
178 |
|
179 |
@spaces.GPU
|
180 |
+
def generate_mesh(image, source_size=512, render_size=384, mesh_size=512, export_mesh=False, export_video=True, fps=30):
|
181 |
image = preprocess_image(image, source_size).to(model_wrapper.device)
|
182 |
source_camera = _default_source_camera(batch_size=1).to(model_wrapper.device)
|
183 |
|
|
|
196 |
mesh_path = "xiaoxis_mesh.obj"
|
197 |
mesh.export(mesh_path, 'obj')
|
198 |
|
199 |
+
return mesh_path, mesh_path
|
200 |
|
201 |
if export_video:
|
202 |
render_cameras = _default_render_cameras(batch_size=1).to(model_wrapper.device)
|
|
|
220 |
video_path = "xiaoxis_video.mp4"
|
221 |
imageio.mimwrite(video_path, frames, fps=fps)
|
222 |
|
223 |
+
return None, video_path
|
|
|
|
|
224 |
|
225 |
return None, None
|
226 |
|
227 |
+
def step_1_generate_obj(image):
|
228 |
+
mesh_path, _ = generate_mesh(image, export_mesh=True)
|
229 |
+
return mesh_path, mesh_path
|
|
|
|
|
|
|
|
|
230 |
|
231 |
+
def step_2_generate_video(image):
|
232 |
_, video_path = generate_mesh(image, export_video=True)
|
233 |
+
return video_path
|
234 |
+
|
235 |
+
def step_3_display_3d_model(mesh_file):
|
236 |
+
return mesh_file
|
237 |
|
238 |
# 从 assets 文件夹中设置示例文件,并限制最多读取 10 个文件
|
239 |
example_folder = "assets"
|
|
|
252 |
with gr.Row():
|
253 |
with gr.Column():
|
254 |
img_input = gr.Image(type="pil", label="输入图像")
|
255 |
+
examples_component = gr.Examples(examples=examples, inputs=img_input, outputs=None, examples_per_page=3)
|
|
|
256 |
generate_mesh_button = gr.Button("生成模型")
|
257 |
generate_video_button = gr.Button("生成视频")
|
258 |
with gr.Column():
|
|
|
|
|
|
|
|
|
|
|
259 |
model_output = LitModel3D(
|
260 |
clear_color=[0, 0, 0, 0], # 可调整背景颜色,以获得更好的对比度
|
261 |
label="模型可视化",
|
262 |
scale=1.0,
|
263 |
+
tonemapping="aces", # 可使用 aces 色调映射,使灯光更逼真
|
264 |
+
exposure=1.1, # 可调节曝光以控制亮度
|
265 |
+
contrast=1.1, # 可略微增加对比度,以获得更好的深度
|
266 |
+
camera_position=(0, 0, 2), # 将设置初始摄像机位置,使模型居中
|
267 |
+
zoom_speed=0.5, # 将调整变焦速度,以便更好地控制
|
268 |
+
pan_speed=0.5, # 将调整摇摄速度,以便更好地控制
|
269 |
+
interactive=False # 这样用户就可以与模型进行交互
|
270 |
)
|
271 |
|
272 |
with gr.Row():
|
|
|
278 |
|
279 |
# 清除输出
|
280 |
def clear_model_viewer():
|
281 |
+
"""在加载新模型前重置 Model3D 组件。"""
|
282 |
+
return gr.update(value=None)
|
283 |
+
|
284 |
+
def generate_and_visualize(image):
|
285 |
+
mesh_path = step_1_generate_obj(image)
|
286 |
+
return mesh_path, mesh_path
|
287 |
|
288 |
+
# 首先清除输出的 3D 模型
|
289 |
+
img_input.change(clear_model_viewer, inputs=None, outputs=model_output)
|
290 |
|
291 |
# 然后生成模型和视频
|
292 |
+
generate_mesh_button.click(step_1_generate_obj, inputs=img_input, outputs=[obj_file_output, model_output])
|
293 |
+
generate_video_button.click(step_2_generate_video, inputs=img_input, outputs=video_file_output)
|
|
|
294 |
|
295 |
demo.launch(
|
296 |
auth=(os.environ.get('AUTH_USERNAME'), os.environ.get('AUTH_PASSWORD'))
|
297 |
+
)
|