Spaces:
Running
Running
import sys | |
sys.path.append('.') | |
import os | |
import numpy as np | |
import base64 | |
import io | |
from PIL import Image | |
from flask import Flask, request, jsonify | |
from facesdk import getMachineCode | |
from facesdk import setActivation | |
from facesdk import initSDK | |
from facesdk import faceDetection | |
from facesdk import templateExtraction | |
from facesdk import similarityCalculation | |
from facebox import FaceBox | |
verifyThreshold = 0.67 | |
maxFaceCount = 1 | |
licensePath = "license.txt" | |
license = "" | |
# Get a specific environment variable by name | |
license = os.environ.get("LICENSE") | |
# Check if the variable exists | |
if license is not None: | |
print("Value of LICENSE:") | |
else: | |
license = "" | |
try: | |
with open(licensePath, 'r') as file: | |
license = file.read().strip() | |
except IOError as exc: | |
print("failed to open license.txt: ", exc.errno) | |
print("license: ", license) | |
machineCode = getMachineCode() | |
print("machineCode: ", machineCode.decode('utf-8')) | |
ret = setActivation(license.encode('utf-8')) | |
print("activation: ", ret) | |
ret = initSDK("data".encode('utf-8')) | |
print("init: ", ret) | |
app = Flask(__name__) | |
def compare_face(): | |
result = "None" | |
similarity = -1 | |
face1 = None | |
face2 = None | |
file1 = request.files['file1'] | |
file2 = request.files['file2'] | |
try: | |
image1 = Image.open(file1).convert('RGB') | |
except: | |
result = "Failed to open file1" | |
response = jsonify({"compare_result": result, "compare_similarity": similarity, "face1": face1, "face2": face2}) | |
response.status_code = 200 | |
response.headers["Content-Type"] = "application/json; charset=utf-8" | |
return response | |
try: | |
image2 = Image.open(file2).convert('RGB') | |
except: | |
result = "Failed to open file2" | |
response = jsonify({"compare_result": result, "compare_similarity": similarity, "face1": face1, "face2": face2}) | |
response.status_code = 200 | |
response.headers["Content-Type"] = "application/json; charset=utf-8" | |
return response | |
image_np1 = np.asarray(image1) | |
image_np2 = np.asarray(image2) | |
faceBoxes1 = (FaceBox * maxFaceCount)() | |
faceCount1 = faceDetection(image_np1, image_np1.shape[1], image_np1.shape[0], faceBoxes1, maxFaceCount) | |
faceBoxes2 = (FaceBox * maxFaceCount)() | |
faceCount2 = faceDetection(image_np2, image_np2.shape[1], image_np2.shape[0], faceBoxes2, maxFaceCount) | |
if faceCount1 == 1 and faceCount2 == 1: | |
templateExtraction(image_np1, image_np1.shape[1], image_np1.shape[0], faceBoxes1[0]) | |
templateExtraction(image_np2, image_np2.shape[1], image_np2.shape[0], faceBoxes2[0]) | |
similarity = similarityCalculation(faceBoxes1[0].templates, faceBoxes2[0].templates) | |
if similarity > verifyThreshold: | |
result = "Same person" | |
else: | |
result = "Different person" | |
elif faceCount1 == 0: | |
result = "No face1" | |
elif faceCount2 == 0: | |
result = "No face2" | |
if faceCount1 == 1: | |
landmark_68 = [] | |
for j in range(68): | |
landmark_68.append({"x": faceBoxes1[0].landmark_68[j * 2], "y": faceBoxes1[0].landmark_68[j * 2 + 1]}) | |
face1 = {"x1": faceBoxes1[0].x1, "y1": faceBoxes1[0].y1, "x2": faceBoxes1[0].x2, "y2": faceBoxes1[0].y2, | |
"yaw": faceBoxes1[0].yaw, "roll": faceBoxes1[0].roll, "pitch": faceBoxes1[0].pitch, | |
"face_quality": faceBoxes1[0].face_quality, "face_luminance": faceBoxes1[0].face_luminance, "eye_dist": faceBoxes1[0].eye_dist, | |
"left_eye_closed": faceBoxes1[0].left_eye_closed, "right_eye_closed": faceBoxes1[0].right_eye_closed, | |
"face_occlusion": faceBoxes1[0].face_occlusion, "mouth_opened": faceBoxes1[0].mouth_opened, | |
"landmark_68": landmark_68} | |
if faceCount2 == 1: | |
landmark_68 = [] | |
for j in range(68): | |
landmark_68.append({"x": faceBoxes2[0].landmark_68[j * 2], "y": faceBoxes2[0].landmark_68[j * 2 + 1]}) | |
face2 = {"x1": faceBoxes2[0].x1, "y1": faceBoxes2[0].y1, "x2": faceBoxes2[0].x2, "y2": faceBoxes2[0].y2, | |
"yaw": faceBoxes2[0].yaw, "roll": faceBoxes2[0].roll, "pitch": faceBoxes2[0].pitch, | |
"face_quality": faceBoxes2[0].face_quality, "face_luminance": faceBoxes2[0].face_luminance, "eye_dist": faceBoxes2[0].eye_dist, | |
"left_eye_closed": faceBoxes2[0].left_eye_closed, "right_eye_closed": faceBoxes2[0].right_eye_closed, | |
"face_occlusion": faceBoxes2[0].face_occlusion, "mouth_opened": faceBoxes2[0].mouth_opened, | |
"landmark_68": landmark_68} | |
response = jsonify({"compare_result": result, "compare_similarity": similarity, "face1": face1, "face2": face2}) | |
response.status_code = 200 | |
response.headers["Content-Type"] = "application/json; charset=utf-8" | |
return response | |
def compare_face_base64(): | |
result = "None" | |
similarity = -1 | |
face1 = None | |
face2 = None | |
content = request.get_json() | |
try: | |
imageBase64_1 = content['base64_1'] | |
image_data1 = base64.b64decode(imageBase64_1) | |
image1 = Image.open(io.BytesIO(image_data1)).convert('RGB') | |
except: | |
result = "Failed to open file1" | |
response = jsonify({"compare_result": result, "compare_similarity": similarity, "face1": face1, "face2": face2}) | |
response.status_code = 200 | |
response.headers["Content-Type"] = "application/json; charset=utf-8" | |
return response | |
try: | |
imageBase64_2 = content['base64_2'] | |
image_data2 = base64.b64decode(imageBase64_2) | |
image2 = Image.open(io.BytesIO(image_data2)).convert('RGB') | |
except IOError as exc: | |
result = "Failed to open file2" | |
response = jsonify({"compare_result": result, "compare_similarity": similarity, "face1": face1, "face2": face2}) | |
response.status_code = 200 | |
response.headers["Content-Type"] = "application/json; charset=utf-8" | |
return response | |
image_np1 = np.asarray(image1) | |
image_np2 = np.asarray(image2) | |
faceBoxes1 = (FaceBox * maxFaceCount)() | |
faceCount1 = faceDetection(image_np1, image_np1.shape[1], image_np1.shape[0], faceBoxes1, maxFaceCount) | |
faceBoxes2 = (FaceBox * maxFaceCount)() | |
faceCount2 = faceDetection(image_np2, image_np2.shape[1], image_np2.shape[0], faceBoxes2, maxFaceCount) | |
if faceCount1 == 1 and faceCount2 == 1: | |
templateExtraction(image_np1, image_np1.shape[1], image_np1.shape[0], faceBoxes1[0]) | |
templateExtraction(image_np2, image_np2.shape[1], image_np2.shape[0], faceBoxes2[0]) | |
similarity = similarityCalculation(faceBoxes1[0].templates, faceBoxes2[0].templates) | |
if similarity > verifyThreshold: | |
result = "Same person" | |
else: | |
result = "Different person" | |
elif faceCount1 == 0: | |
result = "No face1" | |
elif faceCount2 == 0: | |
result = "No face2" | |
if faceCount1 == 1: | |
landmark_68 = [] | |
for j in range(68): | |
landmark_68.append({"x": faceBoxes1[0].landmark_68[j * 2], "y": faceBoxes1[0].landmark_68[j * 2 + 1]}) | |
face1 = {"x1": faceBoxes1[0].x1, "y1": faceBoxes1[0].y1, "x2": faceBoxes1[0].x2, "y2": faceBoxes1[0].y2, | |
"yaw": faceBoxes1[0].yaw, "roll": faceBoxes1[0].roll, "pitch": faceBoxes1[0].pitch, | |
"face_quality": faceBoxes1[0].face_quality, "face_luminance": faceBoxes1[0].face_luminance, "eye_dist": faceBoxes1[0].eye_dist, | |
"left_eye_closed": faceBoxes1[0].left_eye_closed, "right_eye_closed": faceBoxes1[0].right_eye_closed, | |
"face_occlusion": faceBoxes1[0].face_occlusion, "mouth_opened": faceBoxes1[0].mouth_opened, | |
"landmark_68": landmark_68} | |
if faceCount2 == 1: | |
landmark_68 = [] | |
for j in range(68): | |
landmark_68.append({"x": faceBoxes2[0].landmark_68[j * 2], "y": faceBoxes2[0].landmark_68[j * 2 + 1]}) | |
face2 = {"x1": faceBoxes2[0].x1, "y1": faceBoxes2[0].y1, "x2": faceBoxes2[0].x2, "y2": faceBoxes2[0].y2, | |
"yaw": faceBoxes2[0].yaw, "roll": faceBoxes2[0].roll, "pitch": faceBoxes2[0].pitch, | |
"face_quality": faceBoxes2[0].face_quality, "face_luminance": faceBoxes2[0].face_luminance, "eye_dist": faceBoxes2[0].eye_dist, | |
"left_eye_closed": faceBoxes2[0].left_eye_closed, "right_eye_closed": faceBoxes2[0].right_eye_closed, | |
"face_occlusion": faceBoxes2[0].face_occlusion, "mouth_opened": faceBoxes2[0].mouth_opened, | |
"landmark_68": landmark_68} | |
response = jsonify({"compare_result": result, "compare_similarity": similarity, "face1": face1, "face2": face2}) | |
response.status_code = 200 | |
response.headers["Content-Type"] = "application/json; charset=utf-8" | |
return response | |
if __name__ == '__main__': | |
port = int(os.environ.get("PORT", 8080)) | |
app.run(host='0.0.0.0', port=port) | |