欢迎光临苏州海卡电子有限公司官方网站!
咨询热线:13375189757
新闻资讯



苏州海卡电子有限公司(总部)
电话:0512 -66032751 
   0512 - 66032752

在线QQ点击这里给我发消息
苏州市吴中区长蠡路99号吴中科技园402室

利用MTCNN和facenet实现人脸检测和人脸识别
  • 作者:
  • 来源:
  • 日期 : 2019-05-15
目录
利用MTCNN和facenet实现人脸检测和人脸识别
一、项目结构:
二、实现流程
三、Multi-task CNN(MTCNN)人脸检测
四、faceNet人脸识别
五、产生数据库
(1)制作人脸数据图库:
(2)生成embedding数据库
六、人脸识别过程
(1)加载人脸数据库
(2)进行人脸检测
(3)人脸识别(比较相似性)
(4)人脸识别效果
七、模型测评
八、参考资料:
 

一、项目结构:


    打开FaceNet Github地址: https://github.com/davidsandberg/facenet,把我们需要的文件拷贝到自己独立的工程中,(1)align文件夹,(2)facenet.py文件:
align:这个文件夹是从facenet中拷贝的,https://github.com/davidsandberg/facenet/tree/master/src/align,主要是MTCNN人脸检测的相关文件
facenet.py:这个Python文件也是从facenet中拷贝的,https://github.com/davidsandberg/facenet/blob/master/src/facenet.py
    其他文件介绍
dataset:这个文件夹主要存放数据,如人脸数据库
utils:这个文件是工具类文件,用于文件读写,图像相关操作的函数方法等
models:存放facenet预训练模型,百度网盘下载地址:链接: https://pan.baidu.com/s/1hAK9ylURkbeH52BtSSGWsw 提取码: jf1n 
Pre-trained models:
Model name LFW accuracy Training dataset Architecture
20180408-102900 0.9905 CASIA-WebFace Inception ResNet v1
20180402-114759 0.9965 VGGFace2 Inception ResNet v1
 
NOTE: If you use any of the models, please do not forget to give proper credit to those providing the training dataset as well.

二、实现流程

1.通过MTCNN人脸检测模型,从照片中提取人脸图像。
2.把人脸图像输入到FaceNet,计算Embedding的特征向量。
3.比较特征向量间的欧式距离,判断是否为同一人,例如当特征距离小于1的时候认为是同一个人,特征距离大于1的时候认为是不同人。

三、Multi-task CNN(MTCNN)人脸检测

    人脸检测方法很多,如Dilb,OpenCV,OpenFace人脸检测等等,这里使用MTCNN进行人脸检测,一方面是因为其检测精度确实不错,另一方面facenet工程中,已经提供了用于人脸检测的mtcnn接口。  MTCNN是多任务级联CNN的人脸检测深度学习模型,该模型中综合考虑了人脸边框回归和面部关键点检测。在facenet工程中的位置是align/detect_face.py ,它的参数模型也保存在align文件夹下,分别是det1.npy,det2.npy,det3.npy
参考资料:
https://blog.csdn.net/qq_28618765/article/details/78127967
https://blog.csdn.net/gubenpeiyuan/article/details/80475307
    MTCNN一个深度卷积多任务的框架,这个框架利用了检测和对准之间固有的关系来增强他们的性能。特别是,在预测人脸及脸部标记点的时候,通过3个CNN级联的方式对任务进行从粗到精的处理。
Stage 1:使用P-Net是一个全卷积网络,用来生成候选窗和边框回归向量(bounding box regression vectors)。使用Bounding box regression的方法来校正这些候选窗,使用非极大值抑制(NMS)合并重叠的候选框。全卷积网络和Faster R-CNN中的RPN一脉相承。
Stage 2:使用R-Net改善候选窗。将通过P-Net的候选窗输入R-Net中,拒绝掉大部分false的窗口,继续使用Bounding box regression和NMS合并。
Stage 3:最后使用O-Net输出最终的人脸框和特征点位置。和第二步类似,但是不同的是生成5个特征点位置。


    这里提供一个使用MTCNN进行人脸检测的方法:

 
  1.  
    def detection_face(img):
  2.  
    minsize = 20 # minimum size of face
  3.  
    threshold = [0.6, 0.7, 0.7] # three steps's threshold
  4.  
    factor = 0.709 # scale factor
  5.  
    print('Creating networks and loading parameters')
  6.  
    with tf.Graph().as_default():
  7.  
    # gpu_memory_fraction = 1.0
  8.  
    # gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=gpu_memory_fraction)
  9.  
    # sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options, log_device_placement=False))
  10.  
    sess = tf.Session()
  11.  
    with sess.as_default():
  12.  
    pnet, rnet, onet = detect_face.create_mtcnn(sess, None)
  13.  
    bboxes, landmarks = detect_face.detect_face(img, minsize, pnet, rnet, onet, threshold, factor)
  14.  
    landmarks = np.transpose(landmarks)
  15.  
    bboxes = bboxes.astype(int)
  16.  
    bboxes = [b[:4] for b in bboxes]
  17.  
    landmarks_list=[]
  18.  
    for landmark in landmarks:
  19.  
    face_landmarks = [[landmark[j], landmark[j + 5]] for j in range(5)]
  20.  
    landmarks_list.append(face_landmarks)
  21.  
    return bboxes,landmarks_list
  22. 1
    当然,实际应用中,建议还是封装成一个类吧,方面初始化和单独调用:
注意:mtcnn人脸检测获得bboxes并不一定是正方形的矩形框,参数fixed指定等宽或者等高的bboxes,其实现方法可以参考get_square_bboxes()方法。当然啦,你也可以不调用get_square_bboxes()方法,直接resize成指定大小,也是OK的。

 
  1.  
    class Facedetection:
  2.  
    def __init__(self):
  3.  
    self.minsize = 30 # minimum size of face
  4.  
    self.threshold = [0.6, 0.7, 0.7] # three steps's threshold
  5.  
    self.factor = 0.709 # scale factor
  6.  
    print('Creating networks and loading parameters')
  7.  
    with tf.Graph().as_default():
  8.  
    # gpu_memory_fraction = 1.0
  9.  
    # gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=gpu_memory_fraction)
  10.  
    # sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options, log_device_placement=False))
  11.  
    sess = tf.Session()
  12.  
    with sess.as_default():
  13.  
    self.pnet, self.rnet, self.onet = detect_face.create_mtcnn(sess, None)
  14.  
    def detect_face(self,image,fixed=None):
  15.  
    '''
  16.  
    mtcnn人脸检测,
  17.  
    PS:人脸检测获得bboxes并不一定是正方形的矩形框,参数fixed指定等宽或者等高的bboxes
  18.  
    :param image:
  19.  
    :param fixed:
  20.  
    :return:
  21.  
    '''
  22.  
    bboxes, landmarks = detect_face.detect_face(image, self.minsize, self.pnet, self.rnet, self.onet, self.threshold, self.factor)
  23.  
    landmarks_list = []
  24.  
    landmarks=np.transpose(landmarks)
  25.  
    bboxes=bboxes.astype(int)
  26.  
    bboxes = [b[:4] for b in bboxes]
  27.  
    for landmark in landmarks:
  28.  
    face_landmarks = [[landmark[j], landmark[j + 5]] for j in range(5)]
  29.  
    landmarks_list.append(face_landmarks)
  30.  
    if fixed is not None:
  31.  
    bboxes,landmarks_list=self.get_square_bboxes(bboxes, landmarks_list, fixed)
  32.  
    return bboxes,landmarks_list
  33.  
     
  34.  
    def get_square_bboxes(self, bboxes, landmarks, fixed="height"):
  35.  
    '''
  36.  
    获得等宽或者等高的bboxes
  37.  
    :param bboxes:
  38.  
    :param landmarks:
  39.  
    :param fixed: width or height
  40.  
    :return:
  41.  
    '''
  42.  
    new_bboxes = []
  43.  
    for bbox in bboxes:
  44.  
    x1, y1, x2, y2 = bbox
  45.  
    w = x2 - x1
  46.  
    h = y2 - y1
  47.  
    center_x, center_y = (int((x1 + x2) / 2), int((y1 + y2) / 2))
  48.  
    if fixed == "height":
  49.  
    dd = h / 2
  50.  
    elif fixed == 'width':
  51.  
    dd = w / 2
  52.  
    x11 = int(center_x - dd)
  53.  
    y11 = int(center_y - dd)
  54.  
    x22 = int(center_x + dd)
  55.  
    y22 = int(center_y + dd)
  56.  
    new_bbox = (x11, y11, x22, y22)
  57.  
    new_bboxes.append(new_bbox)
  58.  
    return new_bboxes, landmarks
  59. 1

