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

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

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

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

Q&A

解決済

1回答

1255閲覧

画像分割の仕組みについて

ques346

総合スコア47

Python

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

0グッド

0クリップ

投稿2021/06/08 00:28

python

1from google.colab import drive 2drive.mount('/content/drive') 3 4import sys 5import numpy as np 6 7sys.path.append('/content/drive/My Drive') 8 9import ActivationFunction as AF 10from PIL import Image 11 12# PILで開いたうえでデータをNumpy形式にする 13# (例えばJPEGは圧縮されていてNumpyな配列になっていないので、 14# そこからNumpyのデータ空間(?)に持ってくる必要がある) 15tefilename = "test2.png" 16teimg = Image.open("drive/My Drive/mnist_dataset/" + tefilename) 17teimg = teimg.resize((10, 10)) 18teimg = np.asarray(teimg) 19 20size = 5 21 22v_split = img.shape[0] // size 23h_split = img.shape[1] // size 24out_img = [] 25[out_img.extend(np.hsplit(h_img, h_split)) 26 for h_img in np.vsplit(img, v_split)] 27 28plt.subplot(17, 6, 1).imshow(out_img[1]) 29plt.subplot(17, 6, 2).imshow(out_img[2]) 30plt.subplot(17, 6, 3).imshow(out_img[3]) 31plt.subplot(17, 6, 4).imshow(out_img[4]) 32plt.subplot(17, 6, 5).imshow(out_img[5]) 33plt.subplot(17, 6, 6).imshow(out_img[6]) 34plt.subplot(17, 6, 7).imshow(out_img[7]) 35plt.subplot(17, 6, 8).imshow(out_img[8]) 36plt.subplot(17, 6, 9).imshow(out_img[9]) 37plt.subplot(17, 6, 10).imshow(out_img[10]) 38plt.subplot(17, 6, 11).imshow(out_img[11]) 39plt.subplot(17, 6, 12).imshow(out_img[12]) 40plt.subplot(17, 6, 13).imshow(out_img[13]) 41plt.subplot(17, 6, 14).imshow(out_img[14]) 42plt.subplot(17, 6, 15).imshow(out_img[15]) 43plt.subplot(17, 6, 16).imshow(out_img[16]) 44plt.subplot(17, 6, 17).imshow(out_img[17]) 45plt.subplot(17, 6, 18).imshow(out_img[18]) 46plt.subplot(17, 6, 19).imshow(out_img[19]) 47plt.subplot(17, 6, 20).imshow(out_img[20]) 48plt.subplot(17, 6, 21).imshow(out_img[21]) 49plt.subplot(17, 6, 22).imshow(out_img[22]) 50plt.subplot(17, 6, 23).imshow(out_img[23]) 51plt.subplot(17, 6, 24).imshow(out_img[24]) 52plt.subplot(17, 6, 25).imshow(out_img[25]) 53plt.subplot(17, 6, 26).imshow(out_img[26]) 54plt.subplot(17, 6, 27).imshow(out_img[27]) 55plt.subplot(17, 6, 28).imshow(out_img[28]) 56plt.subplot(17, 6, 29).imshow(out_img[29]) 57plt.subplot(17, 6, 30).imshow(out_img[30]) 58plt.subplot(17, 6, 31).imshow(out_img[31]) 59plt.subplot(17, 6, 32).imshow(out_img[32]) 60 61def extract(x, y): 62 # カラー画像の時Gだけ抜き取りたい 63 if len(x.shape) == 3: 64 h, w, ch = x.shape 65 66 # RGBのGだけ抜き取りたい 67 return x[:,:,y] 68 69v_max, v_min = 300, 200 70 71def diff(x): 72 imgrows, lenrows, imgcolumns, lencolumns = [], [], [], [] 73 for (img, imgt) in zip(x, x.T): 74 rows = img[(v_min<img)&(v_max>img)] 75 columns = imgt[(v_min<imgt)&(v_max>imgt)] 76 imgrows.append(rows) 77 lenrows.append(len(rows)) 78 imgcolumns.append(columns) 79 lencolumns.append(len(columns)) 80 return lenrows + lencolumns 81 82test_data_list = [] 83 84test_data_list.append([0] + diff(extract(teimg, 1)) + diff(extract(teimg, 2)) + diff(extract(teimg, 0))) # 略 85 86print("test_data_list[0][1:]" ,test_data_list[0][1:]) 87print("test_data_list" ,test_data_list) 88 89# 見本データに対しても同様に 90# exについて同様に 91training_data_list = [] 92 93for i in range(10): 94 for e in range(1): 95 trad = Image.open("drive/My Drive/mnist_dataset/" + str(10*i+e) + ".png") 96 trad = trad.resize((10, 10)) 97 trad = np.asarray(trad) 98 #g #b #r 抽出後diffしてappend 99 training_data_list.append([i] + diff(extract(trad, 1)) + diff(extract(trad, 2)) + diff(extract(trad, 0))) # 略 100 101print("training_data_list" ,training_data_list) 102print("training_data_list[1:]" ,training_data_list[1:]) 103 104# 3層ニューラルネットワーク 105class ThreeLayerNetwork: 106 # コンストラクタ 107 def __init__(self, inodes, hnodes, onodes, lr): 108 # 各レイヤーのノード数 109 self.inodes = inodes 110 self.hnodes = hnodes 111 self.onodes = onodes 112 113 # 学習率 114 self.lr = lr 115 116 # 重みの初期化 117 self.w_ih = np.random.normal(0.0, 1.0, (self.hnodes, self.inodes)) 118 self.w_ho = np.random.normal(0.0, 1.0, (self.onodes, self.hnodes)) 119 120 # 活性化関数 121 self.af = AF.sigmoid 122 self.daf = AF.derivative_sigmoid 123 124 # 誤差逆伝搬 125 def backprop(self, idata, tdata): 126 127 # 縦ベクトルに変換 128 o_i = np.array(idata, ndmin=2).T 129 t = np.array(tdata, ndmin=2).T 130 131 # 隠れ層 132 np.set_printoptions(threshold=10000) 133 x_h = np.dot(self.w_ih, o_i) 134 o_h = self.af(x_h) 135 136 # 出力層 137 x_o = np.dot(self.w_ho, o_h) 138 o_o = self.af(x_o) 139 140 # 誤差計算 141 e_o = (t - o_o) 142 e_h = np.dot(self.w_ho.T, e_o) 143 144 # 重みの更新 145 self.w_ho += self.lr * np.dot((e_o * self.daf(o_o)), o_h.T) 146 self.w_ih += self.lr * np.dot((e_h * self.daf(o_h)), o_i.T) 147 148 149 # 順伝搬 150 def feedforward(self, idata): 151 # 入力のリストを縦ベクトルに変換 152 o_i = np.array(idata, ndmin=2).T 153 154 # 隠れ層 155 x_h = np.dot(self.w_ih, o_i) 156 o_h = self.af(x_h) 157 158 # 出力層 159 x_o = np.dot(self.w_ho, o_h) 160 o_o = self.af(x_o) 161 162 return o_o 163 164if __name__=='__main__': 165 # パラメータ 166 #inodes=784から59+1に変更 167 inodes = 60 168 hnodes = 100 169 onodes = 10 170 lr = 0.3 171 172 # ニューラルネットワークの初期化 173 nn = ThreeLayerNetwork(inodes, hnodes, onodes, lr) 174 175 # 学習 176 epoch = 50000 177 for e in range(epoch): 178 print('#epoch ', e) 179 data_size = len(training_data_list) 180 for i in range(data_size): 181 if i % 1000 == 0: 182 print(' train: {0:>5d} / {1:>5d}'.format(i, data_size)) 183 idata = (np.array(training_data_list[i][1:]) / 255.0 * 0.99) + 0.01 184 # 変更の余地あり 185 tdata = np.zeros(onodes) + 0.01 186 tdata[training_data_list[i][0]] = 0.99 187 nn.backprop(idata, tdata) 188 pass 189 pass 190 191 # テスト 192 scoreboard = [] 193 for record in test_data_list: 194 idata = (np.array(test_data_list[0][1:]) / 255.0 * 0.99) + 0.01 195 predict = nn.feedforward(idata) 196 plabel = np.argmax(predict) 197 print("predict" ,predict) 198 print("plabel" ,plabel) 199 pass 200 201 scoreboard_array = np.asarray(scoreboard) 202 print('performance: ', scoreboard_array.sum() / scoreboard_array.size)

