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

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

ただいまの
回答率

90.76%

  • Python 3.x

    5318questions

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

  • OpenCV

    966questions

    OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

  • TensorFlow

    608questions

OpenCVのImportエラー

解決済

回答 1

投稿

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

TyoNgc

score 8

前提・実現したいこと

Tensorflowを使ってPythonで画像分類のプログラムを実行しようとしています。openCVを実行するところで画像がうまくインポートできていないのかエラーメッセージが出てしまいます。トレーニングデータをTrain.txtテストデータをtest.txtとして画像のファイルと同じディレクトリに配置しています。

発生している問題・エラーメッセージ

```Traceback (most recent call last)  
<ipython-input-8-ac855ac373a9> in <module>()  
22         # データを読み込んで28x28に縮小  
23         img = cv2.imread(FLAGS.image_dir + '/' + l[0])  
---> 24         img = cv2.resize(img, (28, 28))  
25         # 一列にした後、0-1のfloat値にする  
26         train_image.append(img.flatten().astype(np.float32)/255.0)  

error: ..\..\..\modules\imgproc\src\imgwarp.cpp:3229: error: (-215) ssize.area() > 0 in function cv::resize  


###該当のソースコード  

Python

def accuracy(logits, labels):
""" 正解率(accuracy)を計算する関数
引数: 
logits: inference()の結果
labels: ラベルのtensor, int32 - [batch_size, NUM_CLASSES]
返り値:
accuracy: 正解率(float)
"""
correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(labels, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
tf.summary.scalar("accuracy", accuracy)
return accuracy
if name == 'main':
f = open(FLAGS.train, 'r')

 データを入れる配列

train_image = []
train_label = []
for line in f:

 改行を除いてスペース区切りにする

line = line.rstrip()
l = line.split()

 データを読み込んで28x28に縮小

img = cv2.imread(FLAGS.image_dir + '/' + l[0])
img = cv2.resize(img, (28, 28))

 一列にした後、0-1のfloat値にする

train_image.append(img.flatten().astype(np.float32)/255.0)

 ラベルを1-of-k方式で用意する

tmp = np.zeros(NUM_CLASSES)
tmp[int(l[1])] = 1
train_label.append(tmp)

 numpy形式に変換

train_image = np.asarray(train_image)
train_label = np.asarray(train_label)
f.close()
f = open(FLAGS.test, 'r')
test_image = []
test_label = []
for line in f:
line = line.rstrip()
l = line.split()
img = cv2.imread(FLAGS.image_dir + '/' + l[0])
img = cv2.resize(img, (28, 28))
test_image.append(img.flatten().astype(np.float32)/255.0)
tmp = np.zeros(NUM_CLASSES)
tmp[int(l[1])] = 1
test_label.append(tmp)
test_image = np.asarray(test_image)
test_label = np.asarray(test_label)
f.close()
with tf.Graph().as_default():

 画像を入れる仮のTensor

images_placeholder = tf.placeholder("float", shape=(None, IMAGE_PIXELS))

 ラベルを入れる仮のTensor

labels_placeholder = tf.placeholder("float", shape=(None, NUM_CLASSES))

 dropout率を入れる仮のTensor

keep_prob = tf.placeholder("float")

 inference()を呼び出してモデルを作る

logits = inference(images_placeholder, keep_prob)

 loss()を呼び出して損失を計算

loss_value = loss(logits, labels_placeholder)

 training()を呼び出して訓練

train_op = training(loss_value, FLAGS.learning_rate)

 精度の計算

acc = accuracy(logits, labels_placeholder)

 保存の準備

saver = tf.train.Saver()

 Sessionの作成

sess = tf.Session()

 変数の初期化

sess.run(tf.global_variables_initializer())

 TensorBoardで表示する値の設定

summary_op = tf.summary.merge_all()
summary_writer = tf.summary.FileWriter(FLAGS.train_dir, sess.graph)

 訓練の実行

for step in range(FLAGS.max_steps):
for i in range(int(len(train_image)/FLAGS.batch_size)):

 batch_size分の画像に対して訓練の実行

batch = FLAGS.batch_size*i

 feed_dictでplaceholderに入れるデータを指定する

sess.run(train_op, feed_dict={
images_placeholder: train_image[batch:batch+FLAGS.batch_size],
labels_placeholder: train_label[batch:batch+FLAGS.batch_size],
keep_prob: 0.5})

 1 step終わるたびに精度を計算する

train_accuracy = sess.run(acc, feed_dict={
images_placeholder: train_image,
labels_placeholder: train_label,
keep_prob: 1.0})
print("step %d, training accuracy %g"%(step, train_accuracy))

 1 step終わるたびにTensorBoardに表示する値を追加する

summary_str = sess.run(summary_op, feed_dict={
images_placeholder: train_image,
labels_placeholder: train_label,
keep_prob: 1.0})
summary_writer.add_summary(summary_str, step)

 訓練が終了したらテストデータに対する精度を表示

print("test accuracy %g"%sess.run(acc, feed_dict={
images_placeholder: test_image,
labels_placeholder: test_label,
keep_prob: 1.0}))

 最終的なモデルを保存

save_path = saver.save(sess, os.getcwd() + "\\model.ckpt")

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • can110

    2017/09/27 10:06

    コード詳細確認できていませんが「FLAGS.image_dir」変数に正しいフォルダパスをセットすればよいと思います。

    キャンセル

  • TyoNgc

    2017/09/27 12:38

    おそらく正しいパスはセットできたと思いますが、その次の行のflattenの所でエラーが出ました。('NoneType' object has no attribute 'flatten')これは何が原因だと考えられますか。

    キャンセル

  • can110

    2017/09/28 16:39

    コードが確認しずらいのでコード部分を「コード表示」になるように修正ください。多分、コード前後の区切り「```」がうまく入っていないようです。

    キャンセル

回答 1

checkベストアンサー

0

おそらく正しいパスはセットできたと思いますが、その次の行のflattenの所でエラーが出ました。('NoneType' object has no attribute 'flatten')これは何が原因だと考えられますか

OpenCVで読み込みに失敗したときによく見る典型的なエラーです。

>>> import cv2
>>> img = cv2.imread('')  # もちろん読み込めない
>>> img.shape
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'shape'
>>> img.flatten
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'flatten'

想定される原因
・データが壊れている
・パスが間違っている(参照できていない)

ファイルの構成がどうなっているのか、質問者様以外にはわかりません。
とりあえず絶対パスで試してみて、駄目なら前者、違うなら後者でしょう。


teratailには、コードを見やすく表示する機能があります。
コード編集画面を開き、コードを選択した状態で<code>ボタンを押してください。

ご自身でもわかっているとは思いますが、今の状態では読めたもんじゃないです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • Python 3.x

    5318questions

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

  • OpenCV

    966questions

    OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

  • TensorFlow

    608questions