vidbacktest / app.py
fantaxy's picture
Update app.py
18e9287 verified
import spaces
import gradio as gr
import cv2
import numpy as np
import time
import random
from PIL import Image
from transparent_background import Remover
import subprocess
import os
@spaces.GPU()
def doo(video, mode):
if(mode == 'Fast'):
remover = Remover(mode='fast')
else:
remover = Remover()
cap = cv2.VideoCapture(video)
fps = cap.get(cv2.CAP_PROP_FPS)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
tmpname = random.randint(111111111, 999999999)
tmp_video = f"/tmp/{tmpname}_video.mp4"
tmp_audio = f"/tmp/{tmpname}_audio.aac"
output_video = f"/tmp/{tmpname}_output.mp4"
writer = cv2.VideoWriter(tmp_video, cv2.VideoWriter_fourcc(*'mp4v'), fps, (width, height))
processed_frames = 0
start_time = time.time()
while cap.isOpened():
ret, frame = cap.read()
if ret is False:
break
if time.time() - start_time >= 55:
print("GPU Timeout is coming")
break
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
img = Image.fromarray(frame).convert('RGB')
processed_frames += 1
print(f"Processing: {processed_frames}")
out = remover.process(img, type='green')
writer.write(cv2.cvtColor(np.array(out), cv2.COLOR_RGB2BGR))
cap.release()
writer.release()
# μ˜€λ””μ˜€ μΆ”μΆœ
subprocess.call(['ffmpeg', '-i', video, '-vn', '-acodec', 'copy', tmp_audio])
# 처리된 λΉ„λ””μ˜€μ™€ μ˜€λ””μ˜€ κ²°ν•©
subprocess.call(['ffmpeg', '-i', tmp_video, '-i', tmp_audio, '-c', 'copy', output_video])
# μž„μ‹œ 파일 μ‚­μ œ
os.remove(tmp_video)
os.remove(tmp_audio)
return output_video
# Gradio μΈν„°νŽ˜μ΄μŠ€ μ •μ˜
css = """footer { visibility: hidden; }"""
b_interface = gr.Interface(
fn=doo,
inputs=[
gr.Video(label="Video"),
gr.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.')
],
outputs="video",
css=css,
title="Video Background Removal",
description="Select a video and mode to remove the background."
)
# Gradio μ•± μ‹€ν–‰
if __name__ == "__main__":
b_interface.launch()