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

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

ただいまの
回答率

87.35%

python 機械学習

解決済

回答 1

投稿 編集

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

score 47

機械学習で画像分類を行なっています

# coding:utf-8
import keras
from keras.utils import np_utils
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.preprocessing.image import array_to_img, img_to_array, list_pictures, load_img
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics import confusion_matrix
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split

X = []#train
Y = []
A = []#validation
B = []
V = []#test
W = []

ep = 10
size = 10,10



# aの画像
for picture in list_pictures('dir/train/a'):
    img = img_to_array(load_img(picture, target_size=(size)))
    X.append(img)
    Y.append(0)

for picture in list_pictures('dir/vali/a'):
    img = img_to_array(load_img(picture, target_size=(size)))
    A.append(img)
    B.append(0)

for picture in list_pictures('dir/test/a'):
    img = img_to_array(load_img(picture, target_size=(size)))
    V.append(img)
    W.append(0)

# bの画像
for picture in list_pictures('dir/train/b'):
    img = img_to_array(load_img(picture, target_size=(size)))
    X.append(img)
    Y.append(1)

for picture in list_pictures('dir/vali/b'):
    img = img_to_array(load_img(picture, target_size=(size)))
    A.append(img)
    B.append(1)

for picture in list_pictures('dir/test/b'):
    img = img_to_array(load_img(picture, target_size=(size)))
    V.append(img)
    W.append(1)

# cの画像
for picture in list_pictures('dir/train/c'):
    img = img_to_array(load_img(picture, target_size=(size)))
    X.append(img)
    Y.append(2)

for picture in list_pictures('dir/vali/c'):
    img = img_to_array(load_img(picture, target_size=(size)))
    A.append(img)
    B.append(2)

for picture in list_pictures('dir/test/c'):
    img = img_to_array(load_img(picture, target_size=(size)))
    V.append(img)
    W.append(2)

X = np.asarray(X)
Y = np.asarray(Y)
A = np.asarray(A)
B = np.asarray(B)
V = np.asarray(V)
W = np.asarray(W)

# 画素値を0から1の範囲に変換
X = X.astype('float32')
X = X / 255.0
A = A.astype('float32')
A = A / 255.0
V = V.astype('float32')
V = V / 255.0

# クラスの形式を変換
Y = np_utils.to_categorical(Y, 3)#(ベクトル変換したいラベル、配列数)
B = np_utils.to_categorical(B, 3)
W = np_utils.to_categorical(W, 3)

X_train, Y_train = (X, Y)
A_vali, B_vali = (A, B)
V_test, W_test = (V, W)

# 【CNNを構築】
model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same',
                 input_shape=X_train.shape[1:]))
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.4))
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.4))
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.4))
model.add(Dense(3))#カテゴリー数
model.add(Activation('softmax'))

# 【コンパイル】
model.compile(loss='categorical_crossentropy',#損失関数
              optimizer='adam',#最適化、オブジェクト
              metrics=['accuracy'])#評価関数、正解率

#【学習実行】
history = model.fit(X_train, Y_train, batch_size=2048, epochs=ep,
                    validation_data = (A_vali, B_vali), verbose = 1)

score = model.evaluate(V_test, W_test, verbose = 1)
print("test_acc", score[1], "test_loss", score[0])


機械学習後に

import cv2
import numpy as np
import os
import glob
%matplotlib inline

size = 10,10,3
# ラベル情報
labels = ["a","b","c"]

# モデルデータを読み込み
model.load_weights('weight.h5')

files = glob.glob("Desktop/test/a/*.png")
for f in files:
    im = cv2.imread(f, cv2.COLOR_BGR2RGB)
    im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
    im = cv2.resize(im, (10,10))
    plt.imshow(im)
    plt.show()
    im = im.reshape(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))
    if labels[0] == res.argmax():
        print("予測結果=", labels[res.argmax()])

    else:
            print("予測結果=", labels[res.argmax()])
            if res.argmax() == 1:
                print("bです")
                img = cv2.imread('dir/b.png')
                img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
                img = cv2.resize(img, (300,300))
                plt.imshow(img)
                plt.show()

            elif res.argmax() == 2:
                print("cです")
                img = cv2.imread('dir/c.png')
                img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
                img = cv2.resize(img, (300,300))
                plt.imshow(img)
                plt.show()


理想はこのような感じです

#a画像の表示 #b画像の表示
1/1 [==============================] - 0s 978us/step
a=1
b=90
c=10
予測結果= b

#上記を文章も含めてこのまま画像として保存したい

このようにtest画像を読み、どの画像をどのように間違っていたか評価しています。
a画像をbと間違っていた場合、bの画像を表示するようにしています。
誤判定していた場合に隣に画像を並べる場合に、隣同士で並べ、指定したフォルダに文章ごと保存したいですが、どのようにしたらいいでしょうか?

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

既に処理にopencvを用いているのでopencvを使えば実現可能と思います。
二枚の画像を一つに結合するなら、cv2.hconcat()
画像に文字を埋め込むなら、cv2.putText()
指定したフォルダに保存するには、cv2.imwrite()

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

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

関連した質問

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