找回密码
 立即注册

QQ登录

只需一步,快速开始

本帖最后由 lou 于 2020-5-6 11:06 编辑

深度学习:猫头鹰「僵尸」探测器



127.jpg

这是一只外形是猫头鹰的「僵尸」探测器,它通过图像处理技术实现人体识别和跟踪。如果你手头刚好有树莓派4(Raspberry Pi) 的话就可以来练练手。新版的树莓派拥有 4GB 内存,可以实现许多比较复杂的项目,其中就包括在深度学习模式下的图像处理。
现在让我们一起来看看如何制作吧。


材料清单

  • 树莓派4(Raspberry Pi)×1
  • 夜视摄像头×1
  • 微型舵机×1
  • 猫头鹰模型×1
  • 胶水×1
  • 油漆×若干
  • 螺丝×若干
  • USB 扬声器×1
  • 大型便携式电源(5v)×1
  • 3D打印机×1

处理猫头鹰

这里主要处理猫头鹰的头部,以便安装夜视摄像头。如果你选用的是其他“壳”,可根据自己的实际情况来操作。
1、取下猫头鹰的头部并将连接处的圆柱体移除。

128.jpg

2、拆掉的圆柱体是由一个塑料体和轴承组成,使用螺丝刀将轴承拆除。
3、用螺丝将塑料圆柱体与弹簧连接起来并将舵机连接到圆柱体上。
4、取下连接猫头鹰身体部分的螺丝。

129.jpg

5、在猫头鹰身体部分的顶部开一个孔。孔的大小可以放入若干电线和摄像头的线。

252.jpg

安装电子设备部分

安装头部设备
3D 打印摄像头外壳后刷漆让使其与猫头鹰的颜色相匹配。

130.jpg

1、将摄像头的顶部安装到猫头鹰头部的里面,再将摄像头放入到外壳内并连接电线。

131.jpg

2、将舵机粘到弹簧的顶部。
132.jpg

133.jpg

3、将长线连接到舵机引脚(5V、接地、信号)。
4、将摄像头电线和舵机电线穿过弹簧,然后再穿过猫头鹰身体顶部的孔。

134.jpg

安装身体部位设备

1
、去掉底部的塞子,扩大孔的尺寸,以便树莓派和扬声器等硬件设备可以放入到猫头鹰的体内。

135.jpg

2、将摄像头的线从猫头鹰顶部拉出来插入到树莓派,同时也将舵机的线穿过插入树莓派。

137.jpg

5、通过底座上的孔将树莓派、电源和扬声器插入猫头鹰。

138.jpg

配置树莓派

所有的代码都可以在 GitLab 下载到:
https://gitlab.com/t3chflicks/cctv-owl
1、使用 Balena Etcher 给树莓派刷好系统。
2、开启树莓派的 SSH 并配置好 WiFi。
参考:
https://shumeipai.nxez.com/2017/09/13/raspberry-pi-network-configuration-before-boot.html
3、将 SD 卡插入树莓派,然后尝试通过 SSH 访问树莓派。

设置头部动作

下面的代码示例用来了解使用舵机实现猫头鹰头部的移动:

  1. import RPi.GPIO as GPIO

  2. import time

  3. GPIO.setmode(GPIO.BOARD)

  4. GPIO.setwarnings(False)

  5. GPIO.setup(12, GPIO.OUT)

  6. p = GPIO.PWM(12, 50)



  7. p.start(7.5)

  8. print("starting")

  9. try:

  10.     while True:

  11.         print("looping duty cycle")

  12.         p.ChangeDutyCycle(7.5)  # turn towards 90 degree

  13.         time.sleep(1) # sleep 1 second

  14.         p.ChangeDutyCycle(2.5)  # turn towards 0 degree

  15.         time.sleep(1) # sleep 1 second

  16.         p.ChangeDutyCycle(12.5) # turn towards 180 degree

  17.         time.sleep(1) # sleep 1 second

  18. except KeyboardInterrupt:

  19.     p.stop()

  20.     GPIO.cleanup()
复制代码

139.jpg

1、舵机与树莓派的连接方式如下:
舵机 +5V=> 树莓派 +5V
舵机 Gnd=> 树莓派 Gnd
舵机 信号=> 树莓派 Pin 12
2、首先设置 GPIO 引脚以便舵机的信号引脚上使用 PWM。
3、简单地选择信号引脚的占空比,占空比的设置是 7.5 为 90 度,2.5 为0度,12.5 为 180度。

配置声音

下面的代码示例实现猫头鹰的叫声,使用树莓派播放音频:

140.jpg

1、插入 USB 扬声器,下载声音。我选择了惊悚的声音(用来吓唬人)。
2、通过运行以下命令来播放声音:omxplayer -o alsa:hw:1,0 owl_sound.mp3
如果跑不起来,请使用 alsamixer 命令检查树莓派的输出以及音量的大小。你可以在调音台屏幕上更改音量并选择媒体设备。要增加声音的音量,请执行以下命令:

  1. omxplayer -o alsa:hw:1,0 owl_sound.mp3 --vol 500
复制代码

使用Python 播放声音,然后测试脚本。

  1. import subprocess

  2. command = "omxplayer -o alsa:hw:1,0 ../../assets/owl_sound.mp3 --vol 500"

  3. player = subprocess.Popen(command.split(' '),

  4.                             stdin=subprocess.PIPE,

  5.                             stdout=subprocess.PIPE,

  6.                             stderr=subprocess.PIPE

  7.                           )

复制代码

141.jpg

声音文件请在项目文件库中下载:
https://make.quwj.com/project/181

树莓派上视频流的实现

142.jpg

143.jpg

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

人体识别

144.jpg

使用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/通知服务。

145.jpg

2、注册一个免费帐户并下载该应用程序,然后快速设置,并获取移动通知。

146.jpg

  1. import requests
  2. payload = {
  3.           "app_key": "APP_KEY",
  4.           "app_secret": "APP_SECRET",
  5.           "target_type": "app",
  6.           "content": "Owl has detected a zombie."
  7.           }
  8. r = requests.post("https://api.pushed.co/1/push", data=payload)
复制代码

这非常的简单,你也可以自定义通知的名称。

完成

147.jpg

136.jpg
分享至 : QQ空间
收藏

0 个回复

您需要登录后才可以回帖 登录 | 立即注册