·

提个思路。设置两个队列,一个队列是图像队列,接受 (camera_tag, frame);另一个队列是每个图像检测的输出 (camera_tag, detect_info)

每个摄像头将数据发送到图像队列,YOLO 检测网络单独一个线程,从图像队列中获取数据执行检测,检测结果发送到输出队列。

读取线程从输出队列读取结果,根据 camera_tag 将同一摄像头的结果组合起来,得到最后的。

Replies
4

谢谢你的提点我感觉还是很有收获的。我的不同标签摄像头可能还得选择不同的检测模型,所以我就像是否可以这样实现。

  1. 队列中(camera_tag,frame)在选择检测网络时,根据需要分成两个队列。(因为我的现在的模型中,对应俯视角度检测,和平视角度检测的 两个模型)
    • 我可以设置两个图像队列(camera_tag,frame),
    • 然后开启两个检测线程从两个队列中进行检测
    • 输出到检测队列(camera_tag,detction_infomation)
    • 最后组合起来
  2. 我现在想的是,同时开启两个检测线程,那么会比开一个检测线程,循环检测快,还是慢,因为我不是很清楚这个线程速度这方面的知识。

感谢大佬指点

可以的,实现思路基本就是生产者消费者模型,这样网络能对输入图像进行统一检测,也便于根据负载调节 batch 等参数的大小。

两个检测线程肯定比一个检测线程慢。

多线程我学得并不深,现在的 CPU 一般都是多核的,在理想情况下程序的多个线程可以在不同的核心中并行执行,提高程序的运行速度。但在 Python 中,有 GIL 的存在,导致 Python 程序在运行时实际上是单线程执行的。

因此 Python 中一般使用多进程完成并发任务,实际用起来跟多线程差不多。但多进程下使用队列通信会不会涉及到数据拷贝,以及数据拷贝带来的开销是否比多进程的好处更低,这个就需要实际对比确认了。

你可以都试试,也可以搜索一下有没有进程间共享存储区的方法,来避免拷贝。

谢谢指点 给我了很多的启发,后面就着手对这方面的知识进行深入一点的学习。

不客气~

Python 性能方面的东西我了解得少,只能这样大致说一下,你可以查看一下 GIL(Global Interpreter Lock)和多进程相关的博文 +1