File size: 4,768 Bytes
4d34494
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
import sys
sys.path.append('../')

import os
import base64
import json
import cv2
import numpy as np
from flask import Flask, request, jsonify
from time import gmtime, strftime

from engine.header import *

file_path = os.path.abspath(__file__)
dir_path = os.path.dirname(file_path)
root_path = os.path.dirname(dir_path)

MATCH_THRESHOLD = 0.67

app = Flask(__name__) 
app.config['SITE'] = "http://0.0.0.0:8000/"
app.config['DEBUG'] = False

version = get_version().decode('utf-8')
print_info('\t <Recognito Face Recognition> \t version {}'.format(version))

device_id = get_deviceid().decode('utf-8')
print_info('\t <Hardware ID> \t\t {}'.format(device_id))

def activate_sdk():
    online_key = os.environ.get("FR_LICENSE_KEY")
    offline_key_path = os.path.join(root_path, "license.txt")
    dict_path = os.path.join(root_path, "engine/bin")

    ret = -1
    if online_key is None:
        print_warning("Recognition online license key not found!")
    else:
        print_info(f"FR_LICENSE_KEY: {online_key}")
        ret = init_sdk(dict_path.encode('utf-8'), online_key.encode('utf-8'))

    if ret == 0:
        print_log("Successfully online init SDK!")
    else:
        print_error(f"Failed to online init SDK, Error code {ret}\n Trying offline init SDK...");
        if os.path.exists(offline_key_path) is False:
            print_warning("Recognition offline license key file not found!")
            print_error(f"Falied to offline init SDK, Error code {ret}")
            return ret
        else:
            ret = init_sdk_offline(dict_path.encode('utf-8'), offline_key_path.encode('utf-8'))
            if ret == 0:
                print_log("Successfully offline init SDK!")
            else:
                print_error(f"Falied to offline init SDK, Error code {ret}")
                return ret
                
    return ret

def generate_response(result, similarity=None, face_bboxes=None, face_features=None):
    status = "ok"
    data = {
        "status": status, 
        "data": {}
    }
    
    data["data"]["result"] = result    
    if similarity is not None:
        data["data"]["similarity"] = float(similarity)    
    images = [{}, {}]
    if face_bboxes is not None:
        for i, bbox in enumerate(face_bboxes):
            box = {
                "x" : int(bbox[0]),
                "y" : int(bbox[1]),
                "width" : int(bbox[2] - bbox[0] + 1),
                "height" : int(bbox[3] - bbox[1] + 1)
            }
            images[i]["detection"] = box
        
    if face_features is not None:
        for i, feat in enumerate(face_features):
            json_string = json.dumps(feat.tolist(), indent=0).replace('\n','')
            images[i]["feature"] = json_string
            
    data["data"]["image1"] = images[0]
    data["data"]["image2"] = images[1]

    response = jsonify(data)
    response.status_code = 200
    response.headers["Content-Type"] = "application/json; charset=utf-8"
    return response
    
@app.route('/api/compare_face', methods=['POST'])
def compare_face_api():
    try:
        file1 = request.files['image1']
        image_mat1 = cv2.imdecode(np.frombuffer(file1.read(), np.uint8), cv2.IMREAD_COLOR)
    except:
        response = generate_response("Failed to open image1")
        return response

    try:
        file2 = request.files['image2']
        image_mat2 = cv2.imdecode(np.frombuffer(file2.read(), np.uint8), cv2.IMREAD_COLOR)
    except:
        response = generate_response("Failed to open image2")
        return response        

    result, score, face_bboxes, face_features = compare_face(image_mat1, image_mat2, MATCH_THRESHOLD)
    response = generate_response(result, score, face_bboxes, face_features)
    return response


@app.route('/api/compare_face_base64', methods=['POST'])
def coompare_face_base64_api():
    content = request.get_json()
    
    try:
        image_base64_1 = content['image1']
        image_mat1 = cv2.imdecode(np.frombuffer(base64.b64decode(image_base64_1), dtype=np.uint8), cv2.IMREAD_COLOR)
    except:
        response = generate_response("Failed to open image1")
        return response

    try:
        image_base64_2 = content['image2']
        image_mat2 = cv2.imdecode(np.frombuffer(base64.b64decode(image_base64_2), dtype=np.uint8), cv2.IMREAD_COLOR)
    except:
        response = generate_response("Failed to open image2")
        return response

    result, score, face_bboxes, face_features = compare_face(image_mat1, image_mat2, MATCH_THRESHOLD)
    response = generate_response(result, score, face_bboxes, face_features)
    return response

if __name__ == '__main__':
    ret = activate_sdk()
    if ret != 0:
        exit(-1)
    port = int(os.environ.get("PORT", 8000))
    app.run(host='0.0.0.0', port=port)