import argparse import os import re import string import time import sys from pathlib import Path import torch import pandas as pd import towhee from towhee.operator.base import NNOperator, OperatorFlag from towhee import register import warnings warnings.filterwarnings('ignore') import logging log = logging.getLogger() @register(output_schema=["scorelist"], flag=OperatorFlag.STATELESS | OperatorFlag.REUSEABLE) class Deepfake(NNOperator): ''' Deepfake ''' def __init__(self): super().__init__() sys.path.append(str(Path(__file__).parent)) weights_dir = os.path.join(str(Path(__file__).parent),"weights/") self.model_paths = [os.path.join(weights_dir,model) for model in os.listdir(weights_dir)] self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") from kernel_utils import VideoReader, FaceExtractor, confident_strategy, predict_on_video from classifiers import DeepFakeClassifier models = [] for path in self.model_paths: model = DeepFakeClassifier(encoder="tf_efficientnet_b7_ns").to(self.device) print("loading state dict {}".format(path)) checkpoint = torch.load(path, map_location="cpu") state_dict = checkpoint.get("state_dict", checkpoint) model.load_state_dict({re.sub("^module.", "", k): v for k, v in state_dict.items()}, strict=False) model.eval() del checkpoint models.append(model.float()) self.frames_per_video = 32 video_reader = VideoReader() video_read_fn = lambda x: video_reader.read_frames(x, num_frames=self.frames_per_video) self.face_extractor = FaceExtractor(video_read_fn) self.input_size = 384 self.strategy = confident_strategy self.models = models self.predict_on_video = predict_on_video def __call__(self, filepath: string) -> list: prediction = self.predict_on_video(False, face_extractor=self.face_extractor, video_path=filepath, input_size=self.input_size, batch_size=self.frames_per_video, models=self.models, strategy=self.strategy, apply_compression=False) ''' test_videos = sorted([x for x in os.listdir(filepath) if x[-4:] == ".mp4"]) print("Predicting {} videos".format(len(test_videos))) predictions = predict_on_video_set(False, face_extractor=face_extractor, input_size=input_size, models=models, strategy=strategy, frames_per_video=frames_per_video, videos=test_videos, num_workers=2, test_dir=filepath) ''' return prediction ''' if __name__ == "__main__": filepath = "/Users/zilliz/Desktop/deepfake_video/test/aagfhgtpmv.mp4" op = Deepfake() pred = op(filepath=filepath) print(pred) '''