一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

怎樣用樹莓派構(gòu)建基于面部識別的門鎖

454398 ? 來源:工程師吳畏 ? 2019-07-30 09:16 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

該項目將包括三個階段:

人臉檢測和數(shù)據(jù)收集

訓(xùn)練識別器

面部識別

在深入研究代碼之前,讓我們將電磁鎖與Raspberry Pi連接。

電路圖和說明

Raspberry Pi的GPIO引腳可以提供3.3V的輸出,但電磁鎖需要7-12V才能工作。因此,我們需要使用外部電源和繼電器來操作鎖定。

將繼電器模塊的VCC和GND連接到Raspberry Pi的5V和GND。然后將繼電器模塊的信號引腳連接到Raspberry Pi的GPIO 26.

在繼電器模塊的另一側(cè),將負極直流電源連接到電磁門鎖的負極。將來自直流電源的正極連接到繼電器模塊的公共端,然后將常開模塊從繼電器模塊連接到電磁門鎖的正極。

面部識別電路圖。

人臉檢測的數(shù)據(jù)收集

第一個任務(wù)是收集我們要訓(xùn)練分類器的數(shù)據(jù)。我們將使用OpenCV預(yù)訓(xùn)練分類器編寫一個python代碼,每個人需要30個面。

OpenCV已經(jīng)包含許多面部,眼睛,微笑等預(yù)先訓(xùn)練的分類器。我們要去的分類器使用將檢測面部,并在GitHub上提供級聯(lián)文件。

將此文件保存在工作目錄中“haarcascade_frontalface_default.xml”。

代碼演練

現(xiàn)在讓我們編寫代碼。 首先,我們導(dǎo)入所需的包。

import cv2

from picamera.array import PiRGBArray

from picamera import PiCamera

import numpy as np

import os

import sys

然后我們初始化相機對象,這將允許我們使用Raspberry Pi相機。我們將分辨率設(shè)置為(640,480),幀速率設(shè)置為30 fps。

camera = PiCamera()

camera.resolution = (640, 480)

camera.framerate = 30

PiRGBArray() 為我們提供了一個來自未編碼RGB捕獲的三維RGB數(shù)組(行,列,顏色)。 PiRGBArray的優(yōu)勢在于它能夠?qū)aspberry Pi相機中的幀讀取為NumPy陣列,使其與OpenCV兼容。它避免了從JPEG格式到OpenCV格式的轉(zhuǎn)換,這會減慢我們的過程。

它需要兩個參數(shù):

相機對象

分辨率

rawCapture = PiRGBArray(camera, size=(640, 480))

加載用于檢測面的級聯(lián)文件。

face_cascade = cv2.CascadeClassifier(“haarcascade_frontalface_default.xml”);

接下來,我們要求用戶輸入名稱。如果已存在具有該名稱的目錄,則它將以“名稱已存在”進行響應(yīng)并退出代碼。如果沒有此名稱的目錄,它將創(chuàng)建目錄,圖像將以此名稱保存。

name = input(“What‘s his/her Name? ”)

dirName = “。/images/” + name

print(dirName)

if not os.path.exists(dirName):

os.makedirs(dirName)

print(“Directory Created”)

else:

print(“Name already exists”)

sys.exit()

為圖像創(chuàng)建目錄。

之后,我們使用 capture_continuous 從Raspberry Pi相機模塊開始讀取幀的功能。

c apture_continuous函數(shù)有三個參數(shù):

rawCapture

我們想要讀取每個幀的格式,因為OpenCV期望圖像采用BGR格式而不是RGB格式,因此我們將格式指定為BGR。

use_video_port布爾值,使其為true意味著我們將流視為視頻

for frame in camera.capture_continuous(rawCapture, format=“bgr”, use_video_port=True):

一旦我們有了f rame,我們可以通過.array屬性訪問原始的NumPy數(shù)組。訪問后,我們將此幀轉(zhuǎn)換為灰度。

frame = frame.array

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

然后我們調(diào)用分類器函數(shù)來檢測幀中的面。我們傳遞的第一個參數(shù)是灰度圖像。第二個參數(shù)是指定在每個圖像比例下圖像尺寸減少多少的參數(shù)。第三個參數(shù)是一個參數(shù),指定每個候選矩形應(yīng)保留多少個鄰居。數(shù)字越大,誤報率越低。

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

