連載
» 2020年10月14日 05時00分 公開

AI・機械学習のデータセット辞典:QMNIST:手書き数字の画像データセット(MNIST改良版)

データセット「QMNIST」について説明。MNISTを改良してテストデータを1万から6万に増やし、合計12万枚となった手書き数字の「画像+ラベル」データが無料でダウンロードでき、画像認識などのディープラーニングに利用できる。PyTorchにおける利用コードやTensorFlowにおける情報も紹介。

[一色政彦,デジタルアドバンテージ]
「AI・機械学習のデータセット辞典」のインデックス

連載目次

データセット解説

 QMNISTデータセット(以下、QMNIST)は、

  • 数字「09」(10文字)

といった手書き数字の画像データセットである(図1)。

図1 QMNISTに含まれる「手書き数字」の例 図1 QMNISTに含まれる「手書き数字」の例
データセットの配布元: 「facebookresearch/qmnist: The QMNIST dataset」。BSDライセンス。
出典: Cold Case: The Lost MNIST Digits. Chhavi Yadav, Léon Bottou. arXiv:1905.10498

 QMNISTは、MNISTの改良版/再構築版として、NIST Special Database 19から抽出&加工して作られたサブセットである。MNISTの代わりとして、主に画像認識を目的としたディープラーニング/機械学習の研究や初心者向けチュートリアルで使われることが想定される。

 中身の画像データやラベルはMNISTデータセット(以下、MNIST)とほぼ同じであるが、

  • テストデータが1万件から6万件に増やされたこと
  • ラベルにオリジナルのNISTに関する情報が付加されたこと

が異なる。

 まず6万件に増やした理由については、論文「Cold Case: The Lost MNIST Digits」(2019年、arXiv:1905.10498)Facebook AI Research(FAIR)が公開するGitHub上のqmnist公式サイトで、次のように言及されている。

The official MNIST testing set only contains 10K randomly sampled images and is often considered too small to provide meaningful confidence intervals.
(訳:公式のMNISTにおけるテストデータは、ランダムサンプリングされた1万枚の画像しか含まれておらず、(統計的に)意味のある信頼区間を提供するには小さすぎる、と多くの場合、考えられる。)

 次にラベルに情報を付加した理由については、元のMNISTでは、データセット作成時の前処理に関する情報は失われているためとしている。例えば数字画像に対する筆者IDの情報が失われているので、そういった関係付けを行うための信頼できる方法がない、という問題があるのだ。

 こういった2点を念頭にデータセットを改良するために、QMNISTでは元のMNIST論文に従い、データセットをゼロから再構築している。しかも、ハンガリアン法(Hungarian algorithm)を用いて元のMNISTの数字と可能な限り一致するように工夫している。図2は公式GitHubリポジトリの説明画像を引用したものであるが、MNIST(左)とQMNIST(右)の数字がほぼ完全に一致していることが分かるだろう。

図2 MNISTとQMNISTにおける訓練データ先頭15個の数字の比較(公式GitHubリポジトリから引用) 図2 MNISTとQMNISTにおける訓練データ先頭15個の数字の比較(公式GitHubリポジトリから引用)
引用元: 「facebookresearch/qmnist: The QMNIST dataset」。BSDライセンス。
出典: Cold Case: The Lost MNIST Digits. Chhavi Yadav, Léon Bottou. arXiv:1905.10498

 まとめると、QMNISTデータセット全体は、

  • 6万枚の訓練データ用(画像とラベル)
  • 6万枚のテストデータ用(画像とラベル)
  • 合計12万枚

で構成される(「ラベル」=正解を示す教師データ)。各画像のフォーマットは

  • 8bitグレースケール(=色がないモノクローム): 白「0」〜黒「255」の256段階
  • 28×高さ28フィールド(=784フィールド)

となっている(「フィールド」=データを画像化する場合には「ピクセル」に対応する。RGBで作るグレースケールでは、0が黒で、255が白となり逆なので注意してほしい)。

図3 QMNISTに含まれる画像データの内容 図3 QMNISTに含まれる画像データの内容

 ラベルについては、数字に対応する09の数値だけでなく、前述したようにオリジナルのNIST関連情報も付加されている。QMNISTのラベルは、表1に示す1次元テンソル(=ベクトル)のデータ形式となっている。

