python多进程应用——视频实时显示分析

接上一篇文章 voila:jupyter notebook简单制作视频播放和深度学习测试的显示界面

导语:之前voila的文章,我的目的是对视频帧进行一些处理和显示,并且需要和原始图像同步显示,用voila确实可以做到这些。这篇文章需要在上面的基础上,达到实时性。我就主要讲一下在达到实时性的道路上有那些问题需要解决,我是如何解决的

分析视频中耗时的代码

我需要处理的视频1s有25帧,一帧表示了45ms的信息,如果用opencv的read函数读取,大概有5ms左右的读取时间。所以,如果真的需要达到实时性,那么对每一帧的处理函数耗时最好缩减到30ms以下。

这里还有一个问题就是,若是在voila上显示,需要图像numpy.array转成byte。也就是图片格式转换(编码)成流数据(imgbox = cv2.imencode('.jpg',frame)[1].tobytes()这段代码中tobytes()耗时5ms左右,若是代码运行挤占资源,耗时也会达到10ms左右。并且用flask也需要转换)
编码转换问题——后来直接舍弃voila,直接用opencv的imshow函数显示,把原图像和结果图像合并在一起,把需要显示的文字结果写在图像帧的四周,当然imshow的尺寸大小也会耗时。

在我们这个项目中,有两个功能都需要对每帧图像进行处理,有一个功能是对20帧图像组进行处理。其中对每帧图像进行处理的功能:功能a主要用到opencv的函数,功能b主要用到了深度模型。经过多次修改,还使用了cuda编译的opencv(我之前写了一篇opencv的cuda编译的教程),功能a的一帧耗时在20ms左右。功能b的耗时在25ms左右。勉强达到实时,但加上编码,一帧还是会超过50ms。

功能c是将20帧图像放入模型中测试,得到的结果是文字结果。功能c不要求实时性。
以上功能都是串行运行。

多进程运行多个功能

实现并行运行,要用到多线程或者多进程。我一开始从消费者和生产者入手,生产者消费者问题是多线程多进程的经典问题。这里就不多说了。这个经典问题主要用到的queue这个函数,queue作为一条生产线,在本文中就是存储图像帧的队列。但是我们是一对多的问题,queue不适合放在这里用。(我对queue做了很多尝试,包括queue.get()之后再复制,还有生成两条queue,还有同时读取两次视频这种操作)。

我看了一些关于多进程共享资源的文章,虽然没看懂,但是还是干货,放在这方便查看。——Python 进程之间共享数据
这里要感谢师兄,师兄参考另一篇文章写了一个多进程共享图像帧资源的代码,我根据师兄的代码把三个功能贴上去,完美展现了多进程的好处。
我把这篇文章也贴出来,我也在学习这篇文章。—— On Sharing Large Arrays When Using Python’s Multiprocessing

这篇文章讲述了在使用进程池时如何共享大型的numpy数组。

因为我对这个也没太理解,所以就先写到这了。
……

进程理论:
进程可以说是一个“执行中的程序”。程序是指令、数据及其组织形式的描述,是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。

有了线程技术,我们就可以在一个进程中创建多个线程,让它们在“同一时刻”分别去做不同的工作了。这些线程共享同一块内存,线程之间可以共享对象、资源,如果有冲突或需要协同,还可以随时沟通以解决冲突或保持同步。

不过,多线程技术不是万金油,它有一个致命的缺点:在一个进程内,不管你创建了多少线程,它们总是被限定在一颗CPU内,或者多核CPU的一个核内。这意味着,多线程在宏观上是并行的,在微观上则是分时切换串行的,多线程编程无法充分发挥多核计算资源的优势。这也是使用多线程做任务并行处理时,线程数量超过一定数值后,线程越多速度反倒越慢的原因。

多进程技术正好弥补了多线程编程的不足,我们可以在每一颗CPU上,或者多核CPU的每一个核上启动一个进程,如果有必要,还可以在每个进程内再创建适量的线程,最大限度地使用计算资源解决问题。因为不在同一块内存区域内,和线程相比,进程间的资源共享、通信、同步等,都要麻烦得多,受到的限制也更多。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值