上面的函數(shù)給出了面部區(qū)域的矩形坐標。我們使用這些坐標從圖像中提取面部并將其保存在我們在開始時創(chuàng)建的目錄中。之后,我們展示了裁剪的面部并在原始框架上創(chuàng)建了一個矩形。

代碼將收集30張圖像。

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.imshow(“face”, roiGray)

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

count += 1

然后我們在上面顯示原始幀輸出窗口。 cv2.waitkey()是一個鍵盤綁定函數(shù)。它等待任何鍵盤事件的指定毫秒。它需要一個參數(shù),這個參數(shù)是以毫秒為單位的時間。如果在該時間內(nèi)按下該鍵,則程序?qū)⒗^續(xù)。傳遞0表示它將無限期地等待一個鍵。

cv2.imshow(’frame‘, frame)

key = cv2.waitKey(1)

然后我們通過在捕獲之間調(diào)用truncate(0)來清除流以準備下一幀。

rawCapture.truncate(0)

人臉檢測和數(shù)據(jù)收集工作現(xiàn)已完成。我們應(yīng)該在新創(chuàng)建的目錄中有30個圖像。

我們的30張圖片保存在新創(chuàng)建的目錄中。

人臉檢測完整代碼

import cv2

from picamera.array import PiRGBArray

from picamera import PiCamera

import numpy as np

import os

import sys

camera = PiCamera()

camera.resolution = (640, 480)

camera.framerate = 30

rawCapture = PiRGBArray(camera, size=(640, 480))

faceCascade = cv2.CascadeClassifier(“haarcascade_frontalface_default.xml”)

name = input(“What’s his/her Name? ”)

dirName = “。/images/” + name

print(dirName)

if not os.path.exists(dirName):

os.makedirs(dirName)

print(“Directory Created”)

else:

print(“Name already exists”)

sys.exit()

count = 1

for frame in camera.capture_continuous(rawCapture, format=“bgr”, use_video_port=True):

if count 》 30:

break

frame = frame.array

