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()