рд╣рдо рдЪреЗрд╣рд░реЗ рдХреА рдкрд╣рдЪрд╛рди рд╡рд╛рд▓реЗ рдХреИрдорд░реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ

рдлреЗрд╕ рд░рд┐рдХрдЧреНрдирд┐рд╢рди рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдкреВрд░реА рджреБрдирд┐рдпрд╛ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИред рд╕рднреА рдкреНрд░рдореБрдЦ рджреЗрд╢ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдЙрдкрдпреЛрдЧреА рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдХреНрдпреЛрдВ рд▓реЛрдЧреЛрдВ рдХреЗ рдЬреАрд╡рди рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдмрд╛рдПрдВ рд╕рд╛рдорд╛рди рдХрд╛рд░реНрдпрд╛рд▓рдп рдореЗрдВ рдЪреЗрд╣рд░реЗ рдХреА рдкрд╣рдЪрд╛рди рдХреЛ рдПрдореНрдмреЗрдб рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ?

рдЫрд╡рд┐

рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП

  • рдбрд╛рдЙрдирд▓реЛрдб рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ facenet
  • рдПрдХ рдХрдВрдкреНрдпреВрдЯрд░
  • keras
  • 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 рдХреЛ рдорд╕реНрд╕реЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦрд┐рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдмрдЯрди рджрдмрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, рдПрдХ рдХрдорд╛рдВрдб рдХреЛ рдмреЙрдХреНрд╕ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд░реНрдбрд┐рдиреЛ рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЪреЗрд╣рд░реЗ рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдФрд░ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░, рдпрджрд┐ рдмрдЯрди рджрдмрд╛рдиреЗ рдХрд╛ рдЖрджреЗрд╢ рдлрд┐рд░ рд╕реЗ рдЖрд░реНрдбрд┐рдиреЛ рд╕реЗ рдЖрдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдлрд┐рд░ рд╕реЗ рдорд╛рдиреНрдпрддрд╛ рд╕рдорд╛рд░реЛрд╣ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдЪреЗрд╣рд░реЗ рдЕрднрд┐рд╕рд░рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмреЙрдХреНрд╕ рдЦреЛрд▓реЗрдВред

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

рд╡реАрдбрд┐рдпреЛ рд╕рдВрд▓рдЧреНрди рд╣реИ

рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдЪреЗрд╣рд░реЗ рдХреА рддрд╕реНрд╡реАрд░ рд╕реЗ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдЪреЗрд╣рд░реЗ рдХреЛ рдХреИрд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдП - рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рд╣реИред


рдЬрд╣рд╛рдБ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╣рд┐рдд рд╣реИ, рд╡рд╣рд╛рдБ рдЧрдердм рд╕реЗ рд▓рд┐рдВрдХ

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


All Articles