Memo

メモ > 技術 > プログラミング言語: Python > TensorFlow+Keras(ディープラーニング)で写真に映った物体を認識

■TensorFlow+Keras(ディープラーニング)で写真に映った物体を認識
■CIFAR-10 CIFAR-10 and CIFAR-100 datasets https://www.cs.toronto.edu/~kriz/cifar.html 6万枚の画像にラベルを付けて公開しているサイト フルカラーだが、32px×32pxと小さなサイズの画像となっている ■CIFAR-10の画像を表示
from keras.datasets import cifar10 import matplotlib.pyplot as plt from PIL import Image # 画像データを読み込む (X_train, y_train), (X_test, y_test) = cifar10.load_data() plt.figure(figsize = (10, 10)) labels = ["airplane", "automobile", "bird", "cat", "deer", "dog", "frog", "horse", "ship", "truck"] # 40個連続で出力する for i in range(0, 40) : im = Image.fromarray(X_train[i]) plt.subplot(5, 8, i + 1) plt.title(labels[y_train[i][0]]) plt.tick_params(labelbottom="off", bottom="off") plt.tick_params(labelleft="off", left="off") plt.imshow(im) plt.show() # 画像に保存する plt.savefig("output.png")
プログラムをはじめて実行したとき、以下のように画像のダウンロードが行われる Downloading data from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz 170500096/170498071 [==============================] - 107s 1us/step ■多層パーセプトロン(Multilayer perceptron)で画像認識
import matplotlib.pyplot as plt import keras from keras.datasets import cifar10 from keras.models import Sequential from keras.layers import Dense, Dropout num_classes = 10 im_rows = 32 im_cols = 32 im_size = im_rows * im_cols * 3 # データを読み込む (X_train, y_train), (X_test, y_test) = cifar10.load_data() X_train = X_train[0:im_size * 5] y_train = y_train[0:im_size * 5] X_test = X_test[0:im_size * 5] y_test = y_test[0:im_size * 5] # データを一次元配列に変換 X_train = X_train.reshape(-1, im_size).astype('float32') / 255 X_test = X_test.reshape(-1, im_size).astype('float32') / 255 # ラベルデータをOne-Hot形式に変換 y_train = keras.utils.to_categorical(y_train, num_classes) y_test = keras.utils.to_categorical(y_test, num_classes) # モデルを定義 model = Sequential() model.add(Dense(512, activation='relu', input_shape=(im_size,))) model.add(Dense(num_classes, activation='softmax')) # モデルをコンパイル model.compile( loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) ## 学習を実行 #hist = model.fit(X_train, y_train, # batch_size=32, epochs=50, # verbose=1, # validation_data=(X_test, y_test)) # ## 学習結果を保存 #model.save_weights('cifar10-mlp.h5') # 学習結果を読み込み model.load_weights('cifar10-mlp.h5') # モデルを評価 score = model.evaluate(X_test, y_test, verbose=1) print('正解率=', score[1], 'loss=', score[0])
■畳み込みニューラルネットワーク(Convolutional Neural Network)で画像認識
import matplotlib.pyplot as plt import keras from keras.datasets import cifar10 from keras.models import Sequential from keras.models import load_model from keras.layers import Dense, Dropout, Activation, Flatten from keras.layers import Conv2D, MaxPooling2D num_classes = 10 im_rows = 32 im_cols = 32 in_shape = (im_rows, im_cols, 3) in_size = 32 * 32 # データを読み込む (X_train, y_train), (X_test, y_test) = cifar10.load_data() X_train = X_train[0:in_size * 5] y_train = y_train[0:in_size * 5] X_test = X_test[0:in_size * 5] y_test = y_test[0:in_size * 5] # データを正規化 X_train = X_train.astype('float32') / 255 X_test = X_test.astype('float32') / 255 # ラベルデータをOne-Hot形式に変換 y_train = keras.utils.to_categorical(y_train, num_classes) y_test = keras.utils.to_categorical(y_test, num_classes) ## モデルを定義 #model = Sequential() #model.add(Conv2D(32, (3, 3), padding='same', input_shape=in_shape)) #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')) # ## モデルをコンパイル #model.compile( # loss='categorical_crossentropy', # optimizer='adam', # metrics=['accuracy']) # ## モデルを保存 #model.save('cifar10-cnn-model.h5') # モデルを読み込み model = load_model('cifar10-cnn-model.h5') ## 学習を実行 #hist = model.fit(X_train, y_train, # batch_size=32, epochs=50, # verbose=1, # validation_data=(X_test, y_test)) # ## 学習結果を保存 #model.save_weights('cifar10-cnn-weight.h5') # 学習結果を読み込み model.load_weights('cifar10-cnn-weight.h5') # モデルを評価 score = model.evaluate(X_test, y_test, verbose=1) print('正解率=', score[1], 'loss=', score[0])
■多層パーセプトロン(Multilayer perceptron)の学習結果から画像を判定
import cv2 import numpy as np import matplotlib.pyplot as plt from keras.models import Sequential from keras.layers import Dense, Dropout num_classes = 10 labels = ["airplane", "automobile", "bird", "cat", "deer", "dog", "frog", "horse", "ship", "truck"] im_size = 32 * 32 * 3 # モデルを定義 model = Sequential() model.add(Dense(512, activation='relu', input_shape=(im_size,))) model.add(Dense(num_classes, activation='softmax')) # 学習結果を読み込み model.load_weights('cifar10-mlp.h5') # OpenCVを使って画像を読み込む im = cv2.imread('test-car.jpg') # 色空間を変換してリサイズ im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB) im = cv2.resize(im, (32, 32)) plt.imshow(im) # 画像を出力 plt.show() # MLPで学習した画像データに合わせる im = im.reshape(im_size).astype('float32') / 255 # 予測する r = model.predict(np.array([im]), batch_size=32, verbose=1) res = r[0] # 結果を表示する for i, acc in enumerate(res): print(labels[i], "=", int(acc * 100)) print("---") print('予測した結果=', labels[res.argmax()])
以下の結果になる
$ python3 cifar10-mlp-judge.py 1/1 [==============================] - 0s 67ms/step airplane = 7 automobile = 89 bird = 0 cat = 0 deer = 0 dog = 0 frog = 0 horse = 0 ship = 0 truck = 2 --- 予測した結果= automobile
■畳み込みニューラルネットワーク(Convolutional Neural Network)の学習結果から画像を判定
import cv2 import numpy as np import matplotlib.pyplot as plt from keras.models import Sequential from keras.models import load_model from keras.layers import Dense, Dropout, Activation, Flatten from keras.layers import Conv2D, MaxPooling2D num_classes = 10 im_rows = 32 im_cols = 32 in_shape = (im_rows, im_cols, 3) in_size = 32 * 32 labels = ["airplane", "automobile", "bird", "cat", "deer", "dog", "frog", "horse", "ship", "truck"] im_size = 32 * 32 * 3 # モデルを読み込み model = load_model('cifar10-cnn-model.h5') # 学習結果を読み込み model.load_weights('cifar10-cnn-weight.h5') # OpenCVを使って画像を読み込む im = cv2.imread('test-car.jpg') # 色空間を変換してリサイズ im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB) im = cv2.resize(im, (32, 32)) plt.imshow(im) # 画像を出力 plt.show() # CNNで学習した画像データに合わせる im = im.astype('float32') / 255 # 予測する r = model.predict(np.array([im]), batch_size=32, verbose=1) res = r[0] # 結果を表示する for i, acc in enumerate(res): print(labels[i], "=", int(acc * 100)) print("---") print('予測した結果=', labels[res.argmax()])
以下のとおり実行
$ python3 cifar10-cnn-judge.py 1/1 [==============================] - 0s 250ms/step airplane = 0 automobile = 99 bird = 0 cat = 0 deer = 0 dog = 0 frog = 0 horse = 0 ship = 0 truck = 0 --- 予測した結果= automobile

Advertisement