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

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

ただいまの
回答率

88.92%

画像のグレースケール化が上手くいかない

受付中

回答 1

投稿 編集

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

tbc

score 11

[訓練データの作成]
(https://torina.top/detail/334/)
以下のように実行したらDATA.pklという名前でファイルが作成されると予想したのですが、Finderで調べてもどこにもDATA.pklというファイルはありませんでした。そういうものなのでしょうか?

#Load_Data.py
import os
import pickle
import numpy as np
from PIL import Image


class LoadMnistImage:

    def __init__(self):
        """初期化処理"""

        self.train_img = None
        self.train_label = None
        self.test_img = None
        self.test_label = None

    def get_data(self, DATA_file, normalize=False, flatten=False, one_hot_label=True):
  #def get_data(self, DATA_file, Coror=True,normalize=False, #flatten=False,one_hot_label=True):
        """既に作成したpickleファイルからデータを読み込む(なければ作成する)"""

        if not os.path.exists(DATA_file):
            self.create_data(DATA_file)
        with open(DATA_file,'rb') as f:
            dataset = pickle.load(f)

        self.train_img = dataset['train_img']
        self.train_label = dataset['train_label']
        self.test_img = dataset['test_img']
        self.test_label = dataset['test_label']
       #if Coror:
           #self.to_gray()

        if flatten:
            self.to_flatten()

        if normalize:
            self.to_normalize()

        if not one_hot_label:
            self.no_hot_label()

    def to_flatten(self):
        """画像を1次元にする (100, 100) →(10000,)"""

        self.train_img = self.train_img.reshape(len(self.train_img), 10000)
        self.test_img = self.test_img.reshape(len(self.test_img), 10000)
  #def to_gray(self):
        #self.train_img = self.train_img.convert("L")     
        #self.test_img = self.test_img.convert("L")
    def to_normalize(self):
        """画像のピクセル値を0.0~1.0に正規化する"""

        self.train_img = self.train_img.astype(np.float32) / 255.0
        self.test_img = self.test_img.astype(np.float32) / 255.0

    def no_hot_label(self):
        """one_hot表現をなくす"""

        self.train_label = self.train_label.argmax(axis=1)
        self.test_label = self.test_label.argmax(axis=1)

    def create_data(self, DATA_file):
        """画像・ラベルを読み込み、pickleとして作成・保存する"""

        train_img, train_label, test_img, test_label = [], [], [], []

        # trainディレクトリの画像はtrain_img, train_labelへ
        # testディレクトリはtest_img, test_labelへ
        kinds = [
            ['train', train_img, train_label],
            ['test', test_img, test_label],
        ]
        for kind in kinds:

            # このiはディレクトリ名であると同時に、正解ラベル名
            for i in range(4):

                # mnist_png/training/0 等のパス
                dir_path = os.path.join('gazoフォルダの絶対パス', kind[0], str(i))

                # [mnist_png/training/0/1.png, mnist_png/training/0/2.png]等のリスト
                file_paths = [os.path.join(dir_path, file)
                              for file in os.listdir(dir_path)]

                # [[画像のnumpy配列], [画像のnumpy配列], ...])のような2次元配列
                images = [np.asarray(Image.open(path)).reshape(1, 100, 100) for path in file_paths]
                kind[1].extend(images)

                # ディレクトリ名のiが、そのまま正解ラベル名なので、1を入れる
                label = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
                label[i] = 1
                labels = [label for x in file_paths]
                kind[2].extend(labels)

        dataset = {
            'train_img': np.array(train_img),  
            'train_label': np.array(train_label),  
            'test_img': np.array(test_img),  
            'test_label': np.array(test_label),  
        }

        with open(DATA_file, 'wb') as f:
            pickle.dump(dataset, f, -1)

workはgazo,Load_Data.py,
gazoはtrain,test,
trainとtestはそれぞれに複数のjpg画像が入った0,1,2,3フォルダを内包。
またサイトのままだとエラーが出てしまったので(RBGで3×100×100?)と考えて、自分でグレースケールに変換してみた(#をつけたところです)のですが、エラーメッセージも変わらず、解決できなかったので解決したいです。
images = [np.asarray(Image.open(path)).reshape(3, 100, 100) for path in file_paths]に変更すると動きましたがその後の操作でエラーが出てしまうので1のまでやりたいです。
実行コード

In []: run LoadData.py                                               

In []: mnist = LoadMnistImage() 
    ...: mnist.get_data('DATA.pkl') 
    ...: x_train = mnist.train_img 
    ...: t_train = mnist.train_label 
    ...: x_test = mnist.test_img 
    ...: t_test = mnist.test_label 
    ...:    
ValueError                                Traceback (most recent call last)
<ipython-input-88-e0b16a9c0f89> in <module>
      1 mnist = LoadMnistImage()
----> 2 mnist.get_data('DATA.pkl')
      3 x_train = mnist.train_img
      4 t_train = mnist.train_label
      5 x_test = mnist.test_img
~/work/LoadData.py in get_data(self, DATA_file, Coror, normalize, flatten, one_hot_label)
     20 
     21         if not os.path.exists(DATA_file):
---> 22             self.create_data(DATA_file)
     23 
     24             dataset = pickle.load(f)

~/work/LoadData.py in create_data(self, DATA_file)
     87                               for file in os.listdir(dir_path) if file != '.DS_Store']
     88                 # [[画像のnumpy配列], [画像のnumpy配列], ...])のような2次元配列
---> 89                 images = [np.asarray(Image.open(path)).reshape(1, 100, 100) for path in file_paths]
     90                 kind[1].extend(images)
     91 

~/work/LoadData.py in <listcomp>(.0)
     87                               for file in os.listdir(dir_path) if file != '.DS_Store']
     88                 # [[画像のnumpy配列], [画像のnumpy配列], ...])のような2次元配列
