Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit

Permalink
combine detectors into a single API
Browse files Browse the repository at this point in the history
  • Loading branch information
rashley-iqt committed Dec 1, 2021
1 parent b61568a commit 98f4023
Show file tree
Hide file tree
Showing 23 changed files with 194 additions and 34 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
.env
.venv
dist
.eggs
*.egg-info
Expand Down
7 changes: 7 additions & 0 deletions detectors/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
FROM nvidia/cuda:11.0-base
RUN apt-get update && apt-get install -y python3-pip wget
WORKDIR /
COPY . /
RUN python3 -m pip install -U pip && python3 -m pip install -r requirements.txt
EXPOSE 5000
CMD ["python3","app.py"]
64 changes: 64 additions & 0 deletions detectors/app.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import os
import pandas as pd
import pickle
import flask
from flask import Flask, request, jsonify, make_response
from boken.ensemble import Ensemble as boken_Ensemble
from eighteen.ensemble import Ensemble as eighteen_Ensemble
from medics.ensemble import Ensemble as medics_Ensemble
from ntech.ensemble import Ensemble as ntech_Ensemble
from selimsef.ensemble import Ensemble as selimsef_Ensemble
from wm.ensemble import Ensemble as wm_Ensemble
import boto3

app = Flask(__name__)

models = {
"boken": boken_Ensemble,
"eighteen": eighteen_Ensemble,
"medics": medics_Ensemble,
"ntech": ntech_Ensemble,
"selimsef": selimsef_Ensemble,
"wm": wm_Ensemble,
}


@app.route('/healthcheck')
def starting_url():
status_code = flask.Response(status=201)
return status_code

@app.route('/predict', methods=['POST'])
def predict():
model_names = request.get_json(force=True)['model_names']
video_list = request.get_json(force=True)['video_list']
predictions = []
for filename in video_list:
for modelname in model_names:
score = 0.5
video = ''
model = models[modelname]()
try:
validate_filename(filename)
video = sanitize_filename(filename, platform="auto")
video_path = os.path.join('/uploads/', video)
if os.path.exists(video_path):
score = model.inference(video_path)
pred={'filename': video}
pred[modelname]=score
else:
return make_response(f"File {video} not found.", 400)
except ValidationError as e:
print(f'{e}')
return make_response(f"{e}", 400)
except Exception as err:
print(f'{err}')
return make_response(f"{err}", 500)

result = pd.DataFrame(predictions)
return result.to_json()



if __name__ == '__main__':
app.run(host='0.0.0.0')
Empty file added detectors/boken/__init__.py
Empty file.
8 changes: 4 additions & 4 deletions detectors/boken/ensemble.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import os
import torch

from eval_kit.detector import DeeperForensicsDetector
from eval_kit.client_dev import get_local_frames_iter
from models import model_selection, get_efficientnet, DetectionPipeline
from .eval_kit.detector import DeeperForensicsDetector
from .eval_kit.client_dev import get_local_frames_iter
from .models import model_selection, get_efficientnet, DetectionPipeline
from facenet_pytorch import MTCNN, extract_face
from utils import *
from .utils import *


class Ensemble(DeeperForensicsDetector):
Expand Down
2 changes: 1 addition & 1 deletion detectors/boken/eval_kit/client_dev.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

from io import BytesIO

from eval_kit.extract_frames import extract_frames
from .extract_frames import extract_frames

# EVALUATION SYSTEM SETTINGS
# DON'T CHANGE ANY CODE HERE, OR YOU MAY ENCOUNTER SOME UNEXPECTED PROBLEMS!
Expand Down
Empty file added detectors/eighteen/__init__.py
Empty file.
10 changes: 5 additions & 5 deletions detectors/eighteen/ensemble.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@
import torch.backends.cudnn as cudnn
import torchvision

from face_detect_lib.models.retinaface import RetinaFace
from face_detect_lib.layers.functions.prior_box import PriorBox
from face_detect_lib.utils.box_utils import decode_batch, decode_landm_batch, decode, decode_landm
from .face_detect_lib.models.retinaface import RetinaFace
from .face_detect_lib.layers.functions.prior_box import PriorBox
from .face_detect_lib.utils.box_utils import decode_batch, decode_landm_batch, decode, decode_landm

from utils import *
from models import *
from .utils import *
from .models import *

__all__ = ['Ensemble', 'pipeline_cfg']

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
import torch.nn as nn
import torch.nn.functional as F
from torch.autograd import Variable
from face_detect_lib.utils.box_utils import match, log_sum_exp
from face_detect_lib.models.config import cfg_mnet
from eighteen.face_detect_lib.utils.box_utils import match, log_sum_exp
from eighteen.face_detect_lib.models.config import cfg_mnet
GPU = cfg_mnet['gpu_train']

class MultiBoxLoss(nn.Module):
Expand Down
6 changes: 3 additions & 3 deletions detectors/eighteen/face_detect_lib/models/retinaface.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
import torch.nn.functional as F
from collections import OrderedDict

from face_detect_lib.models.net import MobileNetV1 as MobileNetV1
from face_detect_lib.models.net import FPN as FPN
from face_detect_lib.models.net import SSH as SSH
from .net import MobileNetV1 as MobileNetV1
from .net import FPN as FPN
from .net import SSH as SSH


class ClassHead(nn.Module):
Expand Down
Empty file added detectors/medics/__init__.py
Empty file.
8 changes: 4 additions & 4 deletions detectors/medics/ensemble.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
from torchvision.models.video import mc3_18, r2plus1d_18
from facenet_pytorch import MTCNN

from cnn3d import *
from cnn2d import *
from constants import *
from face_utils import *
from .cnn3d import *
from .cnn2d import *
from .constants import *
from .face_utils import *

__all__ = ['Ensemble']

Expand Down
2 changes: 1 addition & 1 deletion detectors/medics/face_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import cv2
import math
import skimage.measure
from constants import *
from .constants import *


def load_video(filename, every_n_frames=None, specific_frames=None, to_rgb=True, rescale=None, inc_pil=False, max_frames=None):
Expand Down
Empty file added detectors/ntech/__init__.py
Empty file.
4 changes: 2 additions & 2 deletions detectors/ntech/ensemble.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import numpy as np
import cv2

from face_utils import get_tracks, extract_sequence, extract_face
from models import *
from .face_utils import get_tracks, extract_sequence, extract_face
from .models import *

VIDEO_FACE_MODEL_TRACK_STEP = 2
VIDEO_SEQUENCE_MODEL_SEQUENCE_LENGTH = 7
Expand Down
2 changes: 1 addition & 1 deletion detectors/ntech/face_utils.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import numpy as np
import cv2

from tracker.iou_tracker import track_iou
from .tracker.iou_tracker import track_iou

DETECTOR_STEP = 3

