Как загрузить очень большой файл Mat в чанках? - PullRequest
0 голосов
/ 06 ноября 2018

хорошо, поэтому код такой X1 - загруженное гиперспектральное изображение с размерами (512x512x91) То, что я пытаюсь сделать, это в основном обрезать матрицы размером 64x64x91 с изменяющимся шагом 2. Это дает мне в общей сложности 49952 изображения размером 64x64x91 каждое, однако при запуске цикла for я получаю ошибку памяти. моя система имеет 8 ГБ оперативной памяти.

data_images_0=np.zeros((49952,256,256,91))
k=0
for i in range(0,512-64,2):
    r=64
    print(k)
    for j in range (0,512-64,2):   
        #print(k)
        data_images_0[k,:,:,:]=X1[i:i+r,j:j+r,:]
        k=k+1

У меня есть гиперспектральное изображение, загруженное как файл Mat, и размеры (512x512x91). Я хочу использовать куски этого изображения в качестве входных данных для моего CNN, например, используя кадрирование размером 64x64x91. Проблема в том, что, как только я создаю кадрирование из исходного изображения, у меня возникают проблемы с загрузкой данных, поскольку загрузка всех кадрированных изображений одновременно выдает ошибку памяти. Есть ли что-то, что я могу сделать, чтобы загрузить мои обрезанные данные в пакетном режиме, чтобы я не получил такую ​​ошибку памяти. Должен ли я преобразовать свои данные в какой-то другой формат или решить проблему другим способом?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Я думаю, что вы, возможно, захотите использовать функцию matfile, которая в основном открывает файл .mat без загрузки всего содержимого в ОЗУ. Вы в основном читаете заголовок из вашего файла .mat, который содержит информацию о сохраненных элементах, таких как размер, тип данных и так далее. Представьте себе ваш файл .mat hyperspectralimg.mat , содержащий матрицу myImage . Вам нужно действовать так:

filename = 'hyperspectralimg.mat';
img = matfile(filename);

A = doStuff2MyImg(img.myImage(1:64,1:64,:)); % Do stuff to your imageparts

img.myImage(1:64,1:64,:) = A; %Return changes to your file

Это краткий пример того, как вы можете использовать его, если вы не использовали matfile раньше. Если вы уже использовали его, и он не работает, сообщите нам об этом, и в качестве общей рекомендации загрузите фрагменты кода и образцы данных, касающиеся ваших проблем,

Краткий комментарий к тегам: если ваша проблема касается matlab, не помечайте python и подобные вещи.

0 голосов
/ 06 ноября 2018

Вы ищете функцию matfile. Он позволяет получить доступ к массиву на жестком диске, а затем загружать только его части.

Скажите, что ваша фотография называется pic, тогда вы можете сделать что-то вроде

data = matfile("filename.mat");
part = data.pic(1:64,1:64,:);

%Do something

тогда в part будет загружена только часть (1:64,1:64,:) переменной pic.

Как всегда следует отметить, что работа на жестком диске не совсем быстрая и ее следует избегать. С другой стороны, если ваша переменная слишком велика, чтобы поместиться в памяти, другого пути нет (кроме покупки дополнительной памяти).

...