import sys sys.path.append('../') import os import base64 import json import cv2 import numpy as np from time import gmtime, strftime from flask import Flask, request, jsonify from engine.header import get_version from engine.header import get_deviceid from engine.header import init_sdk from engine.header import init_sdk_offline from engine.header import check_liveness from engine.header import print_log, print_error, print_info, print_warning file_path = os.path.abspath(__file__) dir_path = os.path.dirname(file_path) root_path = os.path.dirname(dir_path) SPOOF_THRESHOLD = 0.5 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 \t version {}'.format(version)) device_id = get_deviceid().decode('utf-8') print_info('\t \t\t {}'.format(device_id)) def activate_sdk(): online_key = os.environ.get("FL_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("Liveness online license key not found!") else: print_info(f"FL_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("Liveness 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, face_rect, score, angles): status = "ok" data = { "status": status, "data": {} } data["data"]["result"] = result if score is not None: data["data"]["liveness_score"] = score if face_rect is not None: data["data"]["face_rect"] = { "x": int(face_rect[0]), "y": int(face_rect[1]), "w": int(face_rect[2] - face_rect[0] + 1), "h": int(face_rect[3] - face_rect[1] + 1) } if angles is not None: data["data"]["angles"] = { "yaw": angles[0], "roll": angles[1], "pitch": angles[2] } response = jsonify(data) response.status_code = 200 response.headers["Content-Type"] = "application/json; charset=utf-8" return response @app.route('/api/check_liveness', methods=['POST']) def check_liveness_api(): try: file = request.files['image'] image_mat = cv2.imdecode(np.frombuffer(file.read(), np.uint8), cv2.IMREAD_COLOR) except: response = generate_response("Failed to open file!", None, None, None) return response result, face_rect, score, angles = check_liveness(image_mat, SPOOF_THRESHOLD) response = generate_response(result, face_rect, score, angles) return response @app.route('/api/check_liveness_base64', methods=['POST']) def check_liveness_base64_api(): try: content = request.get_json() imageBase64 = content['image'] image_mat = cv2.imdecode(np.frombuffer(base64.b64decode(imageBase64), dtype=np.uint8), cv2.IMREAD_COLOR) except: response = generate_response("Failed to open file!", None, None, None) return response result, face_rect, score, angles = check_liveness(image_mat, SPOOF_THRESHOLD) response = generate_response(result, face_rect, score, angles) 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)