Ошибка памяти при преобразовании списка в массив numpy

#python #arrays #memory #numpy

#python #массивы #память #numpy

Вопрос:

У меня есть в общей сложности около 7000 изображений, из которых я извлекаю функции HoG. Затем я хочу преобразовать список в np-массив для дальнейшей обработки. Но я получаю ошибку памяти во время преобразования.

Вот соответствующая часть моего кода:

 from skimage import data, io, filter, color, exposure
from skimage.feature import hog
from skimage.transform import resize
import matplotlib.pyplot as plt
import numpy as np

tmp_hogs = [] # this is the list I need to convert into a numpy array
for group in samplegroups:
    for myimg in group:
        curr_img = np.array(myimg, dtype=float)
        imgs.append(curr_img)
        fd, hog_image = hog(curr_img, orientations=8, pixels_per_cell=(4, 4),
                 cells_per_block=(1, 1), visualise=True, normalise=True)
        tmp_hogs.append(fd)

img_hogs = np.array(tmp_hogs, dtype =float) 
  

Ошибка, которую я получаю,:

 Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:Usersappanacondasoftwarelibthreading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:Usersappanacondasoftwarelibsite-packagesspyderlibwidgetsexternalshellmonitor.py", line 582, in run
    already_pickled=True)
  File "C:Usersappanacondasoftwarelibsite-packagesspyderlibutilsbsdsocket.py", line 45, in write_packet
    nsend -= temp_fail_retry(socket.error, sock.send, sent_data)
  File "C:Usersappanacondasoftwarelibsite-packagesspyderlibutilsbsdsocket.py", line 25, in temp_fail_retry
    return fun(*args)
error: [Errno 10054] An existing connection was forcibly closed by the remote host

Traceback (most recent call last):
  File "C:UsersappDocumentsPython Scriptsgbc_carclassify.py", line 63, in <module>
    img_hogs = np.array(tmp_hogs, dtype =float) 
MemoryError
  

Как я могу это исправить?

Комментарии:

1. Какой размер tmp_hogs? И это 1D?

2. Сколько у вас памяти? Сколько памяти занимает один hog? Вы используете 32 или 64-разрядный python?

3. 32-разрядный python (spyder от Anaconda) на 64-разрядной машине.

Ответ №1:

Для изображений RGB или RGBA вам нужно всего 8 бит на значение, а при использовании float вы выделяете 64 бита на значение. Попробуйте использовать np.uint8 вместо:

 img_hogs = np.array(tmp_hogs, dtype=np.uint8)
  

Комментарии:

1. другим улучшением будет создание пустого массива и сохранение изображений непосредственно в этом массиве, избегая промежуточного списка