fasd / app.py
ozyman's picture
added dropdown, made subdir
03d287b
raw
history blame
2.57 kB
import gradio as gr
from gradio.components import Dropdown
import cv2 as cv
import torch
from torchvision import transforms
from DeePixBiS.Model import DeePixBiS
labels = ['Live', 'Spoof']
thresh = 0.45
examples = [
['examples/1_1_21_2_33_scene_fake.jpg', "DeePixBiS"],
['examples/frame150_real.jpg', "DeePixBiS"],
['examples/1_2.avi_125_real.jpg', "DeePixBiS"],
['examples/1_3.avi_25_fake.jpg', "DeePixBiS"]]
device = torch.device("cpu")
faceClassifier = cv.CascadeClassifier('./DeePixBiS/Classifiers/haarface.xml')
tfms = transforms.Compose([
transforms.ToPILImage(),
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])
model = DeePixBiS(pretrained=False)
model.load_state_dict(torch.load('./DeePixBiS/DeePixBiS.pth'))
model.eval()
def find_largest_face(faces):
largest_face = None
largest_area = 0
for (x, y, w, h) in faces:
area = w * h
if area > largest_area:
largest_area = area
largest_face = (x, y, w, h)
return largest_face
def inference(img, model_name):
confidences = {}
if model_name == 'DeePixBiS':
grey = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
faces = faceClassifier.detectMultiScale(
grey, scaleFactor=1.1, minNeighbors=4)
face = find_largest_face(faces)
if face is not None:
x, y, w, h = face
faceRegion = img[y:y + h, x:x + w]
faceRegion = cv.cvtColor(faceRegion, cv.COLOR_BGR2RGB)
faceRegion = tfms(faceRegion)
faceRegion = faceRegion.unsqueeze(0)
mask, binary = model.forward(faceRegion)
res = torch.mean(mask).item()
if res < thresh:
cls = 'Spoof'
color = (0, 0, 255)
res = 1 - res
else:
cls = 'Real'
color = (0, 255, 0)
label = f'{cls} {res:.2f}'
cv.rectangle(img, (x, y), (x + w, y + h), color, 2)
cv.putText(img, label, (x, y + h + 30),
cv.FONT_HERSHEY_COMPLEX, 1, color)
confidences = {label: res}
return img, confidences
if __name__ == '__main__':
demo = gr.Interface(
fn=inference,
inputs=[gr.Image(source='webcam', shape=None, type='numpy'),
Dropdown(["DeePixBiS", "DSDG"], value="DeePixBiS")],
outputs=["image", gr.Label(num_top_classes=2)],
examples=examples).queue(concurrency_count=2)
demo.launch(share=False)