Spaces:
Running
Running
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") | |
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 | |
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) | |