我们正在为具有面部识别功能的相机编写程序

人脸识别已经占领了全世界。 所有主要国家/地区已经使用了此有用功能。 为什么不让人们的生活更加便利,不将面部识别功能嵌入行李寄存办公室呢?

图片

为此,我们需要

  • 下载的神经网络Facenet
  • 一台电脑
  • 凯拉斯
  • OpenCV的

从一开始我们就导入依赖

from keras.models import load_model import numpy as np from keras.utils import plot_model import math import glob import os import cv2 import serial 

          model_path = 'facenet_keras.h5' model = load_model(model_path) cascade_path = 'haarcascade_frontalface_alt2.xml' 

格式化图片并通过神经网络驱动图片的功能

 def calc_embs(imgs, margin, batch_size): fram1e = cv2.resize(imgs,(160,160)) ofg2 = np.array(fram1e) aligned_images = prewhiten(ofg2) pd = [] x_train = np.array([aligned_images]) embs1 = model.predict_on_batch(x_train) embs1.reshape(1,-1) embs = l2_normalize(np.concatenate(embs1)) return embs 

第一次按下按钮时,该功能可保存已通过神经网络的人的面部,第二次已通过网络驱动新面部的功能将其与已保存的面部进行比较

扰流板方向
 def reco_face(frame, i): #frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) img = frame #i = 0 h = 0 v = 0 u = 0 name_out = '  ' #print(ofg.shape) #img = search_face(img, frame, face_cascade) #frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) faces = face_cascade.detectMultiScale(frame, 1.3, 5) print(faces) if faces == (): v = 5 # Loop through all the faces detected and determine whether or not they are in the database identities = [] for (x, y, w, h) in faces: x1 = x-PADDING y1 = y-PADDING x2 = x+w+PADDING y2 = y+h+PADDING frame = cv2.rectangle(frame,(x1, y1),(x2, y2),(255,0,0),2) height, width, channels = frame.shape # The padding is necessary since the OpenCV face detector creates the bounding box around the face and not the head part_image = frame[max(0, y1):min(height, y2), max(0, x1):min(width, x2)] if i == 1: pre[0:] = calc_embs(part_image,10,1) while u!=1: u = ser.write( b'P') u=0 else: ofg = calc_embs(part_image,10,1) #print(ofg) #i = i + 1 if i > 1: for m in pre: dot = np.sum(np.multiply(m, ofg), axis=0) norm = np.linalg.norm(m, axis=0) * np.linalg.norm(ofg, axis=0) similarity = dot / norm dist1 = np.arccos(similarity) / math.pi if dist1<0.32: print(dist1) h = 1 return h,v 


好吧,缅因州。 这一切都始于arduino,当字母B通过疣进入时,这意味着按下了按钮。 接下来,将命令发送到arduino,以打开盒子,并启动识别和保存面部的功能。 然后,如果再次按下按钮的命令来自arduino,则我们将再次启动识别功能,并且如果脸部会聚,则打开框。

 ser = serial.Serial('COM3', 9600, write_timeout=1, timeout=0.1) print(ser.name) # check which port was really used ##sio = io.TextIOWrapper(io.BufferedRWPair(ser, ser)) #ser.close() cap = cv2.VideoCapture(0) zz = 0 while(True): # Capture frame-by-frame ret, frame = cap.read() frame1 = search_face(frame) cv2.imshow('ffff', frame1) ff=ser.read(1) if(ff == b'B'): print("press_button") ff = b'u' zz = zz + 1 mmm, f = reco_face(frame, zz) if f == 5: zz = 0 print(mmm) if mmm == 1: print("otkrivaio") while u!=1: u = ser.write( b'P') u=0 h = 0 zz = 0 if cv2.waitKey(33) == ord('q'): break cap.release() cv2.destroyAllWindows() 

视频已附加。

如何从一张人脸的照片中区分一个人的脸-我还没有想到。


链接到脚本所在的github

Source: https://habr.com/ru/post/zh-CN473510/


All Articles