Estamos escrevendo um programa para uma câmera com reconhecimento de rosto

O reconhecimento de rosto já capturou o mundo inteiro. Todos os principais países já usam esse recurso útil. Por que não tornar a vida das pessoas ainda mais conveniente e não incorporar o reconhecimento facial em um depósito?

imagem

Para isso, precisamos

  • facenet de rede neural baixado
  • um computador
  • keras
  • opencv

Desde o início, importamos dependências

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' 

Função que formata uma imagem e a dirige através de uma rede neural

 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 

Uma função que, quando um botão é pressionado pela primeira vez, salva o rosto de uma pessoa que passou por uma rede neural e, pela segunda vez, depois de passar um novo rosto pela rede, o compara com o rosto salvo

Título 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 


Bem e maine. Tudo começa com o arduino, quando a letra B é alimentada pela verruga, o que significa que o botão é pressionado. Em seguida, um comando é enviado ao arduino para abrir a caixa e a função para reconhecer e salvar a face é iniciada. Então, se o comando para pressionar o botão novamente vier do arduino, iniciaremos novamente a função de reconhecimento e, se as faces convergirem, abra a caixa.

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

O vídeo está anexado.

Como distinguir o rosto de uma pessoa de uma fotografia do rosto de uma pessoa - ainda não pensei.


Link para o github onde está o script

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


All Articles