🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

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

Q&A

3回答

3728閲覧

Segnetを用いて画像を機械学習させたい

jenison

総合スコア2

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

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

0グッド

0クリップ

投稿2021/01/15 06:29

編集2021/01/16 04:19

前提・実現したいこと

・anacondaを用いて構築したsegnetという仮想環境を用いて、pycharmでディープラーニングのネットワーク(SegNet)を実装しています。

・使用する画像を読み込む際にエラーメッセージが表示されてしまいます

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

/Users/yamadajunya/opt/anaconda3/envs/segnet/bin/python /Users/yamadajunya/segnetcode/Segnet-master/main.py
Using TensorFlow backend.
Traceback (most recent call last):
File "/Users/yamadajunya/segnetcode/Segnet-master/main.py", line 78, in <module>
main()
File "/Users/yamadajunya/segnetcode/Segnet-master/main.py", line 53, in main
sg = loader.segment_generator(path_b)
File "/Users/yamadajunya/segnetcode/Segnet-master/loader.py", line 65, in segment_generator
image = identity[image]
IndexError: index 22 is out of bounds for axis 0 with size 22

該当のソースコード

main.pyは以下の通りです

python

1import numpy as np 2from PIL import Image 3import os,glob 4import matplotlib.pyplot as plt 5import keras 6from keras import layers 7from keras import models 8from keras import optimizers 9import tensorflow as tf 10import loader 11import model 12 13**#show functions** 14def show_segment(sg): 15 sg = np.argmax(sg,axis=-1) 16 plt.figure() 17 plt.imshow(np.asarray(sg)) 18 plt.show() 19def show_image(im): 20 plt.figure() 21 plt.imshow(im) 22 plt.show() 23def compare_TV(history,dir): 24 ** # Setting Parameters** 25 acc = history.history['acc'] 26 val_acc = history.history['val_acc'] 27 loss = history.history['loss'] 28 val_loss = history.history['val_loss'] 29 epochs = range(len(acc)) 30 ** # 1) Accracy Plt** 31 plt.figure() 32 plt.plot(epochs, acc, 'bo' ,label = 'training acc') 33 plt.plot(epochs, val_acc, 'b' , label= 'validation acc') 34 plt.title('Training and Validation acc') 35 plt.legend() 36 plt.savefig(dir+"/acc.png") 37 38 ** # 2) Loss Plt** 39 plt.figure() 40 plt.plot(epochs, loss, 'bo' ,label = 'training loss') 41 plt.plot(epochs, val_loss, 'b' , label= 'validation loss') 42 plt.title('Training and Validation loss') 43 plt.legend() 44 plt.savefig(dir+"/loss.png") 45**#define the loss function** 46def my_loss(x,y): 47 return tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(x,y)) 48 49def main(): 50 **#load VOCdataset** 51 path_a , path_b = loader.generate_path("/Users/yamadajunya/Segnet/VOCdataset/original","/Users/yamadajunya/Segnet/VOCdataset/segmented") 52 im = loader.image_generator(path_a) 53 sg = loader.segment_generator(path_b) 54 print("load is succesfully finished!") 55 M = model.build_Segnet() 56 save_dir ="Segnet" 57 if(len(sys.argv)>1): 58 save_dir=sys.argv[1] 59 M.compile(loss="categorical_crossentropy", optimizer="adam",metrics=["acc"]) 60 M.summary() 61 history = M.fit(im[:2000],sg[:2000],batch_size = 4,validation_data = (im[2000:2500],sg[2000:2500]),epochs = 100) 62 ** #history = M.fit(im[:2000],sg[:2000],batch_size = 4,epochs = 20)** 63 compare_TV(history,save_dir) 64 for i in range(100): 65 pred = M.predict(im[2500+i].reshape(1,64,64,3)) 66 sg = np.argmax(pred[0],axis=-1) 67 plt.figure() 68 plt.imshow(np.asarray(sg)) 69 plt.savefig("./"+save_dir+"/{}.png".format(i)) 70 for i in range(100): 71 pred = M.predict(im[i].reshape(1,64,64,3)) 72 sg = np.argmax(pred[0],axis=-1) 73 plt.figure() 74 plt.imshow(np.asarray(sg)) 75 plt.savefig("./"+save_dir+"/train{}.png".format(i)) 76 77if __name__=='__main__': 78 main() 79

