Zhu-FaceOnLive's picture
Update app.py
f866611 verified
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)