四、faceNet人脸识别

    FaceNet Github地址: https://github.com/davidsandberg/facenet
    参考资料:https://blog.csdn.net/fire_light_/article/details/79592804
    Google工程师Florian Schroff,Dmitry Kalenichenko,James Philbin提出了人脸识别FaceNet模型,该模型没有用传统的softmax的方式去进行分类学习,而是抽取其中某一层作为特征,学习一个从图像到欧式空间的编码方法,然后基于这个编码再做人脸识别、人脸验证和人脸聚类等。
    FaceNet主要用于验证人脸是否为同一个人,通过人脸识别这个人是谁。FaceNet的主要思想是把人脸图像映射到一个多维空间,通过空间距离表示人脸的相似度。同个人脸图像的空间距离比较小,不同人脸图像的空间距离比较大。这样通过人脸图像的空间映射就可以实现人脸识别,FaceNet中采用基于深度神经网络的图像映射方法和基于triplets(三联子)的loss函数训练神经网络,网络直接输出为128维度的向量空间。
    FaceNet的网络结构如下图所示,其中Batch表示人脸的训练数据,接下来是深度卷积神经网络,然后采用L2归一化操作,得到人脸图像的特征表示,最后为三元组(Triplet Loss)的损失函数。

    下面是鄙人已经封装好的facenetEmbedding类,其中类函数get_embedding(self,images)方法用于提取facenet的人脸特征embadding,有了人脸embadding特征,就可以比较人脸相似性啦!

 
  1.  
    class facenetEmbedding:
  2.  
    def __init__(self,model_path):
  3.  
    self.sess = tf.InteractiveSession()
  4.  
    self.sess.run(tf.global_variables_initializer())
  5.  
    # Load the model
  6.  
    facenet.load_model(model_path)
  7.  
    # Get input and output tensors
  8.  
    self.images_placeholder = tf.get_default_graph().get_tensor_by_name("input:0")
  9.  
    self.tf_embeddings = tf.get_default_graph().get_tensor_by_name("embeddings:0")
  10.  
    self.phase_train_placeholder = tf.get_default_graph().get_tensor_by_name("phase_train:0")
  11.  
     
  12.  
    def get_embedding(self,images):
  13.  
    feed_dict = {self.images_placeholder: images, self.phase_train_placeholder: False}
  14.  
    embedding = self.sess.run(self.tf_embeddings, feed_dict=feed_dict)
  15.  
    return embedding
  16.  
    def free(self):
  17.  
    self.sess.close()
  18. 1

五、产生数据库

   既然是人脸识别,数据库肯定要有已知人脸的数据库,不然怎么知道被检测的人脸是哪位大神,所以先制作人脸数据库。

(1)制作人脸数据图库:

    把相关大神的人像收集放在dataset/images文件夹下:

 


特别说明:
  1. 这里只收集了4张胡歌和4张周杰伦的单人照片,
  2. 注意制作人脸数据图库时,所使用的照片必须是单人照片!!!
  3. 若需要新增图库,只需在dataset/images下,新建一个文件夹,如,新增“xietingfeng”(谢霆锋)的文件夹,然后把谢霆锋的单人照片放在里面即可,图片名称可以是任意
  4. 函数image_list,names_list=file_processing.gen_files_labels(images_dir,postfix='jpg')可以获取目录images_dir下所有文件,包括子目录下的所有文件路径(image_list),其中names_list就是子目录的文件名,一般子目录作为样本的标签。

(2)生成embedding数据库

    有了人脸数据图库,就可以使用create_dataset.py生成embedding数据库(人脸特征),后面待检测识别的人脸,只需要与这些embedding数据库(人脸特征)进行相似性比较,就可以识别人脸啦!!!!
