• 下载数据-19.3 MB
  • 下载模型-43.5 MB
  • 下载结果-36.66 MB

这是七篇系列文章中的最后一篇。到目前为止,我们已经有了用于人员检测的DNN模型和用于在Raspberry Pi设备上启动该模型的Python代码。我们使用MobileNet DNN构建的AI算法在Pi 3B board上平均约为1.25 FPS。正如我们在前一篇文章中所展示的,这种速度足以检测人在实时摄像机的视频流中的出现。但是我们的算法不是常规意义上的实时齿轮。

视频监视系统中的实时摄像机通常以15-30 FPS的速度运行。我们的算法以1.25 FPS的速率处理帧,太慢了。是什么让它变慢?让我们看一下我们的代码以获取线索。

这是我们在前一篇文章中开发的一部分代码:

fps.start()
obj_data = self.ssd.detect(frame)
persons = self.ssd.get_objects(frame, obj_data, class_num, min_confidence)
fps.stop()

如您所见,我们仅测量人员检测操作(在框架上运行SSD模型)的速度。因此,此操作需要每帧0.8秒才能执行。该算法的其余部分足够快,可以以实时视频系统的速度运行。

考虑到这一点,我们是否可以重新设计算法以使其适应处理实时视频流所需的更高速度?我们试试吧。

在该算法的当前版本中,我们运行SSD模型处理(每帧大约需要0.8秒),其余代码可以按顺序进行实时操作。因此,较慢的部分定义了整体速度。使算法适应实时模式的最简单方法是将其分为多个部分,然后并行运行这些部分。“快”部分将以其实时速度运行,而“慢”部分将以1.25 FPS运行。但是,由于这些部分将异步运行,因此我们可以处理(慢速)SSD模型的部分,并且仅处理那些值得考虑的部分。

看下面的代码。这是一个新类,实现了异步处理的思想:

# Real-Time Video detector
import sys
from multiprocessing import Process
from multiprocessing import Queuedef detect_in_process(proto, model, ssd_proc, frame_queue, person_queue, class_num, min_confidence):ssd_net = CaffeModelLoader.load(proto, model)ssd = SSD(ssd_proc, ssd_net)while True:if not frame_queue.empty():frame = frame_queue.get()obj_data = ssd.detect(frame)persons = ssd.get_objects(frame, obj_data, class_num, min_confidence)person_queue.put(persons)class RealtimeVideoSSD: def __init__(self, proto, model, ssd_proc):self.ssd_proc = ssd_procself.proto = protoself.model = modeldef detect(self, video, class_num, min_confidence):detection_num = 0capture = cv2.VideoCapture(video)frame_queue = Queue(maxsize=1)person_queue = Queue(maxsize=1)detect_proc = Process(target=detect_in_process, args=(self.proto, self.model, self.ssd_proc, frame_queue, person_queue, class_num, min_confidence))detect_proc.daemon = Truedetect_proc.start()frame_num = 0persons = None# Capture all frameswhile(True):  t1 = time.time()(ret, frame) = capture.read()if frame is None:breakif frame_queue.empty():print ("Put into frame queue ..."+str(frame_num))frame_queue.put(frame)t2 = time.time()dt = t2-t1if dt<0.040:st = 0.040-dtprint ("Sleep..."+str(st))time.sleep(st)if not person_queue.empty():persons = person_queue.get()print ("Get from person queue ..."+str(len(persons)))if (persons is not None) and (len(persons)>0):detection_num += len(persons)Utils.draw_objects(persons, "PERSON", (0, 0, 255), frame)# Display the resulting framecv2.imshow('Person detection',frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakframe_num += 1capture.release()cv2.destroyAllWindows()return (frame_num, detection_num)

如您所见,检测算法被提取到一个单独的detect_in_process函数中。此函数有两个特殊参数:frame_queue和person_queue。这些队列旨在支持帧捕获过程和人员检测过程之间的交互。

让我们看一下用于实时人员检测的主类RealtimeVideoSSD。它的构造函数接收三个参数:SSD结构的原型,SSD模型和帧处理器。请注意,前两个参数是模型数据的路径,而不是加载的模型本身的路径。模型被加载到执行过程中。这使我们避免了流程之间大量数据的传输;我们仅传输轻量字符串数据。

