File size: 3,700 Bytes
4d34494
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import os
import sys
import numpy as np
import ctypes, ctypes.util
from enum import Enum
from ctypes import *
from numpy.ctypeslib import ndpointer

def print_log(fmt): print("[LOG] \033[98m{}\033[00m" .format(fmt))
def print_info(fmt): print("[INFO] \033[92m{}\033[00m" .format(fmt))
def print_error(fmt): print("[ERR] \033[91m{}\033[00m" .format(fmt)) 
def print_warning(fmt): print("[WARNING] \033[93m{}\033[00m" .format(fmt))

class ENGINE_CODE(Enum):
    E_NO_FACE = 0
    E_ACTIVATION_ERROR = -1
    E_ENGINE_INIT_ERROR = -2    

lib_path = os.path.abspath(os.path.dirname(__file__)) + '/librecognition_v6.so'
lib = cdll.LoadLibrary(lib_path)

get_version = lib.ttv_version
get_version.argtypes = []
get_version.restype = ctypes.c_char_p

get_deviceid = lib.ttv_get_hwid
get_deviceid.argtypes = []
get_deviceid.restype = ctypes.c_char_p

init_sdk = lib.ttv_init
init_sdk.argtypes = [ctypes.c_char_p, ctypes.c_char_p]
init_sdk.restype = ctypes.c_int32

init_sdk_offline = lib.ttv_init_offline
init_sdk_offline.argtypes = [ctypes.c_char_p, ctypes.c_char_p]
init_sdk_offline.restype = ctypes.c_int32

extract_template = lib.ttv_extract_feature
extract_template.argtypes = [ndpointer(ctypes.c_ubyte, flags='C_CONTIGUOUS'), ctypes.c_int32, ctypes.c_int32, ndpointer(ctypes.c_int32, flags='C_CONTIGUOUS'), ndpointer(ctypes.c_ubyte, flags='C_CONTIGUOUS'), ndpointer(ctypes.c_int32, flags='C_CONTIGUOUS')]
extract_template.restype = ctypes.c_int

calculate_similarity = lib.ttv_compare_feature
calculate_similarity.argtypes = [ndpointer(ctypes.c_ubyte, flags='C_CONTIGUOUS'), ndpointer(ctypes.c_ubyte, flags='C_CONTIGUOUS')]
calculate_similarity.restype = ctypes.c_double

DEFAULT_THRESHOLD = 0.67
def compare_face(image_mat1, image_mat2, match_threshold=DEFAULT_THRESHOLD):
    result = ""
    if image_mat1 is None:
        result = "Failed to open image1"
        return result, None, None, None

    if image_mat2 is None:
        result = "Failed to open image2"
        return result, None, None, None
    
    face_bbox_1 = np.zeros([4], dtype=np.int32)
    template_1 = np.zeros([2048], dtype=np.uint8)
    template_len_1 = np.zeros([1], dtype=np.int32)
    width_1 = image_mat1.shape[1]
    height_1 = image_mat1.shape[0]

    ret = extract_template(image_mat1, width_1, height_1, face_bbox_1, template_1, template_len_1)
    if ret <= 0:
        if ret == ENGINE_CODE.E_ACTIVATION_ERROR.value:
            result = "ACTIVATION ERROR"
        elif ret == ENGINE_CODE.E_ENGINE_INIT_ERROR.value:
            result = "ENGINE INIT ERROR"
        elif ret == ENGINE_CODE.E_NO_FACE.value:
            result = "NO FACE in image1"
        return result, None, None, None
    

    face_bbox_2 = np.zeros([4], dtype=np.int32)
    template_2 = np.zeros([2048], dtype=np.uint8)
    template_len_2 = np.zeros([1], dtype=np.int32)
    width_2 = image_mat2.shape[1]
    height_2 = image_mat2.shape[0]

    ret = extract_template(image_mat2, width_2, height_2, face_bbox_2, template_2, template_len_2)
    if ret <= 0:
        if ret == ENGINE_CODE.E_ACTIVATION_ERROR.value:
            result = "ACTIVATION ERROR"
        elif ret == ENGINE_CODE.E_ENGINE_INIT_ERROR.value:
            result = "ENGINE INIT ERROR"
        elif ret == ENGINE_CODE.E_NO_FACE.value:
            result = "NO FACE in image2"
        return result, None, None, None

    match_score = calculate_similarity(template_1, template_2)
    if match_score > match_threshold:
        result = "SAME PERSON"
    else:
        result = "DIFFERENT PERSON"

    return result, match_score, [face_bbox_1, face_bbox_2], [template_1, template_2]