Kami sedang menulis sebuah program untuk kamera dengan pengenalan wajah

Pengenalan wajah telah menguasai seluruh dunia. Semua negara besar sudah menggunakan fitur bermanfaat ini. Mengapa tidak membuat hidup orang lebih nyaman dan tidak menanamkan pengenalan wajah di kantor bagasi kiri?

gambar

Untuk ini kita perlu

  • facenet jaringan saraf yang diunduh
  • sebuah komputer
  • keras
  • opencv

Sejak awal kami mengimpor dependensi

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' 

Fungsi yang memformat gambar dan mengendarainya melalui jaringan saraf

 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 

Sebuah fungsi yang, ketika sebuah tombol ditekan untuk pertama kalinya, menyimpan wajah seseorang yang telah melewati jaringan saraf, dan yang kedua kalinya, setelah menggerakkan wajah baru melalui jaringan, membandingkannya dengan wajah yang disimpan.

Judul 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 


Baik dan maine. Semuanya dimulai dengan arduino ketika huruf B dimasukkan melalui kutil, yang berarti bahwa tombol ditekan. Selanjutnya, perintah dikirim ke Arduino untuk membuka kotak dan fungsi untuk mengenali dan menyimpan wajah diluncurkan. Kemudian, jika perintah untuk menekan tombol kembali berasal dari arduino, kita kembali memulai fungsi pengenalan dan jika wajah bertemu, kemudian buka kotaknya.

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

Video terlampir.

Bagaimana membedakan wajah seseorang dari foto wajah seseorang - saya belum berpikir.


Tautan ke github tempat skrip berada

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


All Articles