MAKER:t3chflicks/ 譯:趣無盡
這是一隻外形是貓頭鷹的「殭屍」探測器,它通過圖像處理技術實現人體識別和跟蹤。如果你手頭剛好有樹莓派4(Raspberry Pi) 的話就可以來練練手。新版的樹莓派擁有 4GB 內存,可以實現許多比較複雜的項目,其中就包括在深度學習模式下的圖像處理。材料清單樹莓派4(Raspberry Pi)×1
夜視攝像頭×1
微型舵機×1
貓頭鷹模型×1
膠水×1
油漆×若干
螺絲×若干
USB 揚聲器×1
大型可攜式電源(5v)×1
3D印表機×1
2、拆掉的圓柱體是由一個塑料體和軸承組成,使用螺絲刀將軸承拆除。
3、用螺絲將塑料圓柱體與彈簧連接起來並將舵機連接到圓柱體上。
4、取下連接貓頭鷹身體部分的螺絲。
5、在貓頭鷹身體部分的頂部開一個孔。孔的大小可以放入若干電線和攝像頭的線。
1、將攝像頭的頂部安裝到貓頭鷹頭部的裡面,再將攝像頭放入到外殼內並連接電線。
2、將舵機粘到彈簧的頂部。
3、將長線連接到舵機引腳(5V、接地、信號)。
4、將攝像頭電線和舵機電線穿過彈簧,然後再穿過貓頭鷹身體頂部的孔。
安裝身體部位設備
1、去掉底部的塞子,擴大孔的尺寸,以便樹莓派和揚聲器等硬體設備可以放入到貓頭鷹的體內。
2、將攝像頭的線從貓頭鷹頂部拉出來插入到樹莓派,同時也將舵機的線穿過插入樹莓派。
插線方式如下:
舵機 +5v => 樹莓派 +5V
舵機 Gnd => 樹莓派 Gnd
舵機 信號 => 樹莓派 Pin 12
3、將 USB 揚聲器、SD 卡、插入樹莓派。
4、使用可攜式電源為樹莓派供電。
5、通過底座上的孔將樹莓派、電源和揚聲器插入貓頭鷹。
所有的代碼都可以在 GitLab 下載到:
https://gitlab.com/t3chflicks/cctv-owl
1、使用 Balena Etcher 給樹莓派刷好系統。
參考:http://shumeipai.nxez.com/2019/04/17/write-pi-sd-card-image-using-etcher-on-windows-linux-mac.html
2、開啟樹莓派的 SSH 並配置好 WiFi。
參考:
http://shumeipai.nxez.com/2017/09/13/raspberry-pi-network-configuration-before-boot.html
3、將 SD 卡插入樹莓派,然後嘗試通過 SSH 訪問樹莓派。
下面的代碼示例用來了解使用舵機實現貓頭鷹頭部的移動:
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(12, GPIO.OUT)
p = GPIO.PWM(12, 50)
p.start(7.5)
print("starting")
try:
while True:
print("looping duty cycle")
p.ChangeDutyCycle(7.5) # turn towards 90 degree
time.sleep(1) # sleep 1 second
p.ChangeDutyCycle(2.5) # turn towards 0 degree
time.sleep(1) # sleep 1 second
p.ChangeDutyCycle(12.5) # turn towards 180 degree
time.sleep(1) # sleep 1 second
except KeyboardInterrupt:
p.stop()
GPIO.cleanup()
1、舵機與樹莓派的連接方式如下:
舵機 +5V => 樹莓派 +5V
舵機 Gnd => 樹莓派 Gnd
舵機 信號 => 樹莓派 Pin 12
2、首先設置 GPIO 引腳以便舵機的信號引腳上使用 PWM。
3、簡單地選擇信號引腳的佔空比,佔空比的設置是 7.5 為 90 度,2.5 為0度,12.5 為 180度。
下面的代碼示例實現貓頭鷹的叫聲,使用樹莓派播放音頻:
1、插入 USB 揚聲器,下載聲音。我選擇了驚悚的聲音(用來嚇唬人)。
2、通過運行以下命令來播放聲音:omxplayer -o alsa:hw:1,0 owl_sound.mp3
如果跑不起來,請使用 alsamixer 命令檢查樹莓派的輸出以及音量的大小。你可以在調音臺屏幕上更改音量並選擇媒體設備。要增加聲音的音量,請執行以下命令:
omxplayer -o alsa:hw:1,0 owl_sound.mp3 --vol 500
使用 Python 播放聲音,然後測試腳本。
import subprocess
command = "omxplayer -o alsa:hw:1,0 ../../assets/owl_sound.mp3 --vol 500"
player = subprocess.Popen(command.split(' '),
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
聲音文件請在項目文件庫中下載:
https://make.quwj.com/project/181
1、創建樹莓派攝像頭視頻流的代碼教程可參考:
https://gitlab.com/t3chflicks/cctv-owl/tree/master/tutorials/3_stream_video
2、運行 python app.py 並在http://raspberrypi.local:5000/的本地網絡上查看。
3、本代碼是從 Miguel Grinberg 的網站上獲取並稍作改編的。基本概念是使用線程和生成器來提高視頻流的傳輸速度。
https://blog.miguelgrinberg.com/post/flask-video-streaming-revisited
使用 ImageNetSSD 實現視頻中的人體識別可參考:
https://gitlab.com/t3chflicks/cctv-owl/tree/master/tutorials/4_object_detection
因為使用樹莓派4,我們準備用深度學習模型來替代基本 HaarCascade 方法。
1、首先查看一些預先訓練好的模型,例如 YOLOv3。YOLOv3 很輕,對於樹莓派來說很完美,但卻無法完美運行起來。
2、然後我們選擇了 openCVs DNN(深度神經網絡)模塊運行的 MobileSSD 模型。
代碼部分:
https://heartbeat.fritz.ai/real-time-object-detection-on-raspberry-pi-using-opencv-dnn-98827255fa60
圖像處理部分:
https://www.pyimagesearch.com/2017/09/11/object-detection-with-deep-learning-and-opencv/
3、然而當我們嘗試流式傳輸內容並在每個幀上運行模型時,最後導致視頻播放緩慢而且片段化。最後我們學習了Adrian Rosebrock 的方法:
https://www.pyimagesearch.com/2017/10/16/raspberry-pi-deep-learning-object-detection-with-opencv/
使用 Python 多處理模塊將圖像放入隊列可以在不嚴重阻塞攝像頭視頻流的情況下進行處理。
4、嘗試自己運行代碼吧:
https://gitlab.com/t3chflicks/cctv-owl
1、使用https://pushed.co/通知服務。
2、註冊一個免費帳戶並下載該應用程式,然後快速設置,並獲取移動通知。
import requests
payload = {
"app_key": "APP_KEY",
"app_secret": "APP_SECRET",
"target_type": "app",
"content": "Owl has detected a zombie."
}
r = requests.post("https://api.pushed.co/1/push", data=payload)
這非常的簡單,你也可以自定義通知的名稱。
完成
希望你喜歡這隻聰明的貓頭鷹,快來做一隻來守護你的家吧!
BrachioGraph:樹莓派繪圖機