kumilog.net

データ分析やプログラミングの話などを書いています。

MNISTのバイナリを画像に変換する

はじめに

画像系の入門データとして、手書き文字のMNISTは最もよく使われるデータの1つかと思います。

KerasやChainerなど主要なフレームワークには、ダウンロードして配列に格納するといった処理を行う関数を用意しているので、簡単に扱うことができます。

# keras
(X_train, y_train), (X_test, y_test) = keras.datasets.mnist.load_data()

# chainer
train, test = chainer.datasets.get_mnist()

# pytorch
train = torchvision.datasets.MNIST('./data', train=True, download=True)
test = torchvision.datasets.MNIST('./data', train=False)

学習のために画像ファイルで扱いたかったので、Chainerのget_mnist()を参考に、変換スクリプトを書いてみました。

変換スクリプト

作成したスクリプトは

  1. requestsでMNISTのファイルをダウンロード(donwload
  2. structordバイナリファイルを読み込み配列に格納(load
  3. Image.fromarrayPIL.Image形式に変換してjpgで保存(make_images
  4. ファイル名とラベルが書かれたリストを作成(make_labellist

といった流れになります。また、Python 3.6で動きます。

Download and Convert MNIST binary files to image f ...

実行例

python mnist_to_image.py --path ./data

のように実行すると、指定したフォルダに以下のようにファイルが生成されます。画像のファイル名は{ラベル}_{添字}.jpgとなっています。

data
├── processed
│   ├── images
│   │   ├── test
│   │   │   ├── 0_10.jpg
│   │   │   ├── 0_1001.jpg
│   │   │   ├── 0_1009.jpg
│   │   │   ├── ...
│   │   └── train
│   │       ├── 0_1.jpg
│   │       ├── 0_1000.jpg
│   │       ├── 0_10005.jpg
│   │       ├── ...
│   ├── labels
│   │   ├── test.csv
│   │   └── train.csv
└── raw
    ├── t10k-images-idx3-ubyte.gz
    ├── t10k-labels-idx1-ubyte.gz
    ├── train-images-idx3-ubyte.gz
    └── train-labels-idx1-ubyte.gz

labels/train.csvtest.csvは以下のように、ファイル名とラベルが書かれたリストです。

5_0.jpg,5
0_1.jpg,0
4_2.jpg,4
1_3.jpg,1
9_4.jpg,9