LoginSignup
0
1

More than 3 years have passed since last update.

訓練用データの作成

Posted at

はじめに

前回集めた画像データを使って、訓練用データを作成する。
画像データのままテンソルフローに渡すと計算時間がかかるため、numpyの配列形式に変換して計算時間を短縮する。

ソースコード

インポート

from PIL import Image
import os, glob
import numpy as np
from sklearn import model_selection

変換処理準備

classes = ["monkey", "boar", "crow"]
num_classes = len(classes)
image_size = 50

X = []
Y = []

今回はmonkey, boar, crowの分類を行うため、そのキーワードを格納しておく。
画像サイズは50x50に統一する。
XYはそれぞれ、画像データと、その画像がmonkey(0)・boar(1)・crow(2)のどれなのかを示すラベル。

for index, classlabel in enumerate(classes):
    photos_dir = "./" + classlabel
    files = glob.glob(photos_dir + "/*.jpg")
    for i, file in enumerate(files):
        if i >= 141: break # monkey,boar,crowそれぞれのデータ数の最小に合わせる
        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)

glob()はワイルドカードのパターン一致でファイル一覧を取得できるメソッドで、filesに以下のようなデータが格納させている。

['./monkey\\49757184328.jpg', 
 './monkey\\49767449258.jpg', 
 ...

各画像に対して、画像を開き、RGB 256階調形式に変換し、50x50にリサイズする処理を施す。
そのうえで、numpy配列形式(Pythonのリストよりも計算が早いらしい)に変換する。

こうしてできたXYには以下のようなデータが入っている

X
(423, 50, 50, 3)の配列
[[[[ 89  92  60]
   [ 85  84  52]
   [ 91  84  51]
   ...
   [177 178  24]
   [142 145  15]
   [231 219  35]]
   ...
Y
423の配列
[0 0 ... 1 1 ... 2 2 ...]

余談

data = np.asarray(image)X = np.array(X)のように、numpy配列への変化に2種類のメソッドが用いられている。リストからnumpy配列に変換する際は同じ振る舞いとなるが、numpy配列からnumpy配列に変換する際に振る舞いが異なる。
参考:https://punhundon-lifeshift.com/array_asarray

訓練用データの保存

train_test_splitメソッドを使ってXYを、訓練用データとモデル検証用データに分割し、"animal.npy"というファイル名で保存する。

X_train, X_test, y_train, y_test = model_selection.train_test_split(X, Y)
xy = (X_train, X_test, y_train, y_test)
np.save("./animal.npy", xy)

X_trainy_trainは317の配列に、
X_testy_testは106の配列になっている。
すなわち、XYの約75%のデータがtrainに、約25%のデータがtestに分割されている。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1