- 下载数据-19.3 MB
- 下载模型-43.5 MB
- 下载结果-36.66 MB
从本系列的前几篇文章中,我们获得了使用SSD DNN模型检测图像中人物的Python代码。而且我们已经展示了该代码可以在Raspberry Pi设备上启动。在本文中,我们将调整代码以检测视频流中的人物。
我们将使用mp4格式的视频文件作为视频“流”数据。这是测试检测算法的最简单方法。首先,我们可以使用任何摄像机的数据,也可以从Internet下载视频剪辑。其次,我们可以使用相同的输入数据重复进行多次实验,这是测试的重要方面。Raspberry Pi设备具有摄像头模块,我们可以使用它来测试实时视频流上的检测算法。但是,几乎不可能在相同条件下多次测试该算法,因为很难为实时摄像机精确地重复场景。
我们已经有了一些实用程序类,用于处理Caffe DNN模型,处理图像以及在其上进行图形检测。另外,还有一个主要类别,SSD,它可以接收帧(图像)并 检测其中的人物。现在,使用现有代码,让我们编写一个新的Python类进行视频处理:
class VideoSSD:
def __init__(self, ssd):
self.ssd = ssd
def detect(self, video, class_num, min_confidence):
detection_num = 0;
fps = FPS()
capture = cv2.VideoCapture(video)
# Capture all frames
while(True):
(ret, frame) = capture.read()
if frame is None:
break
fps.start()
obj_data = self.ssd.detect(frame)
persons = self.ssd.get_objects(frame, obj_data, class_num, min_confidence)
fps.stop()
p_count = len(persons)
detection_num += p_count
if len(persons)>0:
Utils.draw_objects(persons, "PERSON", (0, 0, 255), frame)
# Display the resulting frame
cv2.imshow('Person detection',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
capture.release()
cv2.destroyAllWindows()
f = fps.fps()
return (detection_num, f)
用SSD类的一个实例初始化VideoSSD类,该SSD类在视频处理器中用于人员检测。主要的detect方法具有三个输入参数:video——视频文件的完整路径,class_num——要检测的类别编号,以及min_confidence——类别检测的阈值。在这种方法中,我们首先初始化fps对象以进行性能评估,然后从cv2模块创建VideoCapture。然后,我们遍历视频流中的所有帧,在每个帧中检测人员,对所有检测到的人员进行计数,然后计算性能。可以修改该代码以用于实时摄像机而不是视频文件。您需要做的就是为适当的参数修改cv2.VideoCapture的初始化。
detect方法返回一个元组,其中包含检测到的人员总数和平均FPS。请注意,我们不会将检测到人物的帧保存到文件中(我们在图像中进行检测的方式)。我们只是在框架中绘制检测结果,然后通过调用cv2.imshow方法将其显示在GUI窗口中。因此,我们将在屏幕上看到检测结果。
现在,让我们编写用于检测视频文件中人物的代码:
# testing video detector
proto_file = r"/home/pi/Desktop/PI_RPD/mobilenet.prototxt"
model_file = r"/home/pi/Desktop/PI_RPD/mobilenet.caffemodel"
ssd_net = CaffeModelLoader.load(proto_file, model_file)
print("Caffe model loaded from: "+model_file)
proc_frame_size = 300
# frame processor for MobileNet
ssd_proc = FrameProcessor(proc_frame_size, 1.0/127.5, 127.5)
person_class = 15
ssd = SSD(ssd_proc, ssd_net)
video_file = r"/home/pi/Desktop/PI_RPD/video/person_1.mp4"
video_ssd = VideoSSD(ssd)
(detections, fps) = video_ssd.detect(video_file, person_class, 0.5)
print ("Detection count:"+str(detections))
print ("FPS:"+str(fps))
在Raspberry Pi 3B设备上针对测试视频运行以上代码,我们得到以下结果:总检测计数为54;平均FPS约为1.27。
在运行程序时,我们会看到带有人员检测的GUI窗口。这是保存的屏幕视频:
youtube
从视频中可以看到,检测速度非常慢,因为处理单元每帧大约需要0.8秒。这与我们在处理静止图像时基准测试的性能相同……但是对于视频处理而言,它看起来很慢。
在这一点上,我们应该问自己是否足以在0.8秒内处理一帧以实现实时人员检测。答案取决于检测目的。如果目标是计算进入购物中心的所有顾客,则答案为“否”。但是,如果我们正在开发视频监视系统,并且目标是仅向操作员告知入侵者的出现,答案将是“是”。让我们注意一下,在我们的测试视频中,每个人都会出现几秒钟。如果我们能够在一秒钟内处理一帧图像,那么我们就很有可能检测到该人的外貌。
看起来我们可以使用AI模型在实时摄像头上检测人的外观。但是,我们的人员检测代码无法实时处理,因为它会处理所有帧,因此速度很慢。
下一步在接下来的文章中,我们将修改的边缘设备上实时处理的代码。