SingleZombie
commited on
Commit
·
ef5f302
1
Parent(s):
e8fbf78
zero gpu
Browse files- app.py +11 -73
- requirements.txt +1 -1
app.py
CHANGED
|
@@ -38,6 +38,7 @@ from annotator.midas import MidasDetector
|
|
| 38 |
import huggingface_hub
|
| 39 |
import shutil
|
| 40 |
import os
|
|
|
|
| 41 |
|
| 42 |
huggingface_hub.hf_hub_download('SingleZombie/FRESCO',
|
| 43 |
'boxer-punching-towards-camera.mp4',
|
|
@@ -170,7 +171,7 @@ def cfg_to_input(filename):
|
|
| 170 |
1.0, cfg['controlnet_type'], 50, 100,
|
| 171 |
cfg['num_inference_steps'], 7.5, a_prompt, n_prompt,
|
| 172 |
frame_count, cfg['batch_size'], cfg['mininterv'], cfg['maxinterv'],
|
| 173 |
-
use_constraints, True,
|
| 174 |
1, 1, 1, 1
|
| 175 |
]
|
| 176 |
return args
|
|
@@ -232,21 +233,17 @@ class GlobalState:
|
|
| 232 |
param.requires_grad = False
|
| 233 |
|
| 234 |
|
| 235 |
-
@torch.no_grad()
|
| 236 |
-
def process(*args):
|
| 237 |
-
keypath = process1(*args)
|
| 238 |
-
fullpath = process2(*args)
|
| 239 |
-
return keypath, fullpath
|
| 240 |
|
| 241 |
|
| 242 |
@torch.no_grad()
|
|
|
|
| 243 |
def process1(input_path, prompt, sd_model, seed, image_resolution, control_strength,
|
| 244 |
x0_strength, control_type, low_threshold, high_threshold,
|
| 245 |
ddpm_steps, scale, a_prompt, n_prompt,
|
| 246 |
frame_count, batch_size, mininterv, maxinterv,
|
| 247 |
use_constraints, bg_smooth, use_poisson, max_process,
|
| 248 |
b1, b2, s1, s2):
|
| 249 |
-
|
| 250 |
global_state.update_controlnet_model(control_type)
|
| 251 |
global_state.update_sd_model(sd_model)
|
| 252 |
apply_freeu(global_state.pipe, b1=b1, b2=b2, s1=s1, s2=s2)
|
|
@@ -392,7 +389,7 @@ def process1(input_path, prompt, sd_model, seed, image_resolution, control_stren
|
|
| 392 |
gc.collect()
|
| 393 |
if device == 'cuda':
|
| 394 |
torch.cuda.empty_cache()
|
| 395 |
-
break
|
| 396 |
|
| 397 |
writer = imageio.get_writer(os.path.join(save_path, 'key.mp4'), fps=fps)
|
| 398 |
file_list = sorted(os.listdir(os.path.join(save_path, 'keys')))
|
|
@@ -404,43 +401,9 @@ def process1(input_path, prompt, sd_model, seed, image_resolution, control_stren
|
|
| 404 |
writer.append_data(curImg)
|
| 405 |
writer.close()
|
| 406 |
|
| 407 |
-
global_state.processing_state = ProcessingState.KEY_IMGS
|
| 408 |
return os.path.join(save_path, 'key.mp4')
|
| 409 |
|
| 410 |
|
| 411 |
-
@torch.no_grad()
|
| 412 |
-
def process2(input_path, prompt, sd_model, seed, image_resolution, control_strength,
|
| 413 |
-
x0_strength, control_type, low_threshold, high_threshold,
|
| 414 |
-
ddpm_steps, scale, a_prompt, n_prompt,
|
| 415 |
-
frame_count, batch_size, mininterv, maxinterv,
|
| 416 |
-
use_constraints, bg_smooth, use_poisson, max_process,
|
| 417 |
-
b1, b2, s1, s2):
|
| 418 |
-
|
| 419 |
-
global global_state
|
| 420 |
-
if global_state.processing_state != ProcessingState.KEY_IMGS:
|
| 421 |
-
raise gr.Error('Please generate key images before propagation')
|
| 422 |
-
|
| 423 |
-
# reset blend dir
|
| 424 |
-
filename = os.path.splitext(os.path.basename(input_path))[0]
|
| 425 |
-
blend_dir = os.path.join('output', filename)
|
| 426 |
-
os.makedirs(blend_dir, exist_ok=True)
|
| 427 |
-
|
| 428 |
-
video_cap = cv2.VideoCapture(input_path)
|
| 429 |
-
fps = int(video_cap.get(cv2.CAP_PROP_FPS))
|
| 430 |
-
o_video = os.path.join(blend_dir, 'blend.mp4')
|
| 431 |
-
key_ind = io.StringIO()
|
| 432 |
-
for k in global_state.keys:
|
| 433 |
-
print('%d' % (k), end=' ', file=key_ind)
|
| 434 |
-
ps = '-ps' if use_poisson else ''
|
| 435 |
-
cmd = (
|
| 436 |
-
f'python video_blend.py {blend_dir} --key keys '
|
| 437 |
-
f'--key_ind {key_ind.getvalue()} --output {o_video} --fps {fps} '
|
| 438 |
-
f'--n_proc {max_process} {ps}')
|
| 439 |
-
print(cmd)
|
| 440 |
-
os.system(cmd)
|
| 441 |
-
return o_video
|
| 442 |
-
|
| 443 |
-
|
| 444 |
config_dir = 'config'
|
| 445 |
filenames = os.listdir(config_dir)
|
| 446 |
config_list = []
|
|
@@ -448,7 +411,6 @@ for filename in filenames:
|
|
| 448 |
if filename.endswith('yaml'):
|
| 449 |
config_list.append(f'{config_dir}/{filename}')
|
| 450 |
|
| 451 |
-
global_state = GlobalState()
|
| 452 |
block = gr.Blocks().queue()
|
| 453 |
with block:
|
| 454 |
with gr.Row():
|
|
@@ -456,7 +418,7 @@ with block:
|
|
| 456 |
with gr.Row():
|
| 457 |
with gr.Column():
|
| 458 |
input_path = gr.Video(label='Input Video',
|
| 459 |
-
|
| 460 |
format='mp4',
|
| 461 |
visible=True)
|
| 462 |
prompt = gr.Textbox(label='Prompt')
|
|
@@ -472,10 +434,7 @@ with block:
|
|
| 472 |
step=1,
|
| 473 |
value=0,
|
| 474 |
randomize=True)
|
| 475 |
-
|
| 476 |
-
with gr.Row():
|
| 477 |
-
run_button1 = gr.Button(value='Run Key Frames')
|
| 478 |
-
run_button2 = gr.Button(value='Run Propagation (Ebsynth)')
|
| 479 |
with gr.Accordion('Advanced options for single frame processing',
|
| 480 |
open=False):
|
| 481 |
image_resolution = gr.Slider(label='Frame resolution',
|
|
@@ -595,20 +554,6 @@ with block:
|
|
| 595 |
value=True,
|
| 596 |
info='Select to smooth background')
|
| 597 |
|
| 598 |
-
with gr.Accordion(
|
| 599 |
-
'Advanced options for the full video translation',
|
| 600 |
-
open=False):
|
| 601 |
-
use_poisson = gr.Checkbox(
|
| 602 |
-
label='Gradient blending',
|
| 603 |
-
value=True,
|
| 604 |
-
info=('Blend the output video in gradient, to reduce'
|
| 605 |
-
' ghosting artifacts (but may increase flickers)'))
|
| 606 |
-
max_process = gr.Slider(label='Number of parallel processes',
|
| 607 |
-
minimum=1,
|
| 608 |
-
maximum=16,
|
| 609 |
-
value=4,
|
| 610 |
-
step=1)
|
| 611 |
-
|
| 612 |
with gr.Accordion('Example configs', open=True):
|
| 613 |
|
| 614 |
example_list = [cfg_to_input(x) for x in config_list]
|
|
@@ -618,7 +563,7 @@ with block:
|
|
| 618 |
x0_strength, control_type, low_threshold, high_threshold,
|
| 619 |
ddpm_steps, scale, a_prompt, n_prompt,
|
| 620 |
frame_count, batch_size, mininterv, maxinterv,
|
| 621 |
-
use_constraints[0], bg_smooth,
|
| 622 |
b1, b2, s1, s2
|
| 623 |
]
|
| 624 |
|
|
@@ -631,9 +576,6 @@ with block:
|
|
| 631 |
result_keyframe = gr.Video(label='Output key frame video',
|
| 632 |
format='mp4',
|
| 633 |
interactive=False)
|
| 634 |
-
result_video = gr.Video(label='Output full video',
|
| 635 |
-
format='mp4',
|
| 636 |
-
interactive=False)
|
| 637 |
|
| 638 |
def input_changed(path):
|
| 639 |
if path is None:
|
|
@@ -650,13 +592,13 @@ with block:
|
|
| 650 |
max_interv_c = min(20, frame_count)
|
| 651 |
min_interv_r = frame_count
|
| 652 |
max_interv_r = frame_count
|
| 653 |
-
return (gr.Slider.
|
| 654 |
value=min_interv_c,
|
| 655 |
maximum=min_interv_r),
|
| 656 |
-
gr.Slider.
|
| 657 |
value=max_interv_c,
|
| 658 |
maximum=max_interv_r),
|
| 659 |
-
gr.Slider.
|
| 660 |
value=frame_count,
|
| 661 |
maximum=frame_count),
|
| 662 |
)
|
|
@@ -666,10 +608,6 @@ with block:
|
|
| 666 |
input_path.upload(input_changed, input_path, [
|
| 667 |
mininterv, maxinterv, frame_count])
|
| 668 |
|
| 669 |
-
run_button.click(fn=process,
|
| 670 |
-
inputs=ips,
|
| 671 |
-
outputs=[result_keyframe, result_video])
|
| 672 |
run_button1.click(fn=process1, inputs=ips, outputs=[result_keyframe])
|
| 673 |
-
run_button2.click(fn=process2, inputs=ips, outputs=[result_video])
|
| 674 |
|
| 675 |
block.launch()
|
|
|
|
| 38 |
import huggingface_hub
|
| 39 |
import shutil
|
| 40 |
import os
|
| 41 |
+
import spaces
|
| 42 |
|
| 43 |
huggingface_hub.hf_hub_download('SingleZombie/FRESCO',
|
| 44 |
'boxer-punching-towards-camera.mp4',
|
|
|
|
| 171 |
1.0, cfg['controlnet_type'], 50, 100,
|
| 172 |
cfg['num_inference_steps'], 7.5, a_prompt, n_prompt,
|
| 173 |
frame_count, cfg['batch_size'], cfg['mininterv'], cfg['maxinterv'],
|
| 174 |
+
use_constraints, True,
|
| 175 |
1, 1, 1, 1
|
| 176 |
]
|
| 177 |
return args
|
|
|
|
| 233 |
param.requires_grad = False
|
| 234 |
|
| 235 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 236 |
|
| 237 |
|
| 238 |
@torch.no_grad()
|
| 239 |
+
@spaces.GPU(duration=240)
|
| 240 |
def process1(input_path, prompt, sd_model, seed, image_resolution, control_strength,
|
| 241 |
x0_strength, control_type, low_threshold, high_threshold,
|
| 242 |
ddpm_steps, scale, a_prompt, n_prompt,
|
| 243 |
frame_count, batch_size, mininterv, maxinterv,
|
| 244 |
use_constraints, bg_smooth, use_poisson, max_process,
|
| 245 |
b1, b2, s1, s2):
|
| 246 |
+
global_state = GlobalState()
|
| 247 |
global_state.update_controlnet_model(control_type)
|
| 248 |
global_state.update_sd_model(sd_model)
|
| 249 |
apply_freeu(global_state.pipe, b1=b1, b2=b2, s1=s1, s2=s2)
|
|
|
|
| 389 |
gc.collect()
|
| 390 |
if device == 'cuda':
|
| 391 |
torch.cuda.empty_cache()
|
| 392 |
+
break
|
| 393 |
|
| 394 |
writer = imageio.get_writer(os.path.join(save_path, 'key.mp4'), fps=fps)
|
| 395 |
file_list = sorted(os.listdir(os.path.join(save_path, 'keys')))
|
|
|
|
| 401 |
writer.append_data(curImg)
|
| 402 |
writer.close()
|
| 403 |
|
|
|
|
| 404 |
return os.path.join(save_path, 'key.mp4')
|
| 405 |
|
| 406 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 407 |
config_dir = 'config'
|
| 408 |
filenames = os.listdir(config_dir)
|
| 409 |
config_list = []
|
|
|
|
| 411 |
if filename.endswith('yaml'):
|
| 412 |
config_list.append(f'{config_dir}/{filename}')
|
| 413 |
|
|
|
|
| 414 |
block = gr.Blocks().queue()
|
| 415 |
with block:
|
| 416 |
with gr.Row():
|
|
|
|
| 418 |
with gr.Row():
|
| 419 |
with gr.Column():
|
| 420 |
input_path = gr.Video(label='Input Video',
|
| 421 |
+
sources='upload',
|
| 422 |
format='mp4',
|
| 423 |
visible=True)
|
| 424 |
prompt = gr.Textbox(label='Prompt')
|
|
|
|
| 434 |
step=1,
|
| 435 |
value=0,
|
| 436 |
randomize=True)
|
| 437 |
+
run_button1 = gr.Button(value='Run Key Frames')
|
|
|
|
|
|
|
|
|
|
| 438 |
with gr.Accordion('Advanced options for single frame processing',
|
| 439 |
open=False):
|
| 440 |
image_resolution = gr.Slider(label='Frame resolution',
|
|
|
|
| 554 |
value=True,
|
| 555 |
info='Select to smooth background')
|
| 556 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 557 |
with gr.Accordion('Example configs', open=True):
|
| 558 |
|
| 559 |
example_list = [cfg_to_input(x) for x in config_list]
|
|
|
|
| 563 |
x0_strength, control_type, low_threshold, high_threshold,
|
| 564 |
ddpm_steps, scale, a_prompt, n_prompt,
|
| 565 |
frame_count, batch_size, mininterv, maxinterv,
|
| 566 |
+
use_constraints[0], bg_smooth,
|
| 567 |
b1, b2, s1, s2
|
| 568 |
]
|
| 569 |
|
|
|
|
| 576 |
result_keyframe = gr.Video(label='Output key frame video',
|
| 577 |
format='mp4',
|
| 578 |
interactive=False)
|
|
|
|
|
|
|
|
|
|
| 579 |
|
| 580 |
def input_changed(path):
|
| 581 |
if path is None:
|
|
|
|
| 592 |
max_interv_c = min(20, frame_count)
|
| 593 |
min_interv_r = frame_count
|
| 594 |
max_interv_r = frame_count
|
| 595 |
+
return (gr.Slider.change(minimum=min_interv_l,
|
| 596 |
value=min_interv_c,
|
| 597 |
maximum=min_interv_r),
|
| 598 |
+
gr.Slider.change(minimum=max_interv_l,
|
| 599 |
value=max_interv_c,
|
| 600 |
maximum=max_interv_r),
|
| 601 |
+
gr.Slider.change(minimum=8,
|
| 602 |
value=frame_count,
|
| 603 |
maximum=frame_count),
|
| 604 |
)
|
|
|
|
| 608 |
input_path.upload(input_changed, input_path, [
|
| 609 |
mininterv, maxinterv, frame_count])
|
| 610 |
|
|
|
|
|
|
|
|
|
|
| 611 |
run_button1.click(fn=process1, inputs=ips, outputs=[result_keyframe])
|
|
|
|
| 612 |
|
| 613 |
block.launch()
|
requirements.txt
CHANGED
|
@@ -8,4 +8,4 @@ av
|
|
| 8 |
basicsr==1.4.2
|
| 9 |
numba==0.57.0
|
| 10 |
imageio-ffmpeg
|
| 11 |
-
gradio==
|
|
|
|
| 8 |
basicsr==1.4.2
|
| 9 |
numba==0.57.0
|
| 10 |
imageio-ffmpeg
|
| 11 |
+
gradio==4.27.0
|