2015-04-12 3 views
0

Я пытаюсь ускорить раздел моего кода, используя параллельную обработку в python, но у меня возникают проблемы с его работой, или даже найти примеры, которые имеют отношение ко мне.Параллелизировать обработку изображений с помощью Numpy

Код создает низкополигональную версию изображения с использованием триангуляции Делоне, а часть, которая меня замедляет, находит средние значения каждого треугольника.

Я был в состоянии получить хорошее увеличение скорости на векторизации мой код, но надеюсь получить больше, используя распараллеливание:

код У меня возникли проблемы с чрезвычайно простой цикл:

for tri in tris: 
     lopo[tridex==tri,:] = np.mean(hipo[tridex==tri,:],axis=0) 

Перечисленные переменные следующие.

tris - уникальный список питон всех индексов треугольников

lopo - массив Numpy окончательной версии с низким многоугольник изображения

hipo - массив Numpy исходного изображения

tridex - массив Numpy того же размера, что и изображение. Каждый элемент представляет собой пиксель и сохраняет треугольник, в котором находится пиксель.

Я не могу найти хороший пример, который использует несколько массивов numpy в качестве входных данных, причем один из них является общим.

Я попытался мультипроцессирование (с выше фрагментом кода, завернутым в функции под названием colorImage):

p = Process(target=colorImage, args=(hipo,lopo,tridex,ppTris)) 
p.start() 
p.join() 

Но я получаю сломанную ошибку трубы сразу.

ответ

0

Таким образом, как многопроцессорная работа Python (по большей части) заключается в том, что вам нужно назначить отдельные потоки, которые вы хотите запустить. Я сделал краткий вступительный учебник здесь: http://will-farmer.com/parallel-python.html

В вашем случае я бы порекомендовал разделить tris на кучу разных частей, каждый из которых поровну, каждый из которых представляет собой «рабочий». Вы можете разделить этот список на numpy.split() (документация здесь: http://docs.scipy.org/doc/numpy/reference/generated/numpy.split.html).

Затем для каждого списка в три, мы используем модули Threading и Queue для обозначения 8 работников.

import numpy as np 
# split into 8 different lists 
tri_lists = np.split(tris, 8) 
# Queues are threadsafe 
return_values = queue.Queue() 
threads = [] 
def color_image(q, tris, hipo, tridex): 
    """ This is the function we're parallelizing """ 
    for tri in tris: 
     return_values.put(np.mean(hipo[tridex==tri,:], axis=0)) 
# Now we run the jobs 
for i in range(8): 
    threads.append(threading.Thread(
     target=color_image, 
     args=(return_values, tri_lists[i], hipo, tridex))) 
# Now we have to cleanup our results 
# First get items from queue 
results = [item for item in return_values.queue] 
# Now set values in lopo 
for i in range(len(results)): 
    for t in tri_lists[i]: 
     lopo[tridex==t, :] = results[i] 

Это не самый чистый способ сделать это, и я не уверен, если это работает, так как я не могу проверить это, но это достойный способ сделать это. Распараллеленная часть теперь np.mean(), а установка значений не распараллеливается.

Если вы хотите также распараллелить настройку значений, вам придется иметь общую переменную, используя либо Queue, либо глобальную переменную.

Увидеть этот пост для общей глобальной переменной: Python Global Variable with thread

+0

ли нарезания резьбы не позволяют для установки новых значений? Я не полностью проверил, но я уверен, что потоки не будут пытаться писать в одни и те же пиксели.Выполнение средних вычислений и написания в то же время должно дать мне большое ускорение, которое я надеюсь увидеть. – Bill

+0

Это тоже будет работать, но я никогда не работал с общей переменной по потокам. Пока вы просто устанавливаете пиксели, вы должны быть в порядке. И да, это также даст вам большее ускорение. См. Ссылку SO, представленную мной для примера. – Will

+0

Кажется, у меня проблемы с запуском даже простых функций параллельно. Знаете ли вы, почему сценарий (запускается в IDLE) будет запускаться последовательно даже при использовании модулей параллелизации? Может ли быть какая-то настройка на моем компьютере, которая ограничивает количество потоков IDLE? – Bill

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