我正在运行一个机器学习管道,用于分割非常大的3D图像。我想将结果(dask数组)存储为.png文件,每个文件对应于dask数组的一个片段。你对如何实现这一点有什么建议吗?
我一直在尝试通过使用joblib dask并行后端构建一个并行for循环来保存结果,然后逐个切片地循环结果。这可以很好地工作,直到我的管道在没有任何明显原因(没有内存问题,没有太多打开的文件描述符等)的情况下被卡住。
已使用client.persist()将array_to_save持久化到内存中
with joblib.parallel_backend('dask'):
joblib.Parallel(verbose=100)(joblib.delayed(png_sav)(j, stack_height, client.compute(array_to_save[j])) for j in range(stack_height))
def png_sav(j, stack_height, prediction):
img = Image.fromarray(prediction.result().astype('uint32'), 'I') # I to save as 16 bit binary image
img.save(png_pn+str(j)+'_slice_prediction.png', "PNG")
img.close()
发布于 2019-02-20 00:59:38
您可以考虑使用以下两种方法之一:
map_blocks
方法在每个数据块上调用一个函数。如果你的函数想知道它在堆栈中的位置,它可以接受block_info=
关键字参数。X= x.rechunk((1,None,None)) #沿第一轴的许多分块切片= x.to_delayed().flatten()保存= dask.delayed(numpy_array_to_png)(slc,filename='...')对于slices中的slc,请使用dask- dask.compute(*saves)
的东西
发布于 2019-02-22 12:13:58
非常感谢你的提示。我正在尝试了解如何使用.map_blocks(),尤其是block_info=。但我不明白如何使用block_info提供的信息。我想单独保存每个块,但不知道如何做到这一点。有什么提示吗?非常感谢!
da.map_blocks(png_sav(stack_height, prediction,
block_info=True), dtype='uint16')
def png_sav(stack_height, prediction, block_info=True):
# I don't get how I can save each chunk separately
img = Image.fromarray("prediction_chunk".astype('uint32'), 'I') # I to save as 16 bit binary image
img.save(png_pn+str(j)+'_slice_prediction.png', "PNG")
img.close()
https://stackoverflow.com/questions/54615625
复制