您当前的位置: 首页 > 

寒冰屋

暂无认证

  • 0浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

寒冰屋 发布时间:2020-11-21 14:08:30 ,浏览量:0

  • 下载数据-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模型在实时摄像头上检测人的外观。但是,我们的人员检测代码无法实时处理,因为它会处理所有帧,因此速度很慢。

下一步

在接下来的文章中,我们将修改的边缘设备上实时处理的代码。

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0495s