eeuuia commited on
Commit
9dde43c
·
verified ·
1 Parent(s): 952adc6

Delete app_seedvr.py

Browse files
Files changed (1) hide show
  1. app_seedvr.py +0 -179
app_seedvr.py DELETED
@@ -1,179 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- SeedVR UI (Gradio) - Interface de Usuário para Restauração de Mídia
4
-
5
- - Permite o upload de um único arquivo de vídeo (.mp4) ou imagem.
6
- - Oferece controle sobre parâmetros de geração como seed, resolução,
7
- paralelismo e FPS de saída para vídeos.
8
- - Delega a execução da inferência para a classe `SeedVRServer`, que gerencia
9
- o ambiente e a chamada ao `torchrun`.
10
- - Possui uma lógica de retorno robusta para exibir o resultado correto (imagem ou vídeo)
11
- ou notificar o usuário se nenhum resultado for encontrado.
12
- """
13
-
14
- import os
15
- import mimetypes
16
- from pathlib import Path
17
- from typing import Optional
18
-
19
- import gradio as gr
20
-
21
- # Importa a classe do servidor que gerencia a lógica de backend.
22
- # A inicialização do servidor (download de modelos, etc.) acontece aqui.
23
- try:
24
- from api.seedvr_server import SeedVRServer
25
- except ImportError:
26
- print("ERRO FATAL: Não foi possível importar o SeedVRServer. Verifique o caminho em services/seed_server.py")
27
- raise
28
-
29
- # Cria uma instância única e persistente do servidor.
30
- server = SeedVRServer()
31
-
32
- # Define o caminho de saída para referência, caso seja necessário.
33
- OUTPUT_ROOT = Path(os.getenv("OUTPUT_ROOT", "/app/outputs"))
34
-
35
-
36
- def _is_video(path: str) -> bool:
37
- """Verifica se um caminho de arquivo corresponde a um tipo de vídeo."""
38
- if not path:
39
- return False
40
- mime, _ = mimetypes.guess_type(path)
41
- # Verifica tanto o MIME type quanto a extensão do arquivo para maior robustez.
42
- return (mime or "").startswith("video") or path.lower().endswith((".mp4", ".mov", ".avi", ".mkv"))
43
-
44
-
45
- def _is_image(path: str) -> bool:
46
- """Verifica se um caminho de arquivo corresponde a um tipo de imagem."""
47
- if not path:
48
- return False
49
- mime, _ = mimetypes.guess_type(path)
50
- return (mime or "").startswith("image") or path.lower().endswith((".png", ".jpg", ".jpeg", ".webp"))
51
-
52
-
53
- def ui_infer(
54
- input_path: Optional[str],
55
- seed: int,
56
- res_h: int,
57
- res_w: int,
58
- sp_size: int,
59
- fps: float,
60
- progress=gr.Progress(track_tqdm=True)
61
- ):
62
- """
63
- Função principal de callback do Gradio. Acionada pelo botão "Restaurar".
64
- """
65
- progress(0.1, desc="Validando entradas...")
66
- if not input_path or not Path(input_path).exists():
67
- gr.Warning("Arquivo de entrada ausente ou inválido. Por favor, faça o upload de um vídeo ou imagem.")
68
- return None, None, None # Retorna None para todas as saídas
69
-
70
- try:
71
- progress(0.4, desc="Enviando tarefa para o backend. A inferência pode levar vários minutos...")
72
-
73
- # Chama o método do servidor, passando todos os parâmetros da UI.
74
- video_out, image_out, out_dir = server.run_inference(
75
- filepath=input_path,
76
- seed=int(seed),
77
- resh=int(res_h),
78
- resw=int(res_w),
79
- spsize=int(sp_size),
80
- fps=float(fps) if fps and fps > 0 else None, # Passa None se o campo for 0 ou vazio
81
- )
82
-
83
- progress(0.9, desc="Inferência concluída. Processando resultados...")
84
-
85
- # Lógica de retorno robusta
86
- final_image = None
87
- final_video = None
88
- result_file_for_download = None
89
-
90
- is_video_input = _is_video(input_path)
91
-
92
- if is_video_input:
93
- # Se a entrada foi um vídeo, a saída principal esperada é um vídeo.
94
- if video_out:
95
- final_video = video_out
96
- result_file_for_download = video_out
97
- elif image_out: # Fallback
98
- gr.Info("A inferência de vídeo resultou em uma única imagem.")
99
- final_image = image_out
100
- result_file_for_download = image_out
101
- else: # A entrada foi uma imagem
102
- # Se a entrada foi uma imagem, a saída principal esperada é uma imagem.
103
- if image_out:
104
- final_image = image_out
105
- result_file_for_download = image_out
106
- elif video_out: # Fallback
107
- gr.Info("A inferência de imagem resultou em um vídeo.")
108
- final_video = video_out
109
- result_file_for_download = video_out
110
-
111
- if not result_file_for_download:
112
- gr.Warning("A inferência foi concluída, mas nenhum arquivo de mídia de saída foi encontrado no diretório de resultados.")
113
-
114
- return final_image, final_video, result_file_for_download
115
-
116
- except Exception as e:
117
- print(f"[UI ERROR] A inferência falhou: {e}")
118
- # Exibe uma notificação de erro clara na interface do Gradio.
119
- gr.Error(f"Erro na Inferência: {e}")
120
- return None, None, None
121
-
122
-
123
- # --- Construção da Interface Gráfica com Gradio ---
124
- with gr.Blocks(title="SeedVR (Aduc-SDR)", theme=gr.themes.Soft()) as demo:
125
- gr.HTML(
126
- """
127
- <div style='text-align:center; margin-bottom: 20px;'>
128
- <h1>SeedVR - Restauração de Imagem e Vídeo</h1>
129
- <p>Implementação com backend Aduc-SDR</p>
130
- </div>
131
- """
132
- )
133
-
134
- with gr.Row():
135
- with gr.Column(scale=1):
136
- inp = gr.File(label="Arquivo de Entrada (Vídeo ou Imagem)", type="filepath")
137
-
138
- with gr.Accordion("Parâmetros de Geração", open=True):
139
- with gr.Row():
140
- seed = gr.Number(label="Seed", value=42, precision=0)
141
- fps_out = gr.Number(label="FPS de Saída", value=24, precision=0, info="Apenas para vídeos.")
142
-
143
- with gr.Row():
144
- res_h = gr.Number(label="Altura (Height)", value=720, precision=0)
145
- res_w = gr.Number(label="Largura (Width)", value=1280, precision=0)
146
-
147
- sp_size = gr.Slider(label="Paralelismo de Sequência (sp_size)", minimum=1, maximum=160, step=4, value=4, info="Para vídeos em multi-GPU. Use 1 para imagens.")
148
-
149
- run_button = gr.Button("Restaurar Mídia", variant="primary")
150
-
151
- with gr.Column(scale=2):
152
- gr.Markdown("### Resultado")
153
- out_image = gr.Image(label="Resultado (Imagem)", show_download_button=True)
154
- out_video = gr.Video(label="Resultado (Vídeo)")
155
- # Componente de arquivo para download, pode ser visível ou não.
156
- # Deixá-lo visível pode ser uma boa alternativa se a pré-visualização falhar.
157
- out_download = gr.File(label="Baixar Resultado")
158
-
159
- # Define a ação do botão
160
- run_button.click(
161
- fn=ui_infer,
162
- inputs=[inp, seed, res_h, res_w, sp_size, fps_out],
163
- outputs=[out_image, out_video, out_download],
164
- )
165
-
166
- gr.Markdown("---")
167
- gr.Markdown("### Exemplos")
168
- # Nota: Exemplos precisam de arquivos presentes no contêiner para funcionar.
169
- # Adicione os arquivos de exemplo ao seu Dockerfile se desejar usá-los.
170
- # gr.Examples(...)
171
-
172
- # --- Ponto de Entrada da Aplicação ---
173
- if __name__ == "__main__":
174
- demo.launch(
175
- server_name=os.getenv("GRADIO_SERVER_NAME", "0.0.0.0"),
176
- server_port=int(os.getenv("GRADIO_SERVER_PORT", "7860")),
177
- allowed_paths=[str(OUTPUT_ROOT), str(os.getenv("INPUT_ROOT", "/app/inputs"))],
178
- show_error=True,
179
- )