opencv-python的imread()函数并不支持中文路径,这里在提供一个函数read_image_gbk()方便读取中文路径的图像。详细请看image_processing.py文件

 
  1.  
    # -*-coding: utf-8 -*-
  2.  
    """
  3.  
    @Project: faceRecognition
  4.  
    @File : create_dataset.py
  5.  
    @Author : panjq
  6.  
    @E-mail : pan_jinquan@163.com
  7.  
    @Date : 2018-12-07 11:31:09
  8.  
    """
  9.  
    import numpy as np
  10.  
    from utils import image_processing , file_processing,debug
  11.  
    import face_recognition
  12.  
    import cv2
  13.  
    import os
  14.  
     
  15.  
    resize_width = 160
  16.  
    resize_height = 160
  17.  
     
  18.  
     
  19.  
    def get_face_embedding(model_path,files_list, names_list):
  20.  
    '''
  21.  
    获得embedding数据
  22.  
    :param files_list: 图像列表
  23.  
    :param names_list: 与files_list一一的名称列表
  24.  
    :return:
  25.  
    '''
  26.  
    # 转换颜色空间RGB or BGR
  27.  
    colorSpace="RGB"
  28.  
    # 初始化mtcnn人脸检测
  29.  
    face_detect = face_recognition.Facedetection()
  30.  
    # 初始化facenet
  31.  
    face_net = face_recognition.facenetEmbedding(model_path)
  32.  
     
  33.  
    embeddings=[] # 用于保存人脸特征数据库
  34.  
    label_list=[] # 保存人脸label的名称,与embeddings一一对应
  35.  
    for image_path, name in zip(files_list, names_list):
  36.  
    print("processing image :{}".format(image_path))
  37.  
    # image_path='E:/Face/dataset/bzl/subjectphoto_with_name/谢伟林_179_180.jpg'
  38.  
    image = image_processing.read_image_gbk(image_path, colorSpace=colorSpace)
  39.  
    # 进行人脸检测,获得bounding_box
  40.  
    bboxes, landmarks = face_detect.detect_face(image)
  41.  
    bboxes, landmarks =face_detect.get_square_bboxes(bboxes, landmarks,fixed="height")
  42.  
    # image_processing.show_image_boxes("image",image,bboxes)
  43.  
    if bboxes == [] or landmarks == []:
  44.  
    print("-----no face")
  45.  
    continue
  46.  
    if len(bboxes) >= 2 or len(landmarks) >= 2:
  47.  
    print("-----image have {} faces".format(len(bboxes)))
  48.  
    continue
  49.  
    # 获得人脸区域
  50.  
    face_images = image_processing.get_bboxes_image(image, bboxes, resize_height, resize_width)
  51.  
    # 人脸预处理,归一化
  52.  
    face_images = image_processing.get_prewhiten_images(face_images,normalization=True)
  53.  
    # 获得人脸特征
  54.  
    pred_emb = face_net.get_embedding(face_images)
  55.  
    embeddings.append(pred_emb)
  56.  
    # 可以选择保存image_list或者names_list作为人脸的标签
  57.  
    # 测试时建议保存image_list,这样方便知道被检测人脸与哪一张图片相似
  58.  
    # label_list.append(image_path)
  59.  
    label_list.append(name)
  60.  
    return embeddings,label_list
  61.  
     
  62.  
    def create_face_embedding(model_path,dataset_path,out_emb_path,out_filename):
  63.  
    '''
  64.  
     
  65.  
    :param model_path: faceNet模型路径
  66.  
    :param dataset_path: 人脸数据库路径,每一类单独一个文件夹
  67.  
    :param out_emb_path: 输出embeddings的路径
  68.  
    :param out_filename: 输出与embeddings一一对应的标签
  69.  
    :return: None
  70.  
    '''
  71.  
    files_list,names_list=file_processing.gen_files_labels(dataset_path,postfix='jpg')
  72.  
    embeddings,label_list=get_face_embedding(model_path,files_list, names_list)
  73.  
    print("label_list:{}".format(label_list))
  74.  
    print("have {} label".format(len(label_list)))
  75.  
     
  76.  
    embeddings=np.asarray(embeddings)
  77.  
    np.save(out_emb_path, embeddings)
  78.  
    file_processing.write_data(out_filename, label_list, model='w')
  79.  
     
  80.  
    if __name__ == '__main__':
  81.  
    model_path = 'models/20180408-102900'
  82.  
    dataset_path='dataset/images'
  83.  
    out_emb_path = 'dataset/emb/faceEmbedding.npy'
  84.  
    out_filename = 'dataset/emb/name.txt'
  85. 1

