Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
PaddleGAN
提交
7557835d
P
PaddleGAN
项目概览
PaddlePaddle
/
PaddleGAN
1 年多 前同步成功
通知
97
Star
7254
Fork
1210
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
4
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
PaddleGAN
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
4
Issue
4
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
7557835d
编写于
11月 23, 2022
作者:
W
wangna11BD
提交者:
GitHub
11月 23, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix First Order Motion (#727)
* fix First Order Motion * fix bug
上级
fefd75fa
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
111 addition
and
35 deletion
+111
-35
README.md
README.md
+2
-0
README_cn.md
README_cn.md
+1
-0
configs/gpen_256_ffhq.yaml
configs/gpen_256_ffhq.yaml
+1
-1
docs/en_US/tutorials/gfpgan.md
docs/en_US/tutorials/gfpgan.md
+0
-0
docs/zh_CN/tutorials/face_enhancement.md
docs/zh_CN/tutorials/face_enhancement.md
+2
-2
docs/zh_CN/tutorials/gfpgan.md
docs/zh_CN/tutorials/gfpgan.md
+0
-0
ppgan/apps/gpen_predictor.py
ppgan/apps/gpen_predictor.py
+2
-2
ppgan/models/generators/__init__.py
ppgan/models/generators/__init__.py
+1
-1
ppgan/models/generators/generator_gpen.py
ppgan/models/generators/generator_gpen.py
+85
-0
ppgan/models/generators/gpen.py
ppgan/models/generators/gpen.py
+17
-29
未找到文件。
README.md
浏览文件 @
7557835d
...
...
@@ -123,6 +123,8 @@ GAN-Generative Adversarial Network, was praised by "the Father of Convolutional
*
[
InvDN
](
./docs/en_US/tutorials/invdn.md
)
*
[
AOT-GAN
](
./docs/en_US/tutorials/aotgan.md
)
*
[
NAFNet
](
./docs/en_US/tutorials/nafnet.md
)
*
[
GFPGan
](
./docs/en_US/tutorials/gfpgan.md
)
*
[
GPEN
](
./docs/en_US/tutorials/gpen.md
)
## Composite Application
...
...
README_cn.md
浏览文件 @
7557835d
...
...
@@ -132,6 +132,7 @@ GAN--生成对抗网络,被“卷积网络之父”**Yann LeCun(杨立昆)
*
人脸编码:
[
Pixel2Style2Pixel
](
./docs/zh_CN/tutorials/pixel2style2pixel.md
)
*
人脸增强:
[
FaceEnhancement
](
./docs/zh_CN/tutorials/face_enhancement.md
)
*
人脸解析:
[
FaceParsing
](
./docs/zh_CN/tutorials/face_parse.md
)
*
盲人脸修复:
[
GFPGan
](
./docs/zh_CN/tutorials/gfpgan.md
)
、
[
GPEN
](
./docs/zh_CN/tutorials/gpen.md
)
*
分辨率提升
*
单张图片超分:
[
Single Image Super Resolution(SISR)
](
./docs/zh_CN/tutorials/single_image_super_resolution.md
)
*
包含模型:RealSR、ESRGAN、LESRCNN、PAN、DRN
...
...
configs/gpen_256_ffhq.yaml
浏览文件 @
7557835d
...
...
@@ -6,7 +6,7 @@ find_unused_parameters: True
model
:
name
:
GPENModel
generator
:
name
:
GPEN
name
:
GPEN
Generator
size
:
256
style_dim
:
512
n_mlp
:
8
...
...
docs/en_US/tutorials/
GFPGAN
.md
→
docs/en_US/tutorials/
gfpgan
.md
浏览文件 @
7557835d
文件已移动
docs/zh_CN/tutorials/face_enhancement.md
浏览文件 @
7557835d
...
...
@@ -20,9 +20,9 @@ img = faceenhancer.enhance_from_image(img)
注意:请将图片转为float类型输入,目前不支持int8类型
### 训练
(TODO)
### 训练
未来还将添加训练脚本方便用户训练出更多类型的 GPEN 人脸增强。
[
详见
](
../../zh_CN/tutorials/gpen.md
)
## 人脸增强结果展示
...
...
docs/zh_CN/tutorials/
GFPGAN
.md
→
docs/zh_CN/tutorials/
gfpgan
.md
浏览文件 @
7557835d
文件已移动
ppgan/apps/gpen_predictor.py
浏览文件 @
7557835d
...
...
@@ -21,7 +21,7 @@ import sys
sys
.
path
.
append
(
"."
)
from
.base_predictor
import
BasePredictor
from
ppgan.datasets.gpen_dataset
import
GFPGAN_degradation
from
ppgan.models.generators
import
GPEN
from
ppgan.models.generators
import
GPEN
Generator
from
ppgan.metrics.fid
import
FID
from
ppgan.utils.download
import
get_path_from_url
import
cv2
...
...
@@ -103,7 +103,7 @@ class GPENPredictor(BasePredictor):
checkpoint
=
paddle
.
load
(
weight_path
)
warnings
.
filterwarnings
(
"always"
)
self
.
generator
=
GPEN
(
size
,
style_dim
,
n_mlp
,
channel_multiplier
,
self
.
generator
=
GPEN
Generator
(
size
,
style_dim
,
n_mlp
,
channel_multiplier
,
narrow
)
self
.
generator
.
set_state_dict
(
checkpoint
)
self
.
generator
.
eval
()
...
...
ppgan/models/generators/__init__.py
浏览文件 @
7557835d
...
...
@@ -41,7 +41,7 @@ from .msvsr import MSVSR
from
.generator_singan
import
SinGANGenerator
from
.rcan
import
RCAN
from
.prenet
import
PReNet
from
.g
pen
import
GPEN
from
.g
enerator_gpen
import
GPENGenerator
from
.swinir
import
SwinIR
from
.gfpganv1_clean_arch
import
GFPGANv1Clean
from
.gfpganv1_arch
import
GFPGANv1
,
StyleGAN2DiscriminatorGFPGAN
...
...
ppgan/models/generators/generator_gpen.py
浏览文件 @
7557835d
...
...
@@ -18,10 +18,13 @@
import
math
import
random
import
itertools
import
paddle
import
paddle.nn
as
nn
import
paddle.nn.functional
as
F
from
ppgan.models.generators.builder
import
GENERATORS
from
ppgan.models.discriminators.discriminator_styleganv2
import
ConvLayer
from
ppgan.modules.equalized
import
EqualLinear_gpen
as
EqualLinear
from
ppgan.modules.fused_act
import
FusedLeakyReLU
from
ppgan.modules.upfirdn2d
import
Upfirdn2dUpsample
,
Upfirdn2dBlur
...
...
@@ -451,3 +454,85 @@ class StyleGANv2Generator(nn.Layer):
else
:
return
image
,
None
@
GENERATORS
.
register
()
class
GPENGenerator
(
nn
.
Layer
):
def
__init__
(
self
,
size
,
style_dim
,
n_mlp
,
channel_multiplier
=
2
,
narrow
=
1
,
blur_kernel
=
[
1
,
3
,
3
,
1
],
lr_mlp
=
0.01
,
is_concat
=
True
,
):
super
(
GPENGenerator
,
self
).
__init__
()
channels
=
{
4
:
int
(
512
*
narrow
),
8
:
int
(
512
*
narrow
),
16
:
int
(
512
*
narrow
),
32
:
int
(
512
*
narrow
),
64
:
int
(
256
*
channel_multiplier
*
narrow
),
128
:
int
(
128
*
channel_multiplier
*
narrow
),
256
:
int
(
64
*
channel_multiplier
*
narrow
),
512
:
int
(
32
*
channel_multiplier
*
narrow
),
1024
:
int
(
16
*
channel_multiplier
*
narrow
),
2048
:
int
(
8
*
channel_multiplier
*
narrow
)
}
self
.
log_size
=
int
(
math
.
log
(
size
,
2
))
self
.
generator
=
StyleGANv2Generator
(
size
,
style_dim
,
n_mlp
,
channel_multiplier
=
channel_multiplier
,
narrow
=
narrow
,
blur_kernel
=
blur_kernel
,
lr_mlp
=
lr_mlp
,
is_concat
=
is_concat
)
conv
=
[
ConvLayer
(
3
,
channels
[
size
],
1
)]
self
.
ecd0
=
nn
.
Sequential
(
*
conv
)
in_channel
=
channels
[
size
]
self
.
names
=
[
'ecd%d'
%
i
for
i
in
range
(
self
.
log_size
-
1
)]
for
i
in
range
(
self
.
log_size
,
2
,
-
1
):
out_channel
=
channels
[
2
**
(
i
-
1
)]
conv
=
[
ConvLayer
(
in_channel
,
out_channel
,
3
,
downsample
=
True
)]
setattr
(
self
,
self
.
names
[
self
.
log_size
-
i
+
1
],
nn
.
Sequential
(
*
conv
))
in_channel
=
out_channel
self
.
final_linear
=
nn
.
Sequential
(
EqualLinear
(
channels
[
4
]
*
4
*
4
,
style_dim
,
activation
=
'fused_lrelu'
))
def
forward
(
self
,
inputs
,
return_latents
=
False
,
inject_index
=
None
,
truncation
=
1
,
truncation_latent
=
None
,
input_is_latent
=
False
,
):
noise
=
[]
for
i
in
range
(
self
.
log_size
-
1
):
ecd
=
getattr
(
self
,
self
.
names
[
i
])
inputs
=
ecd
(
inputs
)
noise
.
append
(
inputs
)
inputs
=
inputs
.
reshape
([
inputs
.
shape
[
0
],
-
1
])
outs
=
self
.
final_linear
(
inputs
)
noise
=
list
(
itertools
.
chain
.
from_iterable
(
itertools
.
repeat
(
x
,
2
)
for
x
in
noise
))[::
-
1
]
outs
=
self
.
generator
([
outs
],
return_latents
,
inject_index
,
truncation
,
truncation_latent
,
input_is_latent
,
noise
=
noise
[
1
:])
return
outs
ppgan/models/generators/gpen.py
浏览文件 @
7557835d
...
...
@@ -14,16 +14,14 @@
# code was heavily based on code was heavily based on https://github.com/yangxy/GPEN
import
itertools
import
paddle.nn
as
nn
import
math
import
paddle
import
paddle.nn
as
nn
from
ppgan.models.generators.builder
import
GENERATORS
from
ppgan.modules.equalized
import
EqualLinear_gpen
as
EqualLinear
from
ppgan.models.generators.generator_gpen
import
StyleGANv2Generator
from
ppgan.models.generators
import
StyleGANv2Generator
from
ppgan.models.discriminators.discriminator_styleganv2
import
ConvLayer
from
ppgan.modules.equalized
import
EqualLinear
@
GENERATORS
.
register
()
class
GPEN
(
nn
.
Layer
):
def
__init__
(
...
...
@@ -32,23 +30,21 @@ class GPEN(nn.Layer):
style_dim
,
n_mlp
,
channel_multiplier
=
2
,
narrow
=
1
,
blur_kernel
=
[
1
,
3
,
3
,
1
],
lr_mlp
=
0.01
,
is_concat
=
True
,
):
super
(
GPEN
,
self
).
__init__
()
channels
=
{
4
:
int
(
512
*
narrow
),
8
:
int
(
512
*
narrow
),
16
:
int
(
512
*
narrow
),
32
:
int
(
512
*
narrow
),
64
:
int
(
256
*
channel_multiplier
*
narrow
),
128
:
int
(
128
*
channel_multiplier
*
narrow
),
256
:
int
(
64
*
channel_multiplier
*
narrow
),
512
:
int
(
32
*
channel_multiplier
*
narrow
),
1024
:
int
(
16
*
channel_multiplier
*
narrow
),
2048
:
int
(
8
*
channel_multiplier
*
narrow
)
4
:
512
,
8
:
512
,
16
:
512
,
32
:
512
,
64
:
256
*
channel_multiplier
,
128
:
128
*
channel_multiplier
,
256
:
64
*
channel_multiplier
,
512
:
32
*
channel_multiplier
,
1024
:
16
*
channel_multiplier
,
}
self
.
log_size
=
int
(
math
.
log
(
size
,
2
))
self
.
generator
=
StyleGANv2Generator
(
...
...
@@ -56,7 +52,6 @@ class GPEN(nn.Layer):
style_dim
,
n_mlp
,
channel_multiplier
=
channel_multiplier
,
narrow
=
narrow
,
blur_kernel
=
blur_kernel
,
lr_mlp
=
lr_mlp
,
is_concat
=
is_concat
)
...
...
@@ -85,7 +80,7 @@ class GPEN(nn.Layer):
truncation
=
1
,
truncation_latent
=
None
,
input_is_latent
=
False
,
):
):
noise
=
[]
for
i
in
range
(
self
.
log_size
-
1
):
ecd
=
getattr
(
self
,
self
.
names
[
i
])
...
...
@@ -93,14 +88,7 @@ class GPEN(nn.Layer):
noise
.
append
(
inputs
)
inputs
=
inputs
.
reshape
([
inputs
.
shape
[
0
],
-
1
])
outs
=
self
.
final_linear
(
inputs
)
noise
=
list
(
itertools
.
chain
.
from_iterable
(
itertools
.
repeat
(
x
,
2
)
for
x
in
noise
))[::
-
1
]
outs
=
self
.
generator
([
outs
],
return_latents
,
inject_index
,
truncation
,
truncation_latent
,
input_is_latent
,
noise
=
noise
[
1
:])
outs
=
self
.
generator
([
outs
],
return_latents
,
inject_index
,
truncation
,
truncation_latent
,
input_is_latent
,
noise
=
noise
[::
-
1
])
return
outs
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录