はじめに
前回集めた画像データを使って、訓練用データを作成する。
画像データのままテンソルフローに渡すと計算時間がかかるため、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に統一する。
XとYはそれぞれ、画像データと、その画像が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のリストよりも計算が早いらしい)に変換する。
こうしてできたXとYには以下のようなデータが入っている
(423, 50, 50, 3)の配列
[[[[ 89 92 60]
[ 85 84 52]
[ 91 84 51]
...
[177 178 24]
[142 145 15]
[231 219 35]]
...
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メソッドを使ってXとYを、訓練用データとモデル検証用データに分割し、"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_trainとy_trainは317の配列に、
X_testとy_testは106の配列になっている。
すなわち、XとYの約75%のデータがtrainに、約25%のデータがtestに分割されている。