質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.13%

画像分類における混合行列の表示方法

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 140

sssan

score 7

現在kerasを使った画像分類タスク(今回は4つのクラス分類)を勉強中です。
画像の元データが少ないので以下のような手順でプログラムを作成しようとしています。

  1. Trainデータの水増し(ImageDataGenerator)
  2. ファインチューニングを使ったモデルの構築
  3. Trainデータ、Validationデータを使ったモデルの評価、保存
  4. 作成したモデルとTestデータを使用した画像分類

ここで手順3のモデル評価時にValidationデータの予想結果を混合行列を使って可視化したいと思っています。
sklearnのconfusion_matrix()とmatplotlibを用いて下記Figure1のような混合行列を表示・保存したいです。
現在Figure2のような状態なのですが、
・Figure1のようにどの画像で何枚間違えたかを可視化する方法がわからない
・Figure2のA, Dの部分の見切れた部分をどうにかしたい
という状況で、この打開策をご教授頂きたく思います。
イメージ説明

現在のコードは下記の通りです。

#ライブラリのインポート部分は省略

program_path        = Path(__file__).parent.resolve()
parent_path         = program_path.parent.resolve()
data_path           = parent_path / 'data'
data_processed_path = data_path / 'processed'

train_dir           = os.path.join(data_processed_path, 'Train')
validation_dir      = os.path.join(data_processed_path, 'Validation')
test_dir            = os.path.join(data_processed_path, 'Test')

label               = os.listdir(test_dir)
n_categories        = len(label)

n_epochs            = 500
batch_size          = 8
input_image_size    = 224

def create_vgg16():
    base_model = VGG16(
    include_top = False,
    weights = "imagenet",
    input_shape = None
    )

    x = base_model.output
    x = GlobalAveragePooling2D()(x)
    x = Dense(1024, activation = 'relu')(x)
    predictions = Dense(n_categories, activation = 'softmax')(x)

    model = Model(inputs = base_model.input, outputs = predictions)

    for layer in model.layers[:17]:
        layer.trainable = False
    for layer in model.layers[17:]:
        layer.trainable = True

    return model

model = create_vgg16()
model.compile(
    optimizer = Adam(),
    loss = 'categorical_crossentropy',
    metrics = ["accuracy"]
    )

train_datagen=ImageDataGenerator(
    rescale=1.0/255,
    shear_range=0.2,
    zoom_range=0.2,
    vertical_flip=True,
    horizontal_flip=True,
    height_shift_range=0.5,
    width_shift_range=0.5,
    channel_shift_range=5.0,
    brightness_range=[0.3,1.0],
    fill_mode='nearest
    )

validation_datagen=ImageDataGenerator(rescale=1.0/255)

train_generator=train_datagen.flow_from_directory(
    train_dir,
    target_size=(input_image_size,input_image_size),
    batch_size=batch_size,
    class_mode='categorical',
    shuffle=True
    )

validation_generator=validation_datagen.flow_from_directory(
    validation_dir,
    target_size=(input_image_size,input_image_size),
    batch_size=batch_size,
    class_mode='categorical',
    shuffle=False
    )

history=model.fit_generator(
    train_generator,
    epochs=n_epochs,
    verbose=1,
    validation_data=validation_generator
    )

#Confution Matrix and Classification Report
def plot_confusion_matrix(cm, classes, cmap):

   plt.imshow(cm, cmap=cmap)
    plt.colorbar()
    plt.ylabel('True label')
    plt.xlabel('Predicted label')
    plt.title('Confusion Matrix')
    tick_marks = np.arange(len(classes))
    plt.xticks(tick_marks, classes, rotation=45)
    plt.yticks(tick_marks, classes)
    plt.tight_layout()
    plt.savefig(os.path.join(result_path, 'confuse_' + file_name + '.png'))

Y_pred       = model.predict_generator(validation_generator)
y_pred       = np.argmax(Y_pred, axis=1)
true_class   = validation_generator.classes
class_labels = list(validation_generator.class_indices.keys())
cm = confusion_matrix(true_class, y_pred)
cmap = plt.cm.Blues
plot_confusion_matrix(cm, classes=class_labels, cmap=cmap)

ちなみに画像データ格納フォルダの階層は次のような感じです。

data
-processed
--Train
---A
----sample01.png
----sample02.png
・・・
---B
---C
---D
--Validation
---A
---B
---C
---D
--Test
---A
---B
---C
---D

初心者的な質問になってしまっているかもしれませんが、よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.13%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る