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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Chainer

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1808閲覧

【Python】画像のreshapeが上手くできません。

ktn09491991

総合スコア1

Chainer

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/09/12 06:39

前提・実現したいこと

インターネットの記事を参考にして画像ファイルから機械学習によって細胞判別のプログラムを作成しています。
しかし、以下のようなエラーが出てしまいます。
reshape前後のサイズが同じでないといけないことは、分かったのですが、画像の高さ、幅を1にしてしまって問題ないのでしょうか。
よろしくお願い致します。

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

Traceback (most recent call last): File "ファイルパス", line 168, in <module> x_train = x_train.reshape(len(x_train), 1, imagesize, imagesize) / 255 ValueError: cannot reshape array of size 59 into shape (59,1,64,64)

該当のソースコード

python

1x_train = [] # 画像データ格納 2y_train = [] # ラベルデータ格納 3for filepath, label in train_list: 4 img = cv2.imread(filepath, 0) # グレースケールで読み込む 5 x_train.append(img) 6 y_train.append(label) 7 8x_train = np.array(x_train).astype(np.float32) 9y_train = np.array(y_train).astype(np.int32) 10 11print(len(x_train)) 12print(imagesize) 13 14# 画像を(学習枚数、チャンネル数、高さ、幅)の4次元に変換する 15x_train = x_train.reshape(len(x_train), 1, imagesize, imagesize) / 255 16

試したこと

>x_train = x_train.reshape(len(x_train), 1, imagesize, imagesize) / 255
上記のimagesizeを1にし、サイズをreshape前と同じにすると先に進みます。

補足情報(FW/ツールのバージョンなど)

参考にした記事
https://lp-tech.net/articles/e0mRJ
環境
Windows10
Python 3.9.6
chainer 1.24.0
filelock 3.0.12
nose 1.3.7
numpy 1.21.2
opencv-contrib-python 4.5.3.56
opencv-python 4.5.3.56
pip 21.2.4
protobuf 3.17.3
setuptools 56.0.0
six 1.16.0
typing-extensions 3.10.0.2

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

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

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

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

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

jbpb0

2021/09/12 08:15

print(imagesize) のすぐ下に print(x_train.shape) を追加して実行したら、そこの結果は何と表示されますか?
ktn09491991

2021/09/12 09:15 編集

ご連絡いただきありがとうございます 上記のエラーの上に (94,) と、表示されます(len(x_train)と同じ値)。
jbpb0

2021/09/12 09:41 編集

> (94,) と、表示されます そこは「(94, 画像縦サイズ, 画像横サイズ)」と表示されるはずなのですが、変ですね 画像ファイルがちゃんと読めてないのかも img = cv2.imread(filepath, 0) # グレースケールで読み込む のすぐ下に、上記とインデントを合わせて print(img.shape) を追加して実行したら、何と表示されますか? 画像ファイルをちゃんと読めてたら、「(画像縦サイズ, 画像横サイズ)」と表示されるはずなのですけど、そうなりますでしょうか?
ktn09491991

2021/09/12 09:41

File "ファイル名", line 156, in <module> print(img.shape) AttributeError: 'NoneType' object has no attribute 'shape' と、表示されました。
jbpb0

2021/09/12 09:44

それでしたらやはり、画像ファイルが読めてないですね 「cv2.imread(filepath, 0)」の「filepath」と、実際の画像ファイルのパス(置き場所やファイル名)が違っている可能性が高いので、そこ調べてください
ktn09491991

2021/09/12 09:46

ありがとうございます。 確認してみます。
ktn09491991

2021/09/12 09:55

先程の箇所に print(filepath) 追加して確認してみたのですが、パスはおそらくあっていて.pngが表示されたのですが、どうすればいいでしょうか。
jbpb0

2021/09/12 10:11 編集