この学習とテストについて、ここで、あらかじめ用意しておいた(が使っていない)
分割画像out_img[0],out_img[1],out_img[2],out_img[3],・・・,out_img[20]?(100,100resizeして5で分割してるから20個あります・・・よね?)

しかしplt.subplot(17, 6, 32).imshow(out_img[32])と、32まで出してもエラーが出ないんですが、なぜでしょう?

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

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

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

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

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

1T2R3M4

2021/06/08 00:40 編集

ご自分で書いたコードではないのですか。
quickquip

2021/06/08 00:51 編集

コードがこれだと v_split = img.shape[0] // size の行でimgのNameErrorが起きるはず。 動かしているコードが別のものだった、などを疑うべき。 (他にはJupyter等で動かしていて、これより前に動かしたコードがあった、とか)
jbpb0

2021/06/08 00:57 編集

v_split = img.shape[0] // size imgって? teimgはあるけど > 100,100resizeして どこで? teimg = teimg.resize((10, 10)) はあるけど
jbpb0

2021/06/08 02:50 編集

仮に、teimgとimgが同じもので、 teimg = teimg.resize((10, 10)) ではなく > 100,100resizeして をやってるとして、imgが100x100のデータなら、縦横それぞれを 100//5=20 に分割するのだから、分割後のout_imgは、 > 20個あります・・・よね? ではなくて、20x20=400ある > 32まで出してもエラーが出ないんですが、なぜでしょう? 400あるから (本当に実行してるコード次第ですが) plt.subplot(17, 6, 1).imshow(out_img[1]) の上に print(len(out_img)) を追加したら、out_imgがいくつあるか分かる
ques346

2021/06/08 04:31

別のものだったかも知れません、いずれにせよ、 10,10でも25個あるんですねなるほど。
jbpb0

2021/06/08 04:41 編集

> 10,10でも25個ある 縦横それぞれを 10//5=2 に分割だから、2x2=4しかない 何個に分けるのかはv_split, h_splitです sizeではない
quickquip

2021/06/09 02:03

質問のコードと本分のつじつまがあってないからどういうことなの? って言われているのに「確かに」とは……?
guest

回答1

0

ベストアンサー

teimgとimgが同じもので、
teimg = teimg.resize((10, 10))
ではなく

100,100resizeして

をやってるとして、imgが100x100のデータなら、縦横それぞれを
100//5=20
に分割するのだから、分割後のout_imgは、

20個あります・・・よね?

ではなくて、20x20=400ある

32まで出してもエラーが出ないんですが、なぜでしょう?

400あるから
(本当に実行してるコード次第ですが)

python

1plt.subplot(17, 6, 1).imshow(out_img[1])

の上に

python

1print(len(out_img))

を追加したら、out_imgがいくつあるか分かる

投稿2021/06/09 02:06

jbpb0

総合スコア7653

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問