Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
|
@@ -54,8 +54,6 @@ JS = """function () {
|
|
| 54 |
}"""
|
| 55 |
|
| 56 |
|
| 57 |
-
|
| 58 |
-
|
| 59 |
# Ensure model and scheduler are initialized in GPU-enabled function
|
| 60 |
if torch.cuda.is_available():
|
| 61 |
model_manager = ModelManager(
|
|
@@ -99,7 +97,12 @@ def change_media(image_in, video_in, selected):
|
|
| 99 |
elif selected == "Diffutoon":
|
| 100 |
return gr.update(visible=False), gr.update(visible=True), gr.update(visible=True)
|
| 101 |
|
| 102 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 103 |
|
| 104 |
@spaces.GPU(duration=120)
|
| 105 |
def generate(
|
|
@@ -108,15 +111,19 @@ def generate(
|
|
| 108 |
selected,
|
| 109 |
prompt: str = "best quality",
|
| 110 |
seed: Optional[int] = -1,
|
| 111 |
-
num_inference_steps: int =
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 112 |
animatediff_batch_size: int = 32,
|
| 113 |
animatediff_stride: int = 16,
|
| 114 |
motion_bucket_id: int = 127,
|
| 115 |
fps_id: int = 25,
|
| 116 |
-
num_frames: int = 50,
|
| 117 |
output_folder: str = "outputs",
|
| 118 |
progress=gr.Progress(track_tqdm=True)):
|
| 119 |
-
|
| 120 |
if seed == -1:
|
| 121 |
seed = random.randint(0, MAX_SEED)
|
| 122 |
|
|
@@ -125,15 +132,15 @@ def generate(
|
|
| 125 |
os.makedirs(output_folder, exist_ok=True)
|
| 126 |
base_count = len(glob(os.path.join(output_folder, "*.mp4")))
|
| 127 |
video_path = os.path.join(output_folder, f"{base_count:06d}.mp4")
|
| 128 |
-
|
| 129 |
if selected == "ExVideo" and image_in:
|
| 130 |
image = Image.open(image_in)
|
| 131 |
video = pipe(
|
| 132 |
-
input_image=image.resize((
|
| 133 |
num_frames=num_frames,
|
| 134 |
fps=fps_id,
|
| 135 |
-
height=
|
| 136 |
-
width=
|
| 137 |
motion_bucket_id=motion_bucket_id,
|
| 138 |
num_inference_steps=num_inference_steps,
|
| 139 |
min_cfg_scale=2,
|
|
@@ -144,18 +151,19 @@ def generate(
|
|
| 144 |
elif selected == "Diffutoon" and video_in:
|
| 145 |
up_video = VideoData(
|
| 146 |
video_file=video_in,
|
| 147 |
-
height=
|
| 148 |
-
|
|
|
|
| 149 |
|
| 150 |
video = pipe2(
|
| 151 |
prompt=prompt,
|
| 152 |
negative_prompt="verybadimagenegative_v1.3",
|
| 153 |
cfg_scale=3,
|
| 154 |
clip_skip=2,
|
| 155 |
-
controlnet_frames=input_video, num_frames=
|
| 156 |
num_inference_steps=num_inference_steps,
|
| 157 |
-
height=
|
| 158 |
-
width=
|
| 159 |
animatediff_batch_size=animatediff_batch_size,
|
| 160 |
animatediff_stride=animatediff_stride,
|
| 161 |
vram_limit_level=0,
|
|
@@ -182,7 +190,11 @@ examples = [
|
|
| 182 |
|
| 183 |
with gr.Blocks(css=CSS, js=JS, theme="soft") as demo:
|
| 184 |
gr.HTML("<h1><center>Exvideoπ½οΈDiffutoon</center></h1>")
|
| 185 |
-
gr.HTML("
|
|
|
|
|
|
|
|
|
|
|
|
|
| 186 |
with gr.Row():
|
| 187 |
video_in = gr.Video(label='Upload Video', height=600, scale=2)
|
| 188 |
image_in = gr.Image(label='Upload Image', height=600, scale=2, image_mode="RGB", type="filepath", visible=False)
|
|
@@ -204,10 +216,50 @@ with gr.Blocks(css=CSS, js=JS, theme="soft") as demo:
|
|
| 204 |
label="Inference steps",
|
| 205 |
info="Inference steps",
|
| 206 |
step=1,
|
| 207 |
-
value=
|
| 208 |
minimum=1,
|
| 209 |
-
maximum=50
|
| 210 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 211 |
with gr.Accordion("Diffutoon Options", open=False):
|
| 212 |
animatediff_batch_size = gr.Slider(
|
| 213 |
label="Animatediff batch size",
|
|
@@ -222,7 +274,7 @@ with gr.Blocks(css=CSS, js=JS, theme="soft") as demo:
|
|
| 222 |
maximum=50,
|
| 223 |
step=1,
|
| 224 |
value=16,
|
| 225 |
-
)
|
| 226 |
with gr.Accordion("ExVideo Options", open=False):
|
| 227 |
motion_bucket_id = gr.Slider(
|
| 228 |
label="Motion bucket id",
|
|
@@ -230,7 +282,7 @@ with gr.Blocks(css=CSS, js=JS, theme="soft") as demo:
|
|
| 230 |
value=127,
|
| 231 |
step=1,
|
| 232 |
minimum=1,
|
| 233 |
-
maximum=255
|
| 234 |
)
|
| 235 |
fps_id = gr.Slider(
|
| 236 |
label="Frames per second",
|
|
@@ -238,17 +290,9 @@ with gr.Blocks(css=CSS, js=JS, theme="soft") as demo:
|
|
| 238 |
value=6,
|
| 239 |
step=1,
|
| 240 |
minimum=5,
|
| 241 |
-
maximum=30
|
| 242 |
-
)
|
| 243 |
-
num_frames = gr.Slider(
|
| 244 |
-
label="Frames num",
|
| 245 |
-
info="Frames num",
|
| 246 |
-
step=1,
|
| 247 |
-
value=50,
|
| 248 |
-
minimum=1,
|
| 249 |
-
maximum=128
|
| 250 |
)
|
| 251 |
-
prompt = gr.Textbox(label="Prompt")
|
| 252 |
with gr.Row():
|
| 253 |
submit_btn = gr.Button(value="Generate")
|
| 254 |
#stop_btn = gr.Button(value="Stop", variant="stop")
|
|
@@ -263,7 +307,8 @@ with gr.Blocks(css=CSS, js=JS, theme="soft") as demo:
|
|
| 263 |
examples_per_page=4,
|
| 264 |
)
|
| 265 |
selected.change(change_media, inputs=[image_in, video_in, selected], outputs=[image_in, video_in, prompt])
|
| 266 |
-
|
|
|
|
| 267 |
#stop_btn.click(fn=None, inputs=None, outputs=None, cancels=[submit_event])
|
| 268 |
|
| 269 |
demo.queue().launch()
|
|
|
|
| 54 |
}"""
|
| 55 |
|
| 56 |
|
|
|
|
|
|
|
| 57 |
# Ensure model and scheduler are initialized in GPU-enabled function
|
| 58 |
if torch.cuda.is_available():
|
| 59 |
model_manager = ModelManager(
|
|
|
|
| 97 |
elif selected == "Diffutoon":
|
| 98 |
return gr.update(visible=False), gr.update(visible=True), gr.update(visible=True)
|
| 99 |
|
| 100 |
+
def update_frames(video_in):
|
| 101 |
+
up_video = VideoData(
|
| 102 |
+
video_file=video_in,
|
| 103 |
+
height=shape_height, width=shape_width)
|
| 104 |
+
frame_len = len(up_video)
|
| 105 |
+
return gr.update(maximum=frame_len)
|
| 106 |
|
| 107 |
@spaces.GPU(duration=120)
|
| 108 |
def generate(
|
|
|
|
| 111 |
selected,
|
| 112 |
prompt: str = "best quality",
|
| 113 |
seed: Optional[int] = -1,
|
| 114 |
+
num_inference_steps: int = 10,
|
| 115 |
+
num_frames: int = 30,
|
| 116 |
+
shape_height: int = 512,
|
| 117 |
+
shape_width: int = 512,
|
| 118 |
+
height: int = 512,
|
| 119 |
+
width: int = 512,
|
| 120 |
animatediff_batch_size: int = 32,
|
| 121 |
animatediff_stride: int = 16,
|
| 122 |
motion_bucket_id: int = 127,
|
| 123 |
fps_id: int = 25,
|
|
|
|
| 124 |
output_folder: str = "outputs",
|
| 125 |
progress=gr.Progress(track_tqdm=True)):
|
| 126 |
+
video = ""
|
| 127 |
if seed == -1:
|
| 128 |
seed = random.randint(0, MAX_SEED)
|
| 129 |
|
|
|
|
| 132 |
os.makedirs(output_folder, exist_ok=True)
|
| 133 |
base_count = len(glob(os.path.join(output_folder, "*.mp4")))
|
| 134 |
video_path = os.path.join(output_folder, f"{base_count:06d}.mp4")
|
| 135 |
+
|
| 136 |
if selected == "ExVideo" and image_in:
|
| 137 |
image = Image.open(image_in)
|
| 138 |
video = pipe(
|
| 139 |
+
input_image=image.resize((shape_height, shape_width)),
|
| 140 |
num_frames=num_frames,
|
| 141 |
fps=fps_id,
|
| 142 |
+
height=height,
|
| 143 |
+
width=width,
|
| 144 |
motion_bucket_id=motion_bucket_id,
|
| 145 |
num_inference_steps=num_inference_steps,
|
| 146 |
min_cfg_scale=2,
|
|
|
|
| 151 |
elif selected == "Diffutoon" and video_in:
|
| 152 |
up_video = VideoData(
|
| 153 |
video_file=video_in,
|
| 154 |
+
height=shape_height, width=shape_width)
|
| 155 |
+
frame_len = min(num_frames, len(up_video))
|
| 156 |
+
input_video = [up_video[i] for i in range(1, frame_len)]
|
| 157 |
|
| 158 |
video = pipe2(
|
| 159 |
prompt=prompt,
|
| 160 |
negative_prompt="verybadimagenegative_v1.3",
|
| 161 |
cfg_scale=3,
|
| 162 |
clip_skip=2,
|
| 163 |
+
controlnet_frames=input_video, num_frames=num_frames,
|
| 164 |
num_inference_steps=num_inference_steps,
|
| 165 |
+
height=height,
|
| 166 |
+
width=width,
|
| 167 |
animatediff_batch_size=animatediff_batch_size,
|
| 168 |
animatediff_stride=animatediff_stride,
|
| 169 |
vram_limit_level=0,
|
|
|
|
| 190 |
|
| 191 |
with gr.Blocks(css=CSS, js=JS, theme="soft") as demo:
|
| 192 |
gr.HTML("<h1><center>Exvideoπ½οΈDiffutoon</center></h1>")
|
| 193 |
+
gr.HTML("""
|
| 194 |
+
<p><center>Exvideo and Diffutoon video generation
|
| 195 |
+
<br><b>Update</b>: Origin and Output resize, Frames control.
|
| 196 |
+
<br><b>Note</b>: ZeroGPU limited, Set the parameters appropriately.</center></p>
|
| 197 |
+
""")
|
| 198 |
with gr.Row():
|
| 199 |
video_in = gr.Video(label='Upload Video', height=600, scale=2)
|
| 200 |
image_in = gr.Image(label='Upload Image', height=600, scale=2, image_mode="RGB", type="filepath", visible=False)
|
|
|
|
| 216 |
label="Inference steps",
|
| 217 |
info="Inference steps",
|
| 218 |
step=1,
|
| 219 |
+
value=10,
|
| 220 |
minimum=1,
|
| 221 |
+
maximum=50,
|
| 222 |
)
|
| 223 |
+
num_frames = gr.Slider(
|
| 224 |
+
label="Num frames",
|
| 225 |
+
info="Output Frames",
|
| 226 |
+
step=1,
|
| 227 |
+
value=30,
|
| 228 |
+
minimum=1,
|
| 229 |
+
maximum=128,
|
| 230 |
+
)
|
| 231 |
+
with gr.Row():
|
| 232 |
+
shape_height = gr.Slider(
|
| 233 |
+
label="Shape Height",
|
| 234 |
+
info="Resize Height",
|
| 235 |
+
step=8,
|
| 236 |
+
value=512,
|
| 237 |
+
minimum=256,
|
| 238 |
+
maximum=2560,
|
| 239 |
+
)
|
| 240 |
+
shape_width = gr.Slider(
|
| 241 |
+
label="Shape Width",
|
| 242 |
+
info="Resize Width",
|
| 243 |
+
step=8,
|
| 244 |
+
value=512,
|
| 245 |
+
minimum=256,
|
| 246 |
+
maximum=2560,
|
| 247 |
+
)
|
| 248 |
+
with gr.Row():
|
| 249 |
+
height = gr.Slider(
|
| 250 |
+
label="Output Height",
|
| 251 |
+
step=8,
|
| 252 |
+
value=512,
|
| 253 |
+
minimum=256,
|
| 254 |
+
maximum=2560,
|
| 255 |
+
)
|
| 256 |
+
width = gr.Slider(
|
| 257 |
+
label="Output Width",
|
| 258 |
+
step=8,
|
| 259 |
+
value=512,
|
| 260 |
+
minimum=256,
|
| 261 |
+
maximum=2560,
|
| 262 |
+
)
|
| 263 |
with gr.Accordion("Diffutoon Options", open=False):
|
| 264 |
animatediff_batch_size = gr.Slider(
|
| 265 |
label="Animatediff batch size",
|
|
|
|
| 274 |
maximum=50,
|
| 275 |
step=1,
|
| 276 |
value=16,
|
| 277 |
+
)
|
| 278 |
with gr.Accordion("ExVideo Options", open=False):
|
| 279 |
motion_bucket_id = gr.Slider(
|
| 280 |
label="Motion bucket id",
|
|
|
|
| 282 |
value=127,
|
| 283 |
step=1,
|
| 284 |
minimum=1,
|
| 285 |
+
maximum=255,
|
| 286 |
)
|
| 287 |
fps_id = gr.Slider(
|
| 288 |
label="Frames per second",
|
|
|
|
| 290 |
value=6,
|
| 291 |
step=1,
|
| 292 |
minimum=5,
|
| 293 |
+
maximum=30,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 294 |
)
|
| 295 |
+
prompt = gr.Textbox(label="Prompt", value="best quality")
|
| 296 |
with gr.Row():
|
| 297 |
submit_btn = gr.Button(value="Generate")
|
| 298 |
#stop_btn = gr.Button(value="Stop", variant="stop")
|
|
|
|
| 307 |
examples_per_page=4,
|
| 308 |
)
|
| 309 |
selected.change(change_media, inputs=[image_in, video_in, selected], outputs=[image_in, video_in, prompt])
|
| 310 |
+
video_in.upload(update_frames, inputs=[video_in], outputs=[num_frames])
|
| 311 |
+
submit_event = submit_btn.click(fn=generate, inputs=[video_in, image_in, selected, prompt, seed, num_inference_steps, num_frames, shape_height, shape_width, height, width, animatediff_batch_size, animatediff_stride, motion_bucket_id, fps_id], outputs=[video, seed], api_name="video")
|
| 312 |
#stop_btn.click(fn=None, inputs=None, outputs=None, cancels=[submit_event])
|
| 313 |
|
| 314 |
demo.queue().launch()
|