> 先程の箇所に print(filepath) 追加して確認 それだと、「filepath」の内容が表示されるだけです 「filepath」は絶対パスで指定してるのですか? もしそうなら、表示された絶対パスと、実際の画像ファイルの絶対パスが合ってれば > パスはおそらくあっていて と分かりますが、相対パス指定なら、合ってるか分かりませんよね 【追記】 「filepath」が相対パス指定の場合は、「print(filepath)」ではなく「print(os.path.abspath(filepath))」を追加して実行してみてください その行よりも上のどこかに「import os」も追加してください そうすれば、「filepath」で指定した画像ファイルを読み込もうとしてる時の場所が絶対パスで分かりますので、それが実際と合ってるかを確認してください
ktn09491991

2021/09/12 10:59

追記ありがとうございます。 読み込んでいる階層にないフォルダが一つ追加されていました。 確認してみます。
ktn09491991

2021/09/13 06:25

ファイルパスを書き出したtxtで指定していたのですが、そこの時点で関係のないパスが追加されていました。 import sys import os.path import shutil import glob import random # 書き込むテキストファイル train_list = open("train.txt", "w") test_list = open("test.txt", "w") classno = 0 count = 0 for label in range(0,2): label=str(label) imagefolder = inputfolder+"/"+label+"/" images = [r.split('/')[-1] for r in glob.glob(imagefolder+"*.png")] startcount = count length = len(images) for image in images: # 各クラスのデータの75%を学習に25%をテストに使う if random.random() < 0.75: train_list.write(imagefolder+image+" %d\n" %classno) else: test_list.write(imagefolder+image+" %d\n" %classno) count+=1 classno+=1 train_list.close() test_list.close() どこで余計なフォルダが追加されているのか分からないのですが、改善箇所はありますでしょうか。 inputfolderのパスは、絶対パスで正しいものです。 よろしくお願いします。
jbpb0

2021/09/13 10:00

できた「train.txt」と「test.txt」が、既に間違ってるのですか? それとも、それらのファイルは正しいけど、それらを読み込んで以降の、質問のコードに至る途中のどこかでおかしくなるのですか?
jbpb0

2021/09/15 01:56 編集

当方のMacで、上記のコードを(インデントを付けて)実行し、できた「train.txt」と「test.txt」を確認したら、各行に 画像ファイルの絶対パス ラベル(0か1) が記入されていて、画像ファイルの絶対パスとラベルは正しいものでしたので、 > inputfolderのパスは、絶対パスで正しいものです。 が大丈夫なら、「train.txt」と「test.txt」の内容は大丈夫だと思います 「train.txt」と、質問のコードの「train_list」との関係が分かりませんが、「train.txt」には画像ファイルの絶対パスが書かれてるのだから、それがそのまま「train_list」に入ってれば、「print(os.path.abspath(filepath))」の結果もその絶対パスと一致するはずなので、問題無いと思うのですが、「print(os.path.abspath(filepath))」の結果が「train.txt」に書かれてる画像ファイルの絶対パスと違うのでしょうか? もしそうなら、質問のコードの「train_list」には何が入ってるのでしょうか? わざわざ「train.txt」の内容を変えて「train_list」に入れてるのでしょうか? 【追記】 当方で上記のコードを実行した際のディレクトリ構成は、下記の通りです ・「inputfolder」にはディレクトリの絶対パスが入っている ・「inputfolder」のパスのディレクトリには、名前が「0」と「1」のディレクトリがある ・その「0」「1」ディレクトリ内に画像ファイルがある
ktn09491991

2021/09/15 06:15

ご返信が遅くなってしまい申し訳ありません。 「print(os.path.abspath(filepath))」の絶対パスと「train.txt」、「train.txt」内のパスは一致しているのですが、そのパスが実際の画像のパスと違っています。
jbpb0

2021/09/15 06:41

