使用Python进行人脸识别(第2部分)

磐创AI 2022-06-10

gpiopython

1136 字丨阅读本文需 3 分钟

我们继续用 Python 编写人脸识别程序,在本节中,我们现在将进入代码部分。你可以先阅读第 1 部分

首先,让我们编写添加新用户的代码。

在这里,我们从相机中拍摄了 30 张照片,并保存在我们的文件夹中。我们将使用这些图像来训练我们的模型。我们正在创建一个小数据集。

# gerekli kütüphaneleri import ediyoruz

import cv2

import numpy as np

import os

import sys

path = os.path.dirname(os.path.abspath(__file__))

detector=cv2.CascadeClassifier(path+r'/home/pi/Desktop/y2tube/haarcascade_frontalface_default.xml') #cascade classifierı kaydettiğimiz

#dosya yolunu ekliyoruz

#Kameradan fotoğraf çekeceğiz, kamera için ayarlama yapıyoruz

camera = cv2.VideoCapture(0)

camera.set(3,640)

camera.set(4,480)

minW = 0.1*camera.get(3)

minH = 0.1*camera.get(4)

faceCascade = cv2.CascadeClassifier("/home/pi/Desktop/y2tube/haarcascade_frontalface_default.xml")

#İnput olarak ad/soyad sorulacak,kullanıcı adı kayıtlıysa yeni klasör oluşturmaz,

#kayıtlı değilse kullanıcı adının yazdığı bir klasör oluşturur.

name = input("AD/SOYAD? ")

dirName = "/home/pi/Desktop/y2tube/dataset" + name

print(dirName)

if not os.path.exists(dirName):

  os.makedirs(dirName)

  print("Klasör oluştruldu")

else:

  print("İsim önceden kullanılmış")

  sys.exit()

count = 1

while True:

  if count > 30: #30 adet fotoğrafı çekip oluşturulan klasöre kaydedecek

      break
       

  ret, im =camera.read()

  gray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)

  faces = faceCascade.detectMultiScale(gray, scaleFactor = 1.5, minNeighbors = 5)

  for (x, y, w, h) in faces:

      roiGray = gray[y:y+h, x:x+w]

      fileName = dirName + "/" + name + str(count) + ".jpg"

      cv2.imwrite(fileName, roiGray) #cv2.imwrite() ile görüntüyü klasöre kaydediyoruz

      cv2.imshow("face", roiGray) #cv2.imshow() ile görüntü pencereye eklenir,pencere görüntü boyutuna göre ayarlanır

      cv2.rectangle(im, (x, y), (x+w, y+h), (0, 255, 0), 2) #görüntüye yeşil çerçeve ekliyoruz
     

      count += 1

  cv2.imshow('im', im)

  key = cv2.waitKey(10) #10 sn bekle

  if key == 27: #ESC ye basıldığında kapat

      break

cv2.destroyAllWindows()

让我们训练模型。

#kütüphaneleri import edelim

import os

import numpy as np

from PIL import Image

import cv2

import pickle

faceCascade = cv2.CascadeClassifier("/home/pi/Desktop/y2tube/haarcascade_frontalface_default.xml")

# OpenCV paketinde bulunan LBPH (YEREL İKİLİ PATTERNS HISTOGRAMS) yüz tanıyıcı kullanıyoruz.

recognizer = cv2.face.LBPHFaceRecognizer_create()

# Geçerli çalışma dizininin yolunu alınır ve images dizinine gidilir.

baseDir = os.path.dirname(os.path.abspath(__file__))

imageDir = os.path.join(baseDir, "datasetyagmurkahya")

currentId = 1

label_ids={}

y_labels=[]

x_train=[]

#Her görüntü için dizine gider ve görüntüleri arar.

#Görüntü mevcutsa, NumPy dizisine dönüştürüyoruz

for root, dirs, files in os.walk(imageDir):

  print(root, dirs, files)

  for file in files:

      print(file)

      if file.endswith("png") or file.endswith("jpg"):

          path = os.path.join(root, file)

          label = os.path.basename(root)

          print(label)

          if not label in label_ids:

              label_ids[label] = currentId

              print(label_ids)

              currentId += 1

#Doğru görüntülere sahip olduğumuzdan emin olmak için yüz algılamayı tekrar gerçekleştiriyoruz.

#Ve sonra kıyaslama verilerini hazırlıyoruz

          id_ = label_ids[label]

          pilImage = Image.open(path).convert("L")

          imageArray = np.array(pilImage, "uint8")

          faces = faceCascade.detectMultiScale(imageArray, scaleFactor=1.1, minNeighbors=5)

         for (x, y, w, h) in faces:

             roi = imageArray[y:y+h, x:x+w]

              x_train.append(roi)

              y_labels.append(id_)

# Dizin adlarını ve etiket kimliklerini içeren sözlüğü saklıyoruz.

with open("labels", "wb") as f:

  pickle.dump(label_ids, f)

  f.close()

# Verileri eğiterek ve dosyayı kaydediyoruz.

recognizer.train(x_train,np.array(y_labels))

recognizer.save("/home/pi/Desktop/y2tube/trainner.yml")

print(label_ids)

现在我们将编写我们的解锁代码。

如果这个人是已知的,门将被解锁,如果不是,它不会被解锁。

