python实现人脸识别_如何通过python实现人脸识别验证

这篇文章主要介绍了如何通过python实现人脸识别验证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

# -*- 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数据库,没有则自动创建

user_face = db.user_face #使用test_set集合,没有则自动创建

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.h5',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)

# 训练脸部信息

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.h5')

def register_face(user):

if user_face.find({"user_name": user}).count() > 0:

print("用户已存在")

return

video_capture=cv2.VideoCapture(0)

# 在MongoDB中使用sort()方法对数据进行排序,sort()方法可以通过参数指定排序的字段,并使用 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)

# 调整角度后连续拍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()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值