回答編集履歴

2

誤字の修正

2021/11/18 01:58

投稿

HRCo4
HRCo4

スコア140

test CHANGED
@@ -1,6 +1,6 @@
1
1
  (回答修正しました)
2
2
 
3
- コードと見ると、np.expand_dims を2回行っており、ネットワークの入力が1chということから、おそらくコードの参考元では1chのグレースケール画像を入力しており、今回試したのはカラーあるいは3chのグレースケール画像を入力しようとしたのではないでしょうか?
3
+ コードと見ると、np.expand_dims を2回行っていますね。ネットワークの入力が1chということから、おそらくコードの参考元では1chのグレースケール画像を入力しており、今回試したのはカラーあるいは3chのグレースケール画像を入力しようとしたのではないでしょうか?
4
4
 
5
5
 
6
6
 

1

補足追加

2021/11/18 01:58

投稿

HRCo4
HRCo4

スコア140

test CHANGED
@@ -1,31 +1,205 @@
1
+ (回答修正しました)
2
+
3
+ コードと見ると、np.expand_dims を2回行っており、ネットワークの入力が1chということから、おそらくコードの参考元では1chのグレースケール画像を入力しており、今回試したのはカラーあるいは3chのグレースケール画像を入力しようとしたのではないでしょうか?
4
+
5
+
6
+
1
- PreprocessedDatasetクラスで画像をロードするときに np.expand_dims を行っており、推論実行するときにまた np.expand_dims を行っているため、入力する画像の shape が (1, 1, h, w, ch) になっています。
7
+ おそらくPreprocessedDatasetクラスで画像をロードするときに np.expand_dims を行っており、推論実行するときにまた np.expand_dims を行っているため、入力する画像の shape が (1, 1, h, w, ch) になっています。
2
-
3
-
4
-
5
- pred = model.predictor(np.expand_dims(img, axis=0)) を
8
+
6
-
7
- pred = model.predictor(img) に
9
+
8
-
9
- 書き換えればよろしいかと。
10
+
10
-
11
-
12
-
13
- あと、chainer は確か入力が (batch, ch, h, w) 形式ったかと思います。
11
+ ネットワーク構成的に入力を1chにしなければならないで画像を読み込ん際にグレースケール化すれば問題ないかと思います。
14
-
12
+
13
+
14
+
15
- た、skimage の imread は (h, w, ch) の形式で読み込んだはずでので、
15
+ 修正したコードを記入しておきます
16
16
 
17
17
  ```
18
18
 
19
+ import os
20
+
21
+ import numpy as np
22
+
23
+ import skimage. io as io
24
+
25
+ from skimage.color import rgb2gray # 追加(グレースケール用)
26
+
27
+ import chainer
28
+
29
+ import chainer.links as L
30
+
31
+ import chainer.functions as F
32
+
33
+
34
+
35
+ class PreprocessedDataset(chainer.dataset.DatasetMixin):
36
+
37
+ def __init__(
38
+
39
+ self,
40
+
41
+ root_path,
42
+
43
+ split_list
44
+
45
+ ):
46
+
47
+ self.root_path = root_path
48
+
49
+ with open(split_list) as f:
50
+
51
+ self.split_list = [line.rstrip() for line in f]
52
+
53
+ self.dtype = np.float32
54
+
55
+
56
+
57
+ def __len__(self):
58
+
59
+ return len(self.split_list)
60
+
61
+
62
+
19
- def _get_image(self, i):
63
+ def _get_image(self, i):
20
64
 
21
65
  image = io.imread(os.path.join(self.root_path, self.split_list[i]))
22
66
 
23
67
  image = self._min_max_normalize_one_image(image)
24
68
 
69
+ if len(image.shape) == 3: # カラーあるいは3chグレスケ画像の場合は1chグレスケ化
70
+
25
- image = image.transpose(2,0,1)
71
+ image = rgb2gray(image) # (h, w, ch) -> (h, w)
26
-
72
+
27
- return np.expand_dims(image.astype(self.dtype), axis=0)
73
+ return np.expand_dims(image.astype(self.dtype), axis=0) # (h, w) -> (1, h, w)
74
+
75
+
76
+
77
+ def _min_max_normalize_one_image(self, image):
78
+
79
+ max_int = image.max()
80
+
81
+ min_int = image.min()
82
+
83
+ out = (image.astype(np.float32) - min_int) / (max_int - min_int)
84
+
85
+ return out
86
+
87
+
88
+
89
+ def _get_label(self, i):
90
+
91
+ label = 0 if 'false' in self.split_list[i] else 1
92
+
93
+ return label
94
+
95
+
96
+
97
+ def get_example(self, i):
98
+
99
+ x, y = self._get_image(i), self._get_label(i)
100
+
101
+ return x, y
102
+
103
+
104
+
105
+ class ClassificationModel(chainer.Chain):
106
+
107
+
108
+
109
+ def __init__(self, n_class=2):
110
+
111
+ super(ClassificationModel, self).__init__()
112
+
113
+ with self.init_scope():
114
+
115
+
116
+
117
+ self.conv1 = L.Convolution2D(1, 32, 5, 1, 2)
118
+
119
+ self.bn1 = L.BatchNormalization(32)
120
+
121
+ self.conv2 = L.Convolution2D(32, 64, 5, 1, 2)
122
+
123
+ self.bn2 = L.BatchNormalization(64)
124
+
125
+ self.conv3 = L.Convolution2D(64, 128, 3, 1, 1)
126
+
127
+ self.bn3 = L.BatchNormalization(128)
128
+
129
+ self.conv4 = L.Convolution2D(128, 256, 3, 1, 1)
130
+
131
+ self.bn4 = L.BatchNormalization(256)
132
+
133
+ self.fc5 = L.Linear(16384, 1024)
134
+
135
+ self.fc6 = L.Linear(1024, n_class)
136
+
137
+
138
+
139
+ def __call__(self, x):
140
+
141
+ h = F.relu(self.conv1(x)) ←#エラー箇所
142
+
143
+ h = F.max_pooling_2d(self.bn1(h), 2, 2)
144
+
145
+ h = F.relu(self.conv2(x))
146
+
147
+ h = F.max_pooling_2d(self.bn2(h), 2, 2)
148
+
149
+ h = F.relu(self.conv3(x))
150
+
151
+ h = F.max_pooling_2d(self.bn3(h), 2, 2)
152
+
153
+ h = F.relu(self.conv4(x))
154
+
155
+ h = F.max_pooling_2d(self.bn4(h), 2, 2)
156
+
157
+ h = F.dropout(F.relu(self.fc5(h)))
158
+
159
+ return self.fc6(h)
160
+
161
+
162
+
163
+ root_path = './dataset_cls'
164
+
165
+ split_list = './dataset_cls/split_list/test.txt'
166
+
167
+
168
+
169
+ test_dataset = PreprocessedDataset(root_path, split_list)
170
+
171
+
172
+
173
+ model = L.Classifier(ClassificationModel(n_class=2))
174
+
175
+
176
+
177
+ print('================')
178
+
179
+ for i in range(10):
180
+
181
+ with chainer.using_config('train', False):
182
+
183
+
184
+
185
+ img, label = test_dataset.get_example(i)
186
+
187
+
188
+
189
+ pred = model.predictor(np.expand_dims(img, axis=0)) # (1, h, w) -> (1, 1, h, w)
190
+
191
+
192
+
193
+ pred = F.softmax(pred)
194
+
195
+
196
+
197
+ print('test {}'.format(i + 1))
198
+
199
+ print(' pred: {}'.format(np.argmax(pred.data)))
200
+
201
+ print(' label: {}'.format(label))
202
+
203
+ print('================')
28
204
 
29
205
  ```
30
-
31
- のようにして、shape を (1, ch, h, w) にする必要があります。