目标是对视频帧进行图像处理。视频可以分为 16 个单独的区域,可以在这些区域上进行处理。因此,使用 16 个不同的进程同时进行处理(结果也存储在每个区域中)。
import cv2
import multiprocessing
def process_region(n):
cap = cv2.VideoCapture('/path/to/video.avi')
ret, frame = cap.read()
while ret:
# crop frame to region n
# process the region
ret, frame = cap.read()
pool = multiprocessing.Pool()
pool.map(process_region, range(16))
这里一个明显的缺陷是所有进程都在单独加载视频。测试确实表明,经过一定 (10) 次处理后,阅读测试视频的性能确实会下降:
+------------+--------+
| #processes | T (s.) |
+------------+--------+
| 1 | 30.2 |
| 2 | 27.1 |
| 3 | 32.9 |
| 4 | 30.2 |
| 5 | 31.7 |
| 6 | 29.6 |
| 7 | 29.5 |
| 8 | 29.5 |
| 9 | 30.6 |
| 10 | 30.9 |
| 11 | 32.4 |
| 12 | 35.7 |
| 13 | 40.3 |
| 14 | 43.5 |
| 15 | 48.3 |
| 16 | 52.5 |
+------------+--------+
我尝试仅使用 1 个进程读取所有视频帧并使用
multiprocessing.Pipe
发送到 16 开始 multiprocessing.Process
过程。然而,这具有最差的性能(> 15 分钟)。我的问题是,是否有一种方法可以比让所有进程加载视频本身具有更好的性能来分发视频帧。
请注意,这是在具有 64GB 内存的双 8 核机器上运行的。
最佳答案
你可以试试numpy-sharedmem使单个图像(cv2
中的 NumPy 数组)可由多个进程读取的模块。我在 one of my projects 中正是这样做的。 .
关于Python:在多个进程上分配视频帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31541548/