import cv2,os

import numpy as np

import pickle

import RPi.GPIO as GPIO

import time

from PIL import Image

from face_lock import unlock,lock

import smtpmail as m #smtp ile mail göndermek için yazdığımız kodu import ediyoruz

id = 0

names = ['None', 'yagmurkahya']

with open('labels', 'rb') as f:

dicti = pickle.load(f)

f.close()

camera = cv2.VideoCapture(0)

camera.set(3,640)

camera.set(4,480)

minW = 0.1*camera.get(3)

minH = 0.1*camera.get(4)

path = os.path.dirname(os.path.abspath(__file__))

faceCascade = cv2.CascadeClassifier("/home/pi/Desktop/y2tube/haarcascade_frontalface_default.xml")

recognizer = cv2.face.LBPHFaceRecognizer_create()

recognizer.read("/home/pi/Desktop/y2tube/trainner.yml")

font = cv2.FONT_HERSHEY_SIMPLEX

prevTime = 0

doorUnlock = False

while True:

  ret, im =camera.read()

  gray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)

  faces = faceCascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5, minSize=(100, 100),flags=cv2.CASCADE_SCALE_IMAGE)

  for (x, y, w, h) in faces:

      cv2.rectangle(im, (x, y), (x + w, y + h), (0, 255, 0), 2)

      id, confidence = recognizer.predict(gray[y:y + h, x:x + w])

   # güven için 100'den küçük olup olmadığını kontrol et, 0 mükemmel eşleşme

      if (confidence < 100):
           

          id = names[id]

          confidence = "  {0}%".format(round(100 - confidence))
         

        # Ekrana kilidin açıldığı bilgisi verilir,kilit açılır 10 sn sonra tekrar kilitlenir

          print("Opening Lock")

          unlock(26)

          time.sleep(10)

          lock(26)

          GPIO.cleanup(26)
         

     else:
           

#bilinmeyen kullanıcı ise kilit açılmaz ve mail gönderilir

          id = "unknown"

          confidence = "  {0}%".format(round(100 - confidence))

          lock(26)

          m.mails()

      cv2.putText(im, str(id), (x + 5, y - 5), font, 1, (255, 255, 255), 2)

      cv2.putText(im, str(confidence), (x + 5, y + h - 5), font, 1, (255, 255, 0), 1)

  cv2.imshow('camera', im)

  k = cv2.waitKey(10) & 0xff  # Videodan çıkmak için 'ESC' tuşuna basın
   if k == 27:

      break

# Do a bit of cleanup

print(" [INFO] Exiting Program and cleanup stuff")

camera.release()

cv2.destroyAllWindows()

GPIO 引脚 电磁锁开关

import RPi.GPIO as GPIO

import time

def unlock(pin=26): #kilitleme fonksiyonu

  GPIO.setmode(GPIO.BCM)

  GPIO.setup(pin,GPIO.OUT)

  GPIO.output(pin,True)

def lock(pin=26): #kilit açma fonksiyonu

  '''

  Solenoid kilitli pininize taktığınız pin varsayılan olarak 26'dır.

  '''

  GPIO.setmode(GPIO.BCM)

  GPIO.setup(pin,GPIO.OUT)

  #GPIO.output(pin,False)

if __name__ == '__main__':

  unlock()

  time.sleep(10)

  lock()

  GPIO.cleanup(26)

发送 SMTP 邮件

import smtplib

import datetime

from email.mime.multipart import MIMEMultipart

from email.mime.image import MIMEImage

from email.mime.text import MIMEText

import os

import cv2

import takepic as t

now = datetime.datetime.now()

t.takepic()

def mails():

 content="RAPOR"

 msg=MIMEMultipart()

 k="someone tried to enter the house on time "+str(now.strftime("%Y-%m-%d %H:%M:%S"))

 text = MIMEText(k)

 msg.attach(text)

 img_data = open("/home/pi/Desktop/y2tube/dataset1/NewPicture.jpg", 'rb').read()

 image = MIMEImage(img_data, name=os.path.basename("/home/pi/Desktop/y2tube/dataset1/NewPicture.jpg"))

 msg.attach(image)

 mail=smtplib.SMTP("smtp.gmail.com",587)

 mail.ehlo()

 mail.starttls()

 mail.login("-----@gmail.com mail adresiniz","******* sifreniz")

 mail.sendmail("------@gmail.com","--------",msg.as_string())

 mails()

发送 SMTP 邮件时的拍照功能

import cv2

def takepic():

  videoCaptureObject = cv2.VideoCapture(0)

  result = True

  while(result):

      ret,frame = videoCaptureObject.read(

      cv2.imwrite("/home/pi/Desktop/y2tube/dataset1/NewPicture.jpg",frame)

      result = False

  videoCaptureObject.release()

  cv2.destroyAllWindows()

takepic()

把人脸识别门锁项目的流程和代码分享给大家,希望对大家有用。

免责声明:凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处本网。非本网作品均来自其他媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如您发现有任何侵权内容,请依照下方联系方式进行沟通,我们将第一时间进行处理。

0赞 好资讯,需要你的鼓励
来自:磐创AI
0

参与评论

登录后参与讨论 0/1000

为你推荐

加载中...