#jupyter-notebook
#питон #обработка изображений #юпитер-записная книжка #из-за нехватки памяти
Вопрос:
Я пытался создать фрагменты изображений из своего набора данных. Это мой код:
for path, subdirs, files in os.walk(root_directory): dirname = path.split(os.path.sep)[-1] if dirname == 'images': #Find all 'images' directories images = os.listdir(path) #List of all image names in this subdirectory for i, image_name in enumerate(images): if image_name.endswith(".tif"): #Only read jpg images... image = cv2.imread(path "/" image_name, 1) #Read each image as BGR SIZE_X = (image.shape[1]//patch_size)*patch_size #Nearest size divisible by our patch size SIZE_Y = (image.shape[0]//patch_size)*patch_size #Nearest size divisible by our patch size image = Image.fromarray(image) image = image.crop((0 ,0, SIZE_X, SIZE_Y)) #Crop from top left corner #image = image.resize((SIZE_X, SIZE_Y)) #Try not to resize for semantic segmentation image = np.array(image) #Extract patches from each image print("Now patchifying image:", path "/" image_name) patches_img = patchify(image, (patch_size, patch_size, 3), step=patch_size) #Step=256 for 256 patches means no overlap for i in range(patches_img.shape[0]): for j in range(patches_img.shape[1]): single_patch_img = patches_img[i,j,:,:] #Use minmaxscaler instead of just dividing by 255. single_patch_img = scaler.fit_transform(single_patch_img.reshape(-1, single_patch_img.shape[-1])).reshape(single_patch_img.shape) #single_patch_img = (single_patch_img.astype('float32')) / 255. single_patch_img = single_patch_img[0] #Drop the extra unecessary dimension that patchify adds. image_dataset.append(single_patch_img)
Но он показывает ошибку «недостаточно памяти» и немедленно выключается. Я использую 32 ГБ оперативной памяти и графический процессор 1660Ti. Изображения имеют размер 5000Х5000 пикселей, а размер моего набора данных составляет 12,7 ГБ.
Комментарии:
1. Вы не можете решить эту проблему. Вам просто нужно сжать их
Ответ №1:
Если вы загрузите файл в записную книжку Jupyter и сохраните его содержимое в переменной, базовый процесс Python сохранит выделенную память для этих данных до тех пор, пока переменная существует и записная книжка запущена. Сборщик мусора Python снова освободит память (в большинстве случаев), если обнаружит, что данные больше не нужны. Это имеет место, если она удалена, например, с помощью del, если переменная перезаписана чем-то другим или если она выходит за рамки (локальная переменная в конце функции).
Если вы храните большие файлы в (разных) переменных в течение нескольких недель, данные останутся в памяти и в конечном итоге заполнят ее. В этом случае вам, возможно, придется выключить ноутбук вручную или использовать какой-либо другой метод для удаления (глобальных) переменных.
Совершенно другой причиной такой же проблемы может быть ошибка в Jupyter. Такого рода ошибки называются утечкой памяти и часто возникают в серверных процессах, запущенных в течение длительного времени. Даже если они с меньшей вероятностью произойдут в Python, для Jupyter есть некоторые сообщения об ошибках. В этом случае единственным обходным путем может быть перезапуск процесса Jupyter. В других случаях я бы рекомендовал это сделать.