1. 程式人生 > >MXNet影象資料打包 im2rec.py

MXNet影象資料打包 im2rec.py

     記錄一下使用MXNet進行影象資料打包時踩過的坑。我使用的MXNet是最新的1.2.0版本,而參考資料中給的基本都是老版本的打包方式,所以過程中出了很多錯誤,無奈只能看im2rec.py原始碼,最終完美解決。

    MXNet提供了影象資料打包格式RecordIO,以及專用迭代器ImageRecordIter,它可以快速非同步載入打包後的影象,還可以自動完成裁剪、縮放、影象增強等常見操作。

    接下來說一下影象打包的具體步驟:

    (1)將影象按標籤分類放到各自的資料夾中;

     例如,在train資料夾下新建10個子資料夾,分別命名為0-9,裡邊存放的是屬於各自類別的圖片。

    

    (2)下載MXNet的GitHub專案,地址為https://github.com/dmlc/mxnet

    (3)在命令列執行tools資料夾中的im2rec.py檔案,生成影象列表lst檔案,具體如下:

在與train同級的資料夾中開啟命令列,執行 python  F:\mxnet\incubator-mxnet-master\tools\im2rec.py  --list  --recursive  train  F:\........\train

注意:

    踩過的坑主要在這裡,參考資料中寫的是--list=1 --recursive=1,這可能是老版本的寫法,新版本這樣寫就會出錯。原始碼中list、recursive預設的是False,此處只需指明--list  --recursive即可。

    (4)從列表生成rec檔案和idx檔案

在與train同級的資料夾中開啟命令列,執行 python F:\mxnet\incubator-mxnet-master\tools\im2rec.py --pass-through train.lst F:
\.........\train

注意:這裡也有幾個坑

  1. 同樣的--pass-through引數無需再次賦值,只需指明即可;
  2. train.list一定要寫上字尾,不然會報錯;
  3. 執行這條指令後可能會抱如下錯誤:TypeError: a bytes-like object is required, not 'str'。解決辦法:在原始碼中將line = [i.strip() for i in line.strip().split('\t')] 修改為line = [i.strip() for i in str(line.strip(),encoding='utf-8').split('\t')]。原始碼中第103行(1.2.0版本)。 

    (5)至此,lst、rec、idx檔案已全部生成 ,即可在ImageRecordIter中載入使用。

注:部分內容參考《深度卷積網路》