1. 程式人生 > >mxnet 資料部分介面解讀和視覺化

mxnet 資料部分介面解讀和視覺化

(一)資料讀取

這裡主要用到兩個函式介面:io.ImageRecordIter以及recordio.MXIndexedRecordIO。

  • io.ImageRecordIter:

函式解釋:從rec檔案中讀取資料,根據batchSize的大小讀取資料。

函式引數:(幾個重要的引數,其餘的參考文件)

                path_imgrec :rec檔案地址

                data_shape:影象輸出大小,形式為(channel,height,width)。如果與原圖不同,會進行裁剪。

                label_width:一個影象對應的標籤數,多屬性時會用到,預設為1。

                batch_size:一次性讀取的資料大小。

                shuffle:是否在讀取時進行混洗,隨機讀取。 

注意點:

           1.當shuffle設定為false時,讀取的順序是按照lst檔案的順序進行讀取的。在進行訓練的時候,最好是設定為true,對於訓練有提升效果。

            2.從這個迭代器中取資料,是呼叫next()函式。

  • recordio.MXIndexedRecordIO

函式解釋:與上個相比,該函式介面支援資料的隨機讀取。

函式引數:idx檔案路徑和rec檔案路徑。

注意點:通過tools/im2rec.py檔案生成資料的時候,一般會有三個檔案,字尾為.lst,.idx,.rec。一般用到的是lst檔案和rec檔案。idx檔案一般被人忽略,其實idx檔案的內容是決定了該介面可以隨機讀取的關鍵。

idx檔案內容為兩列,一列為檔案的index,對應lst檔案的第一列。idx檔案第二列是編碼位置,也就是該檔案在rec中的儲存位置段。

從該介面讀取資料的時候,是按照索引讀取的,索引數就是原始影象在原始資料夾的位置,即lst未打亂前的從index=0,label=0開始索引,按index索引。當然,有了索引,那就可以隨機讀取圖片。

(二)讀取程式碼示例

    path_idx='train_webface_train.idx'
    path_rec='train_webface_train.rec'
    path_lst='train_webface_train.lst'
    ## 1st
    train = mx.io.ImageRecordIter(path_imgrec=path_rec,batch_size=1,data_shape = (1,144,128))
    train.reset()
    #data
    data = next(train)
    image=data.data[0][0][0].asnumpy()
    
    ## 2nd
    imrec = mx.recordio.MXIndexedRecordIO(path_idx, path_rec, 'r')
    #data
    index = 0
    s = imrec.read_idx(index)
    header, img = mx.recordio.unpack(s)
    image1 = mx.image.imdecode(img, 0)
    image1 = mx.nd.transpose(image1, axes=(2, 0, 1))[0].asnumpy()


(三)資料視覺化

在上面的程式碼中,注意從data.data是個list。list內的ndarray是4維的資料,所以需要多層索引。

而從imrec中讀取的資料需要先解碼,之後解碼的影象資料的維度是(h,w,channel),所以需要先轉換維度。

最後將ndarray轉換為numpy,用matplot畫圖。

import matplotlib.pyplot as plt
plt.imshow(image,cmap='gray')
plt.title('image')
plt.show()