隨著人臉識(shí)別應(yīng)用越來(lái)越廣泛,用它來(lái)做智能鎖也是再適合不過(guò)。
硬件連接
在這個(gè)項(xiàng)目中,我們計(jì)劃拍照并識(shí)別其中的人臉,然后在屏幕上顯示識(shí)別結(jié)果。如果是已認(rèn)證面孔,打開(kāi)門(mén),并通過(guò)短信將開(kāi)門(mén)的人發(fā)送到指定的電話號(hào)碼。
因此,您需要將攝像頭連接到 Raspberry Pi 的攝像頭接口,并將天線和 Grove - Relay 安裝到 LTE Pi HAT,然后將 HAT 插入您的 Pi。屏幕可以通過(guò) HDMI 電纜連接到 Raspberry Pi,不要忘記將電源連接到屏幕和 Pi。
軟件編程
人臉識(shí)別
以下步驟將向您展示如何在 Pi 上設(shè)置人臉識(shí)別。
步驟 1. 使用 raspi-config 配置相機(jī)和 GPU 內(nèi)存。
sudo raspi-config
選擇Interface Options -- Camera啟用 picamera,然后選擇Advanced Options -- Memory Split設(shè)置 GPU 內(nèi)存,它應(yīng)該更改為 64。完成后,重新啟動(dòng)您的 Raspberry Pi。
步驟 2. 安裝所需的庫(kù)。
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install build-essential \
? ?cmake \
? ?gfortran \
? ?git \
? ?wget \
? ?curl \
? ?graphicsmagick \
? ?libgraphicsmagick1-dev \
? ?libatlas-dev \
? ?libavcodec-dev \
? ?libavformat-dev \
? ?libboost-all-dev \
? ?libgtk2.0-dev \
? ?libjpeg-dev \
? ?liblapack-dev \
? ?libswscale-dev \
? ?pkg-config \
? ?python3-dev \
? ?python3-numpy \
? ?python3-picamera \
? ?python3-pip \
? ?zip
sudo apt-get clean
步驟 3. 使 picamerea 支持?jǐn)?shù)組。
sudo pip3 install --upgrade picamera[array]
步驟 4. 安裝dlib和人臉識(shí)別。
sudo pip3 install dlib
sudo pip3 install face_recognition
步驟 5. 下載并運(yùn)行人臉識(shí)別示例
git clone --single-branch https://github.com/ageitgey/face_recognition.git
cd ./face_recognition/examples
python3 facerec_on_raspberry_pi.py
注意:如果您收到 ImportError: libatlas.so.3: cannot open shared object file: No such file or directory,請(qǐng)運(yùn)行以下命令進(jìn)行修復(fù)。
sudo apt-get install libatlas3-base
中繼
當(dāng)人臉識(shí)別準(zhǔn)備好后,我們可以繼續(xù)添加額外的功能。我們將 Grove - Relay 連接到 LTE Cat 1 Pi HAT,但它使用數(shù)字端口而不是 I2C 端口。
這是 Raspberry Pi 3B 的引腳,我們可以看到 SDA 引腳和 SCL 引腳位于板的引腳 3 和引腳 5。
所以我們可以通過(guò)輸出數(shù)字信號(hào)到pin 5來(lái)控制繼電器。在你的Raspberry Pi上運(yùn)行下面的python程序,如果沒(méi)有任何問(wèn)題,你會(huì)聽(tīng)到來(lái)自繼電器的Ti-Ta。
import RPi.GPIO as GPIO
RELAY_PIN = 5?
GPIO.setmode(GPIO.BOARD)
GPIO.setup(RELAY_PIN, GPIO.OUT)?
GPIO.output(RELAY_PIN, GPIO.HIGH)
所以這里的想法是,我們從文件夾中加載已知的人臉,識(shí)別 picamera 捕獲的人臉,如果人臉在文件夾中,控制繼電器解鎖門(mén)。我們可以將它們打包成一個(gè)類(lèi),這里??是load_known_faces()方法和unlock()方法,完成的程序可以在文末下載。
def load_known_faces(self):
? ?known_faces = os.listdir(self.__known_faces_path) ??
? ?for known_face in known_faces:
? ? ? ?self.__known_faces_name.append(known_face[0 : len(known_face) - len('.jpg')]) ? ? ??
? ? ? ?known_face_image = face_recognition.load_image_file(self.__known_faces_path + known_face)
? ? ? ?self.__known_faces_encoding.append(face_recognition.face_encodings(known_face_image)[0]) ??
? ?return len(self.__known_faces_encoding) ??
def unlock(self):
? ?if self.__matched.count(True) > 0: ? ? ??
? ? ? ?GPIO.output(self.__relay_pin, GPIO.HIGH)
? ? ? ?print('Door opened') ? ? ??
? ? ? ?time.sleep(5) ? ? ??
? ? ? ?GPIO.output(self.__relay_pin, GPIO.LOW)
? ? ? ?self.__reset_recognise_params() ? ? ? ? ? ? ??
? ? ? ?return True ??
? ?self.__retry_count += 1
? ?print('Please try again...{}'.format(self.__retry_count)) ??
? ?return False
超然思考,我們可以顯示識(shí)別的圖片,庫(kù) PIL 和 matplotlib 會(huì)有所幫助,其中 matplotlib 需要手動(dòng)安裝,在您的樹(shù)莓派終端中運(yùn)行此命令。
sudo pip3 install matplotlib
將它們導(dǎo)入您的代碼中,并在 unlock() 方法中更改 if 塊,如下所示:
img = Image.open('{}/{}.jpg'.format(self.__known_faces_path, self.__known_faces_name[0]))
plt.imshow(img)
plt.ion()?
GPIO.output(self.__relay_pin, GPIO.HIGH)
print('Door opened')?
plt.pause(3)?
plt.close()
GPIO.output(self.__relay_pin, GPIO.LOW)
self.__reset_recognise_params() ? ? ? ??
return True
現(xiàn)在,如果識(shí)別出人臉,文件夾中的圖片將顯示在屏幕上。
短信
有時(shí)我們想知道誰(shuí)在我們的房間里,現(xiàn)在有一個(gè)地方可以放置 LTE Cat 1 Pi HAT。將 SIM 卡插入其中,然后按照步驟測(cè)試它是否可以正常工作。
步驟 1. 在 Raspberry Pi 中啟用 UART0
使用 nano 編輯 /boot 中的 config.txt
sudo nano /boot/config.txt
將 dtoverlay=pi3-disable-bt 添加到它的底部,并禁用 hciuart 服務(wù)
sudo systemctl disable hciuart?
然后在 /boot 的 cmdline.txt 中刪除 console=serial0, 115200
sudo nano /boot/cmdline.txt
一切完成后,你應(yīng)該重啟你的樹(shù)莓派。
步驟 2. 下載示例并運(yùn)行它。
在 Raspberry Pi 上打開(kāi)一個(gè)終端,逐行輸入這些命令。
cd ~
git clone https://github.com/Seeed-Studio/ublox_lara_r2_pi_hat.git
cd ublox_lara_r2_pi_hat
sudo python setup.py install
cd test
sudo python test01.py
如果您在終端中看到這些輸出,則 LTE Cat 1 Pi HAT 運(yùn)行良好。
40-pin GPIO header detected
Enabling CTS0 and RTS0 on GPIOs 16 and 17
rts cts on
waking up...
module name: ?LARA-R211
RSSI: ?3
現(xiàn)在我們知道了 HAT 很好用,如何使用它來(lái)發(fā)送短信?您需要知道的第一件事是,Raspberry Pi 通過(guò) UART 發(fā)送 AT 命令與 HAT 通信。您可以通過(guò)在 python 中運(yùn)行此代碼將 AT 命令發(fā)送到 LTE HAT
from ublox_lara_r2 import *
u = Ublox_lara_r2()
u.initialize()
u.reset_power()
# Close debug massage
u.debug = False
u.sendAT('
發(fā)送短信的AT指令如下
AT+CMGF=1
AT+CMGS=
所以這里是 __send_sms() 方法:
def __send_sms(self):
? ?if self.__phonenum == None:
? ? ? ?return False
? ?for unlocker in self.__recognise_face_names():
? ? ? ?if self.__ublox.sendAT('AT+CMGF=1\r\n'):
? ? ? ? ? ?print(self.__ublox.response)
? ? ? ?if self.__ublox.sendAT('AT+CMGS="{}"\r\n'.format(self.__phonenum)):
? ? ? ? ? ?print(self.__ublox.response)
? ? ? ?if self.__ublox.sendAT('{} enter the room.\x1a'.format(unlocker)):
? ? ? ? ? ?print(self.__ublox.response)
評(píng)論
查看更多