該当のソースコード

loader.pyは以下の通りです

python

1import numpy as np 2from PIL import Image 3import os,glob 4import matplotlib.pyplot as plt 5from keras import layers 6from keras import models 7from keras import optimizers 8import tensorflow as tf 9**#get path of the available image.** 10def generate_path(dir_original,dir_segmented): 11 12 **#get paths using glob** 13 paths_original = glob.glob(dir_original + "/*") 14 paths_segmented = glob.glob(dir_segmented + "/*") 15 16** #Error indication** 17 if (len(paths_original)*len(paths_segmented)==0): 18 raise FileNotFoundError("Sorry, we could not find your files.Check path please.") 19 20 filenames = list(map(lambda path: path.split(os.sep)[-1].split(".")[0],paths_segmented)) 21 paths_original = list(map(lambda filename: dir_original +"/"+filename+".jpg",filenames)) 22 23 return paths_original,paths_segmented 24 25 26def image_generator(file_paths, init_size=(64,64), normalization = True): 27 """ 28 file_paths (list[string]):File paths you want to load. 29 init_size (tuple(int,int)):We will resize the pics. 30 normalization (bool):If true, we transfer the pixel value to [0,1]. 31 """ 32 images = np.zeros((len(file_paths),init_size[0],init_size[1],3)) 33 i = 0 34 for file_path in file_paths: 35 if file_path.endswith(".png") or file_path.endswith(".jpg"): 36 image = Image.open(file_path) 37 **#image = Loader.crop_to_square(image)** 38 if(init_size is not None and init_size !=image.size): 39 image = image.resize(init_size) 40 if(image.mode == "RGBA"): 41 image = image.convert("RGB") 42 image = np.asarray(image,dtype = np.float32) 43 if normalization: 44 image = image/255.0 45 images[i] = image 46 i+=1 47 return images 48 49def segment_generator(file_paths, init_size =(64,64),max_class = 22): 50 """ 51 file_paths (list[string]):File paths you want to load. 52 init_size (tuple(int,int)):We will resize the pics. 53 """ 54 images = np.zeros((len(file_paths),init_size[0],init_size[1],max_class)) 55 i = 0 56 for file_path in file_paths: 57 if file_path.endswith(".png") or file_path.endswith(".jpg"): 58 image = Image.open(file_path) 59 if(init_size is not None and init_size !=image.size): 60 image = image.resize(init_size) 61 image = np.asarray(image,dtype = np.uint8) 62 image = np.where(image ==255, max_class-1,image) 63 64 identity = np.identity(max_class,dtype = np.uint8) 65 image = identity[image] 66 images[i] = image 67 i+=1 68 69 return images 70 71**#データローダの動きを確認** 72def test(): 73 path_a , path_b = generate_path("./VOCdataset/original","./VOCdataset/segmented") 74 print("path_generation is done") 75 im = image_generator(path_a) 76 sg = segment_generator(path_b) 77 print(im.shape,sg.shape) 78 sum_or = True 79 for i in range(sg.shape[0]): 80 sum_or = sum_or or np.all(sg.sum(axis=-1)[i]==1) 81 print(sum_or) 82**** #sns.heatmap(sg.sum(axis=-1)[20]) 83 **#plt.show()****** 84
python

コードはこちらを参照しています。
https://github.com/milky1210/Segnet
上のGithubでダウンロードしたSegnet-masterというフォルダをsegnetcodeというフォルダに格納しています。

また、こちらのサイトも参照しています
https://qiita.com/milky9712/items/dd4fae64751938c038e3

VOCデータセットをダウンロードして、入力画像を"Segnet/VOCdataset/original"、セグメンテーションされた画像を"Segnet/VOCdataset/segmented"に格納しています

VOCデータセットは下記のサイトのDownload the training/validation data (2GB tar file)からダウンロードしています。
http://host.robots.ox.ac.uk/pascal/VOC/voc2012/

試したこと

