Posted at

cifarとCUCUMBER-9データセットから画像を取り出す

More than 1 year has passed since last update.

Python3でnumpyの配列から画像を生成する、ってタイトルの方が良いかも(あえてニッチな方で(^^;

cifarは飛行機やら猫やら、cucumberは(その名の通り)きゅうりの画像セットです。機械学習に使いやすいようにnumpyの配列形式で配布されているんですが、実際の中身を覗いてみたいというのが動機です。

https://www.cs.toronto.edu/~kriz/cifar.html

https://github.com/workpiles/CUCUMBER-9

cucmberはciferとフォーマットを揃えているらしいんですが、実際には異なっていまして、それぞれ別個の処理が必要でした。Tensorflowにはcucumber形式の方が便利なのかな…?(理由は分かっていません)

data.shape = (10000, 3072) # cifar-10

data.shape = (1485, 1024) # CUCUMBER-9

サンプルプログラムは以下の通りです。Python2の場合、cPickleを使ってください。numpyとPILが必要です。

import numpy as np

import _pickle,random
from PIL import Image

def unpickle(file):
fo = open(file, 'rb')
dict = _pickle.load(fo, encoding='latin-1')
fo.close()
return dict

def image_from_cifar(index,dic):
name = dic['filenames'][index]
data = dic['data'][index].reshape(3, 32, 32).transpose(1, 2, 0) # shape=(32, 32, 3)
img = Image.fromarray(data, 'RGB')
print(name)
img.save(name)

def image_from_cucumber(index,dic):
name = dic['filenames'][index]
r = dic['data'][index*3]
g = dic['data'][index*3+1]
b = dic['data'][index*3+2]
data = np.array([r,g,b]).T.reshape(32,32,3)
img = Image.fromarray(data, 'RGB')
print(name)
img.save(name)

if __name__ == "__main__":
dic = unpickle('cifar-10-batches-py/data_batch_1')
image_from_cifar(random.randint(0,len(dic['filenames'])),dic)

dic = unpickle('CUCUMBER-9-master/prototype_1/cucumber-9-python/data_batch_1')
image_from_cucumber(random.randint(0,len(dic['filenames'])),dic)

それぞれのデータセットをカレントディレクトリに置いた状態で実行すると、ランダムに一枚取り出して画像として保存してくれます。

tabby_cat_s_000125.png

2L_00153.jpg