六、人脸识别过程

(1)加载人脸数据库

     把上面制作的,已知的人脸数据库加载进来:

 
  1.  
    def load_dataset(dataset_path,filename):
  2.  
    '''
  3.  
    加载人脸数据库
  4.  
    :param dataset_path: embedding.npy文件(faceEmbedding.npy)
  5.  
    :param filename: labels文件路径路径(name.txt)
  6.  
    :return:
  7.  
    '''
  8.  
    compare_emb=np.load(dataset_path)
  9.  
    names_list=file_processing.read_data(filename,split=False)
  10.  
    return compare_emb,names_list
  11. 1

(2)进行人脸检测


 
  1.  
    def face_recognition_image(model_path,dataset_path, filename,image_path):
  2.  
    # 加载数据库的数据
  3.  
    dataset_emb,names_list=load_dataset(dataset_path, filename)
  4.  
    # 初始化mtcnn人脸检测
  5.  
    face_detect=face_recognition.Facedetection()
  6.  
    # 初始化facenet
  7.  
    face_net=face_recognition.facenetEmbedding(model_path)
  8.  
     
  9.  
    image = image_processing.read_image_gbk(image_path)
  10.  
    # 获取 判断标识 bounding_box crop_image
  11.  
    bboxes, landmarks = face_detect.detect_face(image)
  12.  
    bboxes, landmarks = face_detect.get_square_bboxes(bboxes, landmarks, fixed="height")
  13.  
    if bboxes == [] or landmarks == []:
  14.  
    print("-----no face")
  15.  
    exit(0)
  16.  
    print("-----image have {} faces".format(len(bboxes)))
  17.  
    face_images = image_processing.get_bboxes_image(image, bboxes, resize_height, resize_width)
  18.  
    face_images = image_processing.get_prewhiten_images(face_images)
  19.  
    pred_emb=face_net.get_embedding(face_images)
  20.  
    pred_name,pred_score=compare_embadding(pred_emb, dataset_emb, names_list)
  21.  
    # 在图像上绘制人脸边框和识别的结果
  22.  
    show_info=[ n+':'+str(s)[:5] for n,s in zip(pred_name,pred_score)]
  23.  
    image_processing.show_image_text("face_recognition", image,bboxes,show_info)
  24. 1

(3)人脸识别(比较相似性)

    比较特征向量间的欧式距离

 
  1.  
     
  2.  
    def compare_embadding(pred_emb, dataset_emb, names_list,threshold=0.65):
  3.  
    # 为bounding_box 匹配标签
  4.  
    pred_num = len(pred_emb)
  5.  
    dataset_num = len(dataset_emb)
  6.  
    pred_name = []
  7.  
    pred_score=[]
  8.  
    for i in range(pred_num):
  9.  
    dist_list = []
  10.  
    for j in range(dataset_num):
  11.  
    dist = np.sqrt(np.sum(np.square(np.subtract(pred_emb[i, :], dataset_emb[j, :]))))
  12.  
    dist_list.append(dist)
  13.  
    min_value = min(dist_list)
  14.  
    pred_score.append(min_value)
  15.  
    if (min_value > threshold):
  16.  
    pred_name.append('unknow')
  17.  
    else:
  18.  
    pred_name.append(names_list[dist_list.index(min_value)])
  19.  
    return pred_name,pred_score
  20. 1

(4)人脸识别效果

    一切准备好了,开始run:

 
  1.  
    if __name__=='__main__':
  2.  
    model_path='models/20180408-102900'
  3.  
    dataset_path='dataset/emb/faceEmbedding.npy'
  4.  
    filename='dataset/emb/name.txt'
  5.  
    image_path='dataset/test_images/1.jpg'
  6.  
    face_recognition_image(model_path, dataset_path, filename,image_path)
  7. 1
    说明:
为了方便测试,  这里以文件的路径作为人脸label,这样方便知道被检测人脸与哪一张图片最相似
./dataset/emb_face\huge\huge_1.jpg
./dataset/emb_face\huge\huge_2.jpg
./dataset/emb_face\huge\huge_3.jpg
./dataset/emb_face\huge\huge_4.jpg
./dataset/emb_face\zhoujielun\zhoujielun_1.jpg
./dataset/emb_face\zhoujielun\zhoujielun_2.jpg
./dataset/emb_face\zhoujielun\zhoujielun_3.jpg
./dataset/emb_face\zhoujielun\zhoujielun_4.jpg
对应的label是:
huge
huge
huge
huge
zhoujielun
zhoujielun
zhoujielun
zhoujielun

七、模型测评

    为了对faceNed性能进行测评,这里提供一个测评文件:evaluation_test.py,该文件会绘制测试文件的ROC曲线,并给出最优阈值,以及FPR, TPR, AUC等参数。
