回答編集履歴

1

追補

2020/01/10 12:34

投稿

退会済みユーザー
test CHANGED
@@ -1,3 +1,303 @@
1
+ 追補
2
+
3
+ ---
4
+
5
+ 補完方法にどれだけ差があるか試したことがなかったため、KERASの方法を正としてOpenCV、PILの方法を比較しました。
6
+
7
+ ![イメージ説明](bd16cabd9868535b4744ea67f036f16d.png)
8
+
9
+ 結果: 補完方法による「差はない」は言い過ぎですが、**データ増強の変化量と比べればないも同然程度の差**しかありませんでした。
10
+
11
+ ![イメージ説明](fdafc3e9033f9850e357160d9bc944d0.png)
12
+
13
+ ```Python3
14
+
15
+ from PIL import Image
16
+
17
+ import cv2
18
+
19
+ import os
20
+
21
+ import numpy as np
22
+
23
+
24
+
25
+ from keras.preprocessing.image import ImageDataGenerator,img_to_array
26
+
27
+
28
+
29
+ path = ".\lenna.png"
30
+
31
+ size = (256,256)
32
+
33
+
34
+
35
+ def PIL2OpenCV(img):
36
+
37
+ img = np.asarray(img)
38
+
39
+ if len(img.shape)==3:
40
+
41
+ # RGB --> BGR
42
+
43
+ img = cv2.cvtColor(img,cv2.COLOR_RGB2BGR)
44
+
45
+ return img
46
+
47
+
48
+
49
+ def pure_PIL(path,size):
50
+
51
+ img_PIL = Image.open(path)
52
+
53
+ img_PIL = img_PIL.resize(size)
54
+
55
+
56
+
57
+ return PIL2OpenCV(img_PIL)
58
+
59
+
60
+
61
+ def pure_OpenCV(path,size,flag):
62
+
63
+ img_OpenCV = cv2.imread(path)
64
+
65
+ img_OpenCV = cv2.resize(img_OpenCV,size,interpolation=flag)
66
+
67
+ return img_OpenCV
68
+
69
+
70
+
71
+ def by_keras(path,size):
72
+
73
+ img_by_keras = ImageDataGenerator.flow_from_directory(path,target_size=size)
74
+
75
+ print(img_by_keras)
76
+
77
+ return img_by_keras
78
+
79
+
80
+
81
+ if __name__=="__main__":
82
+
83
+
84
+
85
+ img_by_keras = pure_OpenCV(path,size,cv2.INTER_LANCZOS4)
86
+
87
+ # cv2.imshow("KERAS",cv2.absdiff(img_by_keras,img_by_keras))
88
+
89
+
90
+
91
+ img_PIL = pure_PIL(path,size)
92
+
93
+ # cv2.imshow("PIL",cv2.absdiff(img_by_keras,img_PIL))
94
+
95
+
96
+
97
+ img_nearest = pure_OpenCV(path,size,cv2.INTER_NEAREST)
98
+
99
+ # cv2.imshow("OpenCV (NEAREST)",cv2.absdiff(img_by_keras,img_nearest))
100
+
101
+
102
+
103
+ img_linear = pure_OpenCV(path,size,cv2.INTER_LINEAR)
104
+
105
+ # cv2.imshow("OpenCV (LINEAR)",cv2.absdiff(img_by_keras,img_linear))
106
+
107
+
108
+
109
+ img_cubic = pure_OpenCV(path,size,cv2.INTER_CUBIC)
110
+
111
+ # cv2.imshow("OpenCV (CUBIC)",cv2.absdiff(img_by_keras,img_cubic))
112
+
113
+
114
+
115
+ img_area = pure_OpenCV(path,size,cv2.INTER_AREA)
116
+
117
+ # cv2.imshow("OpenCV (AREA)",cv2.absdiff(img_by_keras,img_area))
118
+
119
+
120
+
121
+ img_lanczos = pure_OpenCV(path,size,cv2.INTER_LANCZOS4)
122
+
123
+ # cv2.imshow("OpenCV (LANCZOS4)",cv2.absdiff(img_by_keras,img_lanczos))
124
+
125
+
126
+
127
+ # img_strange = img_to_array(img_nearest)
128
+
129
+ # cv2.imshow("STRANGE CODE",img_strange)
130
+
131
+
132
+
133
+ img_stacked = np.hstack((cv2.absdiff(img_by_keras,img_by_keras),
134
+
135
+ cv2.absdiff(img_by_keras,img_PIL),
136
+
137
+ cv2.absdiff(img_by_keras,img_nearest),
138
+
139
+ cv2.absdiff(img_by_keras,img_linear),
140
+
141
+ cv2.absdiff(img_by_keras,img_cubic),
142
+
143
+ cv2.absdiff(img_by_keras,img_area),
144
+
145
+ cv2.absdiff(img_by_keras,img_lanczos)
146
+
147
+ ))
148
+
149
+ cv2.imwrite("./stacked.png",img_stacked)
150
+
151
+ cv2.imshow("KERAS/PIL/NEAREST/LINEAR/CUBIC/AREA/LANCZOS/STRANGE",img_stacked)
152
+
153
+
154
+
155
+ cv2.waitKey(0)
156
+
157
+ ```
158
+
159
+ また、
160
+
161
+ > 学習した特徴量(kerasでリサイズ)がモデルを使用するときの画像(opencvでリサイズ)に使えない状態
162
+
163
+
164
+
165
+ これについて検証するため、掲載のコードを手元のWindowsで動くように若干修正したのが以下のコードです。
166
+
167
+ 結果: OpenCVではBGRに対して、PILではRGBでデータが格納されています。この違いにより、PIL経由でデータを表示させたものは異常な色になりました。これが学習がうまくいかなかった原因と思われます。
168
+
169
+ これを防ぐには、上記の`PIL2OpenCV`をかませる等で対応してください。
170
+
171
+
172
+
173
+ ![イメージ説明](3f3178bf3d15a9400aa3de083897892f.png)
174
+
175
+ ```Python3
176
+
177
+ from PIL import Image
178
+
179
+ import cv2
180
+
181
+ import os
182
+
183
+ import numpy as np
184
+
185
+
186
+
187
+ from keras.preprocessing.image import ImageDataGenerator,img_to_array
188
+
189
+
190
+
191
+ path = ".\lenna.png"
192
+
193
+ size = (256,256)
194
+
195
+
196
+
197
+ def PIL2OpenCV(img):
198
+
199
+ img = np.asarray(img)
200
+
201
+ if len(img.shape)==3:
202
+
203
+ # RGB --> BGR
204
+
205
+ img = cv2.cvtColor(img,cv2.COLOR_RGB2BGR)
206
+
207
+ return img
208
+
209
+
210
+
211
+ def pure_PIL(path,size):
212
+
213
+ img_PIL = Image.open(path)
214
+
215
+ img_PIL = img_PIL.resize(size)
216
+
217
+
218
+
219
+ return PIL2OpenCV(img_PIL)
220
+
221
+
222
+
223
+ def pure_OpenCV(path,size,flag):
224
+
225
+ img_OpenCV = cv2.imread(path)
226
+
227
+ img_OpenCV = cv2.resize(img_OpenCV,size,interpolation=flag)
228
+
229
+ return img_OpenCV
230
+
231
+
232
+
233
+ def by_keras(path,size):
234
+
235
+ img_by_keras = ImageDataGenerator.flow_from_directory(path,target_size=size)
236
+
237
+ print(img_by_keras)
238
+
239
+ return img_by_keras
240
+
241
+
242
+
243
+ if __name__=="__main__":
244
+
245
+
246
+
247
+ img_by_keras = pure_OpenCV(path,size,cv2.INTER_LANCZOS4)
248
+
249
+ cv2.imshow("KERAS",cv2.absdiff(img_by_keras,img_by_keras))
250
+
251
+ img_PIL = pure_PIL(path,size)
252
+
253
+ cv2.imshow("PIL",cv2.absdiff(img_by_keras,img_PIL))
254
+
255
+
256
+
257
+ img_OpenCV = pure_OpenCV(path,size,cv2.INTER_NEAREST)
258
+
259
+ cv2.imshow("OpenCV (NEAREST)",cv2.absdiff(img_by_keras,img_OpenCV))
260
+
261
+
262
+
263
+ img_OpenCV = pure_OpenCV(path,size,cv2.INTER_LINEAR)
264
+
265
+ cv2.imshow("OpenCV (LINEAR)",cv2.absdiff(img_by_keras,img_OpenCV))
266
+
267
+
268
+
269
+ img_OpenCV = pure_OpenCV(path,size,cv2.INTER_CUBIC)
270
+
271
+ cv2.imshow("OpenCV (CUBIC)",cv2.absdiff(img_by_keras,img_OpenCV))
272
+
273
+
274
+
275
+ img_OpenCV = pure_OpenCV(path,size,cv2.INTER_AREA)
276
+
277
+ cv2.imshow("OpenCV (AREA)",cv2.absdiff(img_by_keras,img_OpenCV))
278
+
279
+
280
+
281
+ img_OpenCV = pure_OpenCV(path,size,cv2.INTER_LANCZOS4)
282
+
283
+ cv2.imshow("OpenCV (LANCZOS4)",cv2.absdiff(img_by_keras,img_OpenCV))
284
+
285
+
286
+
287
+ img_OpenCV = img_to_array(img_OpenCV)
288
+
289
+ cv2.imshow("STRANGE CODE",img_OpenCV)
290
+
291
+
292
+
293
+ cv2.waitKey(0)
294
+
295
+ ```
296
+
297
+ ---
298
+
299
+
300
+
1
301
  **■リファレンスの情報**
2
302
 
3
303
  - [Kerasのload_imgのリサイズはパスを入れて**PIL形式を返す**](https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/image/load_img)です。