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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

327閲覧

DeepLearningで書かれた数字を当てたい

tasuke

総合スコア53

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2018/10/22 10:38

編集2018/10/22 11:11

現在、Deep Learningの学習をしています。サンプルコードを自分なりに変え、学習した後にwebカメラからの入力画像を分類し表示された数字が何かを当てるというものにしましたつもりです。また、正答確率は85 %近辺です。しかし、実際に動かしてみるとエラーこそ出ないもののプログラムが一向に数字を当ててくれません。
私はDeep Learningの学習を始めたばかりのため、原因が分かりませんでした。モデルの正答率に対して実際にモデルの画像を分類させたときの正答率が低い原因を教えていただきたいです。

python

1import cv2 2from PIL import Image 3from keras.models import load_model 4import numpy as np 5import matplotlib.pyplot as plt 6from keras.datasets import mnist 7from keras.layers import Activation, Dense, Dropout 8from keras.models import Sequential, load_model 9from keras import optimizers 10from keras.utils.np_utils import to_categorical 11 12(X_train, y_train), (X_test, y_test) = mnist.load_data() 13 14X_train = X_train.reshape(X_train.shape[0], 784)[:6000] 15X_test = X_test.reshape(X_test.shape[0], 784)[:1000] 16y_train = to_categorical(y_train)[:6000] 17y_test = to_categorical(y_test)[:1000] 18 19model = Sequential() 20model.add(Dense(280, input_dim=784)) 21model.add(Activation("sigmoid")) 22model.add(Dense(128)) 23model.add(Activation("sigmoid")) 24model.add(Dropout(rate=0.5)) 25model.add(Dense(10)) 26model.add(Activation("softmax")) 27 28sgd = optimizers.SGD(lr=0.01) 29model.compile(optimizer=sgd, loss="categorical_crossentropy", metrics=["accuracy"]) 30model.fit(X_train, y_train, batch_size=32, epochs=10, verbose=1) 31 32score = model.evaluate(X_test, y_test, verbose=0) 33print("evaluate loss: {0[0]}\nevaluate acc: {0[1]}".format(score)) 34 35cap = cv2.VideoCapture(1) 36 37while True: 38 39 ret, frame = cap.read() 40 gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) 41 42 cv2.imshow('preview', frame) 43 key = cv2.waitKey(10) 44 if key == ord("s"): 45 path = "photo.jpg" 46 cv2.imwrite(path,gray) 47 48 img = np.array(Image.open('photo.jpg')) 49 width,height=28,28 50 img2 = cv2.resize(img,(width,height)) 51 data = img2.reshape(1, 784) 52 res = model.predict([data]) 53 y = res.argmax() 54 rabel = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 55 print("Prediction is ", rabel[y]) 56 57 if key == ord("q"): 58 break 59コード

以下が被分類画像のimg2です。
webカメラにより取り込みリサイズした画像

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

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

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

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

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

guest

回答3

0

画像をflattenして全結合層に入れるというアプローチなので、ちょっとしたズレが生じただけでもまったくうまくいきません。

mnistはそれなりに一定の範囲に画像が収まるようなデータになっていますが、webカメラでは期待できないでしょう。

また、グレースケール化・縮小した画像がmnistのデータと同じような値の範囲になっているのかも実はよくわかりません。

一枚画像を掲載していただくと判断しやすいのですが。

投稿2018/10/22 10:50

hayataka2049

総合スコア30933

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

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

tasuke

2018/10/22 11:19

回答ありがとうございます。自分で作った画像の分類を行うことへのアプローチについてですが、私が参考にしている本、見つけたサイト等にはモデルの正答率を出し上げる方法までしか載っていなかったため、少ない知識で考え自分なりに見つけたものになり正直自信はありません。もっと良い方法、また、一般的に取られている方法について参考にできる資料等あれば、教えていただけるとありがたいです。 長文かつ分かりずらくなってしまい申し訳ありません。
hayataka2049

2018/10/22 12:01

