загрузка набора данных, чтобы избежать потребления памяти - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть набор данных с 60000 изображений 227X227X3.Я столкнулся с нехваткой памяти при загрузке этих изображений в память.Мне нужны предложения для загрузки изображений, чтобы избежать нехватки памяти.Ниже приведен код Python, который я использую для загрузки изображений.Может кто-нибудь сказать мне, как я могу улучшить приведенный ниже фрагмент.

def loadImages(fnames,is_test):
    path = '/home/assad/Desktop/grandfinal/grandfinalv2/dataset/test_images/'
    if is_test:
        path = '/home/assad/Desktop/grandfinal/grandfinalv2/dataset/test_images/'
    loadedImages = []
     #loadedImages = np.empty((N, 3, 227, 227), dtype=np.uint8)    
    for image in fnames:
        tmp = Image.open(path + image)
        img = tmp.copy()
        loadedImages.append(img)
        tmp.close()
    return loadedImages



def get_pixels(fnames,is_test):
    imgs = loadImages(fnames, is_test)
    #print imgs
    pixel_list = []
    for img in imgs:
        img = img.resize((227, 227), Image.ANTIALIAS)
        arr = np.array(img, dtype="uint8")
        arr=np.rollaxis(arr,2)
        arr=arr.reshape(-1)
        pixel_list.append(list(arr))
    return np.array(pixel_list)


def label_from_category(category_id=None):
    label_list = np.zeros(4)
    label_list[category_id]=1
    return list(label_list)
#print(label_from_category())


def features_from_data(data, is_test=True):
    pixels = get_pixels(data.FILENAME, is_test)
    labels = data["CATEGORY_ID"]
    return pixels, labels

test_data = get_data(is_test=True)



iX_test, iY_test = features_from_data(test_data, is_test=True)
iY_test=iY_test.tolist()
iX_test, iY_test = features_from_data(test_data, is_test=True)
print (iX_test.shape)
iY_test=iY_test.tolist()
print(iY_test)

1 Ответ

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

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

Измените функцию loadImages на yield изображение, вместо того, чтобы загружать все из них в list.

Попробуйте это:

def loadImages(fnames,is_test):
    path = '/home/assad/Desktop/grandfinal/grandfinalv2/dataset/test_images/'
    if is_test:
        path = '/home/assad/Desktop/grandfinal/grandfinalv2/dataset/test_images/'
    for image in fnames:
        tmp = Image.open(path + image)
        img = tmp.copy()
        tmp.close()
        yield img

И остальная часть вашего кода должна остаться прежней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...