yupikopi commited on
Commit
e27e000
·
1 Parent(s): a5bfc58

Create generate_image.py

Browse files
Files changed (1) hide show
  1. generate_image.py +300 -0
generate_image.py ADDED
@@ -0,0 +1,300 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # TensorFlow と tf.keras のインポート
2
+ import tensorflow as tf
3
+ from tensorflow import keras
4
+
5
+ # ヘルパーライブラリのインポート
6
+ import numpy as np
7
+ import matplotlib.pyplot as plt
8
+
9
+ import os
10
+ import pathlib
11
+ import time
12
+ import datetime
13
+ import glob
14
+ import random
15
+ import cv2
16
+
17
+ from PIL import Image
18
+ from IPython import display
19
+
20
+ def saved_images(model, test_input, number):
21
+ prediction = model(test_input, training=False)
22
+ if CHANNEL == 1:
23
+ predict_image = prediction[0].numpy().flatten().reshape(256, 256) # モノクロ画像の場合
24
+ plt.imsave('predict_images/predict_{}.jpg'.format(number), predict_image, cmap="gray")
25
+ else:
26
+ predict_image = prediction[0].numpy().flatten().reshape(256, 256, 3)
27
+ plt.imsave('predict_images/predict_{}.jpg'.format(number), predict_image)
28
+
29
+
30
+ # 学習に使うデータローダー
31
+ def read_single_image(dataset, batch_size=1, size=256):
32
+ train_image_dataset = dataset
33
+
34
+ batch_input = [] # 入力画像のバッチ
35
+
36
+ for pd in train_image_dataset:
37
+ input = pd[0] # 実態は入力画像のパス
38
+
39
+ # モノクロ画像の場合、モノクロ画像として画像を取得
40
+ if CHANNEL == 1:
41
+ input = Image.open(input).convert("L")
42
+ input = input.resize((256, 256))
43
+ else:
44
+ input = Image.open(input)
45
+ input = input.resize((256, 256))
46
+ # 入力画像の形式(シェイプ)をtensorflow、kerasで学習,推論するために変換
47
+ input = np.reshape(input, [1, size, size, CHANNEL])
48
+ # 入力画像をテンソルに変換
49
+ input = tf.cast(tf.convert_to_tensor(np.asarray(input)), dtype=tf.float32) / 255.
50
+
51
+ # 入力画像のバッチ
52
+ batch_input += [input]
53
+
54
+ # 今回はバッチサイズは1なので、単純にペアの画像を返しているだけ
55
+ if len(batch_input) == batch_size:
56
+ batch_input = tf.concat(batch_input, axis=0)
57
+
58
+ yield {'input': batch_input}
59
+ batch_input = []
60
+
61
+ def test_data_loader(batch_size=1):
62
+ input_paths = sorted(glob.glob(os.path.join(str(PATH), '*.png'))) # QRコード画
63
+ # input_paths = sorted(glob.glob(os.path.join(str(PATH) + "/test/" , 'tr*.jpg'))) # 数字画像
64
+ records = []
65
+ for input in input_paths:
66
+ records += [[input]]
67
+
68
+ return read_single_image(records, batch_size=batch_size)
69
+
70
+ # デコーダーの定義に使用
71
+ def upsample(filters, size, dropout=0.5, max_pool=True, batch_norm=True):
72
+ initializer = tf.random_normal_initializer(0., 0.02)
73
+
74
+ result = tf.keras.Sequential()
75
+ result.add(
76
+ # 畳み込み層の追加(アップサンプルに使用)
77
+ tf.keras.layers.Conv2DTranspose(filters, size, strides=2,
78
+ padding='same',
79
+ kernel_initializer=initializer,
80
+ use_bias=False)
81
+ )
82
+
83
+ # max poolingを行う場合
84
+ if max_pool:
85
+ result.add(tf.keras.layers.MaxPool2D(pool_size=(1, 1), strides=None, padding='same'))
86
+
87
+ # バッチノルムを行う場合
88
+ if batch_norm:
89
+ result.add(tf.keras.layers.BatchNormalization())
90
+
91
+ # ドロップアウトを行う場合
92
+ if dropout != None:
93
+ result.add(tf.keras.layers.Dropout(dropout))
94
+ result.add(tf.keras.layers.ReLU())
95
+
96
+ return result
97
+
98
+ # エンコーダーの定義に使用
99
+ def downsample(filters, kernel_size, strides=2, dropout=0.5, max_pool=True, batch_norm=True):
100
+ initializer = tf.random_normal_initializer(0., 0.02)
101
+
102
+ result = tf.keras.Sequential()
103
+ result.add(
104
+ # 畳み込み層の追加
105
+ tf.keras.layers.Conv2D(filters, kernel_size, strides=strides, padding='same',
106
+ kernel_initializer=initializer, use_bias=False))
107
+ # max poolingを行う場合
108
+ if max_pool:
109
+ result.add(tf.keras.layers.MaxPool2D(pool_size=(1, 1), strides=None, padding='same'))
110
+
111
+ # バッチノルムを行う場合
112
+ if batch_norm:
113
+ result.add(tf.keras.layers.BatchNormalization())
114
+
115
+ # ドロップアウトを行う場合
116
+ if dropout != None:
117
+ result.add(tf.keras.layers.Dropout(dropout))
118
+
119
+ result.add(tf.keras.layers.LeakyReLU())
120
+ return result
121
+
122
+ # ジェネレーターのネットワークの定義
123
+ def Generator(image_shape):
124
+ initializer = tf.random_normal_initializer(0., 0.02)
125
+ # 入力画像
126
+ input_image = keras.layers.Input(shape=image_shape, name='input_image')
127
+ x = input_image
128
+
129
+ # エンコーダーの定義
130
+ enc1 = downsample(n_E1, kernel_size_E1, stride_E1, DropOut_E1, MaxPooling_E1, BatchNorm_E1)(x) # 正体は単純な畳み込み層
131
+ enc2 = downsample(n_E2, kernel_size_E2 ,stride_E2, DropOut_E2, MaxPooling_E2, BatchNorm_E2)(enc1)
132
+ enc3 = downsample(n_E3, kernel_size_E3, stride_E3, DropOut_E3, MaxPooling_E3, BatchNorm_E3)(enc2)
133
+ enc4 = downsample(n_E4, kernel_size_E4, stride_E4, DropOut_E4, MaxPooling_E4, BatchNorm_E4)(enc3)
134
+ enc5 = downsample(n_E5, kernel_size_E5 ,stride_E5, DropOut_E5, MaxPooling_E5, BatchNorm_E5)(enc4)
135
+ enc6 = downsample(n_E6, kernel_size_E6 ,stride_E6, DropOut_E6, MaxPooling_E6, BatchNorm_E6)(enc5)
136
+ enc7 = downsample(n_E7, kernel_size_E7 ,stride_E7, DropOut_E7, MaxPooling_E7, BatchNorm_E7)(enc6)
137
+ enc8 = downsample(n_E8, kernel_size_E8, stride_E8, DropOut_E8, MaxPooling_E8, BatchNorm_E8)(enc7)
138
+
139
+ # デコーダーの定義
140
+ dec1 = upsample(n_E7, kernel_size_E7, DropOut_E7, MaxPooling_E7, BatchNorm_E7) # 正体は単純な畳み込み層
141
+ dec2 = upsample(n_E6, kernel_size_E6, DropOut_E6, MaxPooling_E6, BatchNorm_E6)
142
+ dec3 = upsample(n_E5, kernel_size_E5, DropOut_E5, MaxPooling_E5, BatchNorm_E5)
143
+ dec4 = upsample(n_E4, kernel_size_E4, DropOut_E4, MaxPooling_E4, BatchNorm_E4)
144
+ dec5 = upsample(n_E3, kernel_size_E3, DropOut_E3, MaxPooling_E3, BatchNorm_E3)
145
+ dec6 = upsample(n_E2, kernel_size_E2, DropOut_E2, MaxPooling_E2, BatchNorm_E2)
146
+ dec7 = upsample(n_E1, kernel_size_E1, DropOut_E1, MaxPooling_E1, BatchNorm_E1)
147
+
148
+
149
+ # 画像を拡大する場合コメントアウト
150
+ # zoom = upsample(CHANNEL, 4)
151
+
152
+ # バイパスするエンコーダーの特徴量
153
+ enc_value_list = [enc7, enc6, enc5, enc4, enc3, enc2, enc1]
154
+
155
+ # バイパスするデコーダーの特徴量
156
+ dec_value_list = [dec1, dec2, dec3, dec4, dec5, dec6, dec7]
157
+
158
+ # バイパスを行うか判定するフラグ
159
+ bipass_list = [Bipass_7, Bipass_6, Bipass_5, Bipass_4, Bipass_3, Bipass_2, Bipass_1]
160
+
161
+ # バイパス処理のためにエンコーダーの最終出力をxとする
162
+ x = enc8
163
+
164
+ # バイパス処理を行っている部分
165
+ for dec, enc, bipass in zip(dec_value_list, enc_value_list, bipass_list):
166
+ x = dec(x)
167
+ # バイパスを行うかを判定する
168
+ if bipass:
169
+ x = tf.keras.layers.Concatenate()([x, enc]) # バイパスしている行
170
+
171
+ # 画像を拡大する場合コメントを外す
172
+ # if expantion:
173
+ # x = zoom(x)
174
+
175
+ # 出力のチャネル数、カラーだと3、モノクロだと1
176
+ OUTPUT_CHANNELS = CHANNEL
177
+
178
+ # 層の乱数を初期化するもの
179
+ initializer = tf.random_normal_initializer(0., 0.02)
180
+
181
+ # 最終出力層
182
+ last = tf.keras.layers.Conv2DTranspose(OUTPUT_CHANNELS, 4,
183
+ strides=2,
184
+ padding='same',
185
+ kernel_initializer=initializer,
186
+ activation='tanh')
187
+ x = last(x)
188
+
189
+ return tf.keras.Model(inputs=input_image, outputs=x)
190
+
191
+ CHANNEL = 1
192
+ # 入力画像サイズ
193
+ G_input_dim = (256, 256, CHANNEL)
194
+ EPOCH = 20
195
+
196
+ # 第1層目のパラメータ
197
+ n_E1 = 32 # チャネル数
198
+ m_E1 = 128 # 画素数
199
+ stride_E1 = 2 # ストライドのサイズ
200
+ kernel_size_E1 = 4 # カーネルサイズ
201
+ MaxPooling_E1 = True # MaxPoolingの設定(MaxPoolingを行わない場合はNoneにする)🇲
202
+ ActivationFunc_E1 = "Leaky_ReLu" # 活性化関数
203
+ BatchNorm_E1 = True #  バッチ正規化の設定(正規化を行わない場合はNoneにする)
204
+ DropOut_E1 = 0.5 # ドロップアウトの設定(ドロップアウトを行わない場合はNoneにする)
205
+ Bipass_1 = True # バイパスの設定(バイパスを行わない場合はNoneにする)
206
+
207
+ # 第2層目のパラメーター
208
+ n_E2 = 64 # チャネル数
209
+ m_E2 = 64 # 画素数
210
+ stride_E2 = 2 # ストライドのサイズ
211
+ kernel_size_E2 = 4 # カーネルサイズ
212
+ MaxPooling_E2 = True # MaxPoolingの設定(MaxPoolingを行わない場合はNoneにする)🇲
213
+ ActivationFunc_E2 = "Leaky_ReLu" # 活性化関数
214
+ alfa = 0.2
215
+ BatchNorm_E2 = True #  バッチ正規化の設定(正規化を行わない場合はNoneにする)
216
+ DropOut_E2 = 0.5 # ドロップアウトの設定(ドロップアウトを行わない場合はNoneにする)
217
+ Bipass_2 = True # バイパスの設定(バイパスを行わない場合はNoneにする)
218
+
219
+ # 第3層目のパラメーター
220
+ n_E3 = 128 # チャネル数
221
+ m_E3 = 128 # 画素数
222
+ stride_E3 = 2 # ストライドのサイズ
223
+ kernel_size_E3 = 4 # カーネルサイズ
224
+ MaxPooling_E3 = True # MaxPoolingの設定(MaxPoolingを行わない場合はNoneにする)🇲
225
+ ActivationFunc_E3 = "Leaky_ReLu" # 活性化関数
226
+ alfa = 0.2
227
+ BatchNorm_E3 = True #  バッチ正規化の設定(正規化を行わない場合はNoneにする)
228
+ DropOut_E3 = 0.5 # ドロップアウトの設定(ドロップアウトを行わない場合はNoneにする)
229
+ Bipass_3 = True # バイパスの設定(バイパスを行わない場合はNoneにする)
230
+
231
+ # 第4層目のパラメーター
232
+ n_E4 = 256 # チャネル数
233
+ m_E4 = 256 # 画素数
234
+ stride_E4 = 2 # ストライドのサイズ
235
+ kernel_size_E4 = 4 # カーネルサイズ
236
+ MaxPooling_E4 = True # MaxPoolingの設定(MaxPoolingを行わない場合はNoneにする)🇲
237
+ ActivationFunc_E4 = "Leaky_ReLu" # 活性化関数
238
+ alfa = 0.2
239
+ BatchNorm_E4 = True #  バッチ正規化の設定(正規化を行わない場合はNoneにする)
240
+ DropOut_E4 = 0.5 # ドロップアウトの設定(ドロップアウトを行わない場合はNoneにする)
241
+ Bipass_4 = True # バイパスの設定(バイパスを行わない場合はNoneにする)
242
+
243
+ # 第5層目のパラメーター
244
+ n_E5 = 512 # チャネル数
245
+ m_E5 = 512 # 画素数
246
+ stride_E5 = 2 # ストライドのサイズ
247
+ kernel_size_E5 = 4 # カーネルサイズ
248
+ MaxPooling_E5 = True # MaxPoolingの設定(MaxPoolingを行わない場合はNoneにする)🇲
249
+ ActivationFunc_E5 = "Leaky_ReLu" # 活性化関数
250
+ alfa = 0.2
251
+ BatchNorm_E5 = True #  バッチ正規化の設定(正規化を行わない場合はNoneにする)
252
+ DropOut_E5 = 0.5 # ドロップアウトの設定(ドロップアウトを行わない場合はNoneにする)
253
+ Bipass_5 = True # バイパスの設定(バイパスを行わない場合はNoneにする)
254
+
255
+ # 第6層目のパラメーター
256
+ n_E6 = 512 # チャネル数
257
+ m_E6 = 512 # 画素数
258
+ stride_E6 = 2 # ストライドのサイズ
259
+ kernel_size_E6 = 4 # カーネルサイズ
260
+ MaxPooling_E6 = True # MaxPoolingの設定(MaxPoolingを行わない場合はNoneにする)🇲
261
+ ActivationFunc_E6 = "Leaky_ReLu" # 活性化関数
262
+ alfa = 0.2
263
+ BatchNorm_E6 = True #  バッチ正規化の設定(正規化を行わない場合はNoneにする)
264
+ DropOut_E6 = 0.5 # ドロップアウトの設定(ドロップアウトを行わない場合はNoneにする)
265
+ Bipass_6 = True # バイパスの設定(バイパスを行わない場合はNoneにする)
266
+
267
+ # 第7層目のパラメーター
268
+ n_E7 = 512 # チャネル数
269
+ m_E7 = 512 # 画素数
270
+ stride_E7 = 2 # ストライドのサイズ
271
+ kernel_size_E7 = 4 # カーネルサイズ
272
+ MaxPooling_E7 = True # MaxPoolingの設定(MaxPoolingを行わない場合はNoneにする)🇲
273
+ ActivationFunc_E7 = "Leaky_ReLu" # 活性化関数
274
+ alfa = 0.2
275
+ BatchNorm_E7 = True #  バッチ正規化の設定(正規化を行わない場合はNoneにする)
276
+ DropOut_E7 = 0.5 # ドロップアウトの設定(ドロップアウトを行わない場合はNoneにする)
277
+ Bipass_7 = True # バイパスの設定(バイパスを行わない場合はNoneにする)
278
+
279
+
280
+ # 第8層目のパラメーター
281
+ n_E8 = 512 # チャネル数
282
+ m_E8 = 512 # 画素数
283
+ stride_E8 = 2 # ストライドのサイズ
284
+ kernel_size_E8 = 4 # カーネルサイズ
285
+ MaxPooling_E8 = True # MaxPoolingの設定(MaxPoolingを行わない場合はNoneにする)🇲
286
+ ActivationFunc_E8 = "Leaky_ReLu" # 活性化関数
287
+ alfa = 0.2
288
+ BatchNorm_E8 = True #  バッチ正規化の設定(正規化を行わない場合はNoneにする)
289
+ DropOut_E8 = 0.5 # ドロップアウトの設定(ドロップアウトを行わない場合はNoneにする)
290
+
291
+ # 画像拡大パラメータ
292
+ expantion = True # 画像をconv2dで2倍に拡大する
293
+
294
+ PATH = "bottle/test/broken_large"
295
+ generator = Generator(G_input_dim)
296
+ generator.load_weights('checkpoints/cp-20.h5')
297
+ test_generator = test_data_loader(batch_size=1)
298
+ for i, test_loader_dict in enumerate(test_generator):
299
+ example_input = test_loader_dict['input'] # 入力画像を取得する
300
+ saved_images(generator, example_input, i)