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()
  • シーケンス()を使用してモデルインスタンスを作成します.
  • Conv 2 Dで重合層を追加します.フィルタとノードの数、およびアクティブな関数を決定します.
    デップ32,フィルタ(3,3),アクティブ関数relu,入力サイズ(32,32,3チャネル)
  • MaxPooling 2 Dを指定します.サイズ(2,2)>もdefaultです.
  • ConvとPoyoungを繰り返し、Flattenを使用して画像を1次元
  • に変換します.
  • の後にFCを入れて、1つの隠し層を通って、最後にsoftmaxを取って10個のラベルに対して分類します.
  • [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))
    
  • オプティカル(光学式)ドライブを構成します.adamで一番よく使うやつ
  • で種々の分類を行う場合、0と1ではなく数字で区別するためには、分類よりも疎分類クロスエントロピーを用いるべきである.
  • メートルは最も基本的な精度で指定されています.
  • モデルフィッティングを行います.
  • [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つとも画質が悪い場合にもうまく合わせることができました.このように商品画像のカテゴリラベルを学習し,画像特徴でカテゴリを区別できる人工知能を創出する.