65.9K
CodeProject 正在变化。 阅读更多。
Home

边缘设备的实时 AI 人员检测:在树莓派上测试 SSD 模型

2020年10月9日

CPOL

3分钟阅读

viewsIcon

7732

downloadIcon

47

在本文中,我们将测试MobileNet和SqueezeNet模型在Raspberry Pi设备上的准确性和性能。

在本系列的前一篇文章中,我们已经在Raspberry Pi设备上启动了我们的人体检测软件。 在这篇文章中,我们将比较两个SSD模型 – MobileNet和SqueezeNet – 在Raspberry Pi 3B设备上的精度和性能。 我们将选择更好的一个来对视频剪辑和实时模式进行处理。

首先,让我们创建一个实用程序类来评估函数执行的时间和FPS

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

上面的类只是保存执行的开始时间 – 当调用start方法时 – 并评估到调用stop方法为止所经过的时间。 知道总经过时间和函数执行的次数,我们可以计算长时间计算过程的平均FPS。

现在让我们修改我们的Python代码来评估检测的检测时间(这里只显示修改的部分)

fps = FPS();
fps.start()
obj_data = ssd.detect(image)
persons = ssd.get_objects(image, obj_data, person_class, 0.5)
fps.stop()
person_count = len(persons)
print("Person count on the image: "+str(person_count))
print("FPS: "+str(fps.fps()))

通过在几张图像上运行代码,我们可以估计设备的处理单元检测帧中的人员所需的平均时间。 我们已经为MobileNet DNN模型完成了此操作,并且获得了平均值1.25 FPS。 这意味着该设备大约可以在0.8秒内处理一帧。

为了测试SqueezeNet SSD模型,让我们再次修改我们的代码。一个明显的改变是模型加载的路径

proto_file = r"/home/pi/Desktop/PI_RPD/squeezenet.prototxt"
model_file = r"/home/pi/Desktop/PI_RPD/squeezenet.caffemodel"

另一个重要的修改是切换到具有不同缩放参数的帧处理器。 SqueezeNet模型已经使用其自身的缩放系数进行了训练,因此我们必须为该模型指定适当的值

# frame processor for SqueezeNet
ssd_proc = FrameProcessor(proc_frame_size, 1.0, 127.5)

在与MobileNet相同的图像上测试SqueezeNet模型,我们获得了稍高的处理速度,大约1.5 FPS(或每帧大约0.67秒)。 看来SqueezeNet模型在Raspberry Pi设备上比MobileNet更快。 并且由于速度是主要问题,我们可能应该使用更快的模型。

但是在我们在精度方面测试模型之前,让我们不要仓促下结论。 我们需要比较正面检测率。 为什么这在这里很重要? 当我们以实时模式测试人体检测时,这一点将变得完全清楚。 显而易见的原因是,如果检测率很高,则在视频流中找到人的可能性就会增加。

为了估计我们模型的检测率,我们应该针对许多图像运行代码并评估正确检测的数量。 这是两张图像的实验结果

如您所见,MobileNet SSD在两个图像上都发现了该人,并报告了良好的置信度 – 超过90%。 SqueezeNet模型仅在其中一个图像上找到了该人,置信度相当低,为57%。 因此,测试表明,使用SqueezeNet SSD进行人员检测的概率约为使用MobileNet模型的一半。

考虑到这两个实验-速度估计和准确性评估-我们宣布MobileNet DNN为最终获胜者。 我们将使用此模型进行所有进一步的实验。 请注意,如果我们改变主意,所有代码都可以轻松地适用于SqueezeNet模型。

后续步骤

在本系列的下一篇文章中,我们将开发用于视频流中人员检测的Python代码。 它将使用OpenCV库从视频文件中读取帧。 然后,我们将看到检测算法如何处理流数据,以及如何将其调整为实时视频。

© . All rights reserved.