Raspberry Pi上的SSD模型比较

在本系列的前一篇文章中,已经在Raspberry Pi设备上启动了人检测软件。本文将比较两种SSD模型——MobileNet和SqueezeNet——在Raspberry Pi 3B设备上的精度和性能。将选择更好的模型用于视频剪辑,并在实时模式下进行测试。

创建一个评估函数执行时间和FPS的工具类

首先,需要创建一个工具类来评估函数执行的时间和每秒帧数(FPS)。以下是Python代码示例:

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代码以评估检测时间

接下来,需要修改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秒内处理一帧。

测试SqueezeNetSSD模型

为了测试SqueezeNetSSD模型,需要再次修改代码。一个明显的变化是模型加载的路径:

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

另一个重要的修改是切换到具有不同缩放参数的帧处理器。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模型的两倍。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485