前提・実現したいこと
・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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。