distildire / utils /sanic_utils.py
Yewon Lim
first
424919d
from decord import VideoReader,cpu
import os
import numpy as np
import cv2
import dlib
import face_recognition
from tqdm import tqdm
def real_or_fake(prediction):
return {0: "REAL", 1: "FAKE"}[prediction ^ 1]
def real_or_fake_thres(probability, threshold=0.2):
return "FAKE" if probability >= threshold else "REAL"
def face_rec(frames, p=None, klass=None):
temp_face = np.zeros((len(frames), 224, 224, 3), dtype=np.uint8)
count = 0
mod = "cnn" if dlib.DLIB_USE_CUDA else "hog"
for _, frame in tqdm(enumerate(frames), total=len(frames)):
frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
face_locations = face_recognition.face_locations(
frame, number_of_times_to_upsample=0, model=mod
)
for face_location in face_locations:
if count < len(frames):
top, right, bottom, left = face_location
face_image = frame[top:bottom, left:right]
face_image = cv2.resize(
face_image, (224, 224), interpolation=cv2.INTER_AREA
)
face_image = cv2.cvtColor(face_image, cv2.COLOR_BGR2RGB)
temp_face[count] = face_image
count += 1
else:
break
return ([], 0) if count == 0 else (temp_face[:count], count)
def extract_frames(video_file, frames_nums=15):
vr = VideoReader(video_file, ctx=cpu(0))
# Calculate the step size between frames
step_size = max(1, len(vr) // frames_nums)
return vr.get_batch(
list(range(0, len(vr), step_size))[:frames_nums]
).asnumpy() # seek frames with step_size
def is_video(vid):
return os.path.isfile(vid) and vid.endswith(
tuple([".avi", ".mp4", ".mpg", ".mpeg", ".mov"])
)
def is_image(img):
return os.path.isfile(img) and img.endswith(
tuple([".jpg", ".jpeg", ".png", ".webp"])
)
def set_result():
return {
"video": {
"name": [],
"pred": [],
"klass": [],
"pred_label": [],
"correct_label": [],
}
}
def store_result(
result, filename, y, y_val, klass, correct_label=None, compression=None
):
result["video"]["name"].append(filename)
result["video"]["pred"].append(y_val)
result["video"]["klass"].append(klass.lower())
result["video"]["pred_label"].append(real_or_fake(y))
if correct_label is not None:
result["video"]["correct_label"].append(correct_label)
if compression is not None:
result["video"]["compression"].append(compression)
return result