如何通过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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。