|
|
|
import argparse |
|
import cv2 |
|
import torch |
|
import numpy as np |
|
import ctypes |
|
import os.path |
|
import time |
|
|
|
from face_detect.detect_imgs import get_face_boundingbox |
|
from face_landmark.GetLandmark import get_face_landmark |
|
from face_feature.GetFeature import get_face_feature |
|
from face_pose.GetPose import get_face_pose |
|
import face_manage.manage as db_manage |
|
|
|
def GetImageInfo(image, faceMaxCount): |
|
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) |
|
|
|
start_time = time.time() * 1000 |
|
boxes, scores = get_face_boundingbox(image) |
|
boxes = boxes[:faceMaxCount] |
|
scores = scores[:faceMaxCount] |
|
count = len(boxes) |
|
bboxes = [] |
|
bscores = [] |
|
for idx in range(count): |
|
bboxes.append(boxes[idx].data.numpy()) |
|
bscores.append(scores[idx].data.numpy()) |
|
|
|
|
|
|
|
start_time = time.time() * 1000 |
|
landmarks = [] |
|
for idx in range(count): |
|
landmarks.append(get_face_landmark(gray_image, boxes[idx]).data.numpy()) |
|
|
|
|
|
|
|
poses = [] |
|
for idx in range(count): |
|
poses.append(get_face_pose(boxes[idx], landmarks[idx])) |
|
|
|
|
|
start_time = time.time() * 1000 |
|
features = [] |
|
alignimgs = [] |
|
for idx in range(count): |
|
alignimg, feature = get_face_feature(image, landmarks[idx]) |
|
features.append(feature) |
|
alignimgs.append(alignimg) |
|
print("Feature extraction time = %s ms" % (time.time() * 1000 - start_time)) |
|
|
|
|
|
if 0: |
|
for idx in range(count): |
|
print_image = image.copy() |
|
box = boxes[idx].numpy() |
|
print(">>>>>>>>: ", box) |
|
landmark = landmarks[idx] |
|
cv2.rectangle(print_image, (int(box[0]), int(box[1])), (int(box[2]), int(box[3])), (0, 0, 255), 2) |
|
for p in range(68): |
|
cv2.circle(print_image, (int(landmark[p * 2]), int(landmark[p * 2 + 1])), 1, (255,255,255)) |
|
cv2.imshow("face recognition", print_image) |
|
cv2.waitKey() |
|
|
|
return count, bboxes, bscores, landmarks, alignimgs, features |
|
|
|
def get_similarity(feat1, feat2): |
|
return (np.sum(feat1 * feat2) + 1) * 50 |
|
|
|
if __name__ == '__main__': |
|
threshold = 75 |
|
test_directory = 'test' |
|
|
|
efn = os.getcwd() + "/test/1.png" |
|
img = cv2.imread(efn, cv2.IMREAD_COLOR) |
|
count, boxes, scores, landmarks, alignimgs, features1 = GetImageInfo(img, 5) |
|
|
|
vfn = os.getcwd() + "/test/3.png" |
|
img = cv2.imread(vfn, cv2.IMREAD_COLOR) |
|
count, boxes, scores, landmarks, alignimgs, features2 = GetImageInfo(img, 5) |
|
|
|
score = get_similarity(features1[0], features2[0]) |
|
print('score = ', score) |
|
if score > threshold: |
|
print('same person') |
|
else: |
|
print('different person') |
|
|