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