sofianhw's picture
Update app.py
2db16ac verified
raw
history blame
3.62 kB
import os
os.system("wget https://huggingface.co/akhaliq/lama/resolve/main/best.ckpt")
import cv2
import paddlehub as hub
import gradio as gr
import torch
from PIL import Image, ImageOps
import numpy as np
import imageio
from moviepy.editor import *
os.mkdir("data")
os.rename("best.ckpt", "models/best.ckpt")
os.mkdir("dataout")
def get_frames(video_in):
frames = []
clip = VideoFileClip(video_in)
# Resize and adjust FPS
if clip.fps > 30:
print("Video rate is over 30, resetting to 30")
clip_resized = clip.resize(height=256)
clip_resized.write_videofile("video_resized.mp4", fps=30)
else:
print("Video rate is OK")
clip_resized = clip.resize(height=256)
clip_resized.write_videofile("video_resized.mp4", fps=clip.fps)
# Extract frames
cap = cv2.VideoCapture("video_resized.mp4")
fps = cap.get(cv2.CAP_PROP_FPS)
print("Video fps:", fps)
i = 0
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
frame_path = f'kang_{i}.jpg'
cv2.imwrite(frame_path, frame)
frames.append(frame_path)
i += 1
cap.release()
cv2.destroyAllWindows()
print("Video broken into frames")
return frames, fps
def create_video(frames, fps, type_name):
print("Building video result")
clip = ImageSequenceClip(frames, fps=fps)
output_file = f"{type_name}_result.mp4"
clip.write_videofile(output_file, fps=fps)
return output_file
def magic_lama(img_path):
img = Image.open(img_path)
mask = Image.open("./masks/modelscope-mask.png")
inverted_mask = ImageOps.invert(mask)
imageio.imwrite("./data/data.png", img)
imageio.imwrite("./data/data_mask.png", inverted_mask)
os.system('python predict.py model.path=/home/user/app/ indir=/home/user/app/data/ outdir=/home/user/app/dataout/ device=cpu')
return "./dataout/data_mask.png"
def infer(video_in):
frames_list, fps = get_frames(video_in)
n_frame = len(frames_list)
result_frames = []
for i, frame_path in enumerate(frames_list[:n_frame]):
lama_frame = magic_lama(frame_path)
cleaned_frame_path = f"cleaned_frame_{i}.jpg"
Image.open(lama_frame).save(cleaned_frame_path)
result_frames.append(cleaned_frame_path)
print(f"Processed frame {i + 1}/{n_frame}")
final_video = create_video(result_frames, fps, "cleaned")
return final_video
# Gradio Interface
inputs = gr.Video(label="Input", source="upload", type="filepath")
outputs = gr.Video(label="Output")
title = "LaMa Video Watermark Remover"
description = (
"<p style='text-align: center'>LaMa: Resolution-robust Large Mask Inpainting with Fourier Convolutions.<br />"
"This demo is meant to be used as a watermark remover on Modelscope generated videos.<br />"
"Simply upload your Modelscope video and hit Submit.</p>"
)
article = (
"<p style='text-align: center'><a href='https://arxiv.org/abs/2109.07161' target='_blank'>Resolution-robust Large Mask Inpainting with Fourier Convolutions</a> | "
"<a href='https://github.com/saic-mdal/lama' target='_blank'>Github Repo</a></p>"
)
examples = [
"./examples/modelscope-astronaut-horse.mp4",
"./examples/modelscope-panda.mp4",
"./examples/modelscope-spiderman-surfing.mp4"
]
demo = gr.Interface(
fn=infer,
inputs=inputs,
outputs=outputs,
title=title,
description=description,
article=article,
examples=examples
)
# Launch with prevent_thread_lock in case it's needed for async compatibility in v4
demo.launch(prevent_thread_lock=True)