---> 89                 images = [np.asarray(Image.open(path)).reshape(1, 100, 100) for path in file_paths]
     90                 kind[1].extend(images)
     91 


ValueError: cannot reshape array of size 30000 into shape (1,100,100)


変なことを言っていたらすみません。よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • can110

    2020/07/21 15:59

    提示コードはクラス定義のみのようです。このクラスを使った(実行した)コードも提示ください。

    キャンセル

  • tbc

    2020/07/21 16:06

    ありがとうございます。エラーの前に実行したコードを追記しました。

    キャンセル

  • can110

    2020/07/21 16:11

    提示コードを実行してみましたが「get_data(self, DATA_file,Coror=False」の後ろにカンマがないなど正常に動作しません。エラーなく動作するコードを提示していただけないでしょうか?

    キャンセル

  • tbc

    2020/07/21 16:31

    大変失礼しました。
    気がついたところはすべて修正してみました。ご指摘ありがとうございます。

    キャンセル

回答 1

0

提示コードは構文エラーなどのため動作しませんでしたので適当に修正して動作させたところ
実行した.pyと同じディレクトリ内にDATA.pklが作成されました。
ただし画像ファイルはひとつもない状態で、です。

Jupyter上run ~.pyと実行しているようですので、LoadData.pyのあるフォルダ、またはJupyterのホームディレクトリ、およびその近辺にあると思われます。

追記

1のまでやりたいです。

以下のようにグレースケールに変換すればいけるかと思います。

                #images = [np.asarray(Image.open(path)).reshape(1, 100, 100) for path in file_paths]
                images = []
                for path in file_paths:
                    img = Image.open(path)
                    img = img.convert('L')  # グレイスケールに
                    a = np.asarray(img)
                    print(path, a.shape) # ~.jpg (100, 100) になっているはず
                    images.append( a.reshape(1,100,100))

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/21 18:27

    次のエラーについては、まずは「a = np.asarray(Image.open(path)); print(a.shape)」を追加し、意図したshapeになっているか確認してみてください。

    キャンセル

  • 2020/07/22 11:01

    フォルダから画像を一つ選んでパスを渡して実行してみたところ
    In []: a = np.asarray(Image.open(path))
    In []: print(a.shape)
    (100, 100, 3)
    In []: b= np.asarray(Image.open(path).convert('L'))
    In []: print(b.shape)
    (100, 100)
    となったので、やはりグレースケールにできていれば上手くいくのではないかと思ったのですが.pyの中 での定義では上手く行っていないようです。

    キャンセル

  • 2020/07/22 15:36

    追記した回答でこちらの環境ではDATA.pklできました。

    キャンセル

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

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

関連した質問

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