目录
在这里,我们修改了在Pi设备上启动MD和DNN的Python代码。然后,我们演示视频文件上的驼鹿检测。然后,我们向读者展示了如何通过发出响亮的声音来触发连接的扬声器来吓跑害虫。最后,我们对该系列作了简要介绍,并提出了进一步的改进建议。
介绍
野蛮的野生生物可能给企业和房主带来痛苦。鹿、驼鹿甚至猫等动物都会对花园、庄稼和财产造成破坏。
在本系列文章中,我们将演示如何在Raspberry Pi上实时(或近实时)检测有害生物(例如驼鹿),然后采取措施消除有害生物。由于我们不想造成任何伤害,我们将通过播放巨大的噪音来吓跑害虫。
欢迎您下载该项目的源代码。我们假设您熟悉Python并且对神经网络的工作原理有基本的了解。
在上一篇文章中,我们开发了一种运动检测器,并将其与训练有素的DNN分类器结合在一起。在本文中,我们将修改我们的Python代码以在Raspberry Pi设备上执行有害生物检测,并使最终的解决方案能够播放响亮的声音以将有害生物吓走。
配置Raspberry Pi
首先,我们需要配置我们的边缘设备。我们将使用具有16 GB内存的Raspberry Pi 3B +。操作系统将是Raspberry Pi OS(32位)。可以通过PIP通道安装Python OpenCV库。
要播放声音,我们将使用Pygame库。该软件包已预安装在Raspberry Pi设备使用的大多数操作系统上。假设我们将使用3.5毫米耳机插孔播放声音,因此请使用默认配置在Pi设备上输出音频。
请注意,这旨在作为概念证明。如果您试图构建一个商业性的害虫检测器,则可能需要使用Jetson或Coral之类的东西。他们提供价格合理的原型板和可用于生产的硬件——因此,一旦您的产品准备就绪,就很容易进入批量生产。
修改代码
要播放声音并在Pi设备上测试检测算法,我们需要编写一些其他代码。
首先,我们将使用Pygame混音器模块创建一个声音播放器:
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秒钟播放一次相同的声音后,(希望)会消除烦恼。
我们还需要选择一种适合吓跑害虫的声音。让我们从Internet上获得许多免费的蜂鸣器声音中的一种。例如,这一个:buzzer.wav)。
运行害虫消除器
现在,我们准备在Raspberry Pi设备上运行除虫算法:
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)
这是捕获的视频结果:
https://youtube.com/embed/o2Qd_L0V3uY
视频处理完成后,我们将在控制台中显示平均处理速度。对于此视频文件,其测量值为11到12 FPS。比基于预训练的SSD模型的算法快一个数量级。(记得吗?速度大约为1.25 FPS)。我们的自定义算法几乎可以实时运行,而无需进行硬优化或并行处理。
下一步
在本系列文章中,我们演示了如何在Raspberry Pi设备上使用AI算法来消除现实生活中的户外环境中的有害生物。我们从开发代码开始,以使预训练的SSD模型支持对常见害虫的检测,例如牛、羊、甚至猫和狗。
然后,我们组装了一个“异常”害虫:驼鹿的图像样本数据集。我们应用了几种数据扩充方法来增强数据集。然后,我们开发了一个简单的小型DNN分类器模型,并在扩充数据集上对其进行了训练,其准确度高达97%。
最后,我们设计了一种基本的运动检测算法,并将其与DNN分类器结合在一起。完整的算法在视频文件上进行了测试,显示出惊人的11至12 FPS的良好性能。
我们希望您发现本系列很有用,也希望它为您提供一些针对边缘设备开发有趣的AI应用程序的指导。该系列的主要目的是展示检测问题的概念性解决方案。
如果您打算部署商业性的害虫消除工具,那么下一步就是要做进一步的工作,以优化软件堆栈的性能。我们鼓励您尝试使此解决方案更好地工作。祝好运!
https://www.codeproject.com/Articles/5289754/Eliminating-Pests-with-a-Raspberry-Pi