2015-07-21 3 views
1

Целью является обработка изображений на видеокадрах. Видео можно разделить на 16 отдельных регионов, на которых можно выполнить обработку. Поэтому для выполнения обработки одновременно используются 16 различных процессов (результат также сохраняется для каждого региона).Python: распространение видеокадров по нескольким процессам

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 | 
+------------+--------+ 

Я попытался, используя только один процесс, чтобы прочитать все видеокадры и отправить его с multiprocessing.Pipe до 16 начала multiprocessing.Process процессов. Однако это имело худшую производительность (> 15 мин).

Мой вопрос в том, будет ли способ распространять видеокадры с лучшей производительностью, нежели все процессы загружают само видео.

Обратите внимание, что это выполняется на двойной 8-ядерной машине с 64 ГБ памяти.

+0

Вы изучали темы? (например, http://pymotw.com/2/threading/) – boardrider

ответ

0

Возможно, вы захотите попробовать модуль numpy-sharedmem, чтобы сделать одиночные изображения (массивы NumPy в cv2), читаемые несколькими процессами. Я сделал именно это в one of my projects.

Смежные вопросы