Spaces:
Paused
Paused
Update app.py
Browse files
app.py
CHANGED
@@ -16,7 +16,9 @@ from glob import glob
|
|
16 |
from pathlib import Path
|
17 |
from typing import Optional
|
18 |
|
19 |
-
from diffsynth import save_video, ModelManager, SVDVideoPipeline
|
|
|
|
|
20 |
|
21 |
import uuid
|
22 |
|
@@ -45,23 +47,58 @@ if torch.cuda.is_available():
|
|
45 |
model_id_list=["stable-video-diffusion-img2vid-xt", "ExVideo-SVD-128f-v1"],
|
46 |
downloading_priority=["HuggingFace"])
|
47 |
pipe = SVDVideoPipeline.from_model_manager(model_manager)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
48 |
|
49 |
|
50 |
@spaces.GPU(duration=120)
|
51 |
def generate(
|
52 |
-
|
53 |
seed: Optional[int] = -1,
|
54 |
motion_bucket_id: int = 127,
|
55 |
fps_id: int = 25,
|
56 |
num_inference_steps: int = 10,
|
57 |
num_frames: int = 50,
|
58 |
output_folder: str = "outputs",
|
|
|
|
|
59 |
progress=gr.Progress(track_tqdm=True)):
|
|
|
|
|
60 |
|
61 |
if seed == -1:
|
62 |
seed = random.randint(0, MAX_SEED)
|
63 |
-
|
64 |
-
image = Image.open(image)
|
65 |
|
66 |
torch.manual_seed(seed)
|
67 |
|
@@ -69,19 +106,42 @@ def generate(
|
|
69 |
base_count = len(glob(os.path.join(output_folder, "*.mp4")))
|
70 |
video_path = os.path.join(output_folder, f"{base_count:06d}.mp4")
|
71 |
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
85 |
|
86 |
save_video(video, video_path, fps=fps_id)
|
87 |
|
@@ -92,6 +152,7 @@ examples = [
|
|
92 |
"./train.jpg",
|
93 |
"./girl.webp",
|
94 |
"./robo.jpg",
|
|
|
95 |
]
|
96 |
|
97 |
|
@@ -99,20 +160,48 @@ examples = [
|
|
99 |
# Gradio Interface
|
100 |
|
101 |
with gr.Blocks(css=CSS, js=JS, theme="soft") as demo:
|
102 |
-
gr.HTML("<h1><center>Exvideo
|
103 |
-
gr.HTML("<p><center
|
104 |
with gr.Row():
|
105 |
-
|
106 |
video = gr.Video(label="Generated Video", height=600, scale=2)
|
107 |
-
with gr.
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
113 |
step=1,
|
114 |
-
value
|
115 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
116 |
motion_bucket_id = gr.Slider(
|
117 |
label="Motion bucket id",
|
118 |
info="Controls how much motion to add/remove from the image",
|
@@ -129,14 +218,6 @@ with gr.Blocks(css=CSS, js=JS, theme="soft") as demo:
|
|
129 |
minimum=5,
|
130 |
maximum=30
|
131 |
)
|
132 |
-
num_inference_steps = gr.Slider(
|
133 |
-
label="Inference steps",
|
134 |
-
info="Inference steps",
|
135 |
-
step=1,
|
136 |
-
value=10,
|
137 |
-
minimum=1,
|
138 |
-
maximum=50
|
139 |
-
)
|
140 |
num_frames = gr.Slider(
|
141 |
label="Frames num",
|
142 |
info="Frames num",
|
@@ -144,21 +225,19 @@ with gr.Blocks(css=CSS, js=JS, theme="soft") as demo:
|
|
144 |
value=50,
|
145 |
minimum=1,
|
146 |
maximum=128
|
147 |
-
)
|
|
|
148 |
with gr.Row():
|
149 |
submit_btn = gr.Button(value="Generate")
|
150 |
#stop_btn = gr.Button(value="Stop", variant="stop")
|
151 |
-
clear_btn = gr.ClearButton([
|
152 |
gr.Examples(
|
153 |
examples=examples,
|
154 |
-
inputs=image,
|
155 |
-
outputs=[video, seed],
|
156 |
-
fn=generate,
|
157 |
-
cache_examples="lazy",
|
158 |
examples_per_page=4,
|
159 |
)
|
160 |
|
161 |
-
|
|
|
162 |
#stop_btn.click(fn=None, inputs=None, outputs=None, cancels=[submit_event])
|
163 |
|
164 |
demo.queue().launch()
|
|
|
16 |
from pathlib import Path
|
17 |
from typing import Optional
|
18 |
|
19 |
+
from diffsynth import save_video, ModelManager, SVDVideoPipeline
|
20 |
+
from diffsynth import SDVideoPipeline, ControlNetConfigUnit, VideoData, save_frames
|
21 |
+
from diffsynth.extensions.RIFE import RIFESmoother
|
22 |
|
23 |
import uuid
|
24 |
|
|
|
47 |
model_id_list=["stable-video-diffusion-img2vid-xt", "ExVideo-SVD-128f-v1"],
|
48 |
downloading_priority=["HuggingFace"])
|
49 |
pipe = SVDVideoPipeline.from_model_manager(model_manager)
|
50 |
+
|
51 |
+
|
52 |
+
model_manager2 = ModelManager(torch_dtype=torch.float16, device="cuda")
|
53 |
+
model_manager2.load_textual_inversions("models/textual_inversion")
|
54 |
+
model_manager2.load_models([
|
55 |
+
"models/stable_diffusion/flat2DAnimerge_v45Sharp.safetensors",
|
56 |
+
"models/AnimateDiff/mm_sd_v15_v2.ckpt",
|
57 |
+
"models/ControlNet/control_v11p_sd15_lineart.pth",
|
58 |
+
"models/ControlNet/control_v11f1e_sd15_tile.pth",
|
59 |
+
"models/RIFE/flownet.pkl"
|
60 |
+
])
|
61 |
+
pipe2 = SDVideoPipeline.from_model_manager(
|
62 |
+
model_manager2,
|
63 |
+
[
|
64 |
+
ControlNetConfigUnit(
|
65 |
+
processor_id="lineart",
|
66 |
+
model_path="models/ControlNet/control_v11p_sd15_lineart.pth",
|
67 |
+
scale=0.5
|
68 |
+
),
|
69 |
+
ControlNetConfigUnit(
|
70 |
+
processor_id="tile",
|
71 |
+
model_path="models/ControlNet/control_v11f1e_sd15_tile.pth",
|
72 |
+
scale=0.5
|
73 |
+
)
|
74 |
+
]
|
75 |
+
)
|
76 |
+
smoother = RIFESmoother.from_model_manager(model_manager2)
|
77 |
+
|
78 |
+
|
79 |
+
def video_to_image(selected):
|
80 |
+
if selected == "ExVideo":
|
81 |
+
return gr.Image(label='Upload Image', height=600, scale=2, image_mode="RGB", type="filepath")
|
82 |
+
|
83 |
|
84 |
|
85 |
@spaces.GPU(duration=120)
|
86 |
def generate(
|
87 |
+
media,
|
88 |
seed: Optional[int] = -1,
|
89 |
motion_bucket_id: int = 127,
|
90 |
fps_id: int = 25,
|
91 |
num_inference_steps: int = 10,
|
92 |
num_frames: int = 50,
|
93 |
output_folder: str = "outputs",
|
94 |
+
selected,
|
95 |
+
prompt,
|
96 |
progress=gr.Progress(track_tqdm=True)):
|
97 |
+
|
98 |
+
print(media)
|
99 |
|
100 |
if seed == -1:
|
101 |
seed = random.randint(0, MAX_SEED)
|
|
|
|
|
102 |
|
103 |
torch.manual_seed(seed)
|
104 |
|
|
|
106 |
base_count = len(glob(os.path.join(output_folder, "*.mp4")))
|
107 |
video_path = os.path.join(output_folder, f"{base_count:06d}.mp4")
|
108 |
|
109 |
+
if selected == "ExVideo":
|
110 |
+
image = Image.open(media)
|
111 |
+
video = pipe(
|
112 |
+
input_image=image.resize((512, 512)),
|
113 |
+
num_frames=num_frames,
|
114 |
+
fps=fps_id,
|
115 |
+
height=512,
|
116 |
+
width=512,
|
117 |
+
motion_bucket_id=motion_bucket_id,
|
118 |
+
num_inference_steps=num_inference_steps,
|
119 |
+
min_cfg_scale=2,
|
120 |
+
max_cfg_scale=2,
|
121 |
+
contrast_enhance_scale=1.2
|
122 |
+
)
|
123 |
+
model_manager.to("cpu")
|
124 |
+
else:
|
125 |
+
up_video = VideoData(
|
126 |
+
video_file=media,
|
127 |
+
height=1024, width=1024)
|
128 |
+
input_video = [up_video[i] for i in range(40*60, 41*60)]
|
129 |
+
|
130 |
+
video = pipe(
|
131 |
+
prompt=prompt,
|
132 |
+
negative_prompt="verybadimagenegative_v1.3",
|
133 |
+
cfg_scale=3,
|
134 |
+
clip_skip=2,
|
135 |
+
controlnet_frames=input_video, num_frames=len(input_video),
|
136 |
+
num_inference_steps=10,
|
137 |
+
height=1024,
|
138 |
+
width=1024,
|
139 |
+
animatediff_batch_size=32,
|
140 |
+
animatediff_stride=16,
|
141 |
+
vram_limit_level=0,
|
142 |
+
)
|
143 |
+
video = smoother(video)
|
144 |
+
|
145 |
|
146 |
save_video(video, video_path, fps=fps_id)
|
147 |
|
|
|
152 |
"./train.jpg",
|
153 |
"./girl.webp",
|
154 |
"./robo.jpg",
|
155 |
+
'./working.mp4',
|
156 |
]
|
157 |
|
158 |
|
|
|
160 |
# Gradio Interface
|
161 |
|
162 |
with gr.Blocks(css=CSS, js=JS, theme="soft") as demo:
|
163 |
+
gr.HTML("<h1><center>Exvideo📽️Diffutoon</center></h1>")
|
164 |
+
gr.HTML("<p><center>Exvideo and Diffutoon video generation<br><b>Update</b>: first version<br><b>Note</b>: ZeroGPU limited, Set the parameters appropriately.</center></p>")
|
165 |
with gr.Row():
|
166 |
+
media = gr.Video(label='Upload Video', height=600, scale=2)
|
167 |
video = gr.Video(label="Generated Video", height=600, scale=2)
|
168 |
+
with gr.Column(scale=1):
|
169 |
+
selected = gr.Radio(
|
170 |
+
label="Selected App",
|
171 |
+
choices=["ExVideo", "Diffutoon"],
|
172 |
+
value="Diffutoon"
|
173 |
+
)
|
174 |
+
seed = gr.Slider(
|
175 |
+
label="Seed (-1 Random)",
|
176 |
+
minimum=-1,
|
177 |
+
maximum=MAX_SEED,
|
178 |
+
step=1,
|
179 |
+
value=-1,
|
180 |
+
)
|
181 |
+
num_inference_steps = gr.Slider(
|
182 |
+
label="Inference steps",
|
183 |
+
info="Inference steps",
|
184 |
+
step=1,
|
185 |
+
value=10,
|
186 |
+
minimum=1,
|
187 |
+
maximum=50
|
188 |
+
)
|
189 |
+
with gr.Accordion("Diffutoon Options", open=False):
|
190 |
+
animatediff_batch_size = gr.Slider(
|
191 |
+
label="Animatediff batch size",
|
192 |
+
minimum=1,
|
193 |
+
maximum=50,
|
194 |
step=1,
|
195 |
+
value=32,
|
196 |
)
|
197 |
+
animatediff_stride = gr.Slider(
|
198 |
+
label="Animatediff stride",
|
199 |
+
minimum=1,
|
200 |
+
maximum=50,
|
201 |
+
step=1,
|
202 |
+
value=16,
|
203 |
+
)
|
204 |
+
with gr.Accordion("ExVideo Options", open=False):
|
205 |
motion_bucket_id = gr.Slider(
|
206 |
label="Motion bucket id",
|
207 |
info="Controls how much motion to add/remove from the image",
|
|
|
218 |
minimum=5,
|
219 |
maximum=30
|
220 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
221 |
num_frames = gr.Slider(
|
222 |
label="Frames num",
|
223 |
info="Frames num",
|
|
|
225 |
value=50,
|
226 |
minimum=1,
|
227 |
maximum=128
|
228 |
+
)
|
229 |
+
prompt = gr.Textbox(label="Prompt")
|
230 |
with gr.Row():
|
231 |
submit_btn = gr.Button(value="Generate")
|
232 |
#stop_btn = gr.Button(value="Stop", variant="stop")
|
233 |
+
clear_btn = gr.ClearButton([media, seed, video])
|
234 |
gr.Examples(
|
235 |
examples=examples,
|
|
|
|
|
|
|
|
|
236 |
examples_per_page=4,
|
237 |
)
|
238 |
|
239 |
+
selected.change(fn=video_to_image, inputs=[selected], outputs=[media])
|
240 |
+
submit_event = submit_btn.click(fn=generate, inputs=[media, selected, seed, num_inference_steps, animatediff_batch_size, animatediff_stride, motion_bucket_id, fps_id, num_frames, prompt], outputs=[video, seed], api_name="video")
|
241 |
#stop_btn.click(fn=None, inputs=None, outputs=None, cancels=[submit_event])
|
242 |
|
243 |
demo.queue().launch()
|