37977


[![画像の説明をここに入力](https://i.stack.imgur.com/q3kKn.png)][1  
]  
↑print(omg)の結果  
画像の独自のデータセットを読み込もうとしています。  
下記のコードの`img = cv2.resize(img, (IMG_SIZE, IMG_SIZE))`でエラーがでました。  
`data`
というディレクトリの下にa,b,c,d,e,fというディレクトリがあってそのディレクトリに画像のファイルが大量に入っています。ファイルの拡張子はpngやjpegです。  
データセットの読み込みを教えていただければありがたいです。

[code]

    import os
    import numpy as np
    import cv2
    import tensorflow as tf
    NUM_CLASSES = 6 #分類するクラス数
    IMG_SIZE = 28
    
    #画像のあるディレクトリ
    train_img_dirs = ['a', 'b', 'c', 'd', 'e', 'f']
    
    #学習画像データ
    train_image = []
    #学習データのラベル
    train_label = []
    for i, d in enumerate(train_img_dirs):
     # ./data/以下の各ディレクトリ内のファイル名取得
    files = os.listdir('Users/name/desktop/zissou/data/' + d)
    for f in files:
        # 画像読み込み
        img = cv2.imread('Users/name/desktop/zissou/data/' + d + '/' + f)
        # 1辺がIMG_SIZEの正方形にリサイズ
        img = cv2.resize(img, (IMG_SIZE, IMG_SIZE))
        # 1列にして
        img = img.flatten().astype(np.float32)/255.0
        train_image.append(img)
    
        # one_hot_vectorを作りラベルとして追加
        tmp = np.zeros(NUM_CLASSES)
        tmp[i] = 1
        train_label.append(tmp)
    
    # numpy配列に変換
    train_image = np.asarray(train_image)
    train_label = np.asarray(train_label)
    
[/code]

エラー内容

[code]

    Traceback (most recent call last)
    <ipython-input-65-4ca319834c1e> in <module>()
          6         img = cv2.imread('/Users/tadashintaro/desktop/zissou/data/' + d + '/' + f)
          7         # 1辺がIMG_SIZEの正方形にリサイズ
    ----> 8         img = cv2.resize(img, (IMG_SIZE, IMG_SIZE))
          9         # 1列にして
         10         img = img.flatten().astype(np.float32)/255.0
    
    error: /Users/jenkins/miniconda/1/x64/conda-     bld/conda_1486587097465/work/opencv-    3.1.0/modules/imgproc/src/imgwarp.cpp:3229: error: (-215) ssize.area() > 0    in function resize** 
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/FpQ46.png)](https://i.stack.imgur.com/FpQ46.png)

参照：<http://qiita.com/domkade/items/fc9903c2119fdfa9a234>


CC BY-SA 3.0
2017-09-04T08:36:57.737
37709
2017-09-15T15:43:56.690
2017-09-05T12:49:21.343
23690
23690
question
python tensorflow
files = os.listdir('./data/' + d)でのエラーについて


さてコメント欄で指摘されているように類似の質問があるとおり，とりあえず今のところ話題になっているメッセージからは読み込もうとしているファイルの中に空のものがあるのではないかというのが一番怪しいということにしましょう．というわけで

### Q. フォルダ下にたくさんの画像ファイルらしきものがあるとき，その中から空のものを見つけるにはどうすればよいか．

多分いちばん簡単なのは， Linux 上でしたら
[`find`](https://www.gnu.org/software/findutils/manual/html_mono/find.html#Size)
のようなコマンドを使うことですけれども，せっかくなので今あるコードをできるだけ再利用してみましょう．  
（ところで，
質問する前に余分なコードはできるだけ省くようにすべきです．そうして初めて問題の所在が分かって正しいググり方も分かるということがあります．今回なら
tensorflow 周りは一切要りませんし，`resize` を試みて困ってるわけですからそれ以降の処理も余分です）

ファイルごとに処理をしているところでこういう感じにできたら良さそうですね．

[code]

    for f in files:
        # 画像読み込み
        img = cv2.imread('Users/name/desktop/zissou/data/' + d + '/' + f)
        # 空ファイルがあったら教えてもらう
        if is_empty(img):
            print("{} っていうディレクトリの{}っていうファイルが怪しい!".format(d,f)) 
    
[/code]

では空ファイルをどうみつけていくか．その前に空ファイルがどう扱われるか実験してみましょう． ターミナル（Bash を想定しています）で `$ touch
empty.jpg` などで空のファイルを作っておいて

[code]

    #!/usr/bin/env python3
    
    import cv2
    
    empty = cv2.imread('./empty.jpg')
    print(empty)   # None
    cv2.resize(empty, (3,3)) # OpenCV Error: Assertion failed (ssize.width > 0 && ssize.height > 0) in resize, file /io/opencv/modules/imgproc/src/imgwarp.cpp, line 3483
    
[/code]

いい感じにそれっぽいエラーがでること，空ファイルを読むと `None` が返されていることがわかります(ファイル名を間違えていても同様に `None`
が返ってきます)．というわけで

[code]

    if img is None:
    
[/code]

などで判定を入れてみるのが良いだろうと思います．

以下余談．

* * *

### そもそも不明なエラーが出てるけど原因を探りたい

ときというのは色々あると思いますが，エラーメッセージで検索する他に，今回でしたら例えばどのファイルで詰まってるのを知りたいとしましょう．僕ならこうします：

[code]

    for f in files:
        # 画像読み込み
        img = cv2.imread('Users/name/desktop/zissou/data/' + d + '/' + f)
        try:
            img = cv2.resize(img, (IMG_SIZE, IMG_SIZE))
        except Exception as e:
            # うまく行かないときは報告
            print(e)
            print("{} っていうディレクトリの{}っていうファイルが怪しい!".format(d,f)) 
    
[/code]

書捨て的なトライアルができるのはスクリプト言語の気軽なところなので，色々試してみるといいです．


CC BY-SA 3.0
2017-09-15T15:38:21.573
37977
2017-09-15T15:43:56.690
2017-09-15T15:43:56.690
2901
2901
37709
answer