CIFAR-10[1]「サイファー・テン」や「シーファー・テン」と呼びます。はAlexNetで有名なAlexさんらが構築したもので80 million tiny imagesから
- 飛行機、犬など10クラス
- 学習用データ5万枚
- 評価用データ1万枚
を抽出したデータセットです。
TensorFlowのチュートリアルにも含まれており触ってみる機会の多いデータセットだと思います。手書き数字を集めたMNISTと比べ「飛行機」や「犬」など一般の物体が写った画像が対象になり画像認識らしさを感じることができます。
ただ、Tiny imagesのデータのため解像度が32×32と小さいです。人目でもぎりぎり認識できるかどうかなので高精度を出すのは結構難しいデータセットだと思います。
入手方法
公式ページから「CIFAR-10 python version」を使うのが簡単です。クリックすると「cifar-10-python.tar.gz」がダウンロードされるので解凍すると
- data_batch_1〜data_batch_5: 学習用データ
- test_batch: 評価用データ
- batches.meta: ラベル名などのメタデータ
- readme.html: 公式サイトへのリンク
が生成されます。data_batch_1〜data_batch_5およびtest_batchはそれぞれ1万画像分のデータをcPickleでアーカイブしたデータなので、例えばdata_batch_1は
import pickle with open('data_batch_1', 'rb') as f: dataset = pickle.load(f, encoding='bytes')
で読み込めます。読み込んだdatasetはdictionary形式になっており
- data: 画像データ。1画像を長さ3,072(= 3チャンネル x 32ピクセル x 32ピクセル)の8bit整数配列で表現
- labels: 正解ラベル。0-9の数値で表現
が格納されています。
画像の表示方法
画像データは1次元のnumpy.array形式になっているので画像として表示するには
import numpy as np %matplotlib inline from matplotlib import pyplot as plt image_data = np.rollaxis(dataset['data'][0].reshape( (3, 32, 32) ), 0, 3) plt.imshow(image)
と変換してimshow関数に渡すと画像を表示できます。
クラス名の取得方法
CIFAR-10では各画像に以下の10クラスのいずれかが付与されています。
- airplane(飛行機)
- automobile(車)
- bird(鳥)
- cat(猫)
- deer(鹿)
- dog(犬)
- frog(カエル)
- horse(馬)
- ship(船)
- truck(トラック)
リストの上から順にIDとして0-9が振られておりlabels(正解ラベル)にはIDが記載されています。正解ラベルからクラス名を得るには
with open('batches.meta', 'rb') as f: meta_data = pickle.load(f, encoding='bytes') label_name_list = meta_data[b'label_names'] label_id = 0 # 正解ラベル(ID) label_name = label_name_list[label_id] # ラベル名
とするとラベル名が得られます。
CIFAR-10のデータを読み込んでランダムに画像と正解ラベルを付与するPythonスクリプトをGitHubに上げているので興味のある方はこちらをご参照ください。
有名手法での精度
Benenson先生が論文で報告されている有名データセットに対する精度をWebサイトで公開されています。それによるとCIFAR-10に対する有名手法の精度は
- AlexNet: 89.0%
- Network In Network: 91.2%
- ResNet: 93.6%
となっており90%を超えるところまで来ています。2015年の”Fractional Max-Pooling”という論文では精度96.5%という結果が報告されておりCIFAR-10もかなり高精度な推定が可能になってきていますね。
脚注
↑1 | 「サイファー・テン」や「シーファー・テン」と呼びます。 |
---|