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数组。

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

猜你喜欢

转载自blog.csdn.net/qq_38469784/article/details/110537909