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

作者:Maple_feng 时间:2021-10-30 18:52:56 

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

直接上代码,此案例是根据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数据库,没有则自动创建
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()

来源:https://www.cnblogs.com/angelyan/p/12113773.html

标签:python,人脸,识别
0
投稿

猜你喜欢

  • 网页设计中的层次感

    2007-11-05 18:19:00
  • Python3.10.4激活venv环境失败解决方法

    2022-11-15 10:39:39
  • python的socket编程入门

    2022-11-01 07:33:12
  • python飞机大战pygame碰撞检测实现方法分析

    2023-01-05 18:55:52
  • 栈和队列数据结构的基本概念及其相关的Python实现

    2022-03-14 23:18:28
  • 详解Python安装scrapy的正确姿势

    2023-04-04 01:38:14
  • Python中的各种装饰器详解

    2023-02-23 06:16:41
  • python发送邮件实例分享

    2021-07-17 23:14:23
  • 关于Python字符串显示u...的解决方式

    2021-12-21 18:58:58
  • js弹出新窗口而不会被浏览器阻止的方法

    2010-04-06 12:38:00
  • 深入理解Python装饰器

    2023-11-05 13:01:43
  • python微信好友数据分析详解

    2022-01-27 20:36:39
  • Mootools 1.2教程(9)——输入过滤第二部分(字符串)

    2008-12-01 12:25:00
  • python3通过qq邮箱发送邮件以及附件

    2023-05-06 12:48:27
  • 快速掌握ASP+Access数据库的18条安全法则

    2008-11-28 15:08:00
  • python实现爬虫统计学校BBS男女比例之多线程爬虫(二)

    2021-05-10 03:08:18
  • python pipeline的用法及避坑点

    2022-05-11 08:35:00
  • python用Configobj模块读取配置文件

    2023-10-30 04:29:00
  • python 制作一个gui界面的翻译工具

    2022-04-21 20:16:55
  • 简单了解python shutil模块原理及使用方法

    2023-02-12 22:07:44
  • asp之家 网络编程 m.aspxhome.com