amirgame197's picture
Update app.py
339d0f6 verified
raw
history blame
5.82 kB
#testing webm hello hello
#okay why is webm taking that much bruh
#can someone actually help me please, i dont know whats wrong with the code but it just is so slow when using remover.process(img, type='rgba')
#but type=color is still fast (used by mp4)
import spaces
import gradio as gr
import cv2
import numpy as np
import time
import random
from PIL import Image
import torch
import re
import os
import shutil
import subprocess
import tempfile
torch.jit.script = lambda f: f
from transparent_background import Remover
@spaces.GPU(duration=90)
def doo(video, color, mode, out_format, progress=gr.Progress()):
print(str(color))
if str(color).startswith('#'):
color = color.lstrip('#')
rgb = tuple(int(color[i:i+2], 16) for i in (0, 2, 4))
color = str(list(rgb))
elif str(color).startswith('rgba'):
rgba_match = re.match(r'rgba\(([\d.]+), ([\d.]+), ([\d.]+), [\d.]+\)', color)
if rgba_match:
r, g, b = rgba_match.groups()
color = str([int(float(r)), int(float(g)), int(float(b))])
print("Parsed color:", color)
if mode == 'Fast':
remover = Remover(mode='fast')
else:
remover = Remover()
cap = cv2.VideoCapture(video)
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
fps = cap.get(cv2.CAP_PROP_FPS) or 25.0
writer = None
tmpname = random.randint(111111111, 999999999)
processed_frames = 0
start_time = time.time()
mp4_path = str(tmpname) + '.mp4'
webm_path = str(tmpname) + '.webm'
if out_format == 'mp4':
while cap.isOpened():
ret, frame = cap.read()
if ret is False:
break
if time.time() - start_time >= 20 * 60 - 5:
print("GPU Timeout is coming")
cap.release()
if writer is not None:
writer.release()
return mp4_path
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
img = Image.fromarray(frame).convert('RGB')
if writer is None:
writer = cv2.VideoWriter(mp4_path, cv2.VideoWriter_fourcc(*'mp4v'), fps, img.size)
processed_frames += 1
print(f"Processing frame {processed_frames}")
progress(processed_frames / total_frames, desc=f"Processing frame {processed_frames}/{total_frames}")
out = remover.process(img, type=color)
frame_bgr = cv2.cvtColor(np.array(out), cv2.COLOR_RGB2BGR)
writer.write(frame_bgr)
cap.release()
if writer is not None:
writer.release()
return mp4_path
else:
temp_dir = tempfile.mkdtemp(prefix=f"tb_{tmpname}_")
try:
frame_idx = 0
while cap.isOpened():
ret, frame = cap.read()
if ret is False:
break
if time.time() - start_time >= 20 * 60 - 5:
print("GPU Timeout is coming")
cap.release()
# cleanup
shutil.rmtree(temp_dir, ignore_errors=True)
return webm_path
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
img = Image.fromarray(frame).convert('RGB')
processed_frames += 1
frame_idx += 1
print(f"Processing frame {processed_frames}")
progress(processed_frames / total_frames, desc=f"Processing frame {processed_frames}/{total_frames}")
out = remover.process(img, type='rgba') #thing that makes the process go slow
out = out.convert('RGBA')
frame_name = os.path.join(temp_dir, f"frame_{frame_idx:06d}.png")
out.save(frame_name, 'PNG')
cap.release()
fr_str = str(int(round(fps))) if fps > 0 else "25"
pattern = os.path.join(temp_dir, "frame_%06d.png")
ffmpeg_cmd = [
"ffmpeg", "-y",
"-framerate", fr_str,
"-i", pattern,
"-i", str(video),
"-map", "0:v",
"-map", "1:a?",
"-c:v", "libvpx-vp9",
"-pix_fmt", "yuva420p",
"-auto-alt-ref", "0",
"-metadata:s:v:0", "alpha_mode=1",
"-c:a", "libopus",
"-shortest",
webm_path
]
print("Running ffmpeg:", " ".join(ffmpeg_cmd))
subprocess.run(ffmpeg_cmd, check=True)
shutil.rmtree(temp_dir, ignore_errors=True)
return webm_path
except subprocess.CalledProcessError as e:
print("ffmpeg failed:", e)
shutil.rmtree(temp_dir, ignore_errors=True)
return webm_path
except Exception as e:
print("Error during processing:", e)
shutil.rmtree(temp_dir, ignore_errors=True)
raise
title = "🎞️ Video Background Removal Tool πŸŽ₯"
description = """*Please note that if your video file is long (has a high number of frames), there is a chance that processing break due to GPU timeout. In this case, consider trying Fast mode.*"""
examples = [
['./input.mp4', '#00FF00', 'Normal', 'mp4'],
]
iface = gr.Interface(
fn=doo,
inputs=[
"video",
gr.ColorPicker(label="Background color", value="#00FF00"),
gr.components.Radio(['Normal', 'Fast'], label='Select mode', value='Normal', info='Normal is more accurate, but takes longer. | Fast has lower accuracy so the process will be faster.'),
gr.components.Radio(['mp4', 'webm'], label='Output format', value='mp4')
],
outputs="video",
examples=examples,
title=title,
description=description
)
iface.launch()