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

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
IDClass
0airplane
1automobile
2bird
3cat
4deer
5dog
6frog
7horse
8ship
9truck

まず、クラス定義します。

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

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

IDClassIDClass
0apple50mouse
1aquarium_fish51mushroom
2baby52oak_tree
3bear53orange
4beaver54orchid
5bed55otter
6bee56palm_tree
7beetle57pear
8bicycle58pickup_truck
9bottle59pine_tree
10bowl60plain
11boy61plate
12bridge62poppy
13bus63porcupine
14butterfly64possum
15camel65rabbit
16can66raccoon
17castle67ray
18caterpillar68road
19cattle69rocket
20chair70rose
21chimpanzee71sea
22clock72seal
23cloud73shark
24cockroach74shrew
25couch75skunk
26crab76skyscraper
27crocodile77snail
28cup78snake
29dinosaur79spider
30dolphin80squirrel
31elephant81streetcar
32flatfish82sunflower
33forest83sweet_pepper
34fox84table
35girl85tank
36hamster86telephone
37house87television
38kangaroo88tiger
39keyboard89tractor
40lamp90train
41lawn_mower91trout
42leopard92tulip
43lion93turtle
44lizard94wardrobe
45lobster95whale
46man96willow_tree
47maple_tree97wolf
48motorcycle98woman
49mountain99worm

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

 

 

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

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

👇 フォローボタン 👇
スポンサーリンク
マキシ's ディープパラダイス