深層学習で画像系のタスクであれば、CNN(畳み込みニューラルネットワーク)と呼ばれるような構造のネットワークを使うのが一般的です mnist程度ならCNNに頼らずともある程度は解ける、という事実もありますが、知っておいて損はしないかと 参考: http://tekenuko.hatenablog.com/entry/2017/07/23/195321
tasuke

2018/10/23 01:08

返答ありがとうございます。CNNについて学習してみたいと思います。
guest

0

ベストアンサー

チャンネルの並び順

OpenCV で画像を読み込んだ場合は、チャンネルの並び順は BGR です。
なので、以下のようにするべきです。

cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

私はDeep Learningの学習を始めたばかりのため、原因が分かりませんでした。モデルの正答率に対して実際にモデルの画像を分類させたときの正答率が低い原因を教えていただきたいです。

MNIST と画像の性質が異なるような場合、精度がでないことが考えられます。
推論しようとしている画像 img2 がどのような画像か cv2.imwrite() で保存して、質問欄に貼ることはできますか?

追記

イメージ説明
質問者さんが推論しようとしている画像

イメージ説明
MNIST の画像

見ていただければわかると思いますが、推論しようとしている画像が学習にしようした MNIST の画像と性質が大きく異なっていますね。
多少の違いであれば大丈夫なのですが、学習したデータと性質が大きくかけ離れている場合、推論はうまくいかないでしょう。

以下のように、画像処理で見た目を MNIST の画像に近づけたところ、6 と正しく認識されました。

import cv2 import matplotlib.pyplot as plt img = cv2.imread('test.jpg', cv2.IMREAD_GRAYSCALE) img = cv2.resize(img, (28, 28)) # 表示 plt.imshow(img, cmap='gray') plt.show() img = cv2.bitwise_not(img) # ネガポジ反転 _, img = cv2.threshold(img, 110, 255, cv2.THRESH_TOZERO) # 110 未満の輝度値を0 img = cv2.morphologyEx(img, cv2.MORPH_DILATE, np.ones((2, 2), np.uint8)) # 膨張演算で白い線を太くする。 # 表示 plt.imshow(img, cmap='gray') plt.show() x = img.reshape(1, -1) # (H, W) -> (1, H * W) pred_label = model.predict_classes(x) print(pred_label) # 推論結果 6

イメージ説明
前処理した結果

投稿2018/10/22 10:50

編集2018/10/22 11:30
tiitoi

総合スコア21956

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

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

tasuke

2018/10/22 11:05

回答ありがとうございます。編集して載せさせていただきます。
tiitoi

2018/10/22 11:31

学習したデータと性質が大きくことなるため、推論がうまくいっていませんでした。OpenCV で前処理をし、MNIST の見た目に近づけてあげると、正しく6と推論できることが確認できました。
tasuke

2018/10/23 01:07

回答ありがとうございます。回答者さんのコードを参考にして書き直した結果、推論の成功率は上がりました。画像の前処理について学習していきたいと思います。
guest

0

嫌味な回答になってしまいますが、DeepLearningを試しているだけで学習にはなっていないかと、(DeepLearningそのものは学習しているかもしれませんが)。
回答者さんの考察のように、DeepLearningの仕組みを学んで(できれば応用もできて)こそ、それを学習しているといえるかなーと思います。

投稿2018/10/22 12:02

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tasuke

2018/10/23 01:21

回答ありがとうございます。私は生物系の学生なのですが4年になった現在、研究室の教授にDeep Learningを導入したいと言われ急きょこの分野の勉強もしなくてはならなくなりました。そのうえ、自分の研究でもある程度の結果を残さなければいけないため時間の方が…ただ、あなたのおっしゃる通りです。もっといろいろ調べたり本を読んだりして、少なくとも最低限の知識は身に付けるようにします。
退会済みユーザー

退会済みユーザー

2018/10/23 02:36 編集

そうでしたか、それはかなり大変そうです。私の回答は自虐的なもので、勉強してるつもりで、ただ、用意されてたものを試して遊んでただけで、応用出来てなかった(実際に研究に適用するための知識を得られていなかった)時期があったので、このように書いてみた次第です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問