carlex3321 commited on
Commit
6ec79be
·
verified ·
1 Parent(s): 79bca3d

Update app_vince.py

Browse files
Files changed (1) hide show
  1. app_vince.py +110 -40
app_vince.py CHANGED
@@ -3,11 +3,24 @@ import os
3
  from pathlib import Path
4
  from typing import List, Tuple, Optional
5
  import gradio as gr
 
 
6
  from services.vincie import VincieService
7
 
 
8
  svc = VincieService()
 
 
9
 
10
- DEFAULT_NEGATIVE_PROMPT = "Worst quality, Normal quality, Low quality, Low res, Blurry, Jpeg artifacts, Grainy, text, logo, watermark, banner, extra digits, signature, subtitling, Bad anatomy, Bad proportions, Deformed, Disconnected limbs, Disfigured, Extra arms, Extra limbs, Extra hands, Fused fingers, Gross proportions, Long neck, Malformed limbs, Mutated, Mutated hands, Mutated limbs, Missing arms, Missing fingers, Poorly drawn hands, Poorly drawn face, Nsfw, Uncensored, Cleavage, Nude, Nipples, Overexposed, Plain background, Grainy, Underexposed, Deformed structures"
 
 
 
 
 
 
 
 
11
 
12
  def setup_auto() -> str:
13
  try:
@@ -21,9 +34,18 @@ def setup_auto() -> str:
21
 
22
  def _list_media(out_dir: Path, max_images: int = 24) -> Tuple[List[str], Optional[str]]:
23
  img_globs = ("*.png", "*.jpg", "*.jpeg", "*.webp")
24
- images = sorted([p for pat in img_globs for p in out_dir.rglob(pat)], key=lambda p: p.stat().st_mtime)
 
 
 
 
 
 
25
  image_paths = [str(p) for p in images[-max_images:]]
26
- videos = sorted(out_dir.rglob("*.mp4"), key=lambda p: p.stat().st_mtime)
 
 
 
27
  video_path = str(videos[-1]) if videos else None
28
  return image_paths, video_path
29
 
