【TF2】Keras load_dataで読み込んだ全データセットをローカル保存する (1) CIFAR10, CIFAR100 画像への変換

TIPSディープラーニング
スポンサーリンク

意外とネットにあまり情報がなかったので情報共有です。
使う機会は結構あるかもしれないので。

 

はじめに

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) すべてのコードを一括したファイルをアップしています。
コード見たほうが早いわーな方はどうぞ。

GitHub - MaxiParadise/Save_TF_Keras_Dataset
Contribute to MaxiParadise/Save_TF_Keras_Dataset development by creating an account on GitHub.

 

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 のクラス定義 保存

下記リンク参照。

CIFAR-10 and CIFAR-100 datasets
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となっています。

CIFAR-10 and CIFAR-100 datasets

具体的には、以下の通り。

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 画像への変換方法
について
書きます。

 

 

最後まで読んでいただき、ありがとうございます!

ブックマーク登録、
ツイッターフォロー、
よろしくお願いいたします!🙇‍♂️🙇‍♂️
↓↓↓

タイトルとURLをコピーしました