栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

我们继续用 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("n [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()

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

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。

↓扫描二维码添加小编↓

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/954479.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号