14
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

画像認識データセットOmniglotをMnist風に使えるようにしました

Last updated at Posted at 2017-11-06

元のデータはこちら
https://github.com/brendenlake/omniglot

今回作ったものはこちら
https://github.com/TatsuyaMizuguchi17/Products

作ったというよりは。まとめた、という感じですが…

#Omniglotとは
OmniglotとはMnistと同じ文字認識用データセットですが、Mnistよりもシビアなものになっています。例えばsklearnのMnistと上のOmniglotを比較すると、

データ数 分類クラス 1クラスあたりのデータ数
Mnist 70000 10 7000
Omniglot 32460 1623 20

と1クラスあたりのデータ数が非常に少ないです。
そのため超多クラス分類やOne-shot-learningをやっている人にとっては、より実用に近いデータセットになっています。

#使い方
ダウンロード

//github.com/TatsuyaMizuguchi17/Products.git

形式はsklearn.datasetsのfetch_mldataと同じにしました。
なので、これまでsklearnでMnistを使っていた場合、コードを大きく変更することなく使用できると思います。
もちろん初めからコードを書く場合も扱いやすいようにしています。

sklearnの場合、

Mnist.py
from sklearn.datasets import fetch_mldata

mnist = fetch_mldata("MNIST original")
data = mnist["data"].astype(np.float32)
label = mnist["target"].astype(np.int32)

N = 60000
N_test = 10000
train_data = data[:N].reshape((N, 1, 28, 28)) / 255.0
test_data = data[N:].reshape((N_test, 1, 28, 28)) / 255.0
train_label = label[:N]
test_label = label[N:]

と書くところを、今回は

Omnist.py
import omniglot

dataset = omniglot.omniglot("small1") #small1 or small2 or large

train_data = dataset["train_data"]
train_label = dataset["train_label"]
test_data = dataset["test_data"]
test_label = dataset["test_label"]

とすればOKです。
次に説明しますが、omniglot.omniglotの引数には、small1、small2、largeのどれかを使います。

#データ内訳
データセットは3種類あります。それぞれクラス数が異なります。

Trainデータ数 Testデータ数  クラス数 1クラスあたりのデータ数
small1 2040 680 136  20  
small2 2340 780 156 20
large 14460 4820 964 20

試しで使用する場合はsmall1を使うことをお勧めします。

#選択肢付きデータセット
よくある(?)問題設定として、1つの問題画像Aと複数の選択肢画像B,C,...,Nが提示され、画像Aと同じクラスに分類する画像をB~Nの中から1つ選んで解答するというものがあります。

下の例では、一番左が問題画像で、その他の5つが選択肢の画像になっています。
カッコの中身がクラス番号を表していて、一番左の文字と同じクラス(51)に属するものを右の選択肢の画像の中から選ぶ、というのが問題設定です。

スクリーンショット 2017-11-06 16.57.30.png

今回は、この問題設定に準じたデータセットを簡単に作成することができます。

Omniglot.py
train_questionset = omniglot.get_omniglot_questionset(train_data,train_label,QUESTION_NUM=1000, CHOICE_NUM = 5)
test_questionset = omniglot.get_omniglot_questionset(test_data,test_label,QUESTION_NUM=300, CHOICE_NUM = 5)

QUESTION_NUMが問題数、CHOICE_NUMが選択肢の数です。
ここでは、選択肢が5つである問題文を1300問(トレーニングデータ1000問、テストデータ300問)とってきています。

get_omniglot_questionsetは問題数の大きさのリストLを返します。
L[i]は"question_data","question_label","ans_data","ans_label"をキーに持つ辞書です。

"question_data" : 問題の画像 shape=(1,1,105,105)
"question_label" : 問題のラベル shape=(1)
"ans_data" : 選択肢の画像 shape=(CHOICE_NUM,1,105,105)
"ans_label" : 選択肢の画像 shape=(CHOICE_NUM)

問題を出力して見たい場合はshow_questionset(data)で出力できます。

Omniglot.py
omniglot.show_questionset(train_questionset,line=7)

と言うわけで、以上が今回作ったデータセットの説明でした。

14
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?