matthewkram commited on
Commit
3feedda
·
verified ·
1 Parent(s): 21c8b5a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +72 -17
app.py CHANGED
@@ -12,6 +12,14 @@ import cv2
12
  import subprocess
13
  import tempfile
14
 
 
 
 
 
 
 
 
 
15
  class WanAnimateApp:
16
  def __init__(self):
17
  model_name = "stabilityai/stable-video-diffusion-img2vid-xt"
@@ -22,25 +30,49 @@ class WanAnimateApp:
22
  device_map="cpu"
23
  )
24
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  def predict(
26
  self,
27
- ref_img,
28
- video,
29
  model_id,
30
  model,
31
  ):
32
- if ref_img is None or video is None:
33
- return None, "Upload both image and video."
34
 
35
  try:
36
- # Local processing — PIL for image (no open)
37
- if isinstance(ref_img, Image.Image):
38
- ref_image = ref_img.convert("RGB").resize((576, 320))
39
- else:
40
- ref_image = Image.open(ref_img).convert("RGB").resize((576, 320))
41
-
42
- cap = cv2.VideoCapture(video)
43
- frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
44
  cap.release()
45
  motion_hint = f" with dynamic motion from {frame_count} frames"
46
 
@@ -68,7 +100,7 @@ class WanAnimateApp:
68
  temp_dir = tempfile.mkdtemp()
69
  for i, frame in enumerate(output):
70
  frame.save(f"{temp_dir}/frame_{i:04d}.png")
71
- temp_video = f"/tmp/output_{uuid.uuid4()}.mp4"
72
  subprocess.run([
73
  'ffmpeg', '-y', '-framerate', '7', '-i', f"{temp_dir}/frame_%04d.png",
74
  '-c:v', 'libx264', '-pix_fmt', 'yuv420p', temp_video
@@ -143,15 +175,38 @@ def start_app():
143
 
144
  with gr.Row():
145
  with gr.Column():
 
 
 
 
 
 
146
  ref_img = gr.Image(
147
  label="Reference Image (изображение)",
148
- type="pil",
149
- sources=["upload"],
 
 
 
 
 
 
 
 
 
 
 
 
150
  )
151
-
152
  video = gr.Video(
153
  label="Template Video (шаблонное видео)",
154
- sources=["upload"],
 
 
 
 
 
 
155
  )
156
 
157
  with gr.Row():
 
12
  import subprocess
13
  import tempfile
14
 
15
+ # Папки (создаются автоматически)
16
+ IMG_DIR = './img'
17
+ VIDEO_DIR = './video'
18
+ OUTPUT_DIR = './output'
19
+ os.makedirs(IMG_DIR, exist_ok=True)
20
+ os.makedirs(VIDEO_DIR, exist_ok=True)
21
+ os.makedirs(OUTPUT_DIR, exist_ok=True)
22
+
23
  class WanAnimateApp:
24
  def __init__(self):
25
  model_name = "stabilityai/stable-video-diffusion-img2vid-xt"
 
30
  device_map="cpu"
31
  )
32
 
33
+ def get_img_files(self):
34
+ """Список файлов в папке img"""
35
+ if os.path.exists(IMG_DIR):
36
+ return [f for f in os.listdir(IMG_DIR) if f.lower().endswith(('.png', '.jpg', '.jpeg'))]
37
+ return []
38
+
39
+ def get_video_files(self):
40
+ """Список файлов в папке video"""
41
+ if os.path.exists(VIDEO_DIR):
42
+ return [f for f in os.listdir(VIDEO_DIR) if f.lower().endswith(('.mp4', '.avi', '.mov'))]
43
+ return []
44
+
45
+ def load_img_from_dropdown(self, selected_file):
46
+ """Загружает выбранное фото в ref_img"""
47
+ if selected_file:
48
+ path = os.path.join(IMG_DIR, selected_file)
49
+ if os.path.exists(path):
50
+ return path
51
+ return None
52
+
53
+ def load_video_from_dropdown(self, selected_file):
54
+ """Загружает выбранное видео в video"""
55
+ if selected_file:
56
+ path = os.path.join(VIDEO_DIR, selected_file)
57
+ if os.path.exists(path):
58
+ return path
59
+ return None
60
+
61
  def predict(
62
  self,
63
+ ref_img_path,
64
+ video_path,
65
  model_id,
66
  model,
67
  ):
68
+ if ref_img_path is None or video_path is None:
69
+ return None, "Выберите файлы из dropdown."
70
 
71
  try:
72
+ # Local processing (пути реальные str из папок)
73
+ ref_image = Image.open(ref_img_path).convert("RGB").resize((576, 320))
74
+ cap = cv2.VideoCapture(video_path)
75
+ frame_count = Image.open(cap.get(cv2.CAP_PROP_FRAME_COUNT))
 
 
 
 
76
  cap.release()
77
  motion_hint = f" with dynamic motion from {frame_count} frames"
78
 
 
100
  temp_dir = tempfile.mkdtemp()
101
  for i, frame in enumerate(output):
102
  frame.save(f"{temp_dir}/frame_{i:04d}.png")
103
+ temp_video = os.path.join(OUTPUT_DIR, f"output_{uuid.uuid4()}.mp4")
104
  subprocess.run([
105
  'ffmpeg', '-y', '-framerate', '7', '-i', f"{temp_dir}/frame_%04d.png",
106
  '-c:v', 'libx264', '-pix_fmt', 'yuv420p', temp_video
 
175
 
176
  with gr.Row():
177
  with gr.Column():
178
+ # Dropdown for img
179
+ img_dropdown = gr.Dropdown(
180
+ label="Select Image from img folder (выбери фото)",
181
+ choices=app.get_img_files(),
182
+ value=None,
183
+ )
184
  ref_img = gr.Image(
185
  label="Reference Image (изображение)",
186
+ type="filepath",
187
+ value=None,
188
+ )
189
+ img_dropdown.change(
190
+ fn=app.load_img_from_dropdown,
191
+ inputs=[img_dropdown],
192
+ outputs=[ref_img],
193
+ )
194
+
195
+ # Dropdown for video
196
+ video_dropdown = gr.Dropdown(
197
+ label="Select Video from video folder (выбери видео)",
198
+ choices=app.get_video_files(),
199
+ value=None,
200
  )
 
201
  video = gr.Video(
202
  label="Template Video (шаблонное видео)",
203
+ type="filepath",
204
+ value=None,
205
+ )
206
+ video_dropdown.change(
207
+ fn=app.load_video_from_dropdown,
208
+ inputs=[video_dropdown],
209
+ outputs=[video],
210
  )
211
 
212
  with gr.Row():