22クラスに分類することを学習している最中にエラーが出ていると予測したので、クラス数などを変えてみましたが、だめでした。
VOCデータセットのクラス分類とsegnetのクラス分類で何か違いが出ているのでしょうか?

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

jbpb0

2021/01/15 11:33

pythonのコードの一番最初の行のすぐ上に ```python だけの行を追加してください また、pythonのコードの一番最後の行のすぐ下に ``` だけの行を追加してください 現状、コードがとても読み辛いです
jenison

2021/01/16 04:19

すいません。初心者なものでありがとうございます。
jbpb0

2021/01/17 13:40

loader.segment_generator()の image = identity[image] の際に、imageの各画素には0~21の値しか入っていてはいけないのですが、22という値が入っているため、 > IndexError: index 22 is out of bounds for axis 0 with size 22 というエラーになってるようです http://host.robots.ox.ac.uk/pascal/VOC/voc2012/segexamples/index.html によると、元データの値は0~20と255で、コードの image = np.where(image ==255, max_class-1,image) で255をmax_class-1=21に置き換えているので、0~21しかないはずなのですが、謎です
jbpb0

2021/01/17 15:26

https://teratail.com/questions/280046 の「質問への追記・修正の依頼」に、同じエラーが書かれてました segmentedに、ルールに反した画像が混入してるのを疑った方がいいかもしれません
jbpb0

2021/01/18 08:23

image = np.where(image ==255, max_class-1,image) の次に if np.max(image) > 21: print(file_path + " max: " + str(np.max(image))) を追加すれば、どのファイルが21よりも大きな値を持っているのかが分かります (2行目のprint(...はインデントを入れてください)
jenison

2021/01/19 07:13

返信ありがとうございます jbpb0さんの指示通り image = np.where(image ==255, max_class-1,image) の次に if np.max(image) > 21: print(file_path + " max: " + str(np.max(image))) を追加したところ、 2011_002920.pngの画像がクラスが38個存在していたみたいな結果がきました。 よって、VOCdatasetのoriginalとsegmentedフォルダからそれぞれ2011_002920.jpgと2011_002920..pngを削除しました。 すると、 >>> tf.get_variable_scope() AttributeError: module 'tensorflow' has no attribute 'variable_scope' 上記のようなエラーが出てきました(正確ではないかもしれません) そこでmodel.pyの30行目を以下のように修正しました。 with tf.compat.v1.variable_scope(self.name): すると学習?が開始されました。 学習には数時間かかりそうなため、とりあえず報告させていただきます。 ご教授ありがとうございました。 学習が終わったらSegnetが使えるようになるかはわかりませんが 学習がおわったら結果もここで報告させていただきたいと思います。
jenison

2021/01/19 10:33

学習が終わったら以下のようなエラーが出てしまいました(泣 ‥ 1984/2000 [============================>.] - ETA: 0s - loss: 0.3941 - acc: 0.8655 1988/2000 [============================>.] - ETA: 0s - loss: 0.3942 - acc: 0.8655 1992/2000 [============================>.] - ETA: 0s - loss: 0.3946 - acc: 0.8654 1996/2000 [============================>.] - ETA: 0s - loss: 0.3951 - acc: 0.8652 2000/2000 [==============================] - 120s 60ms/step - loss: 0.3948 - acc: 0.8653 - val_loss: 1.2409 - val_acc: 0.6576 Traceback (most recent call last): File "/Users/yamadajunya/segnetcode/Segnet-master/main.py", line 79, in <module> main() File "/Users/yamadajunya/segnetcode/Segnet-master/main.py", line 64, in main compare_TV(history,save_dir) File "/Users/yamadajunya/segnetcode/Segnet-master/main.py", line 37, in compare_TV plt.savefig(dir+"/acc.png") File "/Users/yamadajunya/opt/anaconda3/envs/segnet/lib/python3.6/site-packages/matplotlib/pyplot.py", line 859, in savefig res = fig.savefig(*args, **kwargs) File "/Users/yamadajunya/opt/anaconda3/envs/segnet/lib/python3.6/site-packages/matplotlib/figure.py", line 2311, in savefig self.canvas.print_figure(fname, **kwargs) File "/Users/yamadajunya/opt/anaconda3/envs/segnet/lib/python3.6/site-packages/matplotlib/backend_bases.py", line 2217, in print_figure **kwargs) File "/Users/yamadajunya/opt/anaconda3/envs/segnet/lib/python3.6/site-packages/matplotlib/backend_bases.py", line 1639, in wrapper return func(*args, **kwargs) File "/Users/yamadajunya/opt/anaconda3/envs/segnet/lib/python3.6/site-packages/matplotlib/backends/backend_agg.py", line 512, in print_png dpi=self.figure.dpi, metadata=metadata, pil_kwargs=pil_kwargs) File "/Users/yamadajunya/opt/anaconda3/envs/segnet/lib/python3.6/site-packages/matplotlib/image.py", line 1611, in imsave image.save(fname, **pil_kwargs) File "/Users/yamadajunya/opt/anaconda3/envs/segnet/lib/python3.6/site-packages/PIL/Image.py", line 2161, in save fp = builtins.open(filename, "w+b") FileNotFoundError: [Errno 2] No such file or directory: 'Segnet/acc.png' プロセスは終了コード 1 で完了しました おそらくmain.pyの37行目の plt.savefig(dir+"/acc.png") がエラーの原因だと思われるのですが何か解決策はありますでしょうか? 図を保存する際にエラーが出てしまっていると思うのですが‥ また、今更の話になってしまいますが クラス分類したい画像を入力し、クラス分けした画像を保存することはこのコードでできるでしょうか? 返信お待ちしております。
jbpb0

