File size: 2,217 Bytes
9067733 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
import gradio as gr
import cv2 as cv
import torch
from torchvision import transforms
from Model import DeePixBiS
labels = ['Live', 'Spoof']
thresh = 0.45
examples = [
'examples/1_1_21_2_33_scene_fake.jpg', 'examples/frame150_real.jpg',
'examples/1_2.avi_125_real.jpg', 'examples/1_3.avi_25_fake.jpg']
device = torch.device("cpu")
faceClassifier = cv.CascadeClassifier('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.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):
grey = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
faces = faceClassifier.detectMultiScale(
grey, scaleFactor=1.1, minNeighbors=4)
face = find_largest_face(faces)
confidences = {}
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')],
outputs=["image", gr.Label(num_top_classes=2)],
examples=examples).queue(concurrency_count=2)
demo.launch(share=False)
|