File size: 3,788 Bytes
20be593
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
576ab32
 
 
20be593
 
576ab32
 
20be593
 
 
 
 
 
 
 
 
 
 
 
576ab32
 
 
 
20be593
 
1528743
576ab32
20be593
 
 
576ab32
20be593
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import cv2
import os
import random
import numpy as np
from matplotlib import pyplot as plt

from tensorflow.keras.layers import Layer
import tensorflow as tf

import gradio as gr

import uuid


def preprocess(file_path):
    # Read in image from file path
    byte_img = tf.io.read_file(file_path)
    # Load in the image
    img = tf.io.decode_jpeg(byte_img)
    # Preprocessing steps - resizing the image to be 100x100x3
    img = tf.image.resize(img, (100, 100))
    # Scale image to be between 0 and 1
    img = img / 255.0
    # Return image
    return img

# Siamese L1 Distance class
class L1Dist(Layer):
    # Init method - inheritance
    def __init__(self, **kwargs):
        super().__init__()
    # Magic happens here - similarity calculation
    def call(self, input_embedding, validation_embedding):
        return tf.math.abs(input_embedding - validation_embedding)
    
# Reload model
siamese_model = tf.keras.models.load_model('siamesemodelv2.h5',
                                           custom_objects={'L1Dist': L1Dist, 'BinaryCrossentropy': tf.losses.BinaryCrossentropy})

def verify(model, detection_threshold, verification_threshold):
    # Build results array
    results = []
    ver_images= []
    for file in os.listdir(os.path.join('application_data', 'verification_images')):
        if file[len(file)-4:] == '.jpg':
            ver_images.append(file)
    ver_images_len= len(ver_images)
    for image in ver_images:
        input_img = preprocess(os.path.join('application_data', 'input_image', 'input_image.jpg'))
        validation_img = preprocess(os.path.join('application_data', 'verification_images', image))
        # Make Predictions 
        result = model.predict(list(np.expand_dims([input_img, validation_img], axis=1)))
        results.append(result)
    
    # Detection Threshold: Metric above which a prediciton is considered positive 
    detection = np.sum(np.array(results) > detection_threshold)
    print('Detection -- ',detection)
    # Verification Threshold: Proportion of positive predictions / total positive samples 
    verification = detection / len(ver_images) 
    print('Verification -- ',verification)
    verified = verification > verification_threshold
    
    return detection,verification,verified,ver_images_len 


       

def take_ver_images (image):
    count=0
    cv2.imwrite(os.path.join('application_data', 'verification_images', '{}.jpg'.format(uuid.uuid1())), image)
    count+=1
    return '{} Image Collected!'.format(count)
def verify_identity (image):
  cv2.imwrite(os.path.join('application_data', 'input_image', 'input_image.jpg'), image)
  detection,verification,verified,ver_images_len = verify(siamese_model, 0.8, 0.7)
  # return {'Detections': int(detection),'Confidence': float(verification),'Verified': bool(verified)}
  return 'Detected {} out of {} samples'.format(detection,ver_images_len),float(verification),'Verified' if verified else 'Not Verified'

with gr.Blocks() as demo:
    with gr.Tab("Setup Identity"):
      with gr.Row():
        input_img = gr.inputs.Image(shape=(100,100))
      output_text = gr.outputs.Label()
      with gr.Row():
        submit_btn = gr.Button("Add Image")
        submit_btn.click(take_ver_images, inputs=input_img,outputs=output_text)
    with gr.Tab("Identify"):
      with gr.Row():
        input_img1 = gr.inputs.Image(shape=(100,100))
      output_text3 = gr.outputs.Label(label='Verification Result')
      with gr.Row():
        output_text1 = gr.outputs.Label(label='Detections')
        output_text2 = gr.outputs.Label(label='Confidence')
        
      with gr.Row():
        submit_btn1 = gr.Button("Verify")
        submit_btn1.click(verify_identity, inputs=input_img1,outputs=[output_text1,output_text2,output_text3])
demo.launch(debug=True)