P-FFP / app.py
mrneuralnet's picture
Fix video inference
7576905
import base64
import json
import os, shutil
import re
import time
import uuid
import cv2
import numpy as np
import streamlit as st
from PIL import Image
# from extract_video import extract_method_single_video
from utils import st_file_selector, img2base64
from main import FaceFakePipelineImage, FaceFakePipelineVideo
import os
DEBUG = True
def main():
st.markdown("###")
uploaded_file = st.file_uploader('Upload a picture', type=['mp4', 'jpg', 'jpeg', 'png'], accept_multiple_files=False)
with st.spinner(f'Loading samples...'):
while not os.path.isdir("sample_files"):
time.sleep(1)
st.markdown("### or")
selected_file = st_file_selector(st, path='sample_files', key = 'selected', label = 'Choose a sample image/video')
if uploaded_file:
random_id = uuid.uuid1()
base_folder = "temps"
filename = "{}.{}".format(random_id, uploaded_file.type.split("/")[-1])
file_type = uploaded_file.type.split("/")[0]
filepath = f"{base_folder}/{filename}"
faces_folder = f"{base_folder}/images/{random_id}"
st.write(filepath)
if uploaded_file.type == 'video/mp4':
with open(f"temps/{filename}", mode='wb') as f:
f.write(uploaded_file.read())
video_path = filepath
st.video(uploaded_file)
else:
img = Image.open(uploaded_file).convert('RGB')
ext = uploaded_file.type.split("/")[-1]
st.image(img)
elif selected_file:
base_folder = "sample_files"
file_type = selected_file.split(".")[-1]
filename = selected_file.split("/")[-1]
filepath = f"{base_folder}/{selected_file}"
if file_type == 'mp4':
video_file = open(filepath, 'rb')
video_bytes = video_file.read()
st.video(video_bytes)
video_path = filepath
else:
img = Image.open(filepath).convert('RGB')
st.image(img)
else:
return
with st.spinner(f'Analyzing {file_type}...'):
if file_type == 'video' or file_type == 'mp4':
result = video_pipeline(video_path, config_payload=config_payload)
else:
result = image_pipeline({'images': [img2base64(np.array(img))]}, config_payload=config_payload)
if 'Real' in result['message']:
st.success(result['message'], icon="✅")
else:
st.error(result['message'], icon="🚨")
st.divider()
st.write('## Response JSON')
st.write(result)
def setup():
if not os.path.isdir("temps"):
os.makedirs("temps")
if __name__ == "__main__":
image_pipeline = FaceFakePipelineImage()
video_pipeline = FaceFakePipelineVideo()
with st.sidebar:
config_payload = {
'face_detection_threshold': 0.997,
'deformation_detection_threshold': 0.6,
'deepfake_detection_threshold': 0.65,
'frame_sampling_interval': st.slider('frame_sampling_interval', 0, 300, 60, step=5),
'frame_sampling_max': st.slider('frame_sampling_max', 0, 120, 50),
}
st.title("Face Fake Detection")
setup()
main()