Estamos escribiendo un programa para una c谩mara con reconocimiento facial.

El reconocimiento facial ya ha capturado al mundo entero. Todos los principales pa铆ses ya utilizan esta 煤til funci贸n. 驴Por qu茅 no hacer la vida de las personas a煤n m谩s conveniente y no incrustar el reconocimiento facial en la consigna de equipaje?

imagen

Para esto necesitamos

  • Facenet de red neuronal descargada
  • una computadora
  • keras
  • opencv

Desde el principio importamos dependencias

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' 

Una funci贸n que formatea una imagen y la conduce a trav茅s de una red neuronal

 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 

Una funci贸n que, cuando se presiona un bot贸n por primera vez, guarda la cara de una persona que ha pasado a trav茅s de una red neuronal, y una segunda vez, despu茅s de haber conducido una nueva cara a trav茅s de la red, la compara con la cara guardada

Encabezado 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 


Bueno y maine. Todo comienza con arduino, cuando la letra B se alimenta a trav茅s de la verruga, lo que significa que se presiona el bot贸n. A continuaci贸n, se env铆a un comando al arduino para abrir la caja y se inicia la funci贸n para reconocer y guardar la cara. Luego, si el comando para presionar el bot贸n nuevamente provino del arduino, comenzamos nuevamente la funci贸n de reconocimiento y si las caras convergen, entonces abra la caja.

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

El video est谩 adjunto.

C贸mo distinguir la cara de una persona de una fotograf铆a de la cara de una persona, todav铆a no lo he pensado.


Enlace a github donde se encuentra el gui贸n

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


All Articles