如何通过python实现人脸识别验证
这篇文章主要介绍了如何通过python实现人脸识别验证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
直接上代码,此案例是根据https://github.com/caibojian/face_login修改的,识别率不怎么好,有时挡了半个脸还是成功的
#-*-coding:utf-8-*-
#__author__="maple"
"""
┏┓┏┓
┏┛┻━━━┛┻┓
┃☃┃
┃┳┛┗┳┃
┃┻┃
┗━┓┏━┛
┃┗━━━┓
┃神兽保佑┣┓
┃永无BUG!┏┛
┗┓┓┏━┳┓┏┛
┃┫┫┃┫┫
┗┻┛┗┻┛
"""
importbase64
importcv2
importtime
fromioimportBytesIO
fromtensorflowimportkeras
fromPILimportImage
frompymongoimportMongoClient
importtensorflowastf
importface_recognition
importnumpyasnp
#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
defgenerateds():
get_out_put_node()
train_x,train_y,test_x,test_y=np.array(datas),np.array(lables),np.array(datas),np.array(lables)
returntrain_x,train_y,test_x,test_y
defget_out_put_node():
foriteminface_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)
returnOUTPUT_NODE,TRAIN_DATA_SIZE,TEST_DATA_SIZE
#验证脸部信息
defpredict_image(image):
model=tf.keras.models.load_model('face_model.h5',compile=False)
face_encode=face_recognition.face_encodings(image)
result=[]
forjinrange(len(face_encode)):
predictions1=model.predict(np.array(face_encode[j]).reshape(1,128))
print(predictions1)
ifnp.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'])
returnresult
#保存脸部信息
defsave_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)
#训练脸部信息
deftrain_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
ifsteps_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')
defregister_face(user):
ifuser_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
iffinds.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)
while1:
#获取一帧视频
ret,frame=video_capture.read()
#窗口显示
cv2.imshow('Video',frame)
#调整角度后连续拍5张图片
ifcv2.waitKey(1)&0xFF==ord('q'):
foriinrange(1,6):
cv2.imwrite('Myface{}.jpg'.format(i),frame)
withopen('Myface{}.jpg'.format(i),"rb")asf:
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()
defrec_face():
video_capture=cv2.VideoCapture(0)
while1:
#获取一帧视频
ret,frame=video_capture.read()
#窗口显示
cv2.imshow('Video',frame)
#验证人脸的5照片
ifcv2.waitKey(1)&0xFF==ord('q'):
foriinrange(1,6):
cv2.imwrite('recface{}.jpg'.format(i),frame)
break
res=[]
foriinrange(1,6):
withopen('recface{}.jpg'.format(i),"rb")asf:
img=f.read()
img_data=BytesIO(img)
im=Image.open(img_data)
im=im.convert('RGB')
imgArray=np.array(im)
predict=predict_image(imgArray)
ifpredict:
res.extend(predict)
b=set(res)#{2,3}
iflen(b)==1andlen(res)>=3:
print("验证成功")
else:
print("验证失败")
if__name__=='__main__':
register_face("maple")
rec_face()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。