列インデックス 説明 数値範囲
0 文字分類
(Character class)
0〜9
1 NIST HSFシリーズ
(NIST HSF series)
0か、1か、4
2 NIST筆者ID
(NIST writer ID)
0〜610 もしくは 2100〜2599
3 この筆者における数字インデックス
(Digit index for this writer)
0〜149
4 NIST分類コード
(NIST class code)
30〜39
5 NIST全体における数字インデックス
(Global NIST digit index)
0〜281769
6 複製
(Duplicate)
0
7 未使用
(Unused)
0
表1 ラベルのデータ形式

 通常は列インデックス0の値だけを見ればよいだろう。ちなみに[NIST HSFシリーズ]とは、大本のNISTがhsf0hsf4で管理されているため。[NIST筆者ID]は、02099がNIST従業員で、21002599が高校生を意味する。このような情報は、公式サイト論文の「MNIST trivia」などに記載されているので、詳しくはそちらを参照してほしい。

引用のための情報

 このデータセットは、基本的に自由に使用できる(BSDライセンス。厳密には公式リポジトリを確認してほしい)。

 引用情報を以下にまとめておく。

  • 作成者: Chhavi Yadav and Léon Bottou
  • タイトル: Cold Case: The Lost MNIST Digits
  • カンファレンス: Advances in Neural Information Processing Systems 32 (NIPS 2019)
  • 公開日: 2019
  • URL: http://arxiv.org/abs/1905.10498

利用方法

 実際にQMNISTを使うには、PyTorch(や将来的にはTensorFlow)といった各ライブラリが提供する機能を利用することをお勧めする。というのも、QMNISTの公式ページからダウンロード可能な、

  • qmnist-train-images-idx3-ubyte.gz: 訓練データ用の画像(6万枚)
  • qmnist-train-labels-idx2-int.gz: 訓練データ用のラベル(6万枚)
  • qmnist-test-images-idx3-ubyte.gz: テスト用の画像(6万枚)
  • qmnist-test-labels-idx2-int.gz: テスト用のラベル(6万枚)

という4つのファイルは、.jpgのような一般的な画像ファイルではなく、独自のフォーマットを持つ単一(=複数の画像データがひとまとめになった形式)の画像データセットだからである(ファイルフォーマットの仕様は、MNIST公式ページの「FILE FORMATS FOR THE MNIST DATABASE」および「THE IDX FILE FORMAT」を確認してほしい)。

 ライブラリを使わない場合、これらの画像フォーマットを読み込むためのリーダーをプログラムとして作る必要がある。プログラムの作成は難しくはないが、多くの人が使うものなので、一部の機械学習&ディープラーニングのライブラリでは基本機能としてQMNISTをロードする機能が含まれている(QMNISTは2019年と最近登場したものであり、2020年10月12日時点で、まだPyTorchにしか標準実装されていない。TensorFlowにも実装される見込みなので後述する)。よってそのロード機能を活用して、ムダな作業を減らすことを本稿ではお勧めする。

 それぞれのライブラリで「どのようなコードを書くとQMNISTが使えるか」の典型的なコードを簡単に示しておく(コードの詳細は解説しない)。基本的に各ライブラリは、QMNISTデータセットを自動的にダウンロードして使いやすい形にロードしてくれる機能を提供している。

PyTorch

# !pip install torch torchvision  # ライブラリ「PyTorch」をインストール

import torch
import torchvision

train_data = torchvision.datasets.QMNIST(
    './QMNIST/train'
    train=True, download=True, transform=torchvision.transforms.ToTensor())

test_data = torchvision.datasets.QMNIST(
    './QMNIST/test'
    train=False, download=True, transform=torchvision.transforms.ToTensor())

train_loader = torch.utils.data.DataLoader(train_data, batch_size=4, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_data, batch_size=4, shuffle=True)

リスト4 PyTorchでQMNISTを利用する基本的なコード

 PyTorchでは、torchvision.datasets.QMNISTクラスのコンストラクター(厳密には__init__関数)でデータセットのオブジェクトを生成してデータをダウンロードし、torch.utils.data.DataLoaderクラスのコンストラクターでデータローダーのオブジェクトを生成してデータをロードすればよい。ラベルデータは、元のMNISTのように数値のみではなく、前述した通り8つの列フィールドを持つ1次元テンソルとなっているので注意してほしい。

TensorFlow Datasets

 TensorFlowでは、TensorFlow DatasetsへのQMNIST搭載が提案されており、実装コードがプルリクエストされレビューされている段階である。近い将来、正式に採用されると期待してよいだろう。具体的な情報や最新の情報は下記のリンク先を参照してほしい。

「AI・機械学習のデータセット辞典」のインデックス

AI・機械学習のデータセット辞典

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。