采用keras框架構(gòu)建簡單的人臉識別模型

-- coding: utf-8 --

"""
Created on Sat Nov 24 14:13:47 2018

@author: ltx
"""
from keras.models import Sequential
from keras.layers import Conv2D, ZeroPadding2D, Activation, Input, concatenate
from keras.models import Model
from keras.layers.normalization import BatchNormalization
from keras.layers.pooling import MaxPooling2D, AveragePooling2D
from keras.layers.merge import Concatenate
from keras.layers.core import Lambda, Flatten, Dense
from keras.initializers import glorot_uniform
from keras.engine.topology import Layer
from keras import backend as K

------------用于繪制模型細節(jié)罢洲,可選--------------#

from IPython.display import SVG
from keras.utils.vis_utils import model_to_dot
from keras.utils import plot_model

------------------------------------------------#

K.set_image_data_format('channels_first')

import time
import cv2
import os
import numpy as np
from numpy import genfromtxt
import pandas as pd
import tensorflow as tf
import fr_utils
from inception_blocks_v2 import * #Szegedy et al.設計了初始模型,用來將圖片生成向量

np.set_printoptions(threshold=np.nan)

--------------導入一個人臉模型----------------------

輸入一張人臉圖片(96,96,3),模型的維度結(jié)構(gòu)為(3,96,96)

輸出為一個128位的向量

FRmodel= faceRecoModel(input_shape=(3,96,96))
print("參數(shù)的數(shù)量為:"+str(FRmodel.count_params())) #3743280

使用三元組損失函數(shù)(A,P,N)進行訓練來實現(xiàn)同一個人的圖像編碼很近喉悴,不同的人的圖像編碼很遠

def triplet_loss(y_true,y_pred,alpha=0.2):
"""
參數(shù):
y_true--true標簽外潜,當你在Keras里定義了一個損失函數(shù)的時候需要它,但是這里不需要
y_pred---列表類型贞间,包含了如下參數(shù):
anchor -- 給定的“anchor”圖像的編碼贿条,維度為(None,128)
positive -- “positive”圖像的編碼,維度為(None,128)
negative -- “negative”圖像的編碼增热,維度為(None,128)

    alpha整以;超參數(shù),閾值
返回:
    loss--實數(shù)峻仇,損失的值
"""
#獲取anchor, positive, negative的圖像編碼
anchor,positive,negative=y_pred[0],y_pred[1],y_pred[2]
#第一步:計算"anchor" 與 "positive"之間編碼的距離公黑,這里需要使用axis=-1
pos_dist=tf.reduce_sum(tf.square(tf.subtract(anchor,positive)),axis=-1)
#第二步:計算"anchor" 與 "negative"之間編碼的距離,這里需要使用axis=-1
neg_dist=tf.reduce_sum(tf.square(tf.subtract(anchor,negative)),axis=-1)
#第三步:減去之前的兩個距離,然后加上alpha
basic_loss=tf.add(tf.subtract(pos_dist,neg_dist),alpha)
#通過取帶零的最大值和對訓練樣本的求和來計算整個公式
loss=tf.reduce_sum(tf.maximum(basic_loss,0))
return loss

with tf.Session() as test:
tf.set_random_seed(1)
y_true = (None, None, None)
y_pred = (tf.random_normal([3, 128], mean=6, stddev=0.1, seed = 1),
tf.random_normal([3, 128], mean=1, stddev=1, seed = 1),
tf.random_normal([3, 128], mean=3, stddev=4, seed = 1))
loss = triplet_loss(y_true, y_pred)

print("loss = " + str(loss.eval()))

----------------加載已訓練好的FaceNet模型-----------------

開始時間

start_time=time.clock()

編譯模型,反向傳播凡蚜,訓練和優(yōu)化模型

FRmodel.compile(optimizer='adam',loss=triplet_loss,metrics=['accuracy'])

加載權(quán)值

fr_utils.load_weights_from_FaceNet(FRmodel)

結(jié)束時間

end_time=time.clock()

計算時間差

minium=end_time-start_time
print("執(zhí)行了:" + str(int(minium / 60)) + "分" + str(int(minium%60)) + "秒")

---------加載數(shù)據(jù)庫---------------------

database = {}
database["danielle"] = fr_utils.img_to_encoding("images/danielle.png", FRmodel)
database["younes"] = fr_utils.img_to_encoding("images/younes.jpg", FRmodel)
database["tian"] = fr_utils.img_to_encoding("images/tian.jpg", FRmodel)
database["andrew"] = fr_utils.img_to_encoding("images/andrew.jpg", FRmodel)
database["kian"] = fr_utils.img_to_encoding("images/kian.jpg", FRmodel)
database["dan"] = fr_utils.img_to_encoding("images/dan.jpg", FRmodel)
database["sebastiano"] = fr_utils.img_to_encoding("images/sebastiano.jpg", FRmodel)
database["bertrand"] = fr_utils.img_to_encoding("images/bertrand.jpg", FRmodel)
database["kevin"] = fr_utils.img_to_encoding("images/kevin.jpg", FRmodel)
database["felix"] = fr_utils.img_to_encoding("images/felix.jpg", FRmodel)
database["benoit"] = fr_utils.img_to_encoding("images/benoit.jpg", FRmodel)
database["arnaud"] = fr_utils.img_to_encoding("images/arnaud.jpg", FRmodel)

實現(xiàn)了人臉驗證

def verify(image_path,identity,database,model):
encoding=fr_utils.img_to_encoding(image_path,model)
dist = np.linalg.norm(encoding - database[identity])

if dist < 0.7:
    print("歡迎 " + str(identity) + "回家奠骄!")
    is_door_open = True
else:
    print("經(jīng)驗證,您與" + str(identity) + "不符番刊!")
    is_door_open = False

return dist, is_door_open

verify("images/camera_0.jpg","younes",database,FRmodel)
verify("images/camera_2.jpg", "kian", database, FRmodel)

實現(xiàn)了人臉識別

def who_is_it(image_path,database,model):
#步驟1:計算指定圖像的編碼含鳞,使用fr_utils.img_to_encoding()來計算
encoding=fr_utils.img_to_encoding(image_path,model)

 #步驟2 :找到最相近的編碼
## 初始化min_dist變量為足夠大的數(shù)字,這里設置為100

 min_dist=100
 for(name,enc)in database.items():
     dist = np.linalg.norm(encoding - enc)
     if dist < min_dist:
         min_dist=dist
         identity=name
 if min_dist > 0.7:
     print("抱歉芹务,您的信息不在數(shù)據(jù)庫中蝉绷。")
 else:
     print("姓名" + str(identity) + "  差距:" + str(min_dist))
 return min_dist, identity

who_is_it("images/camera_0.jpg", database, FRmodel)
----------------------------------實驗結(jié)果-------------------------------------


人臉識別.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市枣抱,隨后出現(xiàn)的幾起案子熔吗,更是在濱河造成了極大的恐慌,老刑警劉巖佳晶,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桅狠,死亡現(xiàn)場離奇詭異,居然都是意外死亡轿秧,警方通過查閱死者的電腦和手機中跌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來菇篡,“玉大人漩符,你說我怎么就攤上這事∏梗” “怎么了嗜暴?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長议蟆。 經(jīng)常有香客問我闷沥,道長,這世上最難降的妖魔是什么咐容? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任舆逃,我火速辦了婚禮,結(jié)果婚禮上疟丙,老公的妹妹穿的比我還像新娘颖侄。我一直安慰自己鸟雏,他們只是感情好享郊,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著孝鹊,像睡著了一般炊琉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天苔咪,我揣著相機與錄音锰悼,去河邊找鬼。 笑死团赏,一個胖子當著我的面吹牛箕般,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播舔清,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼丝里,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了体谒?” 一聲冷哼從身側(cè)響起杯聚,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抒痒,沒想到半個月后幌绍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡故响,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年傀广,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彩届。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡主儡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惨缆,到底是詐尸還是另有隱情糜值,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布坯墨,位于F島的核電站寂汇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏捣染。R本人自食惡果不足惜骄瓣,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望耍攘。 院中可真熱鬧榕栏,春花似錦、人聲如沸蕾各。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽式曲。三九已至妨托,卻和暖如春缸榛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背兰伤。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工内颗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人敦腔。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓均澳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親符衔。 傳聞我的和親對象是個殘疾皇子负懦,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容