Я использую multiprocess
модуль Python для параллельной обработки с помощью алгоритмов OpenCV (например, детектор / дескриптор ORB). Модуль multiprocess
в большинстве случаев работает нормально, но когда дело доходит до возврата списка объектов cv2.KeyPoint
, возникает проблема - все поля каждой ключевой точки устанавливаются в 0 при возврате вызывающей стороне. процесс, хотя внутри рабочего процесса все ключевые точки верны (как возвращено OpenCV).
Вот минимальный пример, который можно использовать для воспроизведения ошибки (для ее работы потребуется файл изображения с именем lena.png
):
import numpy as np
from cv2 import ORB_create, imread, cvtColor, COLOR_BGR2GRAY
from multiprocess import Pool
feature = ORB_create(nfeatures=4)
def proc(img):
return feature.detect(img)
def good(feat, frames):
return map(proc, frames)
def bad(feat, frames):
# this starts a worker process
# and then collects result
# but something is lost on the way
pool = Pool(4)
return pool.map(proc, frames)
if __name__ == '__main__':
# it doesn't matter how many images
# a list of images is required to make use of
# pool from multiprocess module
rgb_images = map(lambda fn: imread(fn), ['lena.png'])
grey_images = map(lambda img: cvtColor(img, COLOR_BGR2GRAY), rgb_images)
good_kp = good(feature, grey_images)
bad_kp = bad(feature, grey_images)
# this will fail because elements in
# bad_kp will all contain zeros
for i in range(len(grey_images)):
for x, y in zip(good_kp[i], bad_kp[i]):
# these should be the same
print('good: pt=%s angle=%s size=%s - bad: pt=%s angle=%s size=%s' % (x.pt, x.angle, x.size, y.pt, y.angle, y.size))
assert x.pt == y.pt
Платформы: CentOS 7.6 и Windows 10 x64
Версия:
Версия Python: 2.7.15
многопроцессный: 0,70,6,1
opencv-python-headless: 3.4.5.20 и 4.0.0.21
Есть ли способ обойти это? Использование стандартного модуля multiprocessing
не допускается из-за интенсивного использования лямбд и вызываемых предметов, которые «не могут быть засолены».