detect类的方法接收视频文件的路径,人员类的编号和置信度阈值。首先,它创建视频流的捕获以及帧和人物检测的队列。然后,它使用指定的参数初始化Process类的实例。其中之一是detect_in_process函数,它将随流程一起运行。检测过程在后台(daemon = True)运行。

进一步,我们遍历所有接收到的帧。当我们得到一个新的帧时,我们查看帧队列,如果它是空的,我们将帧放入队列中。后台进程查看队列并开始处理框架。完成后,该过程会将结果放入人员队列。

帧处理循环查看人员队列,如果检测到,将其绘制在当前帧上。因此,如果在一个帧中检测到一个人,则该人将显示在检测到的帧中,而不是原始帧中。

这里的另一招是在帧处理循环中。注意,我们测量capture.read方法的时间。然后,我们将帧处理设置为睡眠模式以强制其减慢速度。在这种情况下,我们将其速度降低到大约25 FPS(0.040秒= 1/25 FPS)——测试视频的实际帧速率。

现在,我们可以使用以下Python代码以实时模式测试人员检测:

# testing SSD in real-time mode
if __name__ == '__main__':proto_file = r"/home/pi/Desktop/PI_RPD/mobilenet.prototxt"model_file = r"/home/pi/Desktop/PI_RPD/mobilenet.caffemodel"proc_frame_size = 300person_class = 15# frame processor for MobileNetframe_proc = FrameProcessor(proc_frame_size, 1.0/127.5, 127.5)video_file = r"/home/pi/Desktop/PI_RPD/video/persons_4.mp4"video_ssd = RealtimeVideoSSD(proto_file, model_file, frame_proc)(frames, detections) = video_ssd.detect(video_file, person_class, 0.5)print ("Frames count: "+str(frames))print ("Detection count: "+str(detections))

这是在Pi 3B设备上运行的测试的屏幕视频:

youtube

您可以看到我们的视频以FPS = 25的实时模式运行。人员检测滞后——检测矩形与人员位置不匹配,如下图所示:

这种滞后是我们检测算法的一个明显缺点:检测到出现后0.8秒,我们就会显示出检测结果。当人员移动时,检测会显示人员过去的位置。不过,该算法是实时的:它确实以FPS = 25(视频本身的帧频)处理视频。该算法执行其预期的任务:它检测视频流中的人物。考虑到一个人在摄像机视图中行走了几秒钟,发现该人的外观的可能性非常高。

在本系列文章中,我们使用现代的AI算法在计算资源有限的边缘设备上进行人员检测。我们考虑了三种用于对象检测的DNN方法,并选择了最佳模型——适用于Raspberry Pi设备上的图像处理。我们使用预训练的DNN模型开发了用于人员检测的Python代码,并展示了如何在Raspberry Pi设备上启动该代码。最后,我们调整了代码以进行实时处理,并在视频上对其进行了测试,证明它可以检测实时视频流中的人。

边缘设备上的实时AI人员检测:以实时模式检测视频中的人员相关推荐

  1. 170 FPS!YolactEdge:边缘设备上的实时实例分割,已开源!

    点击上方"CVer",选择加"星标"置顶 重磅干货,第一时间送达 本文转载自:AI人工智能初学者 论文:https://arxiv.org/abs/2012.1 ...

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

    下载数据-19.3 MB 下载模型-43.5 MB 下载结果-36.66 MB 从本系列的前几篇文章中,我们获得了使用SSD DNN模型检测图像中人物的Python代码.而且我们已经展示了该代码可以在 ...

  3. 边缘设备上的实时AI人员检测:入门

    下载数据-19.3 MB 下载模型-43.5 MB 下载结果-36.66 MB 得益于深度学习(DL),实时视频流中的人的实时检测几年前就已经解决了.但是,在边缘和物联网设备上并不总是那么容易,因为它 ...

  4. 边缘设备上的实时AI人员检测:使用预先训练的SSD模型检测人员

    下载数据-19.3 MB 下载模型-43.5 MB 下载结果-36.66 MB 在本系列的上一篇文章中,我们选择了两种SSD模型进行进一步工作,一种基于MobileNet,另一种基于SqueezeNe ...

  5. 边缘设备上的实时AI虫害消除:入门

    目录 介绍 选择器与检测器 实时性呢? 下一步 在这里,我们从使用AI和DNN的角度阐述了害虫消除的问题.然后,我们提出两种可能的解决方案:1--使用预训练的SSD模型检测猫.羊和其他动物:2--使用 ...

  6. 【读点论文】PP-PicoDet: A Better Real-Time Object Detector on Mobile Devices,一种可在边缘设备上部署的深度学习目标检测

    PP-PicoDet: A Better Real-Time Object Detector on Mobile Devices https://github.com/ChanChiChoi/awes ...

  7. YolactEdge:边缘设备上的实时实例分割(Xavier: 30 FPS, RTX 2080 Ti:170 FPS)

    带有ResNet-101的YolactEdge在Jetson AGX Xavier上的速度高达30.8 FPS,在RTX 2080 Ti上的速度为172.7 FPS,AP性能超强!速度是目前主流方法的 ...

  8. YolactEdge:首个开源边缘设备上的实时实例分割(Jetson AGX Xavier: 30 FPS)

    YolactEdge 是第一个可在小型边缘设备上以实时速度运行的有竞争力的实例分割方法. 在550x550分辨率的图像上,以ResNet-101为主干网的YolactEdge 在Jetson AGX ...

  9. CVPR 2022 | 未知目标检测模块STUD:学习视频中的未知目标

    前言 构建能够检测分布外(OOD)目标的可靠目标检测器是至关重要的,但尚未得到充分探索.关键挑战之一是,模型缺乏来自未知数据的监督信号,从而对OOD对象产生过于自信的预测. 文章提出了一种基于时空未知 ...

最新文章

  1. 边端云处理器系列技术参数
  2. 当谈论迭代器时,我谈些什么?
  3. centos6.5 mysql 远程访问_centos6.5 mysql 设置支持远程ip访问
  4. Centos7为普通用户添加sudo权限
  5. TypeError: ‘BasePermissionMetaclass‘ object is not iterable
  6. 有人WIFI模块使用详解
  7. http协议与php关系,PHP中的HTTP协议
  8. Java 8 Streams API:对流进行分组和分区
  9. grpc,protoc, protoc-gen-go,rust
  10. 安卓电话和网络开发全解:电话硬件检测、电话服务信息、sim信息、网络服务信息、数据连接和数据传输信息、电话状态监听
  11. Robocode教程4——Robocode的游戏物理
  12. Ubuntu 18.04/20.04 部署minikube
  13. arcgis自动完成面怎么用_ArcGIS 自动生成线或者面
  14. 洛谷 P1315 观光公交
  15. intuitionistic fuzzy set 运算规则python实现
  16. 认识css长度单位 px % em rem vh vw
  17. Js/es for(let i in Obj)效率分析及优化
  18. 高通三款处理器齐发布 全面死磕联发科
  19. CVTE笔试面试经验分享(硬件)—2020秋招
  20. 少女心多功能便签本,少女心便签软件办公版

热门文章

  1. linux静态反汇编工具,源码恢复反汇编静态分析工具IDA pro
  2. idea切换视图快捷键_IDEA操作技巧:一些常用且实用的快捷键
  3. 设计灵感|延展画面的插画Banner设计!
  4. “3D字体”素材|让你的设计脱颖而出,看起来与众不同
  5. 万能套用PS分层模板,不怕老板捉急!
  6. 求两条轨迹间的hausdorff距离_「中考专题」瓜豆原理|第二讲 线段型路径轨迹...
  7. python安装opencv whl_Python 3.x 安装opencv+opencv_contrib的操作方法
  8. NanoLog软件架构
  9. Linux网络协议:当eBPF遇上Linux内核网络 | Linux内核之旅
  10. 如何理解高并发中的协程?协程的实现和历史