#はじめに
前回集めた画像データを使って、訓練用データを作成する。
画像データのままテンソルフローに渡すと計算時間がかかるため、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に分割されている。