这里的测试数据集是agedb_30,该数据集共有12000张,分为6000对照片,每对照片有一个label,即True和False,对应1和0,表示该对照片是否是同一个人;利用该数据集,就可以绘制模型的ROC曲线了

 
  1.  
    # -*- coding: utf-8 -*-
  2.  
     
  3.  
    import os
  4.  
    import pickle
  5.  
    from utils import image_processing,file_processing,evaluation
  6.  
    import cv2
  7.  
    import PIL.Image as Image
  8.  
    import numpy as np
  9.  
    import matplotlib.pyplot as plt
  10.  
    from sklearn import metrics
  11.  
    import face_recognition
  12.  
     
  13.  
    def load_npy(dir_path):
  14.  
    issames_path=os.path.join(dir_path,"issames.npy")
  15.  
    pred_score_path=os.path.join(dir_path,"pred_score.npy")
  16.  
    issames=np.load(issames_path)
  17.  
    pred_score=np.load(pred_score_path)
  18.  
    return pred_score,issames
  19.  
     
  20.  
    def load_bin(path, image_size=[112,112]):
  21.  
    '''
  22.  
    加载人脸bin文件数据,bin_files = ['agedb_30', 'cfp_fp', 'lfw', 'calfw', 'cfp_ff', 'cplfw', 'vgg2_fp']
  23.  
    :param path:
  24.  
    :param image_size:
  25.  
    :return:
  26.  
    '''
  27.  
    bins, issame_list = pickle.load(open(path, 'rb'), encoding='bytes')
  28.  
    data=[]
  29.  
    for i in range(len(bins)):
  30.  
    _bin = bins[i]
  31.  
    img = cv2.imdecode(_bin, -1) # opencv image is bgr
  32.  
    img = image_processing.resize_image(img,resize_height=image_size[0],resize_width=image_size[1])
  33.  
    # image_processing.show_image("src",img)
  34.  
    data.append(img)
  35.  
    i += 1
  36.  
    if i % 1000 == 0:
  37.  
    print('loading bin', i)
  38.  
    data = np.array(data)
  39.  
    issames = np.array(issame_list)
  40.  
    return data, issames
  41.  
     
  42.  
    def split_data(data):
  43.  
    '''
  44.  
    按照奇偶项分割数据
  45.  
    :param data:
  46.  
    :return:
  47.  
    '''
  48.  
    data1 = data[0::2]
  49.  
    data2 = data[1::2]
  50.  
    return data1,data2
  51.  
     
  52.  
    def get_pair_scores(faces_data, issames_data, model_path, save_path=None):
  53.  
    '''
  54.  
    计算分数
  55.  
    :param faces_data:
  56.  
    :param issames_data:
  57.  
    :param model_path: insightFace模型路径
  58.  
    :param save_path:
  59.  
    :return:
  60.  
    '''
  61.  
    faces_list1,faces_list2 = split_data(faces_data)
  62.  
    face_net=face_recognition.facenetEmbedding(model_path)
  63.  
     
  64.  
    pred_score=[]
  65.  
    i=0
  66.  
    for face1,face2,issame in zip(faces_list1, faces_list2, issames_data):
  67.  
    # pred_id, pred_scores = faceRec.predict(faces)
  68.  
    # 或者使用get_faces_embedding()获得embedding,再比较compare_embedding()
  69.  
    face_images1 = image_processing.get_prewhiten_images([face1],normalization=False)
  70.  
    face_images2 = image_processing.get_prewhiten_images([face2],normalization=False)
  71.  
     
  72.  
    face_emb1=face_net.get_embedding(face_images1)
  73.  
    face_emb2=face_net.get_embedding(face_images2)
  74.  
     
  75.  
    # face_emb1 = face_net.get_faces_embedding([face1])
  76.  
    # face_emb2 = face_net.get_faces_embedding([face2])
  77.  
    dist = np.sqrt(np.sum(np.square(np.subtract(face_emb1, face_emb2))))
  78.  
    pred_score.append(dist)
  79.  
    i += 1
  80.  
    if i % 100 == 0:
  81.  
    print('processing data :', i)
  82.  
    pred_score=np.array(pred_score).reshape(-1)
  83.  
    issames_data= issames_data + 0 # 将true和false转为1/0
  84.  
    if save_path is not None:
  85.  
    issames_path = os.path.join(save_path, "issames.npy")
  86.  
    pred_score_path = os.path.join(save_path, "pred_score.npy")
  87.  
    np.save(issames_path, issames_data)
  88.  
    np.save(pred_score_path,pred_score)
  89.  
    return pred_score, issames_data
  90.  
     
  91.  
    if __name__=='__main__':
  92.  
    # bin_files = ['agedb_30', 'cfp_fp', 'lfw', 'calfw', 'cfp_ff', 'cplfw', 'vgg2_fp']
  93.  
    bin_path='./dataset/faces_emore/agedb_30.bin'
  94.  
    model_path = './models/20180408-102900'
  95.  
    # 加载bin测试数据
  96.  
    faces_data, issames_data=load_bin(bin_path,image_size=[160,160])
  97.  
     
  98.  
    # 计算分数
  99.  
    save_path="./dataset/faces_emore"
  100.  
    pred_score, issames_data=get_pair_scores(faces_data, issames_data, model_path, save_path=save_path)
  101.  
    pred_score, issames_data=load_npy(dir_path=save_path)
  102.  
     
  103.  
    # 计算roc曲线
  104.  
    fpr, tpr, roc_auc, threshold, optimal_idx=evaluation.get_roc_curve(y_true=issames_data, y_score=pred_score, invert=True, plot_roc=True)
  105.  
     
  106.  
    print("fpr:{}".format(fpr))
  107.  
    print("tpr:{}".format(tpr))
  108.  
    print("threshold:{}".format(threshold))
  109.  
    print("roc_auc:{}".format(roc_auc))
  110.  
    print("optimal_idx :{},best_threshold :{} ".format(optimal_idx,threshold[optimal_idx]))
  111.  
     
  112.  
    # 测评数据保存
  113.  
    evaluation.save_evaluation(fpr, tpr, roc_auc, "evaluation.npz")
  114.  
     
  115.  
    # 加载测评数据
  116.  
    fpr, tpr, roc_auc=evaluation.load_evaluation("evaluation.npz")
  117.  
    evaluation.plot_roc_curve(fpr_list=[fpr], tpr_list=[tpr], roc_auc_list=[roc_auc], line_names=["FaceNet"])
  118. 1
对应的ROC曲线如下:optimal_idx :1038,最佳阈值:best_threshold :1.1444087028503418 
 


地址:苏州市吴中区长桥街道长蠡路99号吴中科技园402室
电话: 0512 -66032751   ,  0512 - 66032752
手机:13375189757  , QQ:1303004171
手机:13372170866  ,QQ:190563566


 
本站部分图文来源网络,如有侵权问题请通知我们处理!
  • 在线客服一
  • 在线客服二
  • 返回顶部
  • 分享网页