Извлечение патчей из 3D-изображения в Python - PullRequest
0 голосов
/ 22 марта 2020

Я пытаюсь извлечь патчи из трехмерного изображения в качестве обучающих данных для нейронной сети. Но у меня проблемы с изменением формы патчей для больших изображений. В настоящее время я использую view_as_ windows, но я открыт для других методов, если они окажутся более полезными.

Пример того, как будет выглядеть мой код:

import numpy as np
from skimage.util import view_as_windows

kernel_size = 17
V = np.random.rand(150,150,150)
X = view_as_windows(V,(kernel_size,kernel_size,kernel_size),step=1)

Это создает массив numpy, имеющий размер (134,134,134,17,17,17). Теперь в идеале я хотел бы изменить его, чтобы он был размером (2406104,4913), но попытка изменить форму приводит к ошибке выделения:

X = X.reshape(134**3,17**3)
MemoryError: Unable to allocate 88.1 GiB for an array with shape (134, 134, 134, 17, 17, 17) and data type float64

Есть ли способ изменить мои патчи или есть лучший общий способ go об этом?

1 Ответ

1 голос
/ 24 марта 2020

Проблема в том, что нет способа создать измененный массив без копирования данных, поэтому вам нужно так много места. Наивный вариант состоит в том, чтобы разделить на части или пакетировать ваши данные. Грубо (игнорируя эффекты края и перекрытия):

xsize, ysize, zsize = V.shape
xbatch, ybatch, zbatch = (34, 34, 34)
batch_size = xbatch * ybatch * zbatch
for i, j, k in itertools.product(
    range(xsize // xbatch), range(ysize // ybatch), range(zsize // sbatch)
):
    Xbatch = X[i * xbatch : (i+1) * xbatch,
               j * ybatch : (j+1) * ybatch,
               k * zbatch : (k+1) * zbatch]
    Xbatch_linear = Xbatch.reshape((batch_size, -1))
    # ... do your deep learning on the batch

Более длинный ответ: у того, что вы делаете (перебирая все патчи 17x17x17), есть имя в поле, которое называется сверток и сверточная нейронная сеть делает это для вас, не создавая дорогих копий данных. Короче говоря, использование view_as_windows таким способом является небольшим хитрым приемом, и полезно понять эквивалентность этого извилинам, но это не правильный инструмент для этой работы. Для этого вы должны использовать трехмерные сверточные слои в своей библиотеке глубокого обучения.

...