bad commited on
Commit
95a2725
1 Parent(s): f7d7934

Update Generater.py

Browse files
Files changed (1) hide show
  1. Generater.py +39 -237
Generater.py CHANGED
@@ -1,240 +1,42 @@
1
-
2
  import numpy as np
3
- # import os
4
  import paddle
5
- import paddle.optimizer
6
- import paddle.nn as nn
7
- # from tqdm import tqdm
8
- # from paddle.io import Dataset
9
- # from paddle.io import DataLoader
10
  import paddle.nn.functional as F
11
- # import paddle.tensor as tensor
12
-
13
- class VGG19(nn.Layer):
14
- cfg = [
15
- 64, 64, 'M', 128, 128, 'M', 256, 256, 256, 256, 'M', 512, 512, 512, 512,'M', 512, 512, 512, 512, 'M']
16
-
17
- def __init__(self, output_index: int = 26) -> None:
18
- super().__init__()
19
- # arch = 'caffevgg19'
20
- # weights_path = get_path_from_url(model_urls[arch][0],
21
- # model_urls[arch][1])
22
- data_dict: dict = np.load("./vgg19_no_fc.npy",
23
- encoding='latin1',
24
- allow_pickle=True).item()
25
- self.features = self.make_layers(self.cfg, data_dict)
26
- del data_dict
27
- self.features = nn.Sequential(*self.features.sublayers()[:output_index])
28
- mean = paddle.to_tensor([103.939, 116.779, 123.68])
29
- self.mean = mean.unsqueeze(0).unsqueeze(-1).unsqueeze(-1)
30
-
31
- def _process(self, x):
32
- rgb = (x * 0.5 + 0.5) * 255 # value to 255
33
- bgr = paddle.stack((rgb[:, 2, :, :], rgb[:, 1, :, :], rgb[:, 0, :, :]),
34
- 1) # rgb to bgr
35
- return bgr - self.mean # vgg norm
36
-
37
- def _forward_impl(self, x):
38
- x = self._process(x)
39
- # NOTE get output with out relu activation
40
- x = self.features(x)
41
- return x
42
-
43
- def forward(self, x):
44
- return self._forward_impl(x)
45
-
46
- @staticmethod
47
- def get_conv_filter(data_dict, name):
48
- return data_dict[name][0]
49
-
50
- @staticmethod
51
- def get_bias(data_dict, name):
52
- return data_dict[name][1]
53
-
54
- @staticmethod
55
- def get_fc_weight(data_dict, name):
56
- return data_dict[name][0]
57
-
58
- def make_layers(self, cfg, data_dict, batch_norm=False) -> nn.Sequential:
59
- layers = []
60
- in_channels = 3
61
- block = 1
62
- number = 1
63
- for v in cfg:
64
- if v == 'M':
65
- layers += [nn.MaxPool2D(kernel_size=2, stride=2)]
66
- block += 1
67
- number = 1
68
- else:
69
- conv2d = nn.Conv2D(in_channels, v, kernel_size=3, padding=1)
70
- """ set value """
71
- weight = paddle.to_tensor(
72
- self.get_conv_filter(data_dict, f'conv{block}_{number}'))
73
- weight = weight.transpose((3, 2, 0, 1))
74
- bias = paddle.to_tensor(
75
- self.get_bias(data_dict, f'conv{block}_{number}'))
76
- conv2d.weight.set_value(weight)
77
- conv2d.bias.set_value(bias)
78
- number += 1
79
- if batch_norm:
80
- layers += [conv2d, nn.BatchNorm2D(v), nn.ReLU()]
81
- else:
82
- layers += [conv2d, nn.ReLU()]
83
- in_channels = v
84
- # print("number",block)
85
- return nn.Sequential(*layers)
86
-
87
-
88
- class InvertedresBlock(nn.Layer):
89
- def __init__(self,
90
- in_channels: int,
91
- expansion: float,
92
- out_channels: int,
93
- bias_attr=False):
94
- super().__init__()
95
- self.in_channels = in_channels
96
- self.expansion = expansion
97
- self.out_channels = out_channels
98
- self.bottle_channels = round(self.expansion * self.out_channels)
99
- self.body = nn.Sequential(
100
- # pw
101
- Conv2DNormLReLU(self.in_channels,
102
- self.bottle_channels,
103
- kernel_size=1,
104
- bias_attr=bias_attr),
105
- # dw
106
- nn.Conv2D(self.bottle_channels,
107
- self.bottle_channels,
108
- kernel_size=3,
109
- stride=1,
110
- padding=0,
111
- groups=self.bottle_channels,
112
- bias_attr=True),
113
- nn.GroupNorm(1, self.bottle_channels),
114
- nn.LeakyReLU(0.2),
115
- # pw & linear
116
- nn.Conv2D(self.bottle_channels,
117
- self.out_channels,
118
- kernel_size=1,
119
- padding=0,
120
- bias_attr=False),
121
- nn.GroupNorm(1, self.out_channels),
122
- )
123
-
124
-
125
- def forward(self, x0):
126
- x = self.body(x0)
127
- if self.in_channels == self.out_channels:
128
- out = paddle.add(x0, x)
129
- else:
130
- out = x
131
- return x
132
- class Conv2DNormLReLU(nn.Layer):
133
- def __init__(self,
134
- in_channels: int,
135
- out_channels: int,
136
- kernel_size: int = 3,
137
- stride: int = 1,
138
- padding: int = 1,
139
- bias_attr=False) -> None:
140
- super().__init__()
141
- self.conv = nn.Conv2D(in_channels,
142
- out_channels,
143
- kernel_size,
144
- stride,
145
- padding,
146
- bias_attr=bias_attr)
147
- # NOTE layer norm is crucial for animegan!
148
- self.norm = nn.GroupNorm(1, out_channels)
149
- self.lrelu = nn.LeakyReLU(0.2)
150
-
151
- def forward(self, x):
152
- x = self.conv(x)
153
- x = self.norm(x)
154
- x = self.lrelu(x)
155
- return x
156
-
157
-
158
-
159
- class Generater(nn.Layer):
160
- def __init__(self):
161
- super().__init__()
162
- self.VGG = VGG19()
163
- self.A = nn.Sequential(InvertedresBlock(512, 2, 256),
164
- InvertedresBlock(256, 2, 256),
165
- InvertedresBlock(256, 2, 256),
166
- InvertedresBlock(256, 2, 256),
167
- Conv2DNormLReLU(256, 128))
168
- self.B = nn.Sequential(nn.Upsample(scale_factor=2, mode='bilinear'),
169
- Conv2DNormLReLU(128, 128),
170
- Conv2DNormLReLU(128, 128))
171
- self.C = nn.Sequential(nn.Upsample(scale_factor=2, mode='bilinear'),
172
- Conv2DNormLReLU(128, 128),
173
- Conv2DNormLReLU(128, 128))
174
- self.D = nn.Sequential(nn.Upsample(scale_factor=2, mode='bilinear'),
175
- Conv2DNormLReLU(128, 64),
176
- Conv2DNormLReLU(64, 64),
177
- Conv2DNormLReLU(64, 32, 7, padding=3))
178
-
179
- self.out = nn.Sequential(nn.Conv2D(32, 3, 1, bias_attr=False),
180
- nn.Tanh())
181
- # ,nn.Sigmoid())
182
- def style_projection(self,content_feature,style_feature,alpha = 0.7):
183
- def scatter_numpy(dim, index, src):
184
- dst = src.copy()
185
- idx_xsection_shape = index.shape[:dim] + index.shape[dim + 1:]
186
- # print("idx_xsection_shape",idx_xsection_shape)#(b,c)
187
- dst_xsection_shape = dst.shape[:dim] + dst.shape[dim + 1:]
188
- def make_slice(arr, dim, i):
189
- slc = [slice(None)] * arr.ndim
190
- slc[dim] = i
191
- return tuple(slc)
192
-
193
- # We use index and dim parameters to create idx
194
- # idx is in a form that can be used as a NumPy advanced index for scattering of src param.
195
- idx = [[
196
- *np.indices(idx_xsection_shape).reshape(index.ndim - 1, -1), index[make_slice(index, dim, i)].reshape(1, -1)[0]
197
- ] for i in range(index.shape[dim])]
198
- idx = list(np.concatenate(idx, axis=1))
199
- # print("idx",idx)
200
- # idx.insert(dim, idx.pop())
201
-
202
- if not np.isscalar(src):
203
- src_idx = list(idx)#使idx和src_idx并不是同一个内存空间
204
- src_idx.pop(dim)
205
- src_idx.insert(dim, np.repeat(np.arange(index.shape[dim]), np.prod(idx_xsection_shape)))
206
- dst[tuple(idx)] = src[tuple(src_idx)]
207
- else:
208
- dst[idx] = src
209
- return dst
210
- b,c,h,w = content_feature.shape
211
- style_feature = F.interpolate(x=style_feature, size=content_feature.shape[-2:],mode="BILINEAR")
212
- content_feat = content_feature.reshape([b,c,h*w]).numpy()
213
- style_feat = style_feature.reshape([b,c,h*w]).numpy()
214
- # print("content_feat",content_feat.shape,b,c)
215
- # content_feat = np.reshape(content_feat, (b,c, -1))#(b,c,-1)
216
- # style_feat = np.reshape(style_feat, (b,c, -1))#(b,c,-1)
217
- # print(content_feat)
218
- content_feat_index = np.argsort(content_feat, axis=2)
219
- style_feat = np.sort(style_feat, axis=2)
220
- # print("content_feat_index",content_feat_index)
221
- # print("style_feat",style_feat)
222
- fr_feat = scatter_numpy(dim=2, index=content_feat_index, src=style_feat)
223
- fr_feat = fr_feat * alpha + content_feat * (1 - alpha)
224
- fr_feat = np.reshape(fr_feat, (b,c,h,w))
225
- fr_feat = paddle.to_tensor(fr_feat)
226
- return fr_feat
227
- # @paddle.jit.to_static
228
- def forward(self,real_image,style_image,alpha):
229
- alpha = alpha.numpy()[0]
230
- # print("real_image",real_image.shape)
231
- content_feature = self.VGG(real_image)
232
- # print("content_feat",content_feature.shape)
233
- style_feature = self.VGG(style_image)
234
- fr_feat = self.style_projection(content_feature,style_feature,alpha)
235
- a = self.A(fr_feat)
236
- b = self.B(a)
237
- c = self.C(b)
238
- d = self.D(c)
239
- out = self.out(d)
240
- return out
 
1
+ import cv2
2
  import numpy as np
 
3
  import paddle
 
 
 
 
 
4
  import paddle.nn.functional as F
5
+ from Generater import Generater
6
+ import gradio as gr
7
+
8
+
9
+ generator = Generater()
10
+ # # oslist =os.listdir("纹理")
11
+ # # print(oslist)
12
+ G_path ='Gmodel_state33003.pdparams'
13
+ layer_state_dictg = paddle.load(G_path)
14
+ generator.set_state_dict(layer_state_dictg)#导入训练好的参数文件
15
+
16
+ def style_transfer(content_img,style_img):
17
+ g_input = content_img.astype('float32') / 127.5 - 1 # 归一化
18
+ g_input = g_input[np.newaxis, ...].transpose(0, 3, 1, 2) # NHWC -> NCHW
19
+ g_input = paddle.to_tensor(g_input) # numpy -> tensor
20
+ h,w = g_input.shape[-2:]
21
+ p = max([h,w])
22
+ g_input = F.interpolate(g_input,scale_factor=(256/p))
23
+
24
+ g_input_s = style_img.astype('float32') / 127.5 - 1 # 归一化
25
+ g_input_s = g_input_s[np.newaxis, ...].transpose(0, 3, 1, 2) # NHWC -> NCHW
26
+ g_input_s = paddle.to_tensor(g_input_s) # numpy -> tensor
27
+ h,w = g_input_s.shape[-2:]
28
+ p = max([h,w])
29
+ g_input_s = F.interpolate(g_input_s,scale_factor=(256/p))
30
+
31
+ i = paddle.to_tensor([1.])
32
+ g_output = generator(g_input,g_input_s,i)
33
+ g_output = g_output.detach().numpy() # tensor -> numpy
34
+ g_output = g_output.transpose(0, 2, 3, 1)[0] # NCHW -> NHWC
35
+ g_output = (g_output+1) *127.5 # 反归一化
36
+ g_output = g_output.astype(np.uint8)
37
+ output = g_output
38
+ # cv2.imwrite(os.path.join("./test", str(i.numpy()[0])+'qt.png'), g_output)#保存图片到本地
39
+ return output
40
+
41
+ interface = gr.Interface(fn=style_transfer, inputs=["image","image"], outputs="image")
42
+ interface.launch(share=True)