Zhu-FaceOnLive's picture
Upload 9 files
c2b0164
raw
history blame
7.45 kB
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_extract_feature
from facewrapper.facewrapper import ttv_compare_feature
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/compare_face', methods=['POST'])
def compare_face():
file1 = request.files['image1']
image1 = cv2.imdecode(np.fromstring(file1.read(), np.uint8), cv2.IMREAD_COLOR)
if image1 is None:
result = "image1: is null!"
status = "ok"
response = jsonify({"status": status, "data": {"result": result}})
response.status_code = 200
response.headers["Content-Type"] = "application/json; charset=utf-8"
return response
file2 = request.files['image2']
image2 = cv2.imdecode(np.fromstring(file2.read(), np.uint8), cv2.IMREAD_COLOR)
if image2 is None:
result = "image2: is null!"
status = "ok"
response = jsonify({"status": status, "data": {"result": result}})
response.status_code = 200
response.headers["Content-Type"] = "application/json; charset=utf-8"
return response
faceRect1 = np.zeros([4], dtype=np.int32)
feature1 = np.zeros([2048], dtype=np.uint8)
featureSize1 = np.zeros([1], dtype=np.int32)
ret = ttv_extract_feature(image1, image1.shape[1], image1.shape[0], faceRect1, feature1, featureSize1)
if ret <= 0:
if ret == -1:
result = "license error!"
elif ret == -2:
result = "init error!"
elif ret == 0:
result = "image1: no face detected!"
status = "ok"
response = jsonify({"status": status, "data": {"result": result}})
response.status_code = 200
response.headers["Content-Type"] = "application/json; charset=utf-8"
return response
faceRect2 = np.zeros([4], dtype=np.int32)
feature2 = np.zeros([2048], dtype=np.uint8)
featureSize2 = np.zeros([1], dtype=np.int32)
ret = ttv_extract_feature(image2, image2.shape[1], image2.shape[0], faceRect2, feature2, featureSize2)
if ret <= 0:
if ret == -1:
result = "license error!"
elif ret == -2:
result = "init error!"
elif ret == 0:
result = "image2: no face detected!"
status = "ok"
response = jsonify({"status": status, "data": {"result": result}})
response.status_code = 200
response.headers["Content-Type"] = "application/json; charset=utf-8"
return response
similarity = ttv_compare_feature(feature1, feature2)
if similarity > 0.7:
result = "same"
else:
result = "different"
status = "ok"
response = jsonify(
{
"status": status,
"data": {
"result": result,
"similarity": float(similarity),
"face1": {"x1": int(faceRect1[0]), "y1": int(faceRect1[1]), "x2": int(faceRect1[2]), "y2" : int(faceRect1[3])},
"face2": {"x1": int(faceRect2[0]), "y1": int(faceRect2[1]), "x2": int(faceRect2[2]), "y2" : int(faceRect2[3])},
}
})
response.status_code = 200
response.headers["Content-Type"] = "application/json; charset=utf-8"
return response
@app.route('/api/compare_face_base64', methods=['POST'])
def coompare_face_base64():
content = request.get_json()
imageBase641 = content['image1']
image1 = cv2.imdecode(np.frombuffer(base64.b64decode(imageBase641), dtype=np.uint8), cv2.IMREAD_COLOR)
if image1 is None:
result = "image1: is null!"
status = "ok"
response = jsonify({"status": status, "data": {"result": result}})
response.status_code = 200
response.headers["Content-Type"] = "application/json; charset=utf-8"
return response
imageBase642 = content['image2']
image2 = cv2.imdecode(np.frombuffer(base64.b64decode(imageBase642), dtype=np.uint8), cv2.IMREAD_COLOR)
if image2 is None:
result = "image2: is null!"
status = "ok"
response = jsonify({"status": status, "data": {"result": result}})
response.status_code = 200
response.headers["Content-Type"] = "application/json; charset=utf-8"
return response
faceRect1 = np.zeros([4], dtype=np.int32)
feature1 = np.zeros([2048], dtype=np.uint8)
featureSize1 = np.zeros([1], dtype=np.int32)
ret = ttv_extract_feature(image1, image1.shape[1], image1.shape[0], faceRect1, feature1, featureSize1)
if ret <= 0:
if ret == -1:
result = "license error!"
elif ret == -2:
result = "init error!"
elif ret == 0:
result = "image1: no face detected!"
status = "ok"
response = jsonify({"status": status, "data": {"result": result}})
response.status_code = 200
response.headers["Content-Type"] = "application/json; charset=utf-8"
return response
faceRect2 = np.zeros([4], dtype=np.int32)
feature2 = np.zeros([2048], dtype=np.uint8)
featureSize2 = np.zeros([1], dtype=np.int32)
ret = ttv_extract_feature(image2, image2.shape[1], image2.shape[0], faceRect2, feature2, featureSize2)
if ret <= 0:
if ret == -1:
result = "license error!"
elif ret == -2:
result = "init error!"
elif ret == 0:
result = "image2: no face detected!"
status = "ok"
response = jsonify({"status": status, "data": {"result": result}})
response.status_code = 200
response.headers["Content-Type"] = "application/json; charset=utf-8"
return response
similarity = ttv_compare_feature(feature1, feature2)
if similarity > 0.7:
result = "same"
else:
result = "different"
status = "ok"
response = jsonify(
{
"status": status,
"data": {
"result": result,
"similarity": float(similarity),
"face1": {"x1": int(faceRect1[0]), "y1": int(faceRect1[1]), "x2": int(faceRect1[2]), "y2" : int(faceRect1[3])},
"face2": {"x1": int(faceRect2[0]), "y1": int(faceRect2[1]), "x2": int(faceRect2[2]), "y2" : int(faceRect2[3])},
}
})
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)