第1步:大計劃
在這個教學中我們將展示如何:
使用OpenCV和TensorFlow設置Raspberry Pi
在Raspberry Pi上設置Web服務器以顯示有趣的圖像
與IFTTT集成以在發現人時觸發移動警報
將繼電器HAT連接到Raspberry Pi,并將其連接到可為水池添加水的電磁閥
將水位傳感器連接到Raspberry Pi并使用Pi的GPIO與其連接
寫一些代碼將它們粘合在一起
第2步:購物清單
所有組件均可從亞馬遜購買。隨意嘗試和交換組件 - 這是一半的樂趣!
Raspberry Pi
Raspberry Pi電源(不要在這里吝嗇)
記憶卡(越大越好)
案例(這個大到足以容納Pi和HAT)
USB網絡攝像頭(任何網絡攝像頭都可以,但你想要一個
USB延長線(如果需要 - 測量Pi與攝像機放置位置之間的距離)
繼電器板HAT(這個有3個繼電器,我們只需要一個,但你很快就會發現其他用途!)
電磁閥
電磁閥配件1和配件2(這真的取決于你安裝螺線管,但這些對我有用)
電磁閥電源(任何24V AC都可以)
電纜(再次,幾乎任何2股電纜都可以 - 電流是最小)
水位浮動開關(這只是一個例子,檢查可以輕松連接到游泳池的東西)
一些跳線和電線連接器
第3步:設置您的Raspberry Pi
格式化SD卡。這需要特別小心 - Raspberry Pi只能從FAT格式的SD卡啟動。請遵循這些說明。
將Raspberry Pi連接到USB鍵盤和鼠標,再加上HDMI顯示器,并按照Raspberry Pi NOOBS教程中的說明進行操作。確保設置WiFi并啟用SSH訪問。不要忘記為默認的pi帳戶設置密碼。
在您的家庭網絡上為Raspberry Pi設置靜態IP - 這將使SSH更加容易。
確保您的臺式機/筆記本電腦上安裝了ssh客戶端。對于PC,我會推薦Putty,您可以從這里安裝。
將Raspberry Pi中的USB和HDMI取下,重新啟動它,然后插入它 - 如果一切正常,你應該看到這樣的東西:
Linux raspberrypi 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon May 13 10:41:40 2019 from 104.36.248.13
pi@raspberrypi:~ $
步驟4:設置OpenCV
OpenCV是一個用于計算機視覺的圖像處理功能的驚人集合。它將允許我們從網絡攝像頭讀取圖像,操縱它們以查找運動區域,保存它們等等。 Raspberry Pi上的安裝并不困難,但需要一些小心。
首先安裝virtaulenvwrapper:我們將使用python來完成所有的編程,virtualenv將幫助我們將OpenCV和TensorFlow的依賴關系分開Flask或GPIO:
pi@raspberrypi:~ $ sudo pip install virtualenvwrapper
現在您可以執行“mkvirtualenv”來創建一個新環境,“workon”來處理它,等等。
所以,讓我們為我們的圖像處理創建一個環境,使用python 3作為默認解釋器(它是2019年,沒有理由堅持使用舊的python 2):
pi@raspberrypi:~ $ mkvirtualenv cv -p python3
。..
(cv) pi@raspberrypi:~
我們現在準備安裝OpenCV。我們將主要遵循Learn OpenCV中的優秀教程。特別是按照他們的第1步和第2步:
sudo apt -y update
sudo apt -y upgrade
## Install dependencies
sudo apt-get -y install build-essential checkinstall cmake pkg-config yasm
sudo apt-get -y install git gfortran
sudo apt-get -y install libjpeg8-dev libjasper-dev libpng12-dev
sudo apt-get -y install libtiff5-dev
sudo apt-get -y install libtiff-dev
sudo apt-get -y install libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev
sudo apt-get -y install libxine2-dev libv4l-dev
cd /usr/include/linux
sudo ln -s -f 。./libv4l1-videodev.h videodev.h
sudo apt-get -y install libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev
sudo apt-get -y install libgtk2.0-dev libtbb-dev qt5-default
sudo apt-get -y install libatlas-base-dev
sudo apt-get -y install libmp3lame-dev libtheora-dev
sudo apt-get -y install libvorbis-dev libxvidcore-dev libx264-dev
sudo apt-get -y install libopencore-amrnb-dev libopencore-amrwb-dev
sudo apt-get -y install libavresample-dev
sudo apt-get -y install x264 v4l-utils
sudo apt-get -y install libprotobuf-dev protobuf-compiler
sudo apt-get -y install libgoogle-glog-dev libgflags-dev
sudo apt-get -y install libgphoto2-dev libeigen3-dev libhdf5-dev doxygen
sudo apt-get install libqtgui4
sudo apt-get install libqt4-test
現在我們可以使用
就是這樣!我們在Raspberry Pi上安裝了OpenCV,準備捕獲照片和視頻,操作它們并且很酷。
通過打開python解釋器并導入opencv來檢查是否存在錯誤:
pip install opencv-contrib-python
步驟5:設置TensorFlow
TensorFlow是由Google開發和維護的機器學習/人工智能框架。它為各種任務的深度學習模型提供了廣泛的支持,包括圖像中的對象檢測,現在在Raspberry Pi上安裝相當簡單。它在輕微Pi上的輕量級模型的性能大約是每秒1幀,這對于像我們這樣的應用來說非常合適。
我們基本上會遵循Edje Electronics的優秀教程,通過以下方式進行修改:更新的TensorFlow發行版:
(cv) pi@raspberrypi:~ $ python
Python 3.5.3 (default, Sep 27 2018, 17:25:39)
[GCC 6.3.0 20170516] on linux
Type “help”, “copyright”, “credits” or “license” for more information.
》》》 import cv2
》》》
現在我們需要編譯Google的protobuf。只需按照相同優秀教程的步驟4中的說明進行操作
最后,克隆并設置TensorFlow的模型定義 - 按照Edje Electronics教程中的步驟5進行操作
隨意按照步驟中的步驟進行操作同樣,它是對Raspberry Pi上物體檢測的一個很好的介紹。
步驟6:使用OpenCV進行運動檢測
讓我們首先測試OpenCV是否可以與我們的網絡攝像頭連接:ssh進入Raspberry Pi,轉移到cv virtualenv(workon cv) ),打開一個python解釋器(只需輸入python),然后輸入以下python命令:
pi@raspberrypi:~ $ workon cv
(cv) pi@raspberrypi:~ $ pip install tensorflow
(cv) pi@raspberrypi:~ $ sudo apt-get install libxml2-dev libxslt-dev
(cv) pi@raspberrypi:~ $ pip install pillow lxml jupyter matplotlib cython
(cv) pi@raspberrypi:~ $ sudo apt-get install python-tk
運氣好的話,你會發現OpenCV能夠從攝像頭讀取高清幀。
您可以使用cv2.imwrite(path,frame)將該幀寫入磁盤并將其重新掃描以實際查看。
檢測運動的策略非常簡單:
處理較低分辨率的幀 - 此處無需在全高清上運行
此外,模糊圖像以確保盡可能少的噪點。
保持最后N幀的運行平均值。對于此應用,幀速率約為1 FPS(僅因為TensorFlow每幀需要一些時間),我發現N = 60會返回良好的結果。并且由于仔細實現不會占用更多的CPU,而且可以使用更多的幀(它確實需要更多內存 - 但是當我們使用較低分辨率的幀時,這可以忽略不計)
從運行中減去當前圖像平均值(只需要小心輸入 - 你需要允許正值和負值[-255 。. 255],所以幀需要轉換為int)
你可以在灰色上執行減法 - 幀的轉換(和平均值),或者為每個RGB通道單獨進行轉換,然后合并結果(這是我選擇的策略,使其對顏色變化敏感)
使用
最后查找具有三角形的區域的輪廓 - 這些區域是運動發生的位置,當前圖像與先前圖像的平均值不同。如果需要,我們可以進一步找到這些輪廓的邊界框。
我已經在DeltaFinder python類中封裝了代碼來執行此操作,您可以在我的github中找到它
步驟7:使用TensorFlow檢測對象
如果您已按照TensorFlow安裝程序進行操作,則表明您已經測試過安裝了TensorFlow并正常工作。
為了檢測一般室外場景中的人,在COCO數據集上預訓練的模型表現相當不錯 - 這正是我們在TensorFlow安裝結束時下載的模型。我們只需要使用它進行推理!
同樣,我已經在TFClassify python類中封裝了模型加載和推理,以使事情變得更容易,你可以在這里找到。
步驟8:在Raspberry Pi上設置Web服務器
訪問對象檢測結果的最簡單方法是使用Web瀏覽器,所以讓我們來看看在Raspberry Pi上設置Web服務器。然后我們可以將其設置為從給定目錄提供圖片。
Web服務器框架有多個選項。我選擇了Flask。它非常易于配置,并且易于使用Python進行擴展。由于我們需要的“規模”是微不足道的,所以綽綽有余。
我建議將它安裝在一個新的virtualenv中,所以:
import cv2
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)
ret, frame = cap.read()
print(‘Read frame size: {}x{}’.format(frame.shape[1], frame.shape[0])
請注意,只要您的瀏覽器與Raspberry在同一個無線局域網上,只有正常的網絡設置才能訪問它皮。您可以在Internet路由器上創建端口映射/NAT配置以允許外部訪問 - 但我建議不要這樣做。我寫的代碼并不試圖提供在允許對Raspberry Pi進行一般Internet訪問時所需的安全性。
按照Flask快速入門指南測試您的安裝
步驟9:來自Raspberry Pi的移動通知使用IFTTT
我真的希望在事件發生時獲得移動通知。在這種情況下,當檢測到人并且水位變低時。我發現這樣做的最簡單方法是使用IFTTT而不必編寫自定義移動應用程序。 IFTTT代表“If This Then That”并啟用多種類型的事件來觸發多種類型的操作。在我們的例子中,我們對IFTTT Maker Webhook觸發器感興趣。這允許我們通過向IFTTT服務器發出HTTP POST請求來觸發IFTTT操作,該請求具有分配給我們帳戶的特殊密鑰,以及指定發生的事件的數據。我們采取的行動就像使用IFTTT移動應用程序在我們的移動設備上創建通知一樣簡單,或者比這更復雜的任何事情。
以下是如何做到這一點:
在ifttt.com上創建IFTTT帳戶
登錄后,轉到Webhook服務設置頁面并在瀏覽器中輸入URL(例如https://maker.ifttt.com/use/。該網頁將顯示您的密鑰和用于觸發操作的URL。
創建一個IFTTT小程序,當Webhook被觸發時將生成移動通知,其中包含事件的詳細信息:
單擊“我的小程序”,然后單擊“新小程序”。
單擊“+ this”并選擇“webhooks”。單擊“接收Web請求”以繼續查看詳細信息
為您的活動命名,例如“PoolEvent”并點擊“創建觸發器”
點擊“+ that”并選擇“通知”。然后選擇“從IFTTT應用程序發送豐富通知”
對于“標題”選擇類似“PoolPi”的內容
對于“消息”寫“Pool Pi檢測到:”并點擊“添加成分”。.“Value1”。
返回到您在步驟2中復制的URL。它將顯示用于調用新創建的applet的URL。復制該URL,將占位符{event}替換為事件名稱(在示例中為PoolEvent)
下載,安裝并登錄到IFTTT應用程序移動設備
在Raspberry Pi上運行此python腳本以查看它是否正常工作(注意可能需要幾秒鐘或幾分鐘才能在您的移動設備上觸發):
pi@raspberrypi:~ $ mkvirtualenv webserv
(webserv)pi@raspberrypi: ~ $ pip install Flask
步驟10:向Raspberry Pi添加一個Relay HAT并將其連接到電磁閥
在繼續此步驟之前,請關閉Raspberry Pi:ssh并輸入“sudo shutdown now”,然后斷開電源
我們的目標是打開和關閉電源電磁閥 - 一種閥門,可以根據電源提供的24V交流電源打開或關閉供水。繼電器是可以根據我們的Raspberry Pi可提供的數字信號打開或關閉電路的電子元件。我們在這里做的是將繼電器連接到Raspberry Pi的這些數字信號引腳,并使其關閉24V AC電源和電磁閥之間的電路。
Raspberry Pi上的引腳可以充當數字輸入或輸出的稱為GPIO - 通用輸入/輸出,它們是Pi側面的40個引腳的行。關閉Pi并將繼電器HAT牢牢插入其中。我選擇的HAT中有3個繼電器,我們只使用其中一個。想象一下你可以用其他兩個做的所有事情:)
現在重新打開Raspberry Pi。繼電器HAT上的紅色“電源”LED應該亮起,表示它正從Pi通過GPIO獲得電源。讓我們測試一下我們可以控制它:再次進入Pi進入Pi,輸入python并輸入:
import requests
requests.post(‘https://maker.ifttt.com/trigger/PoolEvent/with/key/’, json={“value1”:“Hello Notifications”})
您應該聽到一聲“咔嗒”聲,表示繼電器正在使用,并看到一個LED亮起表示第一個繼電器處于連接位置。您現在可以輸入
import gpiozero
dev = gpiozero.DigitalOutputDevice(26, initial_value = True)
dev.off()
這會將繼電器轉到“關閉”位置(奇怪,我知道。..。..)和從python退出()。
現在使用跨接電纜和更長的電纜連接24V電源和電磁閥之間的繼電器。見圖。最后,使用適配器將電磁閥連接到水龍頭,并通過重復上述命令準備好測試它們 - 它們應該打開和關閉水。
將軟管連接到電磁閥并放入另一端在游泳池深處。您現在有一個計算機控制的池頂關系統,是時候連接傳感器告訴它何時運行。
步驟11:連接水位傳感器
水位傳感器只是一個浮子,當浮子是浮子時連接電路向下,當它漂浮時打破它。如果將其插入池中正確的高度,當水位足夠時,浮子將上升,但當水量不足時,浮子會下降。
為了讓Raspberry Pi了解水位傳感器的狀態,我們需要Pi來感應開路或閉路。幸運的是,這很簡單:我們用作控制繼電器的數字輸出的相同GPIO連接器可以作為輸入(因此GPIO中的I)。具體來說,如果我們將傳感器的一根導線連接到GPIO連接器上的+ 3.3V,另一根傳感器導線連接到我們配置為下拉輸入的引腳(意味著它通常處于GND電壓電平),該引腳將測量僅當水位傳感器關閉電路時 - 水位低時,才會產生數字“高”或“開”電壓。我使用GPIO引腳16作為輸入,我在上圖中標記了它。
將引腳配置為輸入并測試其當前狀態的python代碼是:
dev.on()
一個潛在的挑戰是,當傳感器剛剛改變狀態時,它將在開啟和關閉狀態之間快速振蕩。解決方案被稱為“去抖動”,并在采取行動之前尋找一致的狀態變化。 GPIOZERO庫有代碼可以執行此操作,但由于某些原因,代碼對我來說效果不佳。我寫了一個簡單的循環,當檢測到一致的狀態變化時觸發IFTTT警報,您可以在我的存儲庫中找到它。
步驟12:編寫代碼將所有內容綁定在一起
就是這樣。我們的設置已經完成。您可以編寫自己的代碼將事物組合到一個完整的系統中,或者使用我提供的代碼。要做到這一點,只需創建目錄結構并克隆存儲庫,如下所示:
import gpiozero
level_input = gpiozero.Button(16)
water_low = level_input.is_pressed
接下來,編輯motion_alert和water_level目錄中名為ifttt_url.txt的文件,以獲得您自己的URL使用您的密鑰進行IFTTT Web掛鉤。您可以使用兩個不同的Web掛鉤進行不同的操作。
最后,我們希望此代碼自動運行。實現這一目標的最簡單方法是通過Linux crontab服務。我們可以為兩個主要任務添加一些crontab行:
運行我們的三個程序:每次重啟時對象檢測器,水位傳感器和Web服務器
清理輸出目錄,刪除舊圖片和舊視頻文件(我選擇刪除文件超過1天且超過7天的圖片 - 隨意進行實驗)
要執行此類型的crontab -e,它將打開您的納米文本編輯器。將以下行添加到文件的底部:
mkdir poolpi
cd poolpi
git clone https://github.com/rafitzadik/PoolPiGuy.git
最后,重新啟動Raspberry Pi。它現在已準備好讓您的游泳池充滿安全。
-
報警系統
+關注
關注
5文章
647瀏覽量
75161 -
樹莓派
+關注
關注
116文章
1698瀏覽量
105524
發布評論請先 登錄
相關推薦
評論