Expand Down
89 changes: 89 additions & 0 deletions detectors/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
pathvalidate==2.5.0
numpy==1.18.1
opencv_python==4.2.0.34
torch==1.4.0
torchvision==0.5.0
albumentations==0.5.2
efficientnet_pytorch==0.7.0
facenet_pytorch==2.5.1
Pillow==8.1.1
pretrainedmodels==0.7.4
Flask==1.1.2
easydict==1.8
PyYAML==5.3.1
tensorboardX==2.0
pandas==1.0.4
pydocs==0.2
boto3==1.17.5
scipy==1.4.1
scikit_image==0.18.1
Cython==0.29.21
decord==0.4.2
einops==0.3.0
lmdb==1.0.0
scikit_learn==0.24.1
timm==0.3.4
appdirs==1.4.3
attrs==19.3.0
autopep8==1.5.2
backcall==0.1.0
bleach==3.1.4
certifi==2020.4.5.1
chardet==3.0.4
cycler==0.10.0
decorator==4.4.2
defusedxml==0.6.0
distlib==0.3.0
docopt==0.6.2
entrypoints==0.3
filelock==3.0.12
flake8==3.7.9
idna==2.9
imageio==2.9.0
importlib-metadata==1.5.0
jedi==0.16.0
Jinja2==2.11.1
jsonschema==3.2.0
mccabe==0.6.1
mistune==0.8.4
nbconvert==5.6.1
nbformat==5.0.4
networkx==2.5
notebook==6.0.3
olefile==0.46
pandocfilters==1.4.2
parso==0.6.2
pexpect==4.8.0
pickleshare==0.7.5
pipreqs==0.4.10
prometheus-client==0.7.1
prompt-toolkit==3.0.4
ptyprocess==0.6.0
pycodestyle==2.5.0
pyflakes==2.1.1
Pygments==2.6.1
pyparsing==2.4.6
pyrsistent==0.16.0
python-dateutil==2.8.1
pytz==2019.3
PyWavelets==1.1.1
pyzmq==18.1.1
requests==2.23.0
scikit-image==0.18.1
Send2Trash==1.5.0
sip
six==1.14.0
terminado==0.8.3
testpath==0.4.4
tifffile==2021.1.14

tornado==6.0.4
tqdm==4.44.1
traitlets==4.3.3
urllib3==1.25.9
virtualenv==20.0.18
wcwidth==0.1.9
webencodings==0.5.1
widgetsnbextension==3.5.1
yarg==0.1.9
zipp==2.2.0
Empty file added detectors/selimsef/__init__.py
Empty file.
4 changes: 2 additions & 2 deletions detectors/selimsef/ensemble.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import re

import torch
from kernel_utils import VideoReader, FaceExtractor, confident_strategy, predict_on_video
from models.classifiers import DeepFakeClassifier
from .kernel_utils import VideoReader, FaceExtractor, confident_strategy, predict_on_video
from .models.classifiers import DeepFakeClassifier

model_chpt = ['final_111_DeepFakeClassifier_tf_efficientnet_b7_ns_0_36',
'final_555_DeepFakeClassifier_tf_efficientnet_b7_ns_0_19',
Expand Down
6 changes: 3 additions & 3 deletions detectors/wm/ensemble.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@
from torchvision import transforms as T

sys.path.append('./external/Pytorch_Retinaface')
from model_def import WSDAN, xception
from face_utils import norm_crop, FaceDetector
from external.Pytorch_Retinaface.data import cfg_re50
from .model_def import WSDAN, xception
from .face_utils import norm_crop, FaceDetector
from .external.Pytorch_Retinaface.data import cfg_re50

class video_reader:
def __init__(self, face_detector, transform=None, frame_skip=9, face_limit=25, batch_size=25):
Expand Down
1 change: 0 additions & 1 deletion detectors/wm/external/EfficientNet-PyTorch
Submodule EfficientNet-PyTorch deleted from 7e8b0d
8 changes: 4 additions & 4 deletions detectors/wm/face_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
import torch
from skimage.transform import SimilarityTransform

from data import cfg_re50
from layers.functions.prior_box import PriorBox
from utils.box_utils import decode, decode_landm
from models.retinaface import RetinaFace
from .external.Pytorch_Retinaface.data import cfg_re50
from .external.Pytorch_Retinaface.layers.functions.prior_box import PriorBox
from .external.Pytorch_Retinaface.utils.box_utils import decode, decode_landm
from .external.Pytorch_Retinaface.models.retinaface import RetinaFace


def norm_crop(img, landmark, image_size=112):
Expand Down
2 changes: 1 addition & 1 deletion detectors/wm/model_def/wsdan.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
import torch
import torch.nn as nn
import torch.nn.functional as F
from .efficientnet_pytorch import EfficientNet as ef
from efficientnet_pytorch import EfficientNet as ef
from .xception_wsdan import xception

__all__ = ['WSDAN']
Expand Down

0 comments on commit 98f4023

Please sign in to comment.