MAKER:t3chflicks/译:趣无尽 Cherry(转载请注明出处)
这是一只外形是猫头鹰的「僵尸」探测器,它通过图像处理技术实现人体识别和跟踪。如果你手头刚好有树莓派4(Raspberry Pi) 的话就可以来练练手。新版的树莓派拥有 4GB 内存,可以实现许多比较复杂的项目,其中就包括在深度学习模式下的图像处理。
现在让我们一起来看看如何制作吧。
材料清单
树莓派4(Raspberry Pi)×1
夜视摄像头×1
微型舵机×1
猫头鹰模型×1
胶水×1
油漆×若干
螺丝×若干
USB 扬声器×1
大型便携式电源(5v)×1
3D打印机×1
处理猫头鹰
这里主要处理猫头鹰的头部,以便安装夜视摄像头。如果你选用的是其他“壳”,可根据自己的实际情况来操作。
1、取下猫头鹰的头部并将连接处的圆柱体移除。
2、拆掉的圆柱体是由一个塑料体和轴承组成,使用螺丝刀将轴承拆除。
3、用螺丝将塑料圆柱体与弹簧连接起来并将舵机连接到圆柱体上。
4、取下连接猫头鹰身体部分的螺丝。
5、在猫头鹰身体部分的顶部开一个孔。孔的大小可以放入若干电线和摄像头的线。
安装电子设备部分
安装头部设备
3D 打印摄像头外壳后刷漆让使其与猫头鹰的颜色相匹配。
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 给树莓派刷好系统。
参考:../../../2019/04/17/write-pi-sd-card-image-using-etcher-on-windows-linux-mac.html
2、开启树莓派的 SSH 并配置好 WiFi。
参考:
../../../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)
这非常的简单,你也可以自定义通知的名称。
完成
希望你喜欢这只聪明的猫头鹰,快来做一只来守护你的家吧!
有没有人成功实现功能的?
我遇到一个棘手的问题classify_frame是什么库文件,我没找到它。网上搜索也没有,似乎是这个教程里自己编写出来的。然后运行cctv-owl-master\tutorials\4_object_detection里的app.py会报错,找不到classify_frame。