1. 程式人生 > >深度學習與人臉識別系列(5)__vgg人臉識別模型測試

深度學習與人臉識別系列(5)__vgg人臉識別模型測試

# -*- coding: utf-8 -*-
#想要加中文註釋就必須將字元編碼格式設定為utf8
#作者:郭開

import numpy as np
import os
import cv2
import cv2.cv as cv
from skimage import transform as tf
from PIL import Image, ImageDraw
import threading
from time import ctime,sleep
import time
import sklearn
import matplotlib.pyplot as plt
import skimage

caffe_root = '/home/gk/caffe-master/'
import sys
sys.path.insert(0, caffe_root + 'python')
import caffe
import sklearn.metrics.pairwise as pw


#我把GPU加速註釋掉了,所以沒有GPU加速,速度有點慢,你要在學校有條件找個有GeForce顯示卡的電腦
#caffe.set_mode_gpu()


#載入caffe模型
global net
net=caffe.Classifier('/home/gk/caffe-master/examples/VGG_net/deploy.prototxt',
    '/home/gk/caffe-master/examples/VGG_net/VGG_face.caffemodel')

def compar_pic(path1,path2):
    global net
    #載入驗證圖片
    X=read_image(path1)
    test_num=np.shape(X)[0]
    #X  作為 模型的輸入
    out = net.forward_all(data = X)
    #fc7是模型的輸出,也就是特徵值
    feature1 = np.float64(out['fc7'])
    feature1=np.reshape(feature1,(test_num,4096))
    #載入註冊圖片
    X=read_image(path2)
    #X  作為 模型的輸入
    out = net.forward_all(data=X)
    #fc7是模型的輸出,也就是特徵值
    feature2 = np.float64(out['fc7'])
    feature2=np.reshape(feature2,(test_num,4096))
    #求兩個特徵向量的cos值,並作為是否相似的依據
    predicts=pw.cosine_similarity(feature1,feature2)
    return  predicts



def read_image(filelist):

    averageImg = [129.1863,104.7624,93.5940]
    X=np.empty((1,3,224,224))
    word=filelist.split('\n')
    filename=word[0]
    im1=skimage.io.imread(filename,as_grey=False)
    #歸一化
    image =skimage.transform.resize(im1,(224, 224))*255
    X[0,0,:,:]=image[:,:,0]-averageImg[0]
    X[0,1,:,:]=image[:,:,1]-averageImg[1]
    X[0,2,:,:]=image[:,:,2]-averageImg[2]
    return X


if __name__ == '__main__':

    #設定閾值,大於閾值是同一個人,反之
    thershold=0.85
    #載入註冊圖片與驗證圖片
    #注意:人臉影象必須是N*N的!!!如果圖片的高和寬不一樣,進行歸一化的時候會對圖片進行拉伸,影響識別效果
    reg_path="./2-1.png"
    rec_path="./3-1.png"

    #計算註冊圖片與驗證圖片的相似度
    result=compar_pic(reg_path,rec_path)
    print "%s和%s兩張圖片的相似度是:%f\n\n"%(reg_path,rec_path,result)
    if result>=thershold:
        print '是一個人!!!!\n\n'
    else:
        print '不是同一個人!!!!\n\n'