gray = cv2.cvtColor(frame, 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.imshow(“face”, roiGray)

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

count += 1

cv2.imshow(‘frame’, frame)

key = cv2.waitKey(1)

rawCapture.truncate(0)

if key == 27:

break

cv2.destroyAllWindows()

訓(xùn)練識別器

現(xiàn)在我們可以根據(jù)上一步收集的數(shù)據(jù)訓(xùn)練識別器。

我們將使用LBPH (LOCAL BINARY PATTERNS HISTOGRAMS)面部識別器,包含在OpenCV包中。我們將它加載到以下行:

recognizer = cv2.face.LBPHFaceRecognizer_create()

我們獲取當前工作目錄的路徑,然后移動到圖像目錄所在的目錄。

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

imageDir = os.path.join(baseDir, “images”)

《然后我們進入每個圖像目錄并查找圖像。如果圖像存在,我們將其轉(zhuǎn)換為NumPy數(shù)組。

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 labelIds:

labelIds[label] = currentId

print(labelIds)

currentId += 1

id_ = labelIds[label]

pilImage = Image.open(path).convert(“L”)

imageArray = np.array(pilImage, “uint8”)

之后,我們再次進行面部檢測,以確保我們有正確的圖像,然后我們準備訓(xùn)練數(shù)據(jù)。

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

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

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

xTrain.append(roi)

yLabels.append(id_)

存儲包含目錄名稱和標簽ID的字典。

with open(“l(fā)abels”, “wb”) as f:

pickle.dump(labelIds, f)

f.close()

現(xiàn)在訓(xùn)練數(shù)據(jù)并保存文件。

recognizer.train(xTrain, np.array(yLabels))

recognizer.save(“trainer.yml”)

此代碼創(chuàng)建一個trainer.yml并標記我們在識別代碼中使用的文件。

我們在識別代碼中使用的trainer.yml文件。

培訓(xùn)識別器的完整代碼

import os

import numpy as np

from PIL import Image

import cv2

import pickle

faceCascade = cv2.CascadeClassifier(“haarcascade_frontalface_default.xml”)

recognizer = cv2.face.LBPHFaceRecognizer_create()

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

imageDir = os.path.join(baseDir, “images”)

currentId = 1

labelIds = {}

yLabels = []

xTrain = []

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 labelIds:

labelIds[label] = currentId

print(labelIds)

currentId += 1

id_ = labelIds[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]

xTrain.append(roi)

yLabels.append(id_)

with open(“l(fā)abels”, “wb”) as f:

pickle.dump(labelIds, f)

f.close()

recognizer.train(xTrain, np.array(yLabels))

recognizer.save(“trainer.yml”)

print(labelIds)

使用識別器進行面部識別

我們在上一節(jié)中設(shè)置的識別器現(xiàn)在可用于識別面部。它會給我們信心和標簽ID(識別器對這場比賽的信心程度)。如果面部匹配,繼電器將打開。

首先我們加載包含字典的pickle文件。

with open(‘labels’, ‘rb’) as f:

dicti = pickle.load(f)

f.close()

然后我們加載將檢測面部的分類器以及預(yù)測面部和訓(xùn)練數(shù)據(jù)的識別器。

faceCascade = cv2.CascadeClassifier(“haarcascade_frontalface_default.xml”)

recognizer = cv2.face.LBPHFaceRecognizer_create()

recognizer.read(“trainer.yml”)

我們讀取幀,將其轉(zhuǎn)換為灰度,并在圖像中查找面。如果有任何面部,我們將提取面部區(qū)域并使用識別器識別圖像。

識別器將為我們提供標簽ID和置信度。

gray = cv2.cvtColor(frame, 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]

roiColor = frame[y:y+h, x:x+w]

id_, conf = recognizer.predict(roiGray)

我們在字典中查找分配給此標簽ID的名稱。

for name, value in dict.items():

if value == id_:

print(name)

然后檢查我們是否有足夠的信心打開門鎖。如果信心小于70,門將打開。否則,它將保持關(guān)閉狀態(tài)。

if conf 《= 70:

GPIO.output(relay_pin, 1)

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

cv2.putText(frame, name + str(conf), (x, y), font, 2, (0, 0 ,255), 2,cv2.LINE_AA)

else:

GPIO.output(relay_pin, 0)

在原始圖像中創(chuàng)建一個矩形,并將該名稱寫在矩形的頂部。

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

cv2.putText(frame, name, (x, y), font, 2, (0, 0 ,255), 2,cv2.LINE_AA)

隨著代碼的完成,設(shè)置已準備好進行面部識別!

訓(xùn)練識別器的完整代碼

import cv2

from picamera.array import PiRGBArray

from picamera import PiCamera

import numpy as np

import pickle

import RPi.GPIO as GPIO

from time import sleep

relay_pin = [26]

GPIO.setmode(GPIO.BCM)

GPIO.setup(relay_pin, GPIO.OUT)

GPIO.output(relay_pin, 0)

with open(‘labels’, ‘rb’) as f:

dicti = pickle.load(f)

f.close()

camera = PiCamera()

camera.resolution = (640, 480)

camera.framerate = 30

rawCapture = PiRGBArray(camera, size=(640, 480))

faceCascade = cv2.CascadeClassifier(“haarcascade_frontalface_default.xml”)

recognizer = cv2.face.LBPHFaceRecognizer_create()

recognizer.read(“trainer.yml”)

font = cv2.FONT_HERSHEY_SIMPLEX

for frame in camera.capture_continuous(rawCapture, format=“bgr”, use_video_port=True):

frame = frame.array

gray = cv2.cvtColor(frame, 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]

id_, conf = recognizer.predict(roiGray)

for name, value in dict.items():

if value == id_:

print(name)

if conf 《= 70:

GPIO.output(relay_pin, 1)

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

cv2.putText(frame, name + str(conf), (x, y), font, 2, (0, 0 ,255), 2,cv2.LINE_AA)

else:

GPIO.output(relay_pin, 0)

cv2.imshow(‘frame’, frame)

key = cv2.waitKey(1)

rawCapture.truncate(0)

if key == 27:

break

cv2.destroyAllWindows()

最后的想法

這種人臉識別系統(tǒng)不是100%準確,但在良好的光線下效果很好條件。問題是它還可以檢測圖片中的面孔 - 例如,有人可以通過手機顯示您的圖片來解鎖它。我們可以通過訓(xùn)練自己的級聯(lián)分類器來改進這一點。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 面部識別
    +關(guān)注

    關(guān)注

    1

    文章

    375

    瀏覽量

    27213
  • 樹莓派
    +關(guān)注

    關(guān)注

    121

    文章

    2007

    瀏覽量

    107462
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    樹莓5上使用YOLO進行物體和動物識別-入門指南

    大家好,接下來會為大家開一個樹莓5和YOLO的專題。內(nèi)容包括四個部分:在樹莓5上使用YOLO進行物體和動物識別-入門指南在
    的頭像 發(fā)表于 07-17 17:16 ?78次閱讀
    在<b class='flag-5'>樹莓</b><b class='flag-5'>派</b>5上使用YOLO進行物體和動物<b class='flag-5'>識別</b>-入門指南

    樹莓打造無人機,你需注意的事項!

    能否將樹莓裝入無人機?使用樹莓打造無人機是可行的。樹莓充當無人機的“大腦”,將飛行控制器的
    的頭像 發(fā)表于 07-14 17:49 ?402次閱讀
    <b class='flag-5'>用</b><b class='flag-5'>樹莓</b><b class='flag-5'>派</b>打造無人機,你需注意的事項!

    樹莓6 傳聞:發(fā)布日期與規(guī)格!

    每當我想再為我的收藏增添一款樹莓時,總會在是立即購買還是等待硬件更強大的下一代之間猶豫不決。但新樹莓型號的發(fā)布往往容易被錯過,尤其是在你的信息流被病毒式傳播的貓咪視頻占據(jù)時。因此,
    的頭像 發(fā)表于 07-11 16:21 ?201次閱讀
    <b class='flag-5'>樹莓</b><b class='flag-5'>派</b>6 傳聞:發(fā)布日期與規(guī)格!

    20個任何人都能完成的樹莓酷炫項目!

    不知道如何利用你買的樹莓?這個小設(shè)備真的能當臺式電腦嗎?能當服務(wù)器嗎?能當廣播電臺嗎?當然可以!為了幫助你入門,我們精心挑選了這份樹莓
    的頭像 發(fā)表于 07-03 17:10 ?423次閱讀
    20個任何人都能完成的<b class='flag-5'>樹莓</b><b class='flag-5'>派</b>酷炫項目!

    樹莓小技巧:無需鍵盤或顯示器,如何通過WiFi設(shè)置樹莓?

    樹莓是一款小巧便攜的USB供電計算機,可以隱藏起來用于小型項目,如網(wǎng)絡(luò)服務(wù)器或家庭自動化。通常,設(shè)置樹莓需要鍵盤和顯示器來編輯和查看樹莓
    的頭像 發(fā)表于 06-26 15:41 ?306次閱讀
    <b class='flag-5'>樹莓</b><b class='flag-5'>派</b>小技巧:無需鍵盤或顯示器,如何通過WiFi設(shè)置<b class='flag-5'>樹莓</b><b class='flag-5'>派</b>?

    樹莓分類器:樹莓識別不同型號的樹莓

    在本教程系列的第一部分中,您將學(xué)習(xí)如何使用樹莓AI攝像頭來檢測不同的樹莓型號。本系列由DavidPlowman創(chuàng)建,他是樹莓
    的頭像 發(fā)表于 06-13 16:39 ?414次閱讀
    <b class='flag-5'>樹莓</b><b class='flag-5'>派</b>分類器:<b class='flag-5'>用</b><b class='flag-5'>樹莓</b><b class='flag-5'>派</b><b class='flag-5'>識別</b>不同型號的<b class='flag-5'>樹莓</b><b class='flag-5'>派</b>!

    樹莓“揪出”家里的耗電怪獸!

    在本應(yīng)用中,我們將使用樹莓設(shè)置一個CE電流監(jiān)測器,并通過網(wǎng)頁界面顯示電路的電流讀數(shù)。本項目使用的組件硬件組件樹莓2ModelBx112通道20安培電流監(jiān)測控制器x1項目背景介紹在本
    的頭像 發(fā)表于 06-04 15:33 ?716次閱讀
    <b class='flag-5'>用</b><b class='flag-5'>樹莓</b><b class='flag-5'>派</b>“揪出”家里的耗電怪獸!

    樹莓“吉尼斯世界記錄”:將樹莓的性能發(fā)揮到極致的項目!

    樹莓是一款功能強大、體積小巧且高度可定制的設(shè)備,多年來,我們見證了它被應(yīng)用于眾多領(lǐng)域。無論是將其裝入3D打印的經(jīng)典游戲機外殼,還是簡單地將它隱藏起來作為家庭文件服務(wù)器,我們都報道過在社區(qū)里
    的頭像 發(fā)表于 05-22 16:53 ?644次閱讀
    <b class='flag-5'>樹莓</b><b class='flag-5'>派</b>“吉尼斯世界記錄”:將<b class='flag-5'>樹莓</b><b class='flag-5'>派</b>的性能發(fā)揮到極致的項目!

    樹莓 Zero 打造的智能漫游車!

    使用PXFMini和樹莓Zero打造您自己的自主漫游車。本項目所用組件硬件組件ErleRoboticsPXFmini×1樹莓Zero×1樹莓
    的頭像 發(fā)表于 05-13 16:39 ?437次閱讀
    <b class='flag-5'>用</b> <b class='flag-5'>樹莓</b><b class='flag-5'>派</b> Zero 打造的智能漫游車!

    rpi-image-gen:樹莓軟件鏡像構(gòu)建的終極神器!

    樹莓設(shè)備上,軟件的多樣性令人印象深刻。樹莓操作系統(tǒng)雖然適用于許多場景,但我們深知它并非萬能,尤其在一些特定用途的產(chǎn)品中更是如此。如果您正在開發(fā)嵌入式系統(tǒng)或工業(yè)控制器,您需要對設(shè)備
    的頭像 發(fā)表于 04-08 15:43 ?343次閱讀
    rpi-image-gen:<b class='flag-5'>樹莓</b><b class='flag-5'>派</b>軟件鏡像<b class='flag-5'>構(gòu)建</b>的終極神器!

    驚了!這個“神器”讓樹莓秒變智能管家,圖像識別+無線投屏,太秀了!

    和BalenaCloud,讓樹莓實現(xiàn)從圖像識別到智能生活的華麗轉(zhuǎn)身!圖像分類項目:樹莓和B
    的頭像 發(fā)表于 03-25 09:23 ?609次閱讀
    驚了!這個“神器”讓<b class='flag-5'>樹莓</b><b class='flag-5'>派</b>秒變智能管家,圖像<b class='flag-5'>識別</b>+無線投屏,太秀了!

    樹莓gpio有什么,樹莓gpio接口及編程方法

    一、樹莓GPIO的用途 樹莓(Raspberry Pi)是一款小巧、功能強大的單板計算機,廣泛應(yīng)用于編程教育、物聯(lián)網(wǎng)項目、家庭媒體中心等領(lǐng)域。GPIO(General Purpos
    的頭像 發(fā)表于 10-22 18:09 ?2682次閱讀

    什么是樹莓樹莓是什么架構(gòu)的

    什么是樹莓 樹莓(Raspberry Pi,簡寫為RPi,別名為RasPi/RPI)是由英國“Raspberry Pi 慈善基金會”開發(fā)的一款為學(xué)習(xí)計算機編程教育而設(shè)計的微型電腦。
    的頭像 發(fā)表于 10-22 17:33 ?5834次閱讀

    樹莓gui開發(fā)什么ide

    樹莓(Raspberry Pi)是一款功能強大的微型計算機,可以運行多種操作系統(tǒng),如Raspbian、Ubuntu等。在樹莓派上進行GUI(圖形用戶界面)開發(fā),可以使用多種集成開發(fā)環(huán)境(IDE
    的頭像 發(fā)表于 08-30 16:49 ?1797次閱讀

    樹莓裝ubuntu和raspbian哪個更好

    樹莓(Raspberry Pi)是一款由英國樹莓基金會開發(fā)的單板計算機,廣泛應(yīng)用于教育、科研、物聯(lián)網(wǎng)等領(lǐng)域。樹莓
    的頭像 發(fā)表于 08-30 15:41 ?2837次閱讀