在本系列文章中,介绍了使用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秒处理一帧是否足以实现实时人体检测。答案取决于检测的目的。如果目标是计算进入购物中心的所有顾客,答案是“不”。但如果正在开发一个视频监控系统,目标只是通知操作员有入侵者出现,答案将是“是”。让注意,在测试视频中,每个人出现几秒钟。如果能在一秒钟内处理一帧,就可以以很高的概率检测到人的出现。