■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