@@ -34,7 +56,18 @@ def ui_multi_turn(input_image, turns_text, negative_prompt, seed, steps, cfg_sca
34
  return [], None, "Por favor, forneça as instruções de edição (uma por linha)."
35
  turns = [ln.strip() for ln in turns_text.splitlines() if ln.strip()]
36
  try:
37
- out_dir = svc.multi_turn_edit(input_image, turns, negative_prompt=negative_prompt, seed=int(seed), steps=int(steps), cfg_scale=float(cfg_scale), resolution=int(resolution), use_vae_slicing=use_vae_slicing, num_gpus=int(num_gpus), batch_size=int(batch_size))
 
 
 
 
 
 
 
 
 
 
 
38
  imgs, vid = _list_media(Path(out_dir))
39
  return imgs, vid, f"Saídas salvas em: {out_dir}"
40
  except Exception as e:
@@ -48,7 +81,19 @@ def ui_text_to_video(input_image, prompt, negative_prompt, seed, steps, cfg_scal
48
  if not prompt or not prompt.strip():
49
  return None, "Por favor, forneça um prompt para o vídeo."
50
  try:
51
- out_dir = svc.text_to_video(input_image, prompt, negative_prompt=negative_prompt, seed=int(seed), steps=int(steps), cfg_scale=float(cfg_scale), resolution=int(resolution), fps=int(fps), use_vae_slicing=use_vae_slicing, num_gpus=int(num_gpus), batch_size=int(batch_size))
 
 
 
 
 
 
 
 
 
 
 
 
52
  _, vid = _list_media(Path(out_dir))
53
  return vid, f"Vídeo salvo em: {out_dir}"
54
  except Exception as e:
@@ -57,11 +102,15 @@ def ui_text_to_video(input_image, prompt, negative_prompt, seed, steps, cfg_scal
57
  return None, f"Erro na geração: {e}"
58
 
59
  def ui_multi_concept(files, descs_text, final_prompt):
60
- if not files: return [], None, "Por favor, faça o upload das imagens de conceito."
61
- if not descs_text: return [], None, "Por favor, forneça as descrições (uma por linha)."
62
- if not final_prompt: return [], None, "Por favor, forneça um prompt final."
 
 
 
63
  descs = [ln.strip() for ln in descs_text.splitlines() if ln.strip()]
64
- if len(descs) != len(files): return [], None, f"O número de descrições ({len(descs)}) deve ser igual ao de imagens ({len(files)})."
 
65
  try:
66
  out_dir = svc.multi_concept_compose(files, descs, final_prompt)
67
  imgs, vid = _list_media(Path(out_dir))
@@ -73,62 +122,83 @@ def ui_multi_concept(files, descs_text, final_prompt):
73
 
74
  with gr.Blocks(title="VINCIE Service", theme=gr.themes.Soft()) as demo:
75
  gr.Markdown("# VINCIE Service — Geração Distribuída com Controles Avançados")
76
- gr.Markdown("- **Interface por:** Carlex ([email protected] | GitHub: carlex22)")
 
77
  with gr.Row():
78
  setup_out = gr.Textbox(label="Status da Configuração", interactive=False)
 
79
  with gr.Tab("Edição Multi-Turno"):
80
  with gr.Row():
81
  img_mt = gr.Image(type="filepath", label="Imagem de Entrada")
82
  with gr.Column():
83
- turns_mt = gr.Textbox(lines=5, label="Instruções de Edição (uma por linha)", placeholder="Ex: adicione um chapéu azul\nagora, mude o fundo para uma praia")
84
- with gr.Accordion("Configurações Avançadas e de Desempenho", open=True):
85
- with gr.Row():
86
- num_gpus_mt = gr.Slider(label="Número de GPUs", minimum=1, maximum=8, step=1, value=8, info="Use >1 para acelerar a geração com torchrun.")
87
- batch_size_mt = gr.Number(label="Batch Size por GPU", value=1, precision=0, info="Para Multi-GPU, o lote total será (GPUs x Batch Size).")
88
- resolution_mt = gr.Slider(label="Resolução", minimum=256, maximum=1024, step=128, value=512, info="Maior resolução exige mais VRAM e tempo.")
89
- use_vae_slicing_mt = gr.Checkbox(label="Usar VAE Slicing (Economiza VRAM)", value=True)
90
- neg_prompt_mt = gr.Textbox(lines=3, label="Prompt Negativo", value=DEFAULT_NEGATIVE_PROMPT)
91
- seed_mt = gr.Number(label="Seed (Semente)", value=1, precision=0)
92
- steps_mt = gr.Slider(label="Passos de Inferência", minimum=10, maximum=100, step=1, value=50, info="Menos passos = mais rápido.")
93
- cfg_mt = gr.Slider(label="Escala de Orientação (CFG)", minimum=1.0, maximum=20.0, step=0.5, value=7.5, info="Quão forte o modelo segue o prompt.")
94
- run_mt = gr.Button("Executar Edição Multi-Turno", variant="primary")
 
 
 
 
95
  gallery_mt = gr.Gallery(label="Imagens Geradas", columns=4, height="auto")
96
  video_mt = gr.Video(label="Vídeo da Sequência (se disponível)")
97
  status_mt = gr.Textbox(label="Status da Saída", interactive=False)
98
- run_mt.click(ui_multi_turn, inputs=[img_mt, turns_mt, neg_prompt_mt, seed_mt, steps_mt, cfg_mt, resolution_mt, use_vae_slicing_mt, num_gpus_mt, batch_size_mt], outputs=[gallery_mt, video_mt, status_mt])
 
 
 
 
 
99
  with gr.Tab("Texto-para-Vídeo"):
100
  with gr.Row():
101
  img_vid = gr.Image(type="filepath", label="Frame Inicial")
102
  with gr.Column():
103
  prompt_vid = gr.Textbox(lines=2, label="Prompt do Vídeo", placeholder="Ex: um gato andando pela sala")
104
- with gr.Accordion("Configurações Avançadas e de Desempenho", open=True):
105
- with gr.Row():
106
- num_gpus_vid = gr.Slider(label="Número de GPUs", minimum=1, maximum=8, step=1, value=8, info="Use >1 para acelerar a geração com torchrun.")
107
- batch_size_vid = gr.Number(label="Batch Size por GPU", value=1, precision=0, info="Para Multi-GPU, o lote total será (GPUs x Batch Size).")
108
- resolution_vid = gr.Slider(label="Resolução", minimum=256, maximum=1024, step=128, value=512)
109
- fps_vid = gr.Slider(label="Frames por Segundo (FPS)", minimum=1, maximum=24, step=1, value=2)
110
- use_vae_slicing_vid = gr.Checkbox(label="Usar VAE Slicing (Economiza VRAM)", value=True)
111
- neg_prompt_vid = gr.Textbox(lines=3, label="Prompt Negativo", value=DEFAULT_NEGATIVE_PROMPT)
112
- seed_vid = gr.Number(label="Seed (Semente)", value=1, precision=0)
113
- steps_vid = gr.Slider(label="Passos de Inferência", minimum=10, maximum=100, step=1, value=50)
114
- cfg_vid = gr.Slider(label="Escala de Orientação (CFG)", minimum=1.0, maximum=20.0, step=0.5, value=7.5)
115
- run_vid = gr.Button("Gerar Vídeo", variant="primary")
116
  video_vid = gr.Video(label="Vídeo Gerado")
117
  status_vid = gr.Textbox(label="Status da Saída", interactive=False)
118
- run_vid.click(ui_text_to_video, inputs=[img_vid, prompt_vid, neg_prompt_vid, seed_vid, steps_vid, cfg_vid, resolution_vid, fps_vid, use_vae_slicing_vid, num_gpus_vid, batch_size_vid], outputs=[video_vid, status_vid])
 
 
 
 
 
119
  with gr.Tab("Composição Multi-Conceito"):
120
  gr.Markdown("Nota: A composição multi-conceito está atualmente configurada para rodar em uma única GPU para garantir estabilidade.")
121
  with gr.Row():
122
  with gr.Column(scale=1):
123
  files_mc = gr.File(file_count="multiple", type="filepath", label="1. Imagens de Conceito")
124
  with gr.Column(scale=2):
125
- descs_mc = gr.Textbox(lines=5, label="2. Descrições (uma por linha, na mesma ordem)", placeholder="Ex: : uma foto de um pai\n: uma foto de uma mãe...")
126
- final_prompt_mc = gr.Textbox(lines=3, label="3. Prompt Final de Composição", placeholder="Ex: Baseado em , ..., uma família sorrindo em um retrato...")
127
- run_mc = gr.Button("Executar Composição", variant="primary")
128
  gallery_mc = gr.Gallery(label="Imagens Geradas", columns=4, height="auto")
129
  video_mc = gr.Video(label="Vídeo da Sequência (se disponível)")
130
  status_mc = gr.Textbox(label="Status da Saída", interactive=False)
131
- run_mc.click(ui_multi_concept, inputs=[files_mc, descs_mc, final_prompt_mc], outputs=[gallery_mc, video_mc, status_mc])
 
 
 
 
 
132
  demo.load(fn=setup_auto, outputs=setup_out)
133
 
134
  if __name__ == "__main__":
 
3
  from pathlib import Path
4
  from typing import List, Tuple, Optional
5
  import gradio as gr
6
+
7
+ # Importa o serviço
8
  from services.vincie import VincieService
9
 
10
+ # Instancia e normaliza caminhos (defensivo contra imports alternativos)
11
  svc = VincieService()
12
+ svc.repo_dir = Path(svc.repo_dir)
13
+ svc.ckpt_dir = Path(svc.ckpt_dir)
14
 
15
+ DEFAULT_NEGATIVE_PROMPT = (
16
+ "Worst quality, Normal quality, Low quality, Low res, Blurry, Jpeg artifacts, Grainy, "
17
+ "text, logo, watermark, banner, extra digits, signature, subtitling, Bad anatomy, "
18
+ "Bad proportions, Deformed, Disconnected limbs, Disfigured, Extra arms, Extra limbs, "
19
+ "Extra hands, Fused fingers, Gross proportions, Long neck, Malformed limbs, Mutated, "
20
+ "Mutated hands, Mutated limbs, Missing arms, Missing fingers, Poorly drawn hands, "
21
+ "Poorly drawn face, Nsfw, Uncensored, Cleavage, Nude, Nipples, Overexposed, "
22
+ "Plain background, Grainy, Underexposed, Deformed structures"
23
+ )
24
 
25
  def setup_auto() -> str:
26
  try:
 
34
 
35
  def _list_media(out_dir: Path, max_images: int = 24) -> Tuple[List[str], Optional[str]]:
36
  img_globs = ("*.png", "*.jpg", "*.jpeg", "*.webp")
37
+ try:
38
+ images = sorted(
39
+ [p for pat in img_globs for p in out_dir.rglob(pat)],
40
+ key=lambda p: p.stat().st_mtime
41
+ )
42
+ except FileNotFoundError:
43
+ images = []
44
  image_paths = [str(p) for p in images[-max_images:]]
45
+ try:
46
+ videos = sorted(out_dir.rglob("*.mp4"), key=lambda p: p.stat().st_mtime)
47
+ except FileNotFoundError:
48
+ videos = []
49
  video_path = str(videos[-1]) if videos else None
50
  return image_paths, video_path
51
 
 
56
  return [], None, "Por favor, forneça as instruções de edição (uma por linha)."
57
  turns = [ln.strip() for ln in turns_text.splitlines() if ln.strip()]
58
  try:
59
+ out_dir = svc.multi_turn_edit(
60
+ input_image,
61
+ turns,
62
+ negative_prompt=negative_prompt,
63
+ seed=int(seed),
64
+ steps=int(steps),
65
+ cfg_scale=float(cfg_scale),
66
+ resolution=int(resolution),
67
+ use_vae_slicing=use_vae_slicing,
68
+ num_gpus=int(num_gpus),
69
+ batch_size=int(batch_size),
70
+ )
71
  imgs, vid = _list_media(Path(out_dir))
72
  return imgs, vid, f"Saídas salvas em: {out_dir}"
73
  except Exception as e:
 
81
  if not prompt or not prompt.strip():
82
  return None, "Por favor, forneça um prompt para o vídeo."
83
  try:
84
+ out_dir = svc.text_to_video(
85
+ input_image,
86
+ prompt,
87
+ negative_prompt=negative_prompt,
88
+ seed=int(seed),
89
+ steps=int(steps),
90
+ cfg_scale=float(cfg_scale),
91
+ resolution=int(resolution),
92
+ fps=int(fps),
93
+ use_vae_slicing=use_vae_slicing,
94
+ num_gpus=int(num_gpus),
95
+ batch_size=int(batch_size),
96
+ )
97
  _, vid = _list_media(Path(out_dir))
98
  return vid, f"Vídeo salvo em: {out_dir}"
99
  except Exception as e:
 
102
  return None, f"Erro na geração: {e}"
103
 
104
  def ui_multi_concept(files, descs_text, final_prompt):
105
+ if not files:
106
+ return [], None, "Por favor, faça o upload das imagens de conceito."
107
+ if not descs_text:
108
+ return [], None, "Por favor, forneça as descrições (uma por linha)."
109
+ if not final_prompt:
110
+ return [], None, "Por favor, forneça um prompt final."
111
  descs = [ln.strip() for ln in descs_text.splitlines() if ln.strip()]
112
+ if len(descs) != len(files):
113
+ return [], None, f"O número de descrições ({len(descs)}) deve ser igual ao de imagens ({len(files)})."
114
  try:
115
  out_dir = svc.multi_concept_compose(files, descs, final_prompt)
116
  imgs, vid = _list_media(Path(out_dir))
 
122
 
123
  with gr.Blocks(title="VINCIE Service", theme=gr.themes.Soft()) as demo:
124
  gr.Markdown("# VINCIE Service — Geração Distribuída com Controles Avançados")
125
+ gr.Markdown("- Interface por: Carlex ([email protected] | GitHub: carlex22)")
126
+
127
  with gr.Row():
128
  setup_out = gr.Textbox(label="Status da Configuração", interactive=False)
129
+
130
  with gr.Tab("Edição Multi-Turno"):
131
  with gr.Row():
132
  img_mt = gr.Image(type="filepath", label="Imagem de Entrada")
133
  with gr.Column():
134
+ turns_mt = gr.Textbox(
135
+ lines=5,
136
+ label="Instruções de Edição (uma por linha)",
137
+ placeholder="Ex: adicione um chapéu azul\nagora, mude o fundo para uma praia"
138
+ )
139
+ with gr.Accordion("Configurações Avançadas e de Desempenho", open=True):
140
+ with gr.Row():
141
+ num_gpus_mt = gr.Slider(label="Número de GPUs", minimum=1, maximum=8, step=1, value=8, info="Use >1 para acelerar a geração com torchrun.")
142
+ batch_size_mt = gr.Number(label="Batch Size por GPU", value=1, precision=0, info="Para Multi-GPU, o lote total será (GPUs x Batch Size).")
143
+ resolution_mt = gr.Slider(label="Resolução", minimum=256, maximum=1024, step=128, value=512, info="Maior resolução exige mais VRAM e tempo.")
144
+ use_vae_slicing_mt = gr.Checkbox(label="Usar VAE Slicing (Economiza VRAM)", value=True)
145
+ neg_prompt_mt = gr.Textbox(lines=3, label="Prompt Negativo", value=DEFAULT_NEGATIVE_PROMPT)
146
+ seed_mt = gr.Number(label="Seed (Semente)", value=1, precision=0)
147
+ steps_mt = gr.Slider(label="Passos de Inferência", minimum=10, maximum=100, step=1, value=50, info="Menos passos = mais rápido.")
148
+ cfg_mt = gr.Slider(label="Escala de Orientação (CFG)", minimum=1.0, maximum=20.0, step=0.5, value=7.5, info="Quão forte o modelo segue o prompt.")
149
+ run_mt = gr.Button("Executar Edição Multi-Turno", variant="primary")
150
  gallery_mt = gr.Gallery(label="Imagens Geradas", columns=4, height="auto")
151
  video_mt = gr.Video(label="Vídeo da Sequência (se disponível)")
152
  status_mt = gr.Textbox(label="Status da Saída", interactive=False)
153
+ run_mt.click(
154
+ ui_multi_turn,
155
+ inputs=[img_mt, turns_mt, neg_prompt_mt, seed_mt, steps_mt, cfg_mt, resolution_mt, use_vae_slicing_mt, num_gpus_mt, batch_size_mt],
156
+ outputs=[gallery_mt, video_mt, status_mt]
157
+ )
158
+
159
  with gr.Tab("Texto-para-Vídeo"):
160
  with gr.Row():
161
  img_vid = gr.Image(type="filepath", label="Frame Inicial")
162
  with gr.Column():
163
  prompt_vid = gr.Textbox(lines=2, label="Prompt do Vídeo", placeholder="Ex: um gato andando pela sala")
164
+ with gr.Accordion("Configurações Avançadas e de Desempenho", open=True):
165
+ with gr.Row():
166
+ num_gpus_vid = gr.Slider(label="Número de GPUs", minimum=1, maximum=8, step=1, value=8, info="Use >1 para acelerar a geração com torchrun.")
167
+ batch_size_vid = gr.Number(label="Batch Size por GPU", value=1, precision=0, info="Para Multi-GPU, o lote total será (GPUs x Batch Size).")
168
+ resolution_vid = gr.Slider(label="Resolução", minimum=256, maximum=1024, step=128, value=512)
169
+ fps_vid = gr.Slider(label="Frames por Segundo (FPS)", minimum=1, maximum=24, step=1, value=2)
170
+ use_vae_slicing_vid = gr.Checkbox(label="Usar VAE Slicing (Economiza VRAM)", value=True)
171
+ neg_prompt_vid = gr.Textbox(lines=3, label="Prompt Negativo", value=DEFAULT_NEGATIVE_PROMPT)
172
+ seed_vid = gr.Number(label="Seed (Semente)", value=1, precision=0)
173
+ steps_vid = gr.Slider(label="Passos de Inferência", minimum=10, maximum=100, step=1, value=50)
174
+ cfg_vid = gr.Slider(label="Escala de Orientação (CFG)", minimum=1.0, maximum=20.0, step=0.5, value=7.5)
175
+ run_vid = gr.Button("Gerar Vídeo", variant="primary")
176
  video_vid = gr.Video(label="Vídeo Gerado")
177
  status_vid = gr.Textbox(label="Status da Saída", interactive=False)
178
+ run_vid.click(
179
+ ui_text_to_video,
180
+ inputs=[img_vid, prompt_vid, neg_prompt_vid, seed_vid, steps_vid, cfg_vid, resolution_vid, fps_vid, use_vae_slicing_vid, num_gpus_vid, batch_size_vid],
181
+ outputs=[video_vid, status_vid]
182
+ )
183
+
184
  with gr.Tab("Composição Multi-Conceito"):
185
  gr.Markdown("Nota: A composição multi-conceito está atualmente configurada para rodar em uma única GPU para garantir estabilidade.")
186
  with gr.Row():
187
  with gr.Column(scale=1):
188
  files_mc = gr.File(file_count="multiple", type="filepath", label="1. Imagens de Conceito")
189
  with gr.Column(scale=2):
190
+ descs_mc = gr.Textbox(lines=5, label="2. Descrições (uma por linha, na mesma ordem)", placeholder="Ex: <ref1>: uma foto de um pai\n<ref2>: uma foto de uma mãe...")
191
+ final_prompt_mc = gr.Textbox(lines=3, label="3. Prompt Final de Composição", placeholder="Ex: Baseado em <ref1>, <ref2>, ..., uma família sorrindo em um retrato...")
192
+ run_mc = gr.Button("Executar Composição", variant="primary")
193
  gallery_mc = gr.Gallery(label="Imagens Geradas", columns=4, height="auto")
194
  video_mc = gr.Video(label="Vídeo da Sequência (se disponível)")
195
  status_mc = gr.Textbox(label="Status da Saída", interactive=False)
196
+ run_mc.click(
197
+ ui_multi_concept,
198
+ inputs=[files_mc, descs_mc, final_prompt_mc],
199
+ outputs=[gallery_mc, video_mc, status_mc]
200
+ )
201
+
202
  demo.load(fn=setup_auto, outputs=setup_out)
203
 
204
  if __name__ == "__main__":