face_recognition realizes face similarity comparison

face_recognition

face_recognition is a very famous open source toolkit for face recognition on github, we can install it in the python environment with the following instructions

$ pip install face_recognition

Load face image

image = face_recognition.load_image_file(src)

insert image description here

Get image face positioning [(top, right, bottom, left )]

face_locations = face_recognition.face_locations(image)
img  = image[face_locations[0][0]:face_locations[0][2],face_locations[0][3]:face_locations[0][1]]

insert image description here

Encode face images

face_encoding = face_recognition.face_encodings(image, face_locations)[0]

insert image description here

Description: Given a picture of the face you want to recognize and encode it (only one per person is needed), build a list of these different face encodings. Encoding is actually to map the face picture into a 128-dimensional feature vector.

Simple judgment of face similarity, built-in function

def theSamePerson(one_pic,two_pic):
    '''
    给定两张图片,判断是否是同一个人
    '''
    chenglong = face_recognition.load_image_file(one_pic)
    unknown_image = face_recognition.load_image_file(two_pic)
    biden_encoding = face_recognition.face_encodings(chenglong)[0]
    unknown_encoding = face_recognition.face_encodings(unknown_image)[0]
    results = face_recognition.compare_faces([biden_encoding], unknown_encoding,tolerance=0.35)
    print('results: ',results)
    return results[0]

insert image description here

Custom cosine similarity to compare face similarity

def getFaceEncoding(src):
    image = face_recognition.load_image_file(src)
    face_locations = face_recognition.face_locations(image)
    img_  = image[face_locations[0][0]:face_locations[0][2],face_locations[0][3]:face_locations[0][1]]#人脸范围
    face_encoding = face_recognition.face_encodings(image, face_locations)[0]
    return face_encoding
def simcos(A,B):
    A=np.array(A)
    B=np.array(B)
    dist = np.linalg.norm(A - B) # 二范数
    sim = 1.0 / (1.0 + dist) #
    return sim
def main():
    src1,src2 = sys.argv[1],sys.argv[2]#两张图片路径
    xl1=getFaceEncoding(src1)
    xl2=getFaceEncoding(src2)
    face_distances = face_recognition.face_distance([xl1], xl2)
    value=simcos(xl1,xl2)
    if value>0.75:
        print(True)
    else:
        print(False)

full code

import face_recognition
import numpy as np
import sys
import cv2

def display(img):#查看图片
    cv2.imshow("img",img)
    cv2.waitKey()
    cv2.destroyAllWindows()
def getFaceEncoding(src):
    image = face_recognition.load_image_file(src)
    face_locations = face_recognition.face_locations(image)
    img_  = image[face_locations[0][0]:face_locations[0][2],face_locations[0][3]:face_locations[0][1]]
    img_ = cv2.cvtColor(img_, cv2.COLOR_BGR2RGB)
    #display(img_)
    face_encoding = face_recognition.face_encodings(image, face_locations)[0]
    return face_encoding
def simcos(A,B):
    A=np.array(A)
    B=np.array(B)
    dist = np.linalg.norm(A - B) # 二范数
    sim = 1.0 / (1.0 + dist) #
    return sim

def theSamePerson(one_pic,two_pic):
    '''
    给定两张图片,判断是否是同一个人
    '''
    chenglong = face_recognition.load_image_file(one_pic)
    unknown_image = face_recognition.load_image_file(two_pic)
    biden_encoding = face_recognition.face_encodings(chenglong)[0]
    unknown_encoding = face_recognition.face_encodings(unknown_image)[0]
    results = face_recognition.compare_faces([biden_encoding], unknown_encoding,tolerance=0.35)
    print('results: ',results)
    return results[0]

def main():
    src1,src2 = sys.argv[1],sys.argv[2]
    #theSamePerson(src1,src2)
    xl1=getFaceEncoding(src1)
    xl2=getFaceEncoding(src2)
    face_distances = face_recognition.face_distance([xl1], xl2)
    value=simcos(xl1,xl2)
    if value>0.75:
        print(True)
    else:
        print(False)

main()

insert image description here
insert image description here
insert image description here

Note: The above pictures are all fake pictures generated by stylegan.

extension

Can be used as an access control system or face login

import face_recognition
import os
import numpy as np

cache_dir = "output/cache"


def save_file(vector,name):
    root = os.path.dirname(name)
    if(not os.path.exists(root)):
        os.mkdir(root)
    np.save(name,vector)


def getFaceEncoding(src):
    name = "output/cache/" +os.path.basename(src).split(".")[0]
    image = face_recognition.load_image_file(src)
    face_locations = face_recognition.face_locations(image)
    face_encoding = face_recognition.face_encodings(image, face_locations)[0]
    save_file(face_encoding,name)
    return face_encoding

def theSamePerson(pic,cache_dir):
    '''
    给定两张图片,判断是否是同一个人
    '''
    pic1 = face_recognition.load_image_file(pic)
    face_locations = face_recognition.face_locations(pic1)
    face_encoding = face_recognition.face_encodings(pic1, face_locations)[0]

    all_meber = os.listdir(cache_dir)
    for meber in all_meber:
    	current_name = meber.split(".")[0]
    	current_file = cache_dir + "/" + meber
    	current_meber_encoding = np.load(current_file)
    	results = face_recognition.compare_faces([face_encoding],current_meber_encoding,tolerance=0.35)
    	if (results == [True]):
    		return current_name

    return "not exists!"



def main():
    #file = "output/jingjing.png"
    #getFaceEncoding(file)
    file1 = "output/image0000-target.png"
    name = theSamePerson(file1,cache_dir)
    print ("This meber is ",name)

    
main()

insert image description here
Idea: We store the face codes and build a face information database.
Then we give a picture to test.

Guess you like

Origin blog.csdn.net/qq_38641985/article/details/121034867