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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1413閲覧

CNNで予測されたラベルを棒グラフで可視化したい [画像分類]

sssan

総合スコア10

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/07/20 12:35

編集2020/07/20 12:40

前提・実現したいこと

3種類のラベル(画像A, B, C)に判別できる画像群の画像分類モデルをkerasにて構築し、予測モデル(ImageClassifier.h5)を保存しました。
この予測モデルをload_modelで読み込み、あるフォルダ(フォルダ名:predict)の中にある画像150枚すべての判別を実行しようとしています。
その際に各ラベルの画像が何枚フォルダ中に存在したか下記のような棒グラフで可視化したいと考えています。
for文の中で予測したそれぞれの画像のラベル数を集計し、seabornのcounterplot等を使って棒グラフが作成できればと思っていますが、下記コードから進むことができません。
イメージ説明

現在のコード

#ライブラリのインポート import os from pathlib import Path import matplotlib.pyplot as plt import numpy as np import pandas as pd import keras.models from keras.models import Model from keras.models import load_model from keras.preprocessing.image import img_to_array, load_img input_image_size = 224 labels = ['A','B','C'] model = load_model('ImageClassifier.h5') #パスの設定 program_path = Path(__file__).parent.resolve() parent_path = program_path.parent.resolve() data_path = parent_path / 'data' data_processed_path = data_path / 'processed' predict_dir = os.path.join(data_processed_path, 'predict') #予想する画像が入ったファイル files = os.listdir(predict_dir) n_files = len(files) #モデルを使った予測 for i in range(n_files): predict_img_path = os.path.join(predict_dir, files[i]) predict_img_name = os.path.basename(predict_img_path) predict_img_onlyname = os.path.splitext(predict_img_name)[0] temp_img = load_img(predict_img_path,target_size=(input_image_size,input_image_size)) #Images normalization temp_img_array = img_to_array(temp_img) temp_img_array = temp_img_array.astype('float32')/255.0 temp_img_array = temp_img_array.reshape((1,input_image_size,input_image_size,3)) #predict results img_pred = model.predict(temp_img_array) label_pred = labels[np.argmax(img_pred)] print('画像名:' + predict_img_onlyname + ', 予想ラベル名:' + label_pred +':' + str(round(max(img_pred[0]),2))) print(label_pred.count('A')) print(label_pred.count('B')) print(label_pred.count('C'))

現在の状況

上記コードでフォルダ内の各画像の予測ができていることは確認済みです。
またlabel_pred.countで各ラベルの数も抽出できていると思いますが、
for文で繰り返した全ての画像に対して数を集計しプロットするやり方が思いつきません。

ご助言の程よろしくお願い致します。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下のようにcollections.Counterを使うと簡潔にグラフのもとになるデータを集計できます。
後は好きに加工して描画すればよいです。イメージ説明

Python

1import random 2import collections 3import matplotlib.pyplot as plt 4 5labels = ['A','B','C'] 6n_files = 50 7 8random.seed(110) 9preds = [] 10for i in range(n_files): 11 # 略 12 label_pred = labels[random.randint(0,2)] # ダミー処理 13 preds.append(label_pred) 14 15c = collections.Counter(preds) 16c = sorted(c.items()) 17X = [e[0] for e in c] 18Y = [e[1] for e in c] 19 20plt.bar(X, Y) 21plt.show()

投稿2020/07/20 12:59

can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sssan

2020/07/20 13:35

早速ご回答頂きありがとうございます。 collections.Counterを使うと可能とのことで助かりました。 まだ最近始めたばかりなので初歩的な質問かもしれず恐縮ですが、 ・random.seed()で110と設定した理由 ・ダミー処理を行う理由 をご教授頂けると助かります。よろしくお願い致します。
can110

2020/07/20 13:38

> random.seed()で110と設定した理由 つねに同じ結果が出るように。 >・ダミー処理を行う理由 質問文のコードは第三者はデータなく実行できないので。
sssan

2020/07/20 14:02

ご教授頂きありがとうございます。 無事解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問