如何將cifar-10數據集的圖片轉化爲227*227像素以供Alexnet訓練

下載cifar-10數據集

官網地址:http://www.cs.toronto.edu/~kriz/cifar.html
這是從官網下載好的python版cifar-10數據集

在這裏插入圖片描述

加載cifar-10數據集

def load_file(cifar):
    '''加載cifar數據集'''
    
    import pickle
    with open('D:\cifar-10-batches-py\\'+str(cifar), 'rb') as fo:
        data = pickle.load(fo, encoding='latin1')
    return data
    
# 這裏加載了第一個data_batch  
data = load_file('data_batch_1')
print(data.keys())
X = data['data']
Y = data['labels']
print(X.shape)
print(len(Y))

得到的結果是

dict_keys(['batch_label', 'labels', 'data', 'filenames'])
(10000, 3072)
10000

data是一個字典,包含了四個鍵:‘batch_label’, ‘labels’, ‘data’, ‘filenames’
將data的data鍵對應的值賦給X。
X就是[10000,3072]的矩陣,10000代表着一個batch含有10000張圖片,3072=32x32x3,代表着32x32像素的RGB圖片。
Y是一個長度10000的列表,值爲0-9,分別代表不同的類別。

修改cifar-10圖片的分辨率

def convert_cifar10_227pix(X):
    '''
    將cifar-10數據集的原始矩陣[10000,3072]轉化爲[10000,227,227,3]
    用於Alexnet訓練
    X - 原始矩陣 shape = [10000, 3072]
    m - 10000代表圖片張數
    n_H - 圖片高度
    n_W - 圖片寬度
    channel - RGB三色通道
    '''
    
    from PIL import Image
    import numpy as np
    X = np.reshape(X, (10000,3, 32, 32))  # 將圖片轉換成(m, channel,n_H,n_W)
    X = X.transpose(0, 2, 3, 1)  # 轉換成標準的矩陣(m, n_H,n_W, channel)
    X_resized = np.zeros((10000,227,227,3))# 創建一個存儲修改過圖片分辨率的矩陣
    
    for i in range(0,10000):
        img = X[i]
        img = Image.fromarray(img)
        img = np.array(img.resize((227,227),Image.BICUBIC))# 修改分辨率,再轉爲array類
        X_resized[i,:,:,:] = img
        
    X_resized /= 255
    return X_resized

運行以下代碼

import matplotlib.pyplot as plt
X_resized = convert_cifar10_227pix(X)
X = np.reshape(X, (10000,3, 32, 32))
X = X.transpose(0, 2, 3, 1)
fig, axarr = plt.subplots(1, 2)
axarr[0].imshow(X[4])
axarr[1].imshow(X_resized[4])

效果如圖,左邊爲原始的32x32像素圖片,右邊爲轉換後227x227像素圖片

在這裏插入圖片描述

總結

其實通過這種方法,可以把圖片轉換爲想要的任意像素大小,不過這種方法對內存的佔用很大,要注意一次轉換的圖片不要太多,不然可能內存就爆了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章