vilarin commited on
Commit
898752d
·
verified ·
1 Parent(s): 126f4f2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +121 -42
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, HunyuanDiTImagePipeline
 
 
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
- image,
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
- video = pipe(
73
- input_image=image.resize((512, 512)),
74
- num_frames=num_frames,
75
- fps=fps_id,
76
- height=512,
77
- width=512,
78
- motion_bucket_id=motion_bucket_id,
79
- num_inference_steps=num_inference_steps,
80
- min_cfg_scale=2,
81
- max_cfg_scale=2,
82
- contrast_enhance_scale=1.2
83
- )
84
- model_manager.to("cpu")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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📽️</center></h1>")
103
- gr.HTML("<p><center><a href='https://huggingface.co/ECNU-CILab/ExVideo-SVD-128f-v1'>ExVideo</a> image-to-video generation<br><b>Update</b>: first version</center></p>")
104
  with gr.Row():
105
- image = gr.Image(label='Upload Image', height=600, scale=2, image_mode="RGB", type="filepath")
106
  video = gr.Video(label="Generated Video", height=600, scale=2)
107
- with gr.Accordion("Advanced Options", open=True):
108
- with gr.Column(scale=1):
109
- seed = gr.Slider(
110
- label="Seed (-1 Random)",
111
- minimum=-1,
112
- maximum=MAX_SEED,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
113
  step=1,
114
- value=-1,
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([image, seed, video])
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
- submit_event = submit_btn.click(fn=generate, inputs=[image, seed, motion_bucket_id, fps_id,num_inference_steps, num_frames], outputs=[video, seed], api_name="video")
 
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()