利用SSD DNN模型在视频流中检测人体

在本系列文章中,介绍了使用SSDDNN模型在图像中检测人体的Python代码,并展示了如何将其部署在树莓派设备上。本文将介绍如何将代码适应于视频流中的人体检测。将使用mp4格式的视频文件作为“流”数据。这是测试检测算法的最简单方式。首先,可以使用任何相机的数据——或者从互联网下载视频剪辑。其次,可以多次重复实验,这是测试的一个重要方面。树莓派设备具有相机模块,可以使用它来测试实时视频流中的检测算法。然而,几乎不可能在相同条件下多次测试算法,因为对于实时相机来说,很难精确重复一个场景。

已经有一些用于处理CaffeDNN模型、处理图像以及在图像上绘制检测结果的实用类。此外,还有主类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) 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) 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 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秒处理一帧是否足以实现实时人体检测。答案取决于检测的目的。如果目标是计算进入购物中心的所有顾客,答案是“不”。但如果正在开发一个视频监控系统,目标只是通知操作员有入侵者出现,答案将是“是”。让注意,在测试视频中,每个人出现几秒钟。如果能在一秒钟内处理一帧,就可以以很高的概率检测到人的出现。

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