MXNet チュートリアル : Python Record IO (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
日時 : 02/21/2017
* 本ページは、MXNet 本家サイトの Python Record IO Tutorial を翻訳した上で適宜、補足説明したものです:
http://mxnet.io/tutorials/python/record_io.html
Record IO (Advanced) – フリーフォーマット・データをどのように単一の(簡単で効率的な IO のための MXNet の RecordIO フォーマットを使用した)バイナリファイルにパックするか。
序
画像データ I/O で、画像をどのように標準 recordio フォーマットにパックしてそれを ImageRecordIter でロードするかを学習しました。このチュートリアルは record io ファイルを読み書きするための python I/F を walk through します。データパイプラインの詳細に渡り更に制御する必要がある時に有用です。例えば、検出とセグメンテーションのために画像とラベルを増強 (augument) する必要がある時、あるいは triplet sampling と negative sampling のためにデータ iterator をカスタマイズする必要がある時です。
最初の環境セットアップ :
%matplotlib inline from __future__ import print_function import mxnet as mx import numpy as np import matplotlib.pyplot as plt
関連コードは $mx.recordio$ にあります。2つのクラスがあります : $MxRecordIO$、これはシーケンシャルな読み書きをサポートします、そして $MXIndexedRecordIO$、これはランダム・リードとシーケンシャルな書き込みをサポートします。
MXRecordIO
最初に $MXRecordIO を見てみましょう。$tmp.rec$ ファイルをオープンして 5 文字列をそれに書き込みます :
record = mx.recordio.MXRecordIO('tmp.rec', 'w') for i in range(5): record.write('record_%d'%i) record.close()
そして同じファイルを ‘r’ でオープンすることによりそれを読み戻すことができます :
record = mx.recordio.MXRecordIO('tmp.rec', 'r') while True: item = record.read() if not item: break print (item) record.close()
record_0 record_1 record_2 record_3 record_4
MXIndexedRecordIO
時々より複雑なタスクのためにランダムアクセスが必要でしょう。$MXIndexedRecordIO$ はこのために設計されました。ここで index されたレコード tmp.rec と相当する index ファイル tmp.idx を作成します :
record = mx.recordio.MXIndexedRecordIO('tmp.idx', 'tmp.rec', 'w') for i in range(5): record.write_idx(i, 'record_%d'%i) record.close()
それからレコードにキーでアクセスできます :
record = mx.recordio.MXIndexedRecordIO('tmp.idx', 'tmp.rec', 'r') record.read_idx(3)
'record_3'
全てのキーは次のようにリストできます :
record.keys
[0, 1, 2, 3, 4]
Packing と Unpacking データ
.rec ファイルの各レコードは任意のバイナリ・データを含むことができますが、機械学習データは典型的にはラベル/データ構造を持ちます。mx.recordio はまたそのようなデータを packing するための2、3のユティリティ関数を含みます、すなわち : $pack$, $unpack$, $pack\_img$, そして $unpack\_img$.
バイナリ・データ
pack と unpack は float (or 1d array of float) ラベルとバイナリ・データをストアするために使用されます :
# pack data = 'data' label1 = 1.0 header1 = mx.recordio.IRHeader(flag=0, label=label1, id=1, id2=0) s1 = mx.recordio.pack(header1, data) print('float label:', repr(s1)) label2 = [1.0, 2.0, 3.0] header2 = mx.recordio.IRHeader(flag=0, label=label2, id=2, id2=0) s2 = mx.recordio.pack(header2, data) print('array label:', repr(s2))
float label: '\x00\x00\x00\x00\x00\x00\x80?\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00data' array label: '\x03\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?\x00\x00\x00@\x00\x00@@data'
# unpack print(*mx.recordio.unpack(s1)) print(*mx.recordio.unpack(s2))
HEADER(flag=0, label=1.0, id=1, id2=0) data HEADER(flag=3, label=array([ 1., 2., 3.], dtype=float32), id=2, id2=0) data
画像データ
pack_img and unpack_img are used for packing image data. Records packed by pack_img can be loaded by mx.io.ImageRecordIter.
# pack_img data = np.ones((3,3,1), dtype=np.uint8) label = 1.0 header = mx.recordio.IRHeader(flag=0, label=label, id=0, id2=0) s = mx.recordio.pack_img(header, data, quality=100, img_fmt='.jpg') print(repr(s))
'\x00\x00\x00\x00\x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xdb\x00C\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xff\xc0\x00\x0b\x08\x00\x03\x00\x03\x01\x01\x11\x00\xff\xc4\x00\x1f\x00\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\xff\xc4\x00\xb5\x10\x00\x02\x01\x03\x03\x02\x04\x03\x05\x05\x04\x04\x00\x00\x01}\x01\x02\x03\x00\x04\x11\x05\x12!1A\x06\x13Qa\x07"q\x142\x81\x91\xa1\x08#B\xb1\xc1\x15R\xd1\xf0$3br\x82\t\n\x16\x17\x18\x19\x1a%&\'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz\x83\x84\x85\x86\x87\x88\x89\x8a\x92\x93\x94\x95\x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xff\xda\x00\x08\x01\x01\x00\x00?\x00\xfe\x01\xeb\xff\xd9'
# unpack_img print(*mx.recordio.unpack_img(s))
HEADER(flag=0, label=1.0, id=0, id2=0) [[1 1 1] [1 1 1] [1 1 1]]
Next Step
- Advanced Image IO Advanced image IO for detection, segmentation, etc…
以上