Deep Learning−画像処理CNNによる画像分類モデル(1)
CNNによる画像分類
ビジネスに興味があるので、ビジネスで使えるパターンを想定し、画像で分類すれば、1日で無数の商品を更新するビジネスプラットフォームで、自動化の一環とすることができます.
Cifar 10データを用いた実験
from tensorflow.keras import datasets
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, Flatten
(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
# Normalize pixel values to be between 0 and 1
train_images, test_images = train_images / 255.0, test_images / 255.0
# 라벨 설정
class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',
'dog', 'frog', 'horse', 'ship', 'truck']
kerasはcifar 10データを提供し,ロード後正規化255に分ける.基本的にcifar 10データは10個のラベルからなり、ラベルを分類するためにモデル設計すればよい.
import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))
for i in range(25):
plt.subplot(5,5,i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(train_images[i], cmap=plt.cm.binary)
# The CIFAR labels happen to be arrays,
# which is why you need the extra index
plt.xlabel(class_names[train_labels[i][0]])
plt.show()
5万個のtrainデータのうち、25個だけが浮かび上がった.上の画像を勉強して、test setの画像が合っているかどうかを実験します.
model = Sequential()
model.add(Conv2D(32, 3, activation = 'relu', input_shape=(32,32,3)))
model.add(MaxPooling2D(2,2))
model.add(Conv2D(64, 3, activation = 'relu'))
model.add(MaxPooling2D(2,2))
model.add(Conv2D(64, 3, activation = 'relu'))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dense(10, activation='softmax'))
model.summary()
デップ32,フィルタ(3,3),アクティブ関数relu,入力サイズ(32,32,3チャネル)
[output]
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 30, 30, 32) 896
max_pooling2d (MaxPooling2D (None, 15, 15, 32) 0
)
conv2d_1 (Conv2D) (None, 13, 13, 64) 18496
max_pooling2d_1 (MaxPooling (None, 6, 6, 64) 0
2D)
conv2d_2 (Conv2D) (None, 4, 4, 64) 36928
flatten (Flatten) (None, 1024) 0
dense (Dense) (None, 64) 65600
dense_1 (Dense) (None, 10) 650
=================================================================
Total params: 122,570
Trainable params: 122,570
Non-trainable params: 0
_________________________________________________________________
model.パラメータ数の変化,入力データの形状の変化はsummary()で見ることができる.前述したように、後でコンパイルを行います.
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels))
[output]
Epoch 1/10
1563/1563 [==============================] - 11s 7ms/step - loss: 1.5798 - accuracy: 0.4221 - val_loss: 1.3096 - val_accuracy: 0.5288
Epoch 2/10
1563/1563 [==============================] - 9s 6ms/step - loss: 1.2251 - accuracy: 0.5639 - val_loss: 1.1692 - val_accuracy: 0.5920
Epoch 3/10
1563/1563 [==============================] - 10s 6ms/step - loss: 1.0634 - accuracy: 0.6261 - val_loss: 1.0515 - val_accuracy: 0.6330
Epoch 4/10
1563/1563 [==============================] - 10s 6ms/step - loss: 0.9634 - accuracy: 0.6622 - val_loss: 1.0322 - val_accuracy: 0.6387
Epoch 5/10
1563/1563 [==============================] - 10s 6ms/step - loss: 0.8922 - accuracy: 0.6886 - val_loss: 0.9355 - val_accuracy: 0.6719
Epoch 6/10
1563/1563 [==============================] - 10s 6ms/step - loss: 0.8331 - accuracy: 0.7113 - val_loss: 0.9039 - val_accuracy: 0.6864
Epoch 7/10
1563/1563 [==============================] - 9s 6ms/step - loss: 0.7868 - accuracy: 0.7243 - val_loss: 0.8952 - val_accuracy: 0.6916
Epoch 8/10
1563/1563 [==============================] - 9s 6ms/step - loss: 0.7464 - accuracy: 0.7376 - val_loss: 0.9186 - val_accuracy: 0.6839
Epoch 9/10
1563/1563 [==============================] - 9s 6ms/step - loss: 0.7063 - accuracy: 0.7518 - val_loss: 0.8898 - val_accuracy: 0.6986
Epoch 10/10
1563/1563 [==============================] - 9s 6ms/step - loss: 0.6677 - accuracy: 0.7668 - val_loss: 0.9407 - val_accuracy: 0.6927
# 수행
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
[output]
313/313 - 1s - loss: 0.9407 - accuracy: 0.6927 - 913ms/epoch - 3ms/step
valは精度はあまり高くありませんが、レイヤーを増やしたり、勉強を増やしたりすると向上します.(適切な一致に注意)import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))
for i in range(5):
plt.subplot(5,5,i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(test_images[i], cmap=plt.cm.binary)
# The CIFAR labels happen to be arrays,
# which is why you need the extra index
plt.xlabel(class_names[test_labels[i][0]])
plt.show()
上記のように、テスト3の5つの画像を分類します.
plt.figure(figsize=(10,10))
for i in range(5):
x = np.expand_dims(test_images[i], axis=0) # 이미지의 차원을 맞추기 위해 늘려줘야한다.
predictions = model.predict(x) # 예측을 진행한다.
predicted_ids = np.argmax(predictions, axis=-1)
predicted_class_names = class_names[predicted_ids[0]]
plt.subplot(5,5,i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(test_images[i], cmap=plt.cm.binary)
plt.title(predicted_class_names)
結果的に5つとも画質が悪い場合にもうまく合わせることができました.このように商品画像のカテゴリラベルを学習し,画像特徴でカテゴリを区別できる人工知能を創出する.
Reference
この問題について(Deep Learning−画像処理CNNによる画像分類モデル(1)), 我々は、より多くの情報をここで見つけました https://velog.io/@dlskawns/Deep-Learning-이미지-처리-CNN-이용한-이미지-분류-모델-구현-실습-1テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol