簡體   English   中英

使用Numpy並行處理圖像

[英]Parallelize Image Processing Using Numpy

我正在嘗試使用python中的並行處理來加快我的代碼的速度,但是我無法使其正常工作,甚至找不到與我相關的示例。

該代碼使用Delaunay三角剖分生成圖像的低多邊形版本,而讓我慢下來的部分是找到每個三角形的平均值。

通過對代碼進行矢量化,我已經能夠很好地提高速度,但是希望可以通過並行化獲得更多的性能:

我遇到麻煩的代碼是一個非常簡單的for循環:

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

引用的變量如下。

tris三角形所有索引的唯一python列表

lopo圖像的最終低多邊形版本的Numpy數組

hipo原始圖像的Numpy數組

tridex與圖像大小相同的Numpy數組。 每個元素代表一個像素,並存儲該像素所在的三角形

我似乎找不到一個很好的示例,該示例使用多個numpy數組作為輸入,其中一個共享。

我嘗試了多重處理(上面的代碼段包裝在名為colorImage的函數中):

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

但是我立即收到一個管道破裂錯誤。

因此,Python的多處理工作方式(大部分情況下)是必須指定要運行的各個線程。 我在這里做了一個簡短的入門教程: http : //will-farmer.com/parallel-python.html

在您的情況下,我建議將tris分成許多不同的部分,每個部分的大小均等,每個部分代表一個“工人”。 您可以使用numpy.split()拆分此列表(此處的文檔: http : numpy.split() )。

然后,對於tri中的每個列表,我們使用Threading和Queue模塊來指定8個worker。

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全局變量

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM