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)