Python3 & Opencv3 & Multiprocessing предизвикват системна грешка

В момента използвам 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()

Проблемът е, че никога не стига до "Готово!!" печат, тъй като се счупи, показвайки съобщение за грешка на OS X. Пълното съобщение за грешка е в този GIST

Занимавам се с това известно време и не можах да намеря точната причина за тази грешка. Ако не изпълня командата "cvtcolor", няма никакъв проблем. Както и ако командата "grabcut" не се изпълнява...

UDATE: В метода _func, ако добавя печат или създам файл като първа инструкция, той се отпечатва и създава, което означава, че процесът се стартира. Проблемът се появява, когато се изпълнят както grabcut (в сегментната функция), така и 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
Да skgrrgwasme. Опитах това и то създава файла. J.F. Sebastian, пробвах метода с нишка и да, работи по този начин. Относно това, че е метод на клас, със 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