Как сохранить массив dask как файлы .png по частям? - PullRequest
0 голосов
/ 10 февраля 2019

Я использую конвейер машинного обучения для сегментации очень больших трехмерных изображений.Я хотел бы сохранить результаты (массивы dask) в виде файлов .png, причем каждый файл соответствует одному срезу массива dask.Есть ли у вас какие-либо предложения о том, как это реализовать?

Я пытался сохранить результаты, построив параллель для цикла for, используя параллельный бэкэнд joblib dask, а затем перебирая результаты по частям по частям.Это работает нормально до определенной точки, в которой мой канал зависает без какой-либо видимой причины (нет проблем с памятью, слишком много открытых дескрипторов файлов и т. Д.).

array_to_save сохранен в памяти с помощью client.persist ()

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()

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Большое спасибо за ваши советы.Я пытаюсь понять, как использовать .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()
0 голосов
/ 20 февраля 2019

Возможно, вы захотите использовать либо ...

  1. метод map_blocks для вызова функции в каждом блоке ваших данных.Ваша функция может принять аргумент ключевого слова block_info=, если она хочет знать, где она находится в стеке.

  2. Преобразовать ваш массив в список отложенных массивов.Может быть, что-то вроде этого (непроверенный, вы должны прочитать документы здесь)

    x = x.rechunk((1, None, None))  # many chunks along the first axis
    slices = x.to_delayed().flatten()
    saves = [dask.delayed(numpy_array_to_png)(slc, filename='...') for slc in slices]
    dask.compute(*saves)
    
  3. Зарегистрируйтесь в проекте dask-image.Я подозреваю, что у них есть что-то https://github.com/dask/dask-image

...