边缘设备的实时 AI 人员检测:实时检测视频中的人员





5.00/5 (2投票s)
在本文中,我们将开发用于视频流中人物检测的Python代码。
从本系列的前几篇文章中,我们已经有了使用SSD DNN模型检测图像中人类的Python代码。并且我们已经展示了这段代码可以在树莓派设备上运行。在本文中,我们将调整我们的代码以检测视频流中的人物。
我们将使用mp4格式的视频文件作为我们的视频“流”数据。这是测试检测算法最简单的方法。首先,我们可以使用来自任何摄像头的数据 - 或者从互联网上下载视频片段。其次,我们可以多次重复使用相同的输入数据进行实验,这是测试的一个重要方面。树莓派设备配备了一个摄像头模块,我们可以使用它来测试实时视频流上的检测算法。然而,几乎不可能在相同的条件下多次测试该算法,因为很难完全重复实时摄像头的场景。
我们已经有一些实用程序类来处理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)
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))
在树莓派 3B 设备上针对测试视频运行上述代码,我们得到以下结果:总检测计数为 54;平均 FPS 约为 1.27。
在运行程序时,我们会看到带有人物检测的GUI窗口。这是保存的屏幕视频
正如您从视频中看到的那样,检测速度非常慢,因为处理单元每帧需要大约 0.8 秒。 这与我们处理静态图像时评估的性能相同……但对于视频处理来说,它看起来很慢。
在这一点上,我们应该问自己,处理一帧需要 0.8 秒是否足以实现实时人物检测。 答案取决于检测的目的。 如果目的是统计进入购物中心的所有顾客,那么答案是“否”。 但是,如果我们正在开发一个视频监控系统,并且目标只是告知操作员入侵者的出现,那么答案将是“是”。 让我们注意到,在我们的测试视频中,每个人都会出现几秒钟。 如果我们可以在一秒钟内处理一帧,我们就可以高概率地检测到人物的出现。
看起来我们可以使用AI模型来检测实时摄像头上的人员出现。但是,我们的人物检测代码不适用于实时,因为它处理所有帧,这使得它很慢。
后续步骤
在下一篇文章中,我们将修改代码以在边缘设备上进行实时处理。