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

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

ただいまの
回答率

89.12%

opencv python 画像の判別について

解決済

回答 1

投稿 編集

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

22Go

score 47

作業環境
Mac OS Sierra 10.12.6
Jupiter notebook
python 3.6.2

あらかじめ学習してあるデータセットに自分でダウンロードしてきた
車の画像を読み込み、"automobile"の結果を得たいです。

事前にmlpとcnnで学習済みです

from keras.datasets import cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()

import matplotlib.pyplot as plt
from PIL import Image

plt.figure(figsize=(10, 10))
labels = ["airplene", "automobile", "bord", "cat", "deer", "dog", "frog", "hprse", "ship", "truck"]
for i in range(0, 40):
    im = Image.fromarray(x_train[i])
    plt.subplot(5, 8, i + 1)
    plt.title(labels[y_train[i][0]])
    plt.tick_params(labelbottom="off",bottom="off")
    plt.tick_params(labelleft="off",left="off")
    plt.imshow(im)

plt.show()

import matplotlib.pyplot as plt
import keras
from keras.datasets import cifar10
from keras.models import Sequential
from keras.layers import Dense, Dropout

num_classes = 10
im_rows = 32
im_cols = 32
im_size = im_rows * im_cols * 3

# データを読み込む --- (*1)
(X_train, y_train), (X_test, y_test) = cifar10.load_data()

# データを一次元配列に変換 --- (*2)
X_train = X_train.reshape(-1, im_size).astype('float32') / 255
X_test = X_test.reshape(-1, im_size).astype('float32') / 255
# ラベルデータをOne-Hot形式に変換
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

# モデルを定義 --- (*3)
model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(im_size,)))
model.add(Dense(num_classes, activation='softmax'))

# モデルをコンパイル --- (*4)
model.compile(
    loss='categorical_crossentropy',
    optimizer='adam',
    metrics=['accuracy'])

# 学習を実行 --- (*5)
hist = model.fit(X_train, y_train,
    batch_size=32, epochs=50,
    verbose=1,
    validation_data=(X_test, y_test))

# モデルを評価 --- (*6)
score = model.evaluate(X_test, y_test, verbose=1)
print('正解率=', score[1], 'loss=', score[0])

# 学習の様子をグラフへ描画 --- (*7)
plt.plot(hist.history['acc'])
plt.plot(hist.history['val_acc'])
plt.title('Accuracy')
plt.legend(['train', 'test'], loc='upper left')
plt.show()
plt.plot(hist.history['loss'])
plt.plot(hist.history['val_loss'])
plt.title('Loss')
plt.legend(['train', 'test'], loc='upper left')
plt.show()

import matplotlib.pyplot as plt
import keras
from keras.datasets import cifar10
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv2D, MaxPooling2D

num_classes = 10
im_rows = 32
im_cols = 32
in_shape = (im_rows, im_cols, 3)

# データを読み込む --- (*1)
(X_train, y_train), (X_test, y_test) = cifar10.load_data()

# データを正規化 --- (*2)
X_train = X_train.astype('float32') / 255
X_test = X_test.astype('float32') / 255
# ラベルデータをOne-Hot形式に変換
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

# モデルを定義 --- (*3)
model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same',
                 input_shape=in_shape))
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.25))

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.25))

model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes))
model.add(Activation('softmax'))

# モデルをコンパイル --- (*4)
model.compile(
    loss='categorical_crossentropy',
    optimizer='adam',
    metrics=['accuracy'])

# 学習を実行 --- (*5)
hist = model.fit(X_train, y_train,
    batch_size=32, epochs=50,
    verbose=1,
    validation_data=(X_test, y_test))

# モデルを評価 --- (*6)
score = model.evaluate(X_test, y_test, verbose=1)
print('正解率=', score[1], 'loss=', score[0])

