画像データを機械学習で使えるデータへ変換する

はじめに

前回は、Frickrを使った画像データのダウンロードについて整理しました.

shirakonotempura.hatenablog.com

今回は、ダウンロードした画像データを機械学習で使えるデータへ変換していく作業についてまとめていきます. 前提条件として、画像データは以下のような形で、PC上に保存されているとします.
ゴリゴリのwindowsですみません.

f:id:shirakonotempura:20181226062922p:plain
画像フォルダ例

f:id:shirakonotempura:20181226062926p:plain
フォルダ中身例

読み込み

早速ですが、データを読み込んでいきます.
大まかな手順としては、以下になります

  • フォルダ名を設定(以下の例では、"cheetah"と"cat")
  • そのフォルダ内の画像データをデータ化して入力データXとして保存
  • インデックスをラベルデータYとして保存

image_sizeは、画像のサイズを統一するために使用します. フォルダ内の画像全てを読み込んだ場合、データ数の差異でクラスごとの入力データに偏りが生じる場合があるため、max_readで指定した枚数しか利用しないようにしています.

# input
classes = ["cheetah", "tiger", "leopard", "lynx", "lion",\
           "jaguar", "white tiger", "cat"]
num_classes = len(classes) 
image_size = 50
max_read = 280

for index, class_label in enumerate(classes):
    images_dir = "./images/" + class_label
    files = glob.glob(images_dir + "/*.jpg")
    for i, file in enumerate(files):
        if i >= 5: break
        image = Image.open(file)
        image = image.convert("RGB")
        image = image.resize((image_size, image_size))
        data = np.asarray(image)
        X.append(data)
        y.append(index)

X = np.array(X)
y = np.array(Y)

訓練データとテストデータに分ける

Scikit-learnのmodel_selection.train_test_split()を使って、訓練用データとテスト用データに分けています. デフォルトで訓練データ75%、テストデータ25%に分けてくれますが、自分で割合を指定したい場合はtest_size=0.20で割合を指定できます. また、random_stateを指定して、シード値を固定することもできます.

X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y)

データの正規化およびラベルのOne-hotベクトル化

最後にデータの正規化(最大値を1に変換)およびラベルのone-hotベクトル化をして終了です.

# 正規化
X_train = X_train.astype("float")/255
X_test = X_test.astype("float")/255

# one-hot vector
y_train = np_utils.to_categorical(y_train, num_classes)
y_test = np_utils.to_categorical(y_test, num_classes)

補足:

デジタルデータは以下のコードで保存および再利用が可能です.
ローカルで学習用データを作成して、メインの学習はクラウド上で行うときなど使用できます.
ただし、データのサイズとしてはかなり大きくなりますのでご注意ください.
また、保存先などは適宜、変更してください

# データの保存
Xy_data = (X_train, X_test, y_train, y_test)
np.save("./images/Xy_data.npy", Xy_data)

# データの利用
X_train, X_test, y_train, y_test = np.load("./images/Xy_data.npy")

上記をまとめたGoogle Colaboratoryのnoteはコチラ


まとめ

今回は、画像データをデジタルデータに変換していく作業についてまとめました.
これで訓練データとテストデータができましたので、MNISTでやったようにCNNモデルを作って学習ができるはずです.
誤り・不備にお気づきの方はコメントください.


以下の記事を参考にさせていただきました.ありがとうございます. newtechnologylifestyle.net