2016-11-22 13 views
0

我正在嘗試查看是否可以使用Dask在大規模2D圖像(〜20-50 GB)中檢測和分割對象的塊狀並行化一個集羣。如何使用Dask在集羣上的大量圖像上並行化對象檢測

我的邏輯檢測/分割圖像塊中的對象將被封裝在一個函數中。

我遇到了一個名爲map_blocks的Dask函數,它允許我在dask數組的每個塊/塊上應用自定義函數。

但是,我看到函數我可以傳遞給map_blocks的輸出類型也應該是一個數組。

對於對象檢測/分割,我希望我的函數能夠返回塊中找到/檢測到的每個對象的邊界輪廓的座標。請注意,任何塊中的對象數量都是未知的,取決於圖像。

我該如何解決map_blocks或Dask中的其他東西的用例?

回答

1

對於更多的自定義計算,我推薦使用dask.delayed,它可以讓你並行化相當通用的Python代碼。

如果你有dask.array您可以用.to_delayed()方法

blocks = x.to_delayed() 

把它變成了一堆延遲對象,那麼你可以在這些塊,只要你喜歡執行任意功能。

@dask.delayed 
def process_block(block): 
    ... 

blocks = [[process_block(block) for block in row] 
      for row in x.to_delayed().tolist()] 
+0

感謝您的回答。在你建議的解決方案中,process_block是否可以返回任何類型的對象? process_block函數有可能知道block_id嗎? – cdeepakroy

+0

block_id將被需要,所以我可以讓我的對象檢測函數生成全局空間中的檢測對象的邊界輪廓座標而不是塊空間。 – cdeepakroy

1

你可以使用一個對象數組作爲輸出,並帶有(1,1)的塊形。一定要將「dtype ='object'」添加到您的map_blocks調用中。在映射函數內部,然後用(0,0)處的座標列表實例化一個(1,1)大小的對象數組。像這樣:

def find_objects(): 
    # do logic 
    result = np.empty((1,1), dtype='object') 
    result[0,0] = coordinate_list 
    return result 

da_coords = da.map_blocks(find_objects, da_image, dtype='object') 
+0

感謝您的建議。將嘗試這個並回到這裏。 – cdeepakroy

相關問題