# 学習の様子をグラフへ描画 --- (*7)
plt.plot(hist.history['acc'])
plt.plot(hist.history['val_acc'])
plt.title('Accuracy')
plt.legend(['train', 'test'], loc='upper left')
plt.show()
plt.plot(hist.history['loss'])
plt.plot(hist.history['val_loss'])
plt.title('Loss')
plt.legend(['train', 'test'], loc='upper left')
plt.show()

model.save_weights("cifar10-weight.h5")
model.load_weights("cifar10-weight.h5")
model.save_weights("cifar10-mlp-weight.h5")




import cv2
import numpy as np

labels = ["airplene", "automobile", "bord", "cat", "deer", "dog", "frog", "hprse", "ship", "truck"]
im_size = 32*32*3#幅*高さ*チャンネル数

#モデルデータ読み込み
model.load_weights("cifar10-mlp-weight.h5")

#opencvを使って画像を読み込む
im = cv2.imread("car.jpg")#numpy配列

#色空間を変換して、リサイズ
im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)#青緑赤を赤緑青に変換
im = cv2.resize(im, (32, 32))#32*32ピクセルにリサイズ
plt.imshow(im)#画像を出力
plt.show()

#MLPで学習した画像データに合わせる
im = im.reshape(im_size).astype("float32") / 255#float32:32bit,255:255bit
#予測
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))
print("---")
print("予測結果=", labels[res.argmax()])

car.jpgのインライン表示はできたのでパスは合っているのですが様々なエラーが出てしまい
解決できず困っています。

エラー内容はこちらです

ValueError                                Traceback (most recent call last)
<ipython-input-12-2c80cdd11a3c> in <module>()
     20 im = im.reshape(im_size).astype("float32") / 255#float32:32bit,255:255bit
     21 #予測
---> 22 r = model.predict(np.array([im]), batch_size=32,verbose=1)
     23 res = r[0]
     24 #結果表示

~/.pyenv/versions/anaconda3-5.0.0/lib/python3.6/site-packages/keras/models.py in predict(self, x, batch_size, verbose, steps)
   1023             self.build()
   1024         return self.model.predict(x, batch_size=batch_size, verbose=verbose,
-> 1025                                   steps=steps)
   1026 
   1027     def predict_on_batch(self, x):

~/.pyenv/versions/anaconda3-5.0.0/lib/python3.6/site-packages/keras/engine/training.py in predict(self, x, batch_size, verbose, steps)
   1822         x = _standardize_input_data(x, self._feed_input_names,
   1823                                     self._feed_input_shapes,
-> 1824                                     check_batch_axis=False)
   1825         if self.stateful:
   1826             if x[0].shape[0] > batch_size and x[0].shape[0] % batch_size != 0:

~/.pyenv/versions/anaconda3-5.0.0/lib/python3.6/site-packages/keras/engine/training.py in _standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
    111                         ': expected ' + names[i] + ' to have ' +
    112                         str(len(shape)) + ' dimensions, but got array '
--> 113                         'with shape ' + str(data_shape))
    114                 if not check_batch_axis:
    115                     data_shape = data_shape[1:]

ValueError: Error when checking : expected conv2d_1_input to have 4 dimensions, but got array with shape (1, 3072)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • _Victorique__

    2019/04/14 13:53

    model.load_weights("cifar10-mlp-weight.h5")

    このmodelはどこから来たのでしょうか?定義されていませんが

    キャンセル

  • 22Go

    2019/04/14 14:13

    "cifar10-mlp-weight.h5"はjupyternotebook上で学習済みで一旦保存してあり
    それをloadしています。

    キャンセル

  • _Victorique__

    2019/04/14 14:16

    このコード以外にライブラリのimport等をしているということでしょうか?
    全部載せてもらえますか?

    キャンセル

回答 1

checkベストアンサー

0

OpenCVじゃなく、機械学習とかだなぁ。
1次元配列にしていますが、学習するときは、どのようにしましたか。学習するときに画像を流したのと同じ形で渡してください。
4次元だと言っているので、バッチ, 縦, 横, 色の4次元で渡したと思いますよ。それをreshapeで1次元にしているので、エラーになっています。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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