這篇文章主要介紹了如何通過python實現(xiàn)人臉識別驗證,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比沈陽網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式沈陽網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋沈陽地區(qū)。費用合理售后完善,十年實體公司更值得信賴。直接上代碼,此案例是根據(jù)https://github.com/caibojian/face_login修改的,識別率不怎么好,有時擋了半個臉還是成功的
# -*- coding: utf-8 -*- # __author__="maple" """ ┏┓ ┏┓ ┏┛┻━━━┛┻┓ ┃ ☃ ┃ ┃ ┳┛ ┗┳ ┃ ┃ ┻ ┃ ┗━┓ ┏━┛ ┃ ┗━━━┓ ┃ 神獸保佑 ┣┓ ┃ 永無BUG! ┏┛ ┗┓┓┏━┳┓┏┛ ┃┫┫ ┃┫┫ ┗┻┛ ┗┻┛ """ import base64 import cv2 import time from io import BytesIO from tensorflow import keras from PIL import Image from pymongo import MongoClient import tensorflow as tf import face_recognition import numpy as np #mongodb連接 conn = MongoClient('mongodb://root:123@localhost:27017/') db = conn.myface #連接mydb數(shù)據(jù)庫,沒有則自動創(chuàng)建 user_face = db.user_face #使用test_set集合,沒有則自動創(chuàng)建 face_images = db.face_images lables = [] datas = [] INPUT_NODE = 128 LATER1_NODE = 200 OUTPUT_NODE = 0 TRAIN_DATA_SIZE = 0 TEST_DATA_SIZE = 0 def generateds(): get_out_put_node() train_x, train_y, test_x, test_y = np.array(datas),np.array(lables),np.array(datas),np.array(lables) return train_x, train_y, test_x, test_y def get_out_put_node(): for item in face_images.find(): lables.append(item['user_id']) datas.append(item['face_encoding']) OUTPUT_NODE = len(set(lables)) TRAIN_DATA_SIZE = len(lables) TEST_DATA_SIZE = len(lables) return OUTPUT_NODE, TRAIN_DATA_SIZE, TEST_DATA_SIZE # 驗證臉部信息 def predict_image(image): model = tf.keras.models.load_model('face_model.h6',compile=False) face_encode = face_recognition.face_encodings(image) result = [] for j in range(len(face_encode)): predictions1 = model.predict(np.array(face_encode[j]).reshape(1, 128)) print(predictions1) if np.max(predictions1[0]) > 0.90: print(np.argmax(predictions1[0]).dtype) pred_user = user_face.find_one({'id': int(np.argmax(predictions1[0]))}) print('第%d張臉是%s' % (j+1, pred_user['user_name'])) result.append(pred_user['user_name']) return result # 保存臉部信息 def save_face(pic_path,uid): image = face_recognition.load_image_file(pic_path) face_encode = face_recognition.face_encodings(image) print(face_encode[0].shape) if(len(face_encode) == 1): face_image = { 'user_id': uid, 'face_encoding':face_encode[0].tolist() } face_images.insert_one(face_image) # 訓(xùn)練臉部信息 def train_face(): train_x, train_y, test_x, test_y = generateds() dataset = tf.data.Dataset.from_tensor_slices((train_x, train_y)) dataset = dataset.batch(32) dataset = dataset.repeat() OUTPUT_NODE, TRAIN_DATA_SIZE, TEST_DATA_SIZE = get_out_put_node() model = keras.Sequential([ keras.layers.Dense(128, activation=tf.nn.relu), keras.layers.Dense(128, activation=tf.nn.relu), keras.layers.Dense(OUTPUT_NODE, activation=tf.nn.softmax) ]) model.compile(optimizer=tf.compat.v1.train.AdamOptimizer(), loss='sparse_categorical_crossentropy', metrics=['accuracy']) steps_per_epoch = 30 if steps_per_epoch > len(train_x): steps_per_epoch = len(train_x) model.fit(dataset, epochs=10, steps_per_epoch=steps_per_epoch) model.save('face_model.h6') def register_face(user): if user_face.find({"user_name": user}).count() > 0: print("用戶已存在") return video_capture=cv2.VideoCapture(0) # 在MongoDB中使用sort()方法對數(shù)據(jù)進行排序,sort()方法可以通過參數(shù)指定排序的字段,并使用 1 和 -1 來指定排序的方式,其中 1 為升序,-1為降序。 finds = user_face.find().sort([("id", -1)]).limit(1) uid = 0 if finds.count() > 0: uid = finds[0]['id'] + 1 print(uid) user_info = { 'id': uid, 'user_name': user, 'create_time': time.time(), 'update_time': time.time() } user_face.insert_one(user_info) while 1: # 獲取一幀視頻 ret, frame = video_capture.read() # 窗口顯示 cv2.imshow('Video',frame) # 調(diào)整角度后連續(xù)拍5張圖片 if cv2.waitKey(1) & 0xFF == ord('q'): for i in range(1,6): cv2.imwrite('Myface{}.jpg'.format(i), frame) with open('Myface{}.jpg'.format(i),"rb")as f: img=f.read() img_data = BytesIO(img) im = Image.open(img_data) im = im.convert('RGB') imgArray = np.array(im) faces = face_recognition.face_locations(imgArray) save_face('Myface{}.jpg'.format(i),uid) break train_face() video_capture.release() cv2.destroyAllWindows() def rec_face(): video_capture = cv2.VideoCapture(0) while 1: # 獲取一幀視頻 ret, frame = video_capture.read() # 窗口顯示 cv2.imshow('Video',frame) # 驗證人臉的5照片 if cv2.waitKey(1) & 0xFF == ord('q'): for i in range(1,6): cv2.imwrite('recface{}.jpg'.format(i), frame) break res = [] for i in range(1, 6): with open('recface{}.jpg'.format(i),"rb")as f: img=f.read() img_data = BytesIO(img) im = Image.open(img_data) im = im.convert('RGB') imgArray = np.array(im) predict = predict_image(imgArray) if predict: res.extend(predict) b = set(res) # {2, 3} if len(b) == 1 and len(res) >= 3: print(" 驗證成功") else: print(" 驗證失敗") if __name__ == '__main__': register_face("maple") rec_face()
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
網(wǎng)頁標(biāo)題:如何通過python實現(xiàn)人臉識別驗證-創(chuàng)新互聯(lián)
本文地址:http://jinyejixie.com/article26/coiscg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、定制網(wǎng)站、網(wǎng)站導(dǎo)航、品牌網(wǎng)站建設(shè)、Google、移動網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)