使用树莓派消除害虫





5.00/5 (3投票s)
在本文中,我们将在一台树莓派3设备上测试我们的检测算法,并通过播放响亮的声音来实现我们害虫消除器的“驱赶害虫”功能。
引言
不受控制的野生动物对于企业和房主来说都是一个难题。像鹿、驼鹿甚至猫这样的动物都会对花园、庄稼和财产造成破坏。
在本系列文章中,我们将演示如何在树莓派上实时(或近乎实时)检测害虫(例如驼鹿),然后采取措施驱赶害虫。由于我们不想造成任何伤害,我们将专注于通过播放响亮的声音来吓走害虫。
欢迎您下载项目源代码。我们假设您熟悉Python,并对神经网络的工作原理有一定的基本了解。
在上一篇文章中,我们开发了一个运动检测器,并将其与训练好的DNN分类器结合起来。在本文中,我们将修改我们的Python代码,以便在树莓派设备上执行害虫检测,并使最终解决方案能够播放响亮的声音来吓走害虫。
配置树莓派
首先,我们需要配置我们的边缘设备。我们将使用一台16GB内存的树莓派3B+。操作系统将是Raspberry Pi OS (32位)。Python OpenCV库可以通过PIP通道安装。
要播放声音,我们将使用Pygame库。这个包在树莓派设备上使用的大多数操作系统中都已预装。我们假定将使用3.5毫米耳机插孔来播放声音,因此请使用Pi设备上音频输出的默认配置。
请注意,这仅用于概念验证。如果您试图构建一个商业害虫探测器,您可能需要使用类似Jetson或Coral的设备。它们提供经济实惠的原型开发板和生产级硬件 - 因此一旦您的产品准备就绪,就可以轻松进入大规模生产。
修改代码
为了在Pi设备上播放声音并测试检测算法,我们需要编写一些额外的代码。
首先,我们将使用Pygame的mixer模块创建一个声音播放器
from pygame import mixer
class SoundPlayer:
def __init__(self, sound_file):
mixer.init(44100, -16, 2, 2048)
self.sound = mixer.Sound(sound_file)
def play(self):
self.sound.play()
接下来,我们需要一个类来测量我们应用程序的帧处理速度
import time
class FPS:
def __init__(self):
self.frame_count = 0
self.elapsed_time = 0
def start(self):
self.start_time = time.time()
def stop(self):
self.stop_time = time.time()
self.frame_count += 1
self.elapsed_time += (self.stop_time-self.start_time)
def count(self):
return self.frame_count
def elapsed(self):
return self.elapsed_time
def fps(self):
if self.elapsed_time==0:
return 0
else:
return self.frame_count/self.elapsed_time
现在我们可以修改我们在上一篇文章中开发的VideoPD
类,以播放声音并评估检测速度
class VideoPDSound:
def __init__(self, md, pd, thresh, sp):
self.md = md
self.pd = pd
self.thresh = thresh
self.sp = sp
self.fps = FPS()
def play(self, file_path):
capture = cv2.VideoCapture(file_path)
md_name = 'Motion objects'
cv2.namedWindow(md_name, cv2.WINDOW_NORMAL)
cv2.resizeWindow(md_name, 640, 480)
counter = 0
play_dt = 10.0
curr_time = time.time()
play_time = curr_time - play_dt - 0.1
detect_count = 0
while(True):
(ret, frame) = capture.read()
if frame is None:
break
counter = counter + 1
#if (counter % 3) != 0:
# continue
self.fps.start()
self.md.process(frame)
objects = self.md.objects()
l = len(objects)
pests = []
if l>0 :
for (i, obj) in enumerate(objects) :
(roi, (class_num, class_conf)) = self.pd.detect(frame, obj)
if (class_num>0) and (class_conf>=self.thresh) :
pests.append(roi)
self.fps.stop()
if l>0:
Utils.draw_objects(objects, "OBJECT", (255, 0, 0), frame)
k = len(pests)
if k>0:
detect_count = detect_count + 1
Utils.draw_objects(pests, "PEST", (0, 0, 255), frame)
curr_time = time.time()
dt = curr_time - play_time
if dt>play_dt :
self.sp.play()
play_time = curr_time
# Display the resulting frame with object rects
cv2.imshow(md_name, frame)
#time.sleep(0.01)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
capture.release()
cv2.destroyAllWindows()
f = self.fps.fps()
return (detect_count, f)
此代码现在通过调用self.fps.start
和self.fps.stop
方法来监控检测过程的性能。请注意,我们仅评估检测算法(运动检测和分类)的执行时间。修改后的代码还在检测到帧中的害虫时通过调用self.sp.play
来播放声音。在实际情况下,驼鹿很可能在几个连续的帧中被检测到。我们不希望每次驼鹿出现在摄像头视野中时都播放声音。
目标是只发出一次吓人的声音,然后等待新的害虫出现。该算法播放声音的频率不超过每10秒一次。所以如果我们有一群恶意的驼鹿在我们的金盏花丛中游荡,我们将把它们全部吓走——如果必要,一次一个。
如果一只驼鹿在我们试图吓走它之后仍然逗留,我们也能应对。如果我们的声音不足以吓唬这只驼鹿,只要驼鹿在可视范围内,它就会(希望)因为恼怒而离开,因为我们每10秒播放一次相同的声音。
我们还需要选择一种适合吓唬害虫的声音。让我们从互联网上众多免费的蜂鸣声中选择一个;例如,这个:buzzer.wav)。
运行害虫消除器
现在我们准备在树莓派设备上运行我们的害虫消除算法
video_file = r"/home/pi/Desktop/PI_PEST/video/moose_1.mp4"
md = MD(0.05, 0.1)
proto = r"/home/pi/Desktop/PI_PEST/net/moose.prototxt"
model = r"/home/pi/Desktop/PI_PEST/net/moose.caffemodel"
pd = PestDetector(proto, model, 128)
sound_file = r"/home/pi/Desktop/PI_PEST/video/buzzer.wav"
scarer = SoundPlayer(sound_file)
v_pd = VideoPDSound(md, pd, 0.99, scarer)
(detect_count, fps) = v_pd.play(video_file)
print("FPS = %s" % fps)
这是拍摄到的视频结果
视频处理完成后,我们会在控制台中显示平均处理速度。对于这个视频文件,它测得的速度为11到12 FPS。比基于预训练SSD模型的算法快一个数量级。(还记得吗?那里的速度大约是1.25 FPS)。我们的自定义算法几乎以实时速度运行,而无需进行硬优化或并行处理。
后续步骤
在本系列文章中,我们演示了如何在树莓派设备上使用AI算法在户外真实场景中消除害虫。我们首先开发了代码,使预训练的SSD模型能够支持检测常见的害虫,如牛、羊,甚至猫狗。
然后,我们为一种“不寻常”的害虫——驼鹿——组建了一个图像样本数据集。我们应用了几种数据增强方法来丰富我们的数据集。然后,我们开发了一个简单、小型的DNN分类器模型,并在增强的数据集上进行了训练,准确率高达97%。
最后,我们设计了一个基本的运动检测算法,并将其与DNN分类器结合起来。该完整算法在视频文件上进行了测试,显示出令人惊讶的良好性能,为11到12 FPS。
我们希望您觉得这个系列文章很有用,并希望它能为您开发有趣的边缘设备AI应用提供一些思路。本系列的主要目的是展示检测问题的概念性解决方案。
如果您打算部署一个商业害虫消除工具,接下来的步骤是进一步优化您的软件堆栈以提高性能。我们鼓励您尝试让这个解决方案变得更好。祝您好运!