> そのパスが実際の画像のパスと違っています。 作成された「train.txt」と「test.txt」に記入されてるパスが間違ってるのですか 私の一つ前のコメントに書いたように、当方でコードを動かして作った「train.txt」と「test.txt」は、実際の画像ファイルのパスと合ってましたので、コードに間違いは無いはずです 私のそのコメントの【追記】に書いたように、 ・「inputfolder」にはディレクトリの絶対パスが入っている ・「inputfolder」のパスのディレクトリには、名前が「0」と「1」のディレクトリがある ・その「0」「1」ディレクトリ内に画像ファイルがある という条件が全て満たされる必要がありますので、そこをもう一度確認してみてください どこかに間違いがあるはずです たとえば、 /Users/XXX/Downloads/test/0 /Users/XXX/Downloads/test/1 というディレクトリが存在していて、そのそれぞれの中に画像ファイルがある、という状態ならば、 inputfolder = "/Users/XXX/Downloads/test" となっている必要があります 「inputfolder」の最後はディレクトリ名(上記の場合は「test」)です 最後に「/」を付けてはダメです(たぶん)
guest

回答1

0

ベストアンサー

質問のコードの

python

1 img = cv2.imread(filepath, 0) # グレースケールで読み込む

のすぐ上か下に

python

1 import os 2 print(os.path.abspath(filepath))

を追加して実行したら、画像ファイルを読み込もうとしてる時の場所が絶対パスで表示されます
それが画像ファイルの本当のパスと合ってなければ、画像ファイルを読み込むことができず、質問のエラーの原因になります

当方のMacで、
/Users/XXX/Downloads/test/0

/Users/XXX/Downloads/test/1
に、それぞれ画像ファイルが置いてある状態で、

python

1import sys 2import os.path 3import shutil 4import glob 5import random 6 7inputfolder = "/Users/XXX/Downloads/test" 8 9# 書き込むテキストファイル 10train_list = open("train.txt", "w") 11test_list = open("test.txt", "w") 12 13classno = 0 14count = 0 15 16for label in range(0,2): 17 label=str(label) 18 imagefolder = inputfolder+"/"+label+"/" 19 print(imagefolder) 20 images = [r.split('/')[-1] for r in glob.glob(imagefolder+"*.png")] 21 print(images) 22 startcount = count 23 length = len(images) 24 for image in images: 25 print(image) 26 # 各クラスのデータの75%を学習に25%をテストに使う 27 if random.random() < 0.75: 28 train_list.write(imagefolder+image+" %d\n" %classno) 29 else: 30 test_list.write(imagefolder+image+" %d\n" %classno) 31 count+=1 32 classno+=1 33 34train_list.close() 35test_list.close()

を実行したら、下記の内容のファイルができ、それぞれのファイル内に記入されてる画像ファイルのパスは正しいものでした

train.txt
/Users/XXX/Downloads/test/0/8.png 0
/Users/XXX/Downloads/test/0/9.png 0
/Users/XXX/Downloads/test/0/4.png 0
/Users/XXX/Downloads/test/0/5.png 0
/Users/XXX/Downloads/test/0/6.png 0
/Users/XXX/Downloads/test/0/2.png 0
/Users/XXX/Downloads/test/0/1.png 0
/Users/XXX/Downloads/test/0/0.png 0
/Users/XXX/Downloads/test/1/00.png 1
/Users/XXX/Downloads/test/1/01.png 1
/Users/XXX/Downloads/test/1/03.png 1
/Users/XXX/Downloads/test/1/02.png 1
/Users/XXX/Downloads/test/1/05.png 1
/Users/XXX/Downloads/test/1/04.png 1
/Users/XXX/Downloads/test/1/08.png 1

test.txt
/Users/XXX/Downloads/test/0/7.png 0
/Users/XXX/Downloads/test/0/3.png 0
/Users/XXX/Downloads/test/1/06.png 1
/Users/XXX/Downloads/test/1/07.png 1
/Users/XXX/Downloads/test/1/09.png 1

このようにして作成した「train.txt」の内容が、質問のコードの「train_list」に入ってれば、パスが間違っていて画像ファイルが読み込めない、ということは起きないはずです

投稿2021/09/20 06:22

jbpb0

総合スコア7651

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問