|
import cv2 as cv |
|
import torch |
|
import torch.nn as nn |
|
from torchvision import transforms |
|
import numpy as np |
|
from DeePixBis.Model import DeePixBiS |
|
from DeePixBis.Loss import PixWiseBCELoss |
|
from DeePixBis.Metrics import predict, test_accuracy, test_loss |
|
|
|
model = DeePixBiS(pretrained=False) |
|
model.load_state_dict(torch.load('./DeePixBiS.pth')) |
|
model.eval() |
|
|
|
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)) |
|
]) |
|
|
|
faceClassifier = cv.CascadeClassifier('Classifiers/haarface.xml') |
|
|
|
camera = cv.VideoCapture(0) |
|
|
|
while cv.waitKey(1) & 0xFF != ord('q'): |
|
_, img = camera.read() |
|
grey = cv.cvtColor(img, cv.COLOR_BGR2GRAY) |
|
faces = faceClassifier.detectMultiScale(grey, scaleFactor=1.1, minNeighbors=4) |
|
|
|
for x, y, w, h in faces: |
|
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 < 0.7: |
|
label = f'Spoof {res:.2f}' |
|
color = (0, 0, 255) |
|
else: |
|
label = f'Real {res:.2f}' |
|
color = (0, 255, 0) |
|
print(f'{label}: {res}') |
|
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) |
|
|
|
cv.imshow('Deep Pixel-wise Binary Supervision Anti-Spoofing', img) |
|
|