Nous écrivons un programme pour une caméra avec reconnaissance faciale

La reconnaissance faciale a déjà conquis le monde entier. Tous les principaux pays utilisent déjà cette fonctionnalité utile. Pourquoi ne pas rendre la vie des gens encore plus pratique et ne pas intégrer la reconnaissance faciale dans la consigne?

image

Pour cela, nous avons besoin

  • facenet réseau neuronal téléchargé
  • un ordinateur
  • keras
  • opencv

Depuis le début nous importons des dépendances

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' 

Une fonction qui formate une image et la conduit à travers un réseau de neurones

 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 

Fonction qui, lorsqu'un bouton est enfoncé pour la première fois, enregistre le visage d'une personne qui a traversé un réseau de neurones, et une deuxième fois déjà, après avoir conduit un nouveau visage à travers le réseau, le compare avec le visage enregistré

Cap de spoiler
 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 


Eh bien et maine. Tout commence par l'arduino, lorsque la lettre B est introduite dans la verrue, ce qui signifie que le bouton est enfoncé. Ensuite, une commande est envoyée à l'arduino pour ouvrir la boîte et la fonction de reconnaissance et d'enregistrement des visages est lancée. Ensuite, si la commande d'appuyer à nouveau sur le bouton provenait de l'arduino, nous recommençons la fonction de reconnaissance et si les visages convergent, alors ouvrons la boîte.

 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() 

La vidéo est jointe.

Comment distinguer le visage d'une personne d'une photographie du visage d'une personne - je n'ai pas encore pensé.


Lien vers github où se trouve le script

Source: https://habr.com/ru/post/fr473510/


All Articles