2021/01/19 12:17

> 図を保存する際にエラーが出てしまっていると思うのですが‥ カレントディレクトリに「Segnet」というフォルダはありますか? カレントディレクトリは、Pythonで下記を実行したら分かります import os path = os.getcwd() print(path)
jbpb0

2021/01/19 12:25

> クラス分類したい画像を入力し、クラス分けした画像を保存する 「クラス分けした画像を保存」というのは、どういう意味ですか? 普通は分類は、候補各クラスの確率を数値で得て、確率最大のクラスのラベル(ネコとかイスとか)を表示させるくらいです
jbpb0

2021/03/30 12:10

> main.pyの37行目の plt.savefig(dir+"/acc.png") がエラーの原因だと思われるのですが 以下、「Segnet」というディレクトリに「main.py」等があるとします 予め「Segnet/Segnet」ディレクトリを作成しておいてから、Anacondaプロンプトで下記を実行したら、当方ではそのエラーは出ませんでした cd 「Segnet」ディレクトリのパス python main.py Segnet やはり、ディレクトリが無いために画像を保存できないというエラーだと思います 当方の環境  Windows 10  Python 3.7.9  tensorflow-gpu 1.15.3  Keras 2.3.1
guest

回答3

0

私も同様に進めているのですが、その後も色々エラーがでており、
心おれそうです。

投稿2021/03/09 02:16

Seven_Sea

総合スコア23

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

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

0

”2011_002920.jpg”が該当のエラー画像のようです。
質問なのですが、お使いのPythonのバージョン、Tensorflowのバージョン、Kerasのバージョンを教えていただけないでしょうか?
よろしくお願いいたします。

投稿2021/03/09 02:10

Seven_Sea

総合スコア23

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

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

0

「loader.segment_generator()」の

python

1 image = identity[image]

の際に、imageの各画素には0~21の値しか入っていてはいけないのですが、22という値が入っているため、

IndexError: index 22 is out of bounds for axis 0 with size 22

というエラーになってるようです

PASCAL VOC2011 Example Segmentations
によると、元データの値は0~20と255で、コードの

python

1 image = np.where(image ==255, max_class-1,image)

で255をmax_class-1=21に置き換えているので、その通りならば0~21しかないはずなのですが

Segnetを動かしてみたい
の「質問への追記・修正の依頼」に、同じエラーが書かれてました
segmentedに、ルールに反した画像が混入してるのを疑った方がいいかもしれません

python

1 image = np.where(image ==255, max_class-1,image)

の次に

python

1 if np.max(image) > 21: 2 print(file_path + " max: " + str(np.max(image)))

を追加すれば、どのファイルが21よりも大きな値を持っているのかが分かります

投稿2021/02/28 14:08

jbpb0

総合スコア7653

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問