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 = "IBHTS-SIGHK-VVGCB-MGJYC" 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 print("@@@@@@@@@@@@@@@@@", faceRect1, featureSize1) 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.67: result = "same person!" else: result = "different person!" status = "ok" response = jsonify( { "status": status, "data": { "result": result, "similarity": float(similarity), "face1": {"x1": int(feature2[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.67: result = "same person!" else: result = "different person!" 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)