zoukankan      html  css  js  c++  java
  • python 人脸识别

    """Performs face alignment and calculates L2 distance between the embeddings of images."""
    
    # MIT License
    # 
    # Copyright (c) 2016 David Sandberg
    # 
    # Permission is hereby granted, free of charge, to any person obtaining a copy
    # of this software and associated documentation files (the "Software"), to deal
    # in the Software without restriction, including without limitation the rights
    # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    # copies of the Software, and to permit persons to whom the Software is
    # furnished to do so, subject to the following conditions:
    # 
    # The above copyright notice and this permission notice shall be included in all
    # copies or substantial portions of the Software.
    # 
    # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    # SOFTWARE.
    
    from __future__ import absolute_import
    from __future__ import division
    from __future__ import print_function
    
    from scipy import misc
    import tensorflow as tf
    import numpy as np
    import sys
    import os
    import argparse
    import facenet
    import align.detect_face
    
    def main():
        model = "../models/20170216-091149"
        image_files = ['compare_images/index10.png', 'compare_images/index73.png']
        image_size = 160
        margin = 44
        gpu_memory_fraction = 0.5
    
        images = load_and_align_data(image_files, image_size, margin, gpu_memory_fraction)
        with tf.Graph().as_default():
    
            with tf.Session() as sess:
          
                # Load the model
                facenet.load_model(model)
    
                # Get input and output tensors
                images_placeholder = tf.get_default_graph().get_tensor_by_name("input:0")
                embeddings = tf.get_default_graph().get_tensor_by_name("embeddings:0")
                phase_train_placeholder = tf.get_default_graph().get_tensor_by_name("phase_train:0")
    
                # Run forward pass to calculate embeddings
                feed_dict = { images_placeholder: images, phase_train_placeholder:False }
                emb = sess.run(embeddings, feed_dict=feed_dict)
                
                nrof_images = len(image_files)
    
                print('Images:')
                for i in range(nrof_images):
                    print('%1d: %s' % (i, image_files[i]))
                print('')
                
                # Print distance matrix
                print('Distance matrix')
                print('    ', end='')
                for i in range(nrof_images):
                    print('    %1d     ' % i, end='')
                print('')
                for i in range(nrof_images):
                    print('%1d  ' % i, end='')
                    for j in range(nrof_images):
                        dist = np.sqrt(np.sum(np.square(np.subtract(emb[i,:], emb[j,:]))))
                        print('  %1.4f  ' % dist, end='')
                    print('')
                
                
    def load_and_align_data(image_paths, image_size, margin, gpu_memory_fraction):
    
        minsize = 20 # minimum size of face
        threshold = [ 0.6, 0.7, 0.7 ]  # three steps's threshold
        factor = 0.709 # scale factor
        
        print('Creating networks and loading parameters')
        with tf.Graph().as_default():
            gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=gpu_memory_fraction)
            sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options, log_device_placement=False))
            with sess.as_default():
                pnet, rnet, onet = align.detect_face.create_mtcnn(sess, None)
      
        nrof_samples = len(image_paths)
        img_list = [None] * nrof_samples
        for i in range(nrof_samples):
            img = misc.imread(os.path.expanduser(image_paths[i]))
            img_size = np.asarray(img.shape)[0:2]
            bounding_boxes, _ = align.detect_face.detect_face(img, minsize, pnet, rnet, onet, threshold, factor)
            det = np.squeeze(bounding_boxes[0,0:4])
            bb = np.zeros(4, dtype=np.int32)
            bb[0] = np.maximum(det[0]-margin/2, 0)
            bb[1] = np.maximum(det[1]-margin/2, 0)
            bb[2] = np.minimum(det[2]+margin/2, img_size[1])
            bb[3] = np.minimum(det[3]+margin/2, img_size[0])
            cropped = img[bb[1]:bb[3],bb[0]:bb[2],:]
            aligned = misc.imresize(cropped, (image_size, image_size), interp='bilinear')
            prewhitened = facenet.prewhiten(aligned)
            img_list[i] = prewhitened
        images = np.stack(img_list)
        return images
    
    # def parse_arguments(argv):
    #     parser = argparse.ArgumentParser()
    #
    #     parser.add_argument('model', type=str, default="./models/20170216-091149",
    #         help='Could be either a directory containing the meta_file and ckpt_file or a model protobuf (.pb) file')
    #     parser.add_argument('image_files', type=str, default="src/compare_images/index10.png src/compare_images/index73.png "
    #         , nargs='+', help='Images to compare')
    #     parser.add_argument('--image_size', type=int,
    #         help='Image size (height, width) in pixels.', default=160)
    #     parser.add_argument('--margin', type=int,
    #         help='Margin for the crop around the bounding box (height, width) in pixels.', default=44)
    #     parser.add_argument('--gpu_memory_fraction', type=float,
    #         help='Upper bound on the amount of GPU memory that will be used by the process.', default=0.5)
    #     return parser.parse_args(argv)
    
    if __name__ == '__main__':
        main()
    """Validate a face recognizer on the "Labeled Faces in the Wild" dataset (http://vis-www.cs.umass.edu/lfw/).
    Embeddings are calculated using the pairs from http://vis-www.cs.umass.edu/lfw/pairs.txt and the ROC curve
    is calculated and plotted. Both the model metagraph and the model parameters need to exist
    in the same directory, and the metagraph should have the extension '.meta'.
    """
    # MIT License
    #
    # Copyright (c) 2016 David Sandberg
    #
    # Permission is hereby granted, free of charge, to any person obtaining a copy
    # of this software and associated documentation files (the "Software"), to deal
    # in the Software without restriction, including without limitation the rights
    # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    # copies of the Software, and to permit persons to whom the Software is
    # furnished to do so, subject to the following conditions:
    #
    # The above copyright notice and this permission notice shall be included in all
    # copies or substantial portions of the Software.
    #
    # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    # SOFTWARE.
    
    from __future__ import absolute_import
    from __future__ import division
    from __future__ import print_function
    
    import tensorflow as tf
    import numpy as np
    import argparse
    import facenet
    import lfw
    import os
    import sys
    import math
    from sklearn import metrics
    from scipy.optimize import brentq
    from scipy import interpolate
    import numpy
    from PIL import Image,ImageDraw
    import cv2
    
    from scipy import misc
    import argparse
    import align.detect_face
    
    def detetet_face_init():
        cap = cv2.VideoCapture(0)
        print(cap.isOpened())
        classifier=cv2.CascadeClassifier("./xml/haarcascade_frontalface_alt.xml")
        count=0
        return cap,classifier,count
    
    def detect_face_clear():
        cap.release()
        cv2.destroyAllWindows()
    
    def load_and_align_data(image_paths, image_size, margin, gpu_memory_fraction):
    
        minsize = 20 # minimum size of face
        threshold = [ 0.6, 0.7, 0.7 ]  # three steps's threshold
        factor = 0.709 # scale factor
        
        print('Creating networks and loading parameters')
        with tf.Graph().as_default():
            gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=gpu_memory_fraction)
            sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options, log_device_placement=False))
            with sess.as_default():
                pnet, rnet, onet = align.detect_face.create_mtcnn(sess, None)
      
        nrof_samples = len(image_paths)
        img_list = [None] * nrof_samples
        for i in range(nrof_samples):
            img = misc.imread(os.path.expanduser(image_paths[i]))
            img_size = np.asarray(img.shape)[0:2]
            bounding_boxes, _ = align.detect_face.detect_face(img, minsize, pnet, rnet, onet, threshold, factor)
            det = np.squeeze(bounding_boxes[0,0:4])
            bb = np.zeros(4, dtype=np.int32)
            bb[0] = np.maximum(det[0]-margin/2, 0)
            bb[1] = np.maximum(det[1]-margin/2, 0)
            bb[2] = np.minimum(det[2]+margin/2, img_size[1])
            bb[3] = np.minimum(det[3]+margin/2, img_size[0])
            cropped = img[bb[1]:bb[3],bb[0]:bb[2],:]
            aligned = misc.imresize(cropped, (image_size, image_size), interp='bilinear')
            prewhitened = facenet.prewhiten(aligned)
            img_list[i] = prewhitened
        images = np.stack(img_list)
        return images
    
    def compare_facevec(facevec1, facevec2):
        dist = np.sqrt(np.sum(np.square(np.subtract(facevec1, facevec2))))
        #print('  %1.4f  ' % dist, end='')
        return dist
    
    def face_recognition_using_facenet():
        cap,classifier,count = detetet_face_init()
        model = "../models/20170216-091149"
        image_files = ['compare_images/index10.png', 'compare_images/index73.png']
        image_size = 160
        margin = 44
        gpu_memory_fraction = 0.5
        with tf.Graph().as_default():
            with tf.Session() as sess:
                # Load the model
                facenet.load_model(model)
    
                # Get input and output tensors
                images_placeholder = tf.get_default_graph().get_tensor_by_name("input:0")
                embeddings = tf.get_default_graph().get_tensor_by_name("embeddings:0")
                phase_train_placeholder = tf.get_default_graph().get_tensor_by_name("phase_train:0")
    
                #image_size = images_placeholder.get_shape()[1]  # For some reason this doesn't work for frozen graphs
                image_size = 160
                embedding_size = embeddings.get_shape()[1]
                index = 0
                th = 0.7
                face_recognition_tag = True
                color = (0,255,0)
                exist_face_vec = []
                face_detect_vec = []
                while count > -1:
                    ret,img = cap.read()
                    faceRects = classifier.detectMultiScale(img, 1.2, 2, cv2.CASCADE_SCALE_IMAGE,(20,20))
                    if len(faceRects)>0:
                        for faceRect in faceRects:
                                x, y, w, h = faceRect
                                #cv2.rectangle(img, (int(x), int(y)), (int(x)+int(w), int(y)+int(h)), (0,255,0), 2,0)
                                #print "save faceimg"
                                face_win = img[int(y):int(y) + int(h), int(x):int(x) + int(w)]
                                face_detect = cv2.resize(face_win,(image_size,image_size),interpolation=cv2.INTER_CUBIC)
                                #cv2.imwrite('faceimg/index' + str(index) + '.bmp', face_win)
                                # Run forward pass to calculate embeddings
                                #print('Runnning forward pass on face detect')
                                nrof_samples = 1
                                img_list = [None] * nrof_samples
                                prewhitened = facenet.prewhiten(face_detect)
                                img_list[0] = prewhitened
                                images = np.stack(img_list)
                                if index == 10:
                                    feed_dict = {images_placeholder:images, phase_train_placeholder:False }
                                    exist_face_vec = sess.run(embeddings, feed_dict=feed_dict)
                                elif index > 10  and index % 10 == 0:
                                    feed_dict = {images_placeholder:images, phase_train_placeholder:False }
                                    face_detect_vec = sess.run(embeddings, feed_dict=feed_dict) 
                                    cp = compare_facevec(face_detect_vec, exist_face_vec)
                                    print("index ", index, " dist ", cp)
                                    if cp < th:
                                        print(True)
                                        face_recognition_tag = True
                                    else:
                                        print(False)
                                        face_recognition_tag = False
                                index +=1
                                # if face_recognition_tag == True:
                                #     cv2.rectangle(img, (int(x), int(y)), (int(x)+int(w), int(y)+int(h)), (255,0,0), 2,0)
                                # else:
                                #     cv2.rectangle(img, (int(x), int(y)), (int(x)+int(w), int(y)+int(h)), (0,255,0), 2,0)
                                cv2.rectangle(img, (int(x), int(y)), (int(x)+int(w), int(y)+int(h)), (0,255,0), 2,0)
                                
                                
                    cv2.imshow('video',img)
                    key=cv2.waitKey(1)
                    if key==ord('q'):
                        break
        detect_face_clear(cap)
    
    if __name__ == '__main__':
        face_recognition_using_facenet()
  • 相关阅读:
    Web安全学习笔记之更新kali国内源
    K8S学习笔记之二进制的方式创建一个Kubernetes集群
    K8S学习笔记之Kubernetes核心概念
    K8S学习笔记之修改K8S的api-server证书
    Docker学习笔记之Copy on Write机制
    ELK学习笔记之简单适用的ES集群监控工具cerebro安装使用
    ELK学习笔记之F5利用EELK进行应用数据挖掘系列(2)-DNS
    ELK学习笔记之F5利用ELK进行应用数据挖掘系列(1)-HTTP
    ELK学习笔记之F5-HTTP-requesting-logging logstash filter
    Debian 无线网卡驱动问题
  • 原文地址:https://www.cnblogs.com/adong7639/p/7789971.html
Copyright © 2011-2022 走看看