Python3, Opencv3 и многопроцессорность вызывают системную ошибку

В настоящее время я использую OpenCV 3 с python 3.4. Моя машина — MacBook Pro с OS X 10.10 (Yosemite), и у меня возникают проблемы при использовании некоторых функций OpenCV в сочетании с многопроцессорной библиотекой. Вот (очень) упрощенный пример кода, который воспроизводит ошибку:

import multiprocessing
import numpy
import cv2


class Sample():
    def __init__(self):
        self.mask = []  # Testing

    def experiment(self):

        img = cv2.imread("/Users/luigolas/PycharmProjects/PyReid/tests/test_resources/P2/cam1/P2_001_cam1_1.png")
        self.mask.append(segment(img))
        print("Segmented!")
        processes = [multiprocessing.Process(target=self._func) for i in range(3)]
        _ = [p.start() for p in processes]
        _ = [p.join() for p in processes]

    def _func(self):
        img = cv2.imread("/Users/luigolas/PycharmProjects/PyReid/tests/test_resources/P2/cam2/P2_001_cam2_1.png")
        cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
        print("Done!!")


def segment(image):
    bgdmodel = numpy.zeros((1, 65), numpy.float64)
    fgdmodel = numpy.zeros((1, 65), numpy.float64)
    mask_source = "/Users/luigolas/PycharmProjects/PyReid/resources/masks/OptimalMask.txt"
    mask = numpy.loadtxt(mask_source, numpy.uint8)
    cv2.grabCut(image, mask, None, bgdmodel, fgdmodel, 2, cv2.GC_INIT_WITH_MASK)

    mask = numpy.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')

    return mask


if __name__ == '__main__':
    t = Sample()
    t.experiment()

Проблема в том, что он никогда не доходит до "Готово!!" print, так как он прерывается, показывая сообщение об ошибке OS X. Полное сообщение об ошибке находится в этом GIST.

Я застрял с этим некоторое время и не смог найти точную причину этой ошибки. Если я не запускаю команду «cvtcolor», проблем вообще нет. Как и если бы не запускалась команда "grabcut"...

UDATE: В методе _func, если я добавляю печать или создаю файл в качестве первой инструкции, он печатается и создается, что означает запуск процесса. Проблема возникает, когда одновременно выполняются функции захвата (в функции сегмента) и cvtcolor. Если один из них не выполняется, то вообще нет проблем. Как это вообще может быть связано?

Я также пытался использовать multiprocessing.dummy.Process, и это сработало. Может проблема с OpenCV?


person Luigolas    schedule 21.10.2014    source источник
comment
Попробуйте добавить with open('temp.txt', 'w') as fo: pass к вашей функции _func(). Запустите его снова и посмотрите в свой текущий рабочий каталог. Если вы видите файл «temp.txt», то вы знаете, что по крайней мере ваши подпроцессы запускаются правильно. Если вы не видите файл, значит что-то не так с тем, как вы пытаетесь запустить процессы.   -  person skrrgwasme    schedule 22.10.2014
comment
это работает, если вы используете multiprocessing.dummy.Process (поток вместо процесса)? Произойдет ли сбой, если вы сделаете _func(self) глобальной функцией (я нигде не вижу, чтобы self использовалась), удалите вызов segment() и т. д.?   -  person jfs    schedule 22.10.2014
comment
Да скгрргвасме. Я попробовал это, и он создает файл. Дж. Ф. Себастьян, я попробовал метод с нитью, и да, он работает именно так. О том, что это метод класса с self, это так, потому что это упрощенный код для воспроизведения ошибки, но в моем коде мне нужно передать параметр self. В любом случае, если я сделаю это просто функцией (не в классе, без себя), она все равно рухнет. Если я уберу вызов сегмента, это сработает. Если я уберу вызов cv2.cvtColor, он сработает. Если присутствуют оба, возникает ошибка. Я обновлю свой вопрос.   -  person Luigolas    schedule 22.10.2014


Ответы (1)


Ну, наконец, я решил это. Это была проблема с компиляцией и установкой OpenCV. Не могу точно сказать, что было не так, но я проверил, как работает homebrew настроить OpenCV и адаптировать его (добавив поддержку python 3).

Спасибо за помощь.

person Luigolas    schedule 24.10.2014
comment
У тебя такая же проблема. Это помогло бы объяснить решение. - person memecs; 18.12.2014
comment
Прямо сейчас я все еще с проблемой при тестировании в других сценариях... Я попытаюсь найти решение и опубликовать его здесь... - person Luigolas; 28.12.2014