意外とネットにあまり情報がなかったので情報共有です。
使う機会は結構あるかもしれないので。
はじめに
Tensorflowにも搭載されている Keras dataset API。
モデルの検証にload_data()で読み込んだ画像データ等をよく使用しますが、
データを目視で確認したい時に、Notebook等では限界があります。
そんな時に、すべてのデータをローカルで保存、可視化する方法です。
(1) CIFAR10、CIFAR100 画像への変換方法
(2) MNIST、Fashin-MNIST 画像への変換方法
(3) IMDB Review、Reuters Topics テキストへの変換方法
(4) Boston Housing data のcsvへの変換方法
この記事では「(1) CIFAR10、CIFAR100画像への変換方法」について書いています。
ソースコード一式
こちらに(1)~(4) すべてのコードを一括したファイルをアップしています。
コード見たほうが早いわーな方はどうぞ。
CIFAR10、CIFAR100 の画像保存
from tensorflow.keras.datasets import cifar10, cifar100
# Load data from keras API
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
まず、load_data()で、train, testにデータを読み込むのですが、
CIFAR10/100の場合、yの配列にクセがあります。
具体的には、y_train, y_testにはクラスIDが格納されていますが、
[1,2,3,・・・] のようにそのままint配列が入っているのではなく
[[1],[2],[3],・・・]のように要素1の配列を持つ二次元配列になってます。
なので、クラスIDを取り出すには
y_train[n][0] のように記述する必要あり。
CIFAR10 のクラス定義 保存
下記リンク参照。
ID | Class |
0 | airplane |
1 | automobile |
2 | bird |
3 | cat |
4 | deer |
5 | dog |
6 | frog |
7 | horse |
8 | ship |
9 | truck |
まず、クラス定義します。
TrainデータとTestデータを分けて保存したいので、
まずは、”train” “test”というフォルダを生成、
その下に「クラスID_クラス名」でフォルダを生成します。
import os
import numpy as np
from PIL import Image
OUT_DIR = 'cifar10'
# define class names
class_list = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
# make train/test dirs and class dirs
for cid, class_name in enumerate(class_list):
os.makedirs(os.path.join(OUT_DIR,'train', '{:d}_{}'.format(cid,class_name)), exist_ok=True)
os.makedirs(os.path.join(OUT_DIR,'test', '{:d}_{}'.format(cid,class_name)), exist_ok=True)
画像変換はよくやる「numpy → Pillowで画像化して保存」です。
具体的には、
Image.fromarray(numpy_data).save(filepath)
で、画像保存します。
まずはTrainデータの保存。
クラスIDを見ながら先ほどのフォルダごとに一個一個保存していきます。
# convert train data
for num, (x_data, y_data) in enumerate(zip(x_train, y_train)):
cid = y_data[0] # y_data is an 1 element array
# make file path
fpath = os.path.join(OUT_DIR,'train', '{:d}_{}'.format(cid,class_list[cid]), 'train_{:05d}.png'.format(num))
# convert numpy to pillow and save
Image.fromarray(x_data).save(fpath)
Testデータもほぼ同じように。
# convert test data
for num, (x_data, y_data) in enumerate(zip(x_test, y_test)):
cid = y_data[0] # y_data is an 1 element array
# make file path
fpath = os.path.join(OUT_DIR,'test', '{:d}_{}'.format(cid,class_list[cid]), 'test_{:05d}.png'.format(num))
# convert numpy to pillow and save
Image.fromarray(x_data).save(fpath)
以下のように保存されます。
CIFAR100 のクラス定義 保存
CIFAR10とクラス定義が違うだけです。
クラス定義は、下記CIFAR100の項目のClassに記載されているのですが、
実際には記述順ではなく、
アルファベット順にソートしたものがClass IDとなっています。
具体的には、以下の通り。
ID | Class | ID | Class |
0 | apple | 50 | mouse |
1 | aquarium_fish | 51 | mushroom |
2 | baby | 52 | oak_tree |
3 | bear | 53 | orange |
4 | beaver | 54 | orchid |
5 | bed | 55 | otter |
6 | bee | 56 | palm_tree |
7 | beetle | 57 | pear |
8 | bicycle | 58 | pickup_truck |
9 | bottle | 59 | pine_tree |
10 | bowl | 60 | plain |
11 | boy | 61 | plate |
12 | bridge | 62 | poppy |
13 | bus | 63 | porcupine |
14 | butterfly | 64 | possum |
15 | camel | 65 | rabbit |
16 | can | 66 | raccoon |
17 | castle | 67 | ray |
18 | caterpillar | 68 | road |
19 | cattle | 69 | rocket |
20 | chair | 70 | rose |
21 | chimpanzee | 71 | sea |
22 | clock | 72 | seal |
23 | cloud | 73 | shark |
24 | cockroach | 74 | shrew |
25 | couch | 75 | skunk |
26 | crab | 76 | skyscraper |
27 | crocodile | 77 | snail |
28 | cup | 78 | snake |
29 | dinosaur | 79 | spider |
30 | dolphin | 80 | squirrel |
31 | elephant | 81 | streetcar |
32 | flatfish | 82 | sunflower |
33 | forest | 83 | sweet_pepper |
34 | fox | 84 | table |
35 | girl | 85 | tank |
36 | hamster | 86 | telephone |
37 | house | 87 | television |
38 | kangaroo | 88 | tiger |
39 | keyboard | 89 | tractor |
40 | lamp | 90 | train |
41 | lawn_mower | 91 | trout |
42 | leopard | 92 | tulip |
43 | lion | 93 | turtle |
44 | lizard | 94 | wardrobe |
45 | lobster | 95 | whale |
46 | man | 96 | willow_tree |
47 | maple_tree | 97 | wolf |
48 | motorcycle | 98 | woman |
49 | mountain | 99 | worm |
あとは、
CIFAR10保存コードのクラス定義を書き換えるだけです。
class_list = [
'apple', 'aquarium_fish', 'baby', 'bear', 'beaver', 'bed', 'bee', 'beetle',
'bicycle', 'bottle', 'bowl', 'boy', 'bridge', 'bus', 'butterfly', 'camel',
'can', 'castle', 'caterpillar', 'cattle', 'chair', 'chimpanzee', 'clock',
'cloud', 'cockroach', 'couch', 'crab', 'crocodile', 'cup', 'dinosaur',
'dolphin', 'elephant', 'flatfish', 'forest', 'fox', 'girl', 'hamster',
'house', 'kangaroo', 'keyboard', 'lamp', 'lawn_mower', 'leopard', 'lion',
'lizard', 'lobster', 'man', 'maple_tree', 'motorcycle', 'mountain', 'mouse',
'mushroom', 'oak_tree', 'orange', 'orchid', 'otter', 'palm_tree', 'pear',
'pickup_truck', 'pine_tree', 'plain', 'plate', 'poppy', 'porcupine',
'possum', 'rabbit', 'raccoon', 'ray', 'road', 'rocket', 'rose',
'sea', 'seal', 'shark', 'shrew', 'skunk', 'skyscraper', 'snail', 'snake',
'spider', 'squirrel', 'streetcar', 'sunflower', 'sweet_pepper', 'table',
'tank', 'telephone', 'television', 'tiger', 'tractor', 'train', 'trout',
'tulip', 'turtle', 'wardrobe', 'whale', 'willow_tree', 'wolf', 'woman', 'worm']
これで100クラスの画像が保存されるはず。
次回は、
(2) MNIST、Fashion-MNIST 画像への変換方法
について書きます。
最後まで読んでいただき、ありがとうございます!
ブックマーク登録、
ツイッターフォロー、
よろしくお願いいたします!🙇♂️🙇♂️
↓↓↓