tonyassi's picture
Update app.py
371ecf0 verified
raw
history blame
2.63 kB
import os
import cv2
import glob
import shutil
import numpy as np
import gradio as gr
from PIL import Image
from moviepy import *
from insightface.app import FaceAnalysis
def video_to_images(video_path, images_path):
cam = cv2.VideoCapture(video_path)
fps = cam.get(cv2.CAP_PROP_FPS)
clip = VideoFileClip(video_path)
clip.audio.write_audiofile("./audio.mp3")
if os.path.exists(images_path):
shutil.rmtree(images_path)
os.makedirs(images_path)
frame_num = 0
while True:
ret, frame = cam.read()
if not ret:
break
filename = os.path.join(images_path, f"{frame_num:05}.png")
cv2.imwrite(filename, frame, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])
frame_num += 1
cam.release()
return fps
def blur_faces_in_images(images_path):
faceapp = FaceAnalysis(name="buffalo_l", providers=["CPUExecutionProvider"])
faceapp.prepare(ctx_id=0)
for img_path in sorted(glob.glob(os.path.join(images_path, "*.png"))):
img = cv2.imread(img_path)
faces = faceapp.get(img)
for face in faces:
x1, y1, x2, y2 = list(map(int, face.bbox))
face_crop = img[y1:y2, x1:x2]
img[y1:y2, x1:x2] = cv2.GaussianBlur(face_crop, (99, 99), 30)
cv2.imwrite(img_path, img)
def images_to_video(images_path, output_path, fps):
images = sorted(glob.glob(os.path.join(images_path, "*.png")))
frame = cv2.imread(images[0])
height, width, _ = frame.shape
temp_path = "temp_video.avi"
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(temp_path, fourcc, fps, (width, height))
for img_path in images:
frame = cv2.imread(img_path)
out.write(frame)
out.release()
video = VideoFileClip(temp_path)
audio = AudioFileClip("audio.mp3")
final = video.set_audio(audio)
final.write_videofile(output_path, codec="libx264", audio_codec="aac")
os.remove(temp_path)
os.remove("audio.mp3")
def process(video):
input_path = "input.mp4"
output_path = "output.mp4"
frames_dir = "frames"
video.save(input_path)
fps = video_to_images(input_path, frames_dir)
blur_faces_in_images(frames_dir)
images_to_video(frames_dir, output_path, fps)
shutil.rmtree(frames_dir)
return output_path
demo = gr.Interface(
fn=process,
inputs=gr.Video(label="Upload Video"),
outputs=gr.Video(label="Faces Blurred"),
title="Face Blurring App",
description="Uploads a video and returns the same video with all faces blurred using InsightFace."
)
if __name__ == "__main__":
demo.launch()