MXNet チュートリアル : 画像データ I/O

MXNet チュートリアル : 画像データ I/O (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
日時 : 02/21/2017

* 本ページは、MXNet 本家サイトの Image Data IO Tutorial を翻訳した上で適宜、補足説明したものです:
    http://mxnet.io/tutorials/python/image_io.html

Image IO – 画像分類ネットワークをトレーニングするために画像をどのように準備し、ロードし、そして前処理するか。

 

このチュートリアルは MXNet において画像データをどのように準備し、ロードしそしてトレーニングするかについて説明します。MXNet の全ての I/O は $mx.io.DataIter$ とそのサブクラスを通して処理され、これは ここ で説明されます (訳注: リンク切れ。API Doc は こちら)。このチュートリアルでは画像データを処理するために pre-built データ iterator とカスタム iterator をどのように使用するかに焦点を当てます。

MXNet で画像データをロードするには主として3つの方法があります :

  • [NEW] mx.img.ImageIter: python で実装され、簡単にカスタマイズ可能で、.rec ファイルと raw 画像ファイルの両者からロードされます。
  • [OLD] mx.io.ImageRecordIter: バックエンド (C++) で実装され、カスタマイズ性は低い、しかし全ての言語バインディングで使用可能、.rec ファイルからロード
  • mx.io.DataIter を継承するカスタム iterator。

最初に、mxnet で使用されるレコード IO ファイル・フォーマットを説明します :

 

RecordIO

Record IO は データ IO のために MXNet で使用される主たるファイルフォーマットです。それは Hadoop HDFS と AWS S3 のような分散ファイルシステムを含む様々なファイルシステム上での読み書きをサポートします。最初に、物体の 101 クラスを含む Caltech 101 データセットをダウンロードして record io フォーマットに変換します :

セットアップ:

%matplotlib inline
import os
import subprocess
import mxnet as mx
import numpy as np
import matplotlib.pyplot as plt

# change this to your mxnet location
MXNET_HOME = '/scratch/mxnet'

ダウンロードそして unzip:

os.system('wget http://www.vision.caltech.edu/Image_Datasets/Caltech101/101_ObjectCategories.tar.gz -P data/')
os.chdir('data')
os.system('tar -xf 101_ObjectCategories.tar.gz')
os.chdir('../')

データを見てみましょう。見れば分かるように、root フォルダの下に全てのカテゴリーがサブフォルダを持ちます。

さてそれらを record io フォーマットに変換しましょう。最初に全て画像ファイルとそのカテゴリを含むリストを作成する必要がります :

os.system('python %s/tools/im2rec.py --list=1 --recursive=1 --shuffle=1 --test-ratio=0.2 data/caltech data/101_ObjectCategories'%MXNET_HOME)
0

or

import commands
commands.getoutput('python %s/tools/im2rec.py --list=1 --recursive=1 --shuffle=1 --test-ratio=0.2 data/caltech data/101_ObjectCategories'%MXNET_HOME)
'BACKGROUND_Google 0\nFaces 1\nFaces_easy 2\nLeopards 3\nMotorbikes 4\naccordion 5\nairplanes 6\nanchor 7\nant 8\nbarrel 9\nbass 10\nbeaver 11\nbinocular 12\nbonsai 13\nbrain 14\nbrontosaurus 15\nbuddha 16\nbutterfly 17\ncamera 18\ncannon 19\ncar_side 20\nceiling_fan 21\ncellphone 22\nchair 23\nchandelier 24\ncougar_body 25\ncougar_face 26\ncrab 27\ncrayfish 28\ncrocodile 29\ncrocodile_head 30\ncup 31\ndalmatian 32\ndollar_bill 33\ndolphin 34\ndragonfly 35\nelectric_guitar 36\nelephant 37\nemu 38\neuphonium 39\newer 40\nferry 41\nflamingo 42\nflamingo_head 43\ngarfield 44\ngerenuk 45\ngramophone 46\ngrand_piano 47\nhawksbill 48\nheadphone 49\nhedgehog 50\nhelicopter 51\nibis 52\ninline_skate 53\njoshua_tree 54\nkangaroo 55\nketch 56\nlamp 57\nlaptop 58\nllama 59\nlobster 60\nlotus 61\nmandolin 62\nmayfly 63\nmenorah 64\nmetronome 65\nminaret 66\nnautilus 67\noctopus 68\nokapi 69\npagoda 70\npanda 71\npigeon 72\npizza 73\nplatypus 74\npyramid 75\nrevolver 76\nrhino 77\nrooster 78\nsaxophone 79\nschooner 80\nscissors 81\nscorpion 82\nsea_horse 83\nsnoopy 84\nsoccer_ball 85\nstapler 86\nstarfish 87\nstegosaurus 88\nstop_sign 89\nstrawberry 90\nsunflower 91\ntick 92\ntrilobite 93\numbrella 94\nwatch 95\nwater_lilly 96\nwheelchair 97\nwild_cat 98\nwindsor_chair 99\nwrench 100\nyin_yang 101'

結果リストファイルは “index\t(one or more label)\tpath” というフォーマットです。この場合には各画像に一つだけのラベルがありますが、マルチラベル・トレーニングのために更に追加してリストを修正可能です。

そしてこのリストを record io ファイルを作成するために利用できます :

os.system("python %s/tools/im2rec.py --num-thread=4 --pass-through=1 data/caltech data/101_ObjectCategories"%MXNET_HOME)
0

or

commands.getoutput("python %s/tools/im2rec.py --num-thread=4 --pass-through=1 data/caltech data/101_ObjectCategories"%MXNET_HOME)
'Creating .rec file from /home/masao/ws.mxnet/ws/io/data/caltech.lst in /home/masao/ws.mxnet/ws/io/data\ntime: 0.00106501579285  count: 0\ntime: 0.18564581871  count: 1000\ntime: 0.0275530815125  count: 2000\ntime: 0.0347418785095  count: 3000\ntime: 0.0390591621399  count: 4000\ntime: 0.0364289283752  count: 5000\ntime: 0.0299060344696  count: 6000\ntime: 0.026172876358  count: 7000\ntime: 0.0177810192108  count: 8000\ntime: 0.0168430805206  count: 9000'

 

ImageRecordIter

mx.io.ImageRecordIter は record io フォーマットで保存された画像データをロードするために利用できます。全てのフロントエンド言語で利用できますが、C++ で実装されていて柔軟性に欠けています。

ImageRecordIter を使うためには、レコードファイルをロードして単にインスタンスを作成します :

data_iter = mx.io.ImageRecordIter(
    path_imgrec="./data/caltech_train.rec", # the target record file
    data_shape=(3, 227, 227), # output data shape. An 227x227 region will be cropped from the original image.
    batch_size=4, # number of samples per batch
    resize=256 # resize the shorter edge to 256 before cropping
    # ... you can add more augumentation options here. use help(mx.io.ImageRecordIter) to see all possible choices
    )
data_iter.reset()
batch = data_iter.next()
data = batch.data[0]
for i in range(4):
    plt.subplot(1,4,i+1)
    plt.imshow(data[i].asnumpy().astype(np.uint8).transpose((1,2,0)))
plt.show()

 

以上