import sys sys.path.append('.') from flask import Flask, request, jsonify from time import gmtime, strftime import os import base64 import json import cv2 import numpy as np from facewrapper.facewrapper import ttv_version from facewrapper.facewrapper import ttv_get_hwid from facewrapper.facewrapper import ttv_init from facewrapper.facewrapper import ttv_init_offline from facewrapper.facewrapper import ttv_detect_face app = Flask(__name__) app.config['SITE'] = "http://0.0.0.0:8000/" app.config['DEBUG'] = False licenseKey = os.environ.get("LICENSE_KEY") licensePath = "license.txt" modelFolder = os.path.abspath(os.path.dirname(__file__)) + '/facewrapper/dict' version = ttv_version() print("version: ", version.decode('utf-8')) ret = ttv_init(modelFolder.encode('utf-8'), licenseKey.encode('utf-8')) if ret != 0: print(f"online init failed: {ret}"); hwid = ttv_get_hwid() print("hwid: ", hwid.decode('utf-8')) ret = ttv_init_offline(modelFolder.encode('utf-8'), licensePath.encode('utf-8')) if ret != 0: print(f"offline init failed: {ret}") exit(-1) else: print(f"offline init ok") else: print(f"online init ok") @app.route('/api/liveness', methods=['POST']) def check_liveness(): file = request.files['image'] image = cv2.imdecode(np.fromstring(file.read(), np.uint8), cv2.IMREAD_COLOR) faceRect = np.zeros([4], dtype=np.int32) livenessScore = np.zeros([1], dtype=np.double) angles = np.zeros([3], dtype=np.double) ret = ttv_detect_face(image, image.shape[1], image.shape[0], faceRect, livenessScore, angles) if ret == -1: result = "license error!" elif ret == -2: result = "init error!" elif ret == 0: result = "no face detected!" elif ret > 1: result = "multiple face detected!" elif faceRect[0] < 0 or faceRect[1] < 0 or faceRect[2] >= image.shape[1] or faceRect[2] >= image.shape[0]: result = "face is in boundary!" elif livenessScore[0] > 0.5: result = "genuine" else: result = "spoof" status = "ok" response = jsonify({"status": status, "data": {"result": result, "face_rect": {"x": int(faceRect[0]), "y": int(faceRect[1]), "w": int(faceRect[2] - faceRect[0] + 1), "h" : int(faceRect[3] - faceRect[1] + 1)}, "liveness_score": livenessScore[0], "angles": {"yaw": angles[0], "roll": angles[1], "pitch": angles[2]}}}) response.status_code = 200 response.headers["Content-Type"] = "application/json; charset=utf-8" return response @app.route('/api/liveness_base64', methods=['POST']) def check_liveness_base64(): content = request.get_json() imageBase64 = content['image'] image = cv2.imdecode(np.frombuffer(base64.b64decode(imageBase64), dtype=np.uint8), cv2.IMREAD_COLOR) faceRect = np.zeros([4], dtype=np.int32) livenessScore = np.zeros([1], dtype=np.double) angles = np.zeros([3], dtype=np.double) ret = ttv_detect_face(image, image.shape[1], image.shape[0], faceRect, livenessScore, angles) if ret == -1: result = "license error!" elif ret == -2: result = "init error!" elif ret == 0: result = "no face detected!" elif ret > 1: result = "multiple face detected!" elif faceRect[0] < 0 or faceRect[1] < 0 or faceRect[2] >= image.shape[1] or faceRect[2] >= image.shape[0]: result = "face is in boundary!" elif livenessScore[0] > 0.5: result = "genuine" else: result = "spoof" status = "ok" response = jsonify({"status": status, "data": {"result": result, "face_rect": {"x": int(faceRect[0]), "y": int(faceRect[1]), "w": int(faceRect[2] - faceRect[0] + 1), "h" : int(faceRect[3] - faceRect[1] + 1)}, "liveness_score": livenessScore[0], "angles": {"yaw": angles[0], "roll": angles[1], "pitch": angles[2]}}}) response.status_code = 200 response.headers["Content-Type"] = "application/json; charset=utf-8" return response if __name__ == '__main__': port = int(os.environ.get("PORT", 8000)) app.run(host='0.0.0.0', port=port)