Python

深層学習を用いて画像判定AIを作ってみよう。(その3画像データの数値化・CNN)

2018年11月12日

ここでは、画像データの数値化を行っていきます。

画像データの数値化

Pillowのインストール

まず、画像のデータ化をするために、画像処理ライブラリPillowをインストールしていきます。

以下のようにして、"pip install pillow"とPillowをインストールします。

scikit-learnのインストール

次に、機械学習用のライブラリのskleranを"pip install sklearn"としてインストールしておきます。

画像の数値化

画像データを数値化していくためのプログラムが以下のようになります。また、機械学習のトレーニング用データと結果を評価するためのテストデータの2つに分ける処理がプログラムにあります。

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


image_path = "./image"
classes = os.listdir(image_path)

image_size = 50

X = []
Y = []
for index,classlabel in enumerate(classes):
    photos_dir = "./image/" + classlabel
    files = glob.glob(photos_dir + "/*.jpg")
    for i,file in enumerate(files):
        if i > 300: 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)

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("./image_data.npy", xy)

Kerasのインストール

まず、"pip install keras"としてKerasをインストールします。

そして畳み込み処理をするプログラムが以下となります。

from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.utils import np_utils
import keras
import numpy as np
import os

image_path = "./image"
classes = os.listdir(image_path)

num_classes = len(classes)
image_size = 50


def main():
    X_train, X_test, y_train, y_test = np.load("./image_data.npy")
    X_train = X_train.astype("float") / 256
    X_test = X_test.astype("float") / 256
    y_train = np_utils.to_categorical(y_train, num_classes)
    y_test = np_utils.to_categorical(y_test, num_classes)

    model = model_train(X_train, y_train)
    model_eval(model, X_test, y_test)

def model_train(X, y):
    model = Sequential()
    model.add(Conv2D(32,(3,3), padding='same',input_shape=X.shape[1:]))
    model.add(Activation('relu'))
    model.add(Conv2D(32,(3,3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(Dropout(0.25))

    model.add(Conv2D(64,(3,3), padding='same'))
    model.add(Activation('relu'))
    model.add(Conv2D(64,(3,3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(Dropout(0.25))

    model.add(Flatten())
    model.add(Dense(512))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))
    model.add(Dense(num_classes))
    model.add(Activation('softmax'))

    opt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6)
    model.compile(loss='categorical_crossentropy',optimizer=opt,metrics=['accuracy'])
    model.fit(X, y, batch_size=32, epochs=100)


    model.save('./image_cnn.h5')

    return model

def model_eval(model, X, y):
    scores = model.evaluate(X, y, verbose=1)
    print('Test Loss: ', scores[0])
    print('Test Accuracy: ', scores[1])

if __name__ == "__main__":
    main()

上のプログラムを実行する前に、imageの中に"tiger"以外のフォルダを作って画像を保存しておきます。

画像フォルダの数はいくつでも良いですが、多すぎると処理に時間がかかってしまうので、今回は3つだけ用意しました。


"python gen_data.py"と実行すると、新しく画像フォルダの数値化されたファイル"image_data.npy"が作成されます。


先の畳み込み処理を実行していきます。"python image_cnn.py"と実行します。

このように、最後までプログラムが実行できれば成功です。

右側のデータから最終的に訓練用のデータのaccuracyが99%に達していますが、下側のデータからテスト用のデータではaccuracyが79%となっています。まだ改善の余地がありそうですね。プログラムの改善は後で考えることにします。

もし実行しても上手くいかないときは、一度コンピュータを再起動することでできる可能性があるので、もう一度実行してみてください。

合わせて読みたい

よく読まれている記事

1

DeepFaceLab 2.0とは DeepFaceLab 2.0は機械学習を利用して動画の顔を入れ替えるツールです。 以前にDeepFaceLab 1.0を記事としてアップしていましたが、2.0は以 ...

2

自作PCで、多くのパーツをCorsair製品で揃えたので、iCUEでライティング制御していきました。 私のPCでは、表示されている4つのパーツが制御されています。ここで、HX750i電源ユニットは、L ...

3

コンピュータは有限桁の数値しか扱う事はできないので、桁数の多い場合や無限小数の場合は四捨五入され切り捨てられます。なので実際の数値とは多少の誤差が生じますが、これを丸め誤差といいます。 なので、コンピ ...

-Python