Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
models
提交
b6f99b31
M
models
项目概览
PaddlePaddle
/
models
大约 2 年 前同步成功
通知
232
Star
6828
Fork
2962
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
602
列表
看板
标记
里程碑
合并请求
255
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
models
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
602
Issue
602
列表
看板
标记
里程碑
合并请求
255
合并请求
255
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
b6f99b31
编写于
10月 18, 2019
作者:
L
lvmengsi
提交者:
GitHub
10月 18, 2019
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix spade infer (#3575)
* fix spade * update SPADE * update spade * update infer * update infer
上级
d7f8866b
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
44 addition
and
6 deletion
+44
-6
PaddleCV/PaddleGAN/README.md
PaddleCV/PaddleGAN/README.md
+17
-1
PaddleCV/PaddleGAN/data_reader.py
PaddleCV/PaddleGAN/data_reader.py
+10
-0
PaddleCV/PaddleGAN/images/spade_net.png
PaddleCV/PaddleGAN/images/spade_net.png
+0
-0
PaddleCV/PaddleGAN/infer.py
PaddleCV/PaddleGAN/infer.py
+7
-3
PaddleCV/PaddleGAN/network/CGAN_network.py
PaddleCV/PaddleGAN/network/CGAN_network.py
+1
-1
PaddleCV/PaddleGAN/scripts/infer_SPADE.sh
PaddleCV/PaddleGAN/scripts/infer_SPADE.sh
+1
-0
PaddleCV/PaddleGAN/scripts/run_SPADE.sh
PaddleCV/PaddleGAN/scripts/run_SPADE.sh
+1
-1
PaddleCV/PaddleGAN/trainer/SPADE.py
PaddleCV/PaddleGAN/trainer/SPADE.py
+7
-0
未找到文件。
PaddleCV/PaddleGAN/README.md
浏览文件 @
b6f99b31
...
@@ -16,7 +16,7 @@
...
@@ -16,7 +16,7 @@
## 模型简介
## 模型简介
本图像生成模型库包含CGAN
\[
[
3
](
#参考文献
)
\]
, DCGAN
\[
[
4
](
#参考文献
)
\]
, Pix2Pix
\[
[
5
](
#参考文献
)
\]
, CycleGAN
\[
[
6
](
#参考文献
)
\]
, StarGAN
\[
[
7
](
#参考文献
)
\]
, AttGAN
\[
[
8
](
#参考文献
)
\]
, STGAN
\[
[
9
](
#参考文献
)
\]
。
本图像生成模型库包含CGAN
\[
[
3
](
#参考文献
)
\]
, DCGAN
\[
[
4
](
#参考文献
)
\]
, Pix2Pix
\[
[
5
](
#参考文献
)
\]
, CycleGAN
\[
[
6
](
#参考文献
)
\]
, StarGAN
\[
[
7
](
#参考文献
)
\]
, AttGAN
\[
[
8
](
#参考文献
)
\]
, STGAN
\[
[
9
](
#参考文献
)
\]
, SPADE
\[
[
13
](
#参考文献
)
\]
。
注意:
注意:
1.
StarGAN,AttGAN和STGAN由于梯度惩罚所需的操作目前只支持GPU,需使用GPU训练。
1.
StarGAN,AttGAN和STGAN由于梯度惩罚所需的操作目前只支持GPU,需使用GPU训练。
...
@@ -86,6 +86,7 @@ StarGAN,AttGAN和STGAN采用celeba\[[11](#参考文献)\]数据集进行属性
...
@@ -86,6 +86,7 @@ StarGAN,AttGAN和STGAN采用celeba\[[11](#参考文献)\]数据集进行属性
通过指定dataset参数来下载相应的数据集。
通过指定dataset参数来下载相应的数据集。
StarGAN, AttGAN和STGAN所需要的
[
Celeba
](
http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html
)
数据集可以自行下载。
StarGAN, AttGAN和STGAN所需要的
[
Celeba
](
http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html
)
数据集可以自行下载。
SPADE使用的
[
cityscapes
](
https://www.cityscapes-dataset.com
)
数据集可以自行下载。下载完成后新建一个目录data/cityscapes/,并在目录下准备3个子目录,分别是真实图片、分割图、实例图。准备一个train_list和test_list,每一行的顺序是分割图
\t
真实图
\t
实例图。
**自定义数据集:**
**自定义数据集:**
如果您要使用自定义的数据集,只要设置成对应的生成模型所需要的数据格式,并放在data文件夹下,然后把
`--dataset`
参数设置成您自定义数据集的名称,data_reader.py文件就会自动去data文件夹中寻找数据。
如果您要使用自定义的数据集,只要设置成对应的生成模型所需要的数据格式,并放在data文件夹下,然后把
`--dataset`
参数设置成您自定义数据集的名称,data_reader.py文件就会自动去data文件夹中寻找数据。
...
@@ -113,6 +114,7 @@ StarGAN, AttGAN和STGAN所需要的[Celeba](http://mmlab.ie.cuhk.edu.hk/projects
...
@@ -113,6 +114,7 @@ StarGAN, AttGAN和STGAN所需要的[Celeba](http://mmlab.ie.cuhk.edu.hk/projects
-
每个GAN都给出了一份运行示例,放在scripts文件夹内,用户可以直接运行训练脚本快速开始训练。
-
每个GAN都给出了一份运行示例,放在scripts文件夹内,用户可以直接运行训练脚本快速开始训练。
-
用户可以通过设置
`--model_net`
参数来选择想要训练的模型,通过设置
`--dataset`
参数来选择训练所需要的数据集。
-
用户可以通过设置
`--model_net`
参数来选择想要训练的模型,通过设置
`--dataset`
参数来选择训练所需要的数据集。
-
SPADE模型的训练需要在主目录下新建一个VGG19_pretrained目录,从
[
该链接
](
https://paddle-imagenet-models-name.bj.bcebos.com/VGG19_pretrained.tar
)
下载在ImageNet上预训练好的VGG19模型,解压之后把VGG19模型的参数名改成
`vgg19_`
开头的参数名。
### 模型测试
### 模型测试
模型测试是利用训练完成的生成模型进行图像生成。infer.py是主要的执行程序,调用示例如下:
模型测试是利用训练完成的生成模型进行图像生成。infer.py是主要的执行程序,调用示例如下:
...
@@ -183,6 +185,7 @@ STGAN的效果图(图片属性分别为:original image, Bald, Bangs, Black Hai
...
@@ -183,6 +185,7 @@ STGAN的效果图(图片属性分别为:original image, Bald, Bangs, Black Hai
| StarGAN |
[
StarGAN的预训练模型
](
https://paddle-gan-models.bj.bcebos.com/stargan_G.tar.gz
)
|
| StarGAN |
[
StarGAN的预训练模型
](
https://paddle-gan-models.bj.bcebos.com/stargan_G.tar.gz
)
|
| AttGAN |
[
AttGAN的预训练模型
](
https://paddle-gan-models.bj.bcebos.com/attgan_G.tar.gz
)
|
| AttGAN |
[
AttGAN的预训练模型
](
https://paddle-gan-models.bj.bcebos.com/attgan_G.tar.gz
)
|
| STGAN |
[
STGAN的预训练模型
](
https://paddle-gan-models.bj.bcebos.com/stgan_G.tar.gz
)
|
| STGAN |
[
STGAN的预训练模型
](
https://paddle-gan-models.bj.bcebos.com/stgan_G.tar.gz
)
|
| SPADE |
[
SPADE的预训练模型
](
)
([SPADE需要的vgg预训练模型]()
)
## 进阶使用
## 进阶使用
...
@@ -202,6 +205,8 @@ AttGAN利用分类损失和重构损失来保证改变特定的属性,可用
...
@@ -202,6 +205,8 @@ AttGAN利用分类损失和重构损失来保证改变特定的属性,可用
STGAN只输入有变化的标签,引入GRU结构,更好的选择变化的属性,可用于人脸特定属性转换。
STGAN只输入有变化的标签,引入GRU结构,更好的选择变化的属性,可用于人脸特定属性转换。
SPADE提出一种考虑空间语义信息的归一化方法,从而更好的保留语义信息,生成更为逼真的图像,可用于图像翻译。
### 模型概览
### 模型概览
-
Pix2Pix由一个生成网络和一个判别网络组成。生成网络中编码部分的网络结构都是采用
`convolution-batch norm-ReLU`
作为基础结构,解码部分的网络结构由
`transpose convolution-batch norm-ReLU`
组成,判别网络基本是由
`convolution-norm-leaky_ReLU`
作为基础结构,详细的网络结构可以查看
`network/Pix2pix_network.py`
文件。生成网络提供两种可选的网络结构:Unet网络结构和普通的encoder-decoder网络结构。网络利用损失函数学习从输入图像到输出图像的映射,生成网络损失函数由GAN的损失函数和L1损失函数组成,判别网络损失函数由GAN的损失函数组成。生成器的网络结构如下图所示:
-
Pix2Pix由一个生成网络和一个判别网络组成。生成网络中编码部分的网络结构都是采用
`convolution-batch norm-ReLU`
作为基础结构,解码部分的网络结构由
`transpose convolution-batch norm-ReLU`
组成,判别网络基本是由
`convolution-norm-leaky_ReLU`
作为基础结构,详细的网络结构可以查看
`network/Pix2pix_network.py`
文件。生成网络提供两种可选的网络结构:Unet网络结构和普通的encoder-decoder网络结构。网络利用损失函数学习从输入图像到输出图像的映射,生成网络损失函数由GAN的损失函数和L1损失函数组成,判别网络损失函数由GAN的损失函数组成。生成器的网络结构如下图所示:
...
@@ -245,6 +250,13 @@ AttGAN的网络结构[8]
...
@@ -245,6 +250,13 @@ AttGAN的网络结构[8]
STGAN的网络结构[9]
STGAN的网络结构[9]
</p>
</p>
-
SPADE中整体网络结构如下图所示。SPADE在网络中的卷积层使用了
[
谱归一化
](
\[[12](#参考文献
)
\]
),把输入图像的语义mask图像作为生成网络输入,拼接了语义mask和生成器的输出为判别网络的输入。SPADE提出了一种基于空间信息的归一化方法
\(
SPatially-Adaptive
\(
DE
\)
normalization
\)
,在进行归一化的时候可以更好的利用语义信息,从而生成更为逼真的图像。更为具体的网络结构可以参考network/SPADE_network.py文件或者论文中的附录部分。
<p
align=
"center"
>
<img
src=
"images/spade_net.png"
width=
800
/>
<br
/>
SPADE整体的网络结构[10]
</p>
注意:网络结构中的norm指的是用户可以选用batch norm或者instance norm来搭建自己的网络。
注意:网络结构中的norm指的是用户可以选用batch norm或者instance norm来搭建自己的网络。
...
@@ -291,6 +303,10 @@ STGAN的网络结构[9]
...
@@ -291,6 +303,10 @@ STGAN的网络结构[9]
[
11] [Deep Learning Face Attributes in the Wild
](
https://arxiv.org/abs/1411.7766
)
[
11] [Deep Learning Face Attributes in the Wild
](
https://arxiv.org/abs/1411.7766
)
[
12] [Spectral Normalization for Generative Adversarial Networks
](
https://arxiv.org/abs/1802.05957
)
[
13] [Semantic Image Synthesis with Spatially-Adaptive Normalization
](
https://arxiv.org/abs/1903.07291
)
## 版本更新
## 版本更新
...
...
PaddleCV/PaddleGAN/data_reader.py
浏览文件 @
b6f99b31
...
@@ -618,6 +618,11 @@ class data_reader(object):
...
@@ -618,6 +618,11 @@ class data_reader(object):
train_list
=
os
.
path
.
join
(
dataset_dir
,
'train.txt'
)
train_list
=
os
.
path
.
join
(
dataset_dir
,
'train.txt'
)
if
self
.
cfg
.
train_list
is
not
None
:
if
self
.
cfg
.
train_list
is
not
None
:
train_list
=
self
.
cfg
.
train_list
train_list
=
self
.
cfg
.
train_list
if
not
os
.
path
.
exists
(
train_list
):
print
(
"train_list is NOT EXIST!!! Please prepare train list first"
)
sys
.
exit
(
1
)
train_reader
=
triplex_reader_creator
(
train_reader
=
triplex_reader_creator
(
image_dir
=
dataset_dir
,
image_dir
=
dataset_dir
,
list_filename
=
train_list
,
list_filename
=
train_list
,
...
@@ -629,6 +634,11 @@ class data_reader(object):
...
@@ -629,6 +634,11 @@ class data_reader(object):
test_list
=
os
.
path
.
join
(
dataset_dir
,
"test.txt"
)
test_list
=
os
.
path
.
join
(
dataset_dir
,
"test.txt"
)
if
self
.
cfg
.
test_list
is
not
None
:
if
self
.
cfg
.
test_list
is
not
None
:
test_list
=
self
.
cfg
.
test_list
test_list
=
self
.
cfg
.
test_list
if
not
os
.
path
.
exists
(
test_list
):
print
(
"test_list is NOT EXIST!!! Please prepare test list first"
)
sys
.
exit
(
1
)
test_reader
=
triplex_reader_creator
(
test_reader
=
triplex_reader_creator
(
image_dir
=
dataset_dir
,
image_dir
=
dataset_dir
,
list_filename
=
test_list
,
list_filename
=
test_list
,
...
...
PaddleCV/PaddleGAN/images/spade_net.png
0 → 100644
浏览文件 @
b6f99b31
62.8 KB
PaddleCV/PaddleGAN/infer.py
浏览文件 @
b6f99b31
...
@@ -169,12 +169,14 @@ def infer(args):
...
@@ -169,12 +169,14 @@ def infer(args):
model
=
DCGAN_model
(
args
.
n_samples
)
model
=
DCGAN_model
(
args
.
n_samples
)
fake
=
model
.
network_G
(
noise
,
name
=
"G"
)
fake
=
model
.
network_G
(
noise
,
name
=
"G"
)
elif
args
.
model_net
==
'SPADE'
:
elif
args
.
model_net
==
'SPADE'
:
label_shape
=
[
-
1
,
args
.
label_nc
,
args
.
crop_height
,
args
.
crop_width
]
spade_data_shape
=
[
-
1
,
1
,
args
.
crop_height
,
args
.
crop_width
]
from
network.SPADE_network
import
SPADE_model
from
network.SPADE_network
import
SPADE_model
model
=
SPADE_model
()
model
=
SPADE_model
()
input_label
=
fluid
.
layers
.
data
(
input_label
=
fluid
.
layers
.
data
(
name
=
'input_label'
,
shape
=
data
_shape
,
dtype
=
'float32'
)
name
=
'input_label'
,
shape
=
label
_shape
,
dtype
=
'float32'
)
input_ins
=
fluid
.
layers
.
data
(
input_ins
=
fluid
.
layers
.
data
(
name
=
'input_ins'
,
shape
=
data_shape
,
dtype
=
'float32'
)
name
=
'input_ins'
,
shape
=
spade_
data_shape
,
dtype
=
'float32'
)
input_
=
fluid
.
layers
.
concat
([
input_label
,
input_ins
],
1
)
input_
=
fluid
.
layers
.
concat
([
input_label
,
input_ins
],
1
)
fake
=
model
.
network_G
(
input_
,
"generator"
,
cfg
=
args
,
is_test
=
True
)
fake
=
model
.
network_G
(
input_
,
"generator"
,
cfg
=
args
,
is_test
=
True
)
else
:
else
:
...
@@ -319,10 +321,12 @@ def infer(args):
...
@@ -319,10 +321,12 @@ def infer(args):
shuffle
=
False
,
shuffle
=
False
,
batch_size
=
1
,
batch_size
=
1
,
mode
=
"TEST"
)
mode
=
"TEST"
)
id2name
=
test_reader
.
id2name
reader_test
=
test_reader
.
make_reader
(
args
,
return_name
=
True
)
reader_test
=
test_reader
.
make_reader
(
args
,
return_name
=
True
)
for
data
in
zip
(
reader_test
()):
for
data
in
zip
(
reader_test
()):
data_A
,
data_B
,
data_C
,
name
=
data
[
0
]
data_A
,
data_B
,
data_C
,
name
=
data
[
0
]
name
=
name
[
0
]
name
=
id2name
[
np
.
array
(
name
).
astype
(
'int32'
)[
0
]]
print
(
"read: "
,
name
)
tensor_A
=
fluid
.
LoDTensor
()
tensor_A
=
fluid
.
LoDTensor
()
tensor_C
=
fluid
.
LoDTensor
()
tensor_C
=
fluid
.
LoDTensor
()
tensor_A
.
set
(
data_A
,
place
)
tensor_A
.
set
(
data_A
,
place
)
...
...
PaddleCV/PaddleGAN/network/CGAN_network.py
浏览文件 @
b6f99b31
...
@@ -83,7 +83,7 @@ class CGAN_model(object):
...
@@ -83,7 +83,7 @@ class CGAN_model(object):
name
=
name
+
'_dc2'
,
name
=
name
+
'_dc2'
,
output_size
=
[
self
.
img_w
,
self
.
img_h
])
output_size
=
[
self
.
img_w
,
self
.
img_h
])
out
=
fluid
.
layers
.
reshape
(
o_dc2
,
[
-
1
,
self
.
img_w
*
self
.
img_h
])
out
=
fluid
.
layers
.
reshape
(
o_dc2
,
[
-
1
,
self
.
img_w
*
self
.
img_h
])
return
o
_dc2
return
o
ut
def
network_D
(
self
,
input
,
label
,
name
=
"discriminator"
):
def
network_D
(
self
,
input
,
label
,
name
=
"discriminator"
):
# concat image and label
# concat image and label
...
...
PaddleCV/PaddleGAN/scripts/infer_SPADE.sh
0 → 100644
浏览文件 @
b6f99b31
python infer.py
--model_net
SPADE
--test_list
./data/cityscapes/test_list
--load_height
512
--load_width
1024
--crop_height
512
--crop_width
1024
--dataset_dir
./data/cityscapes/
--init_model
./spade_py37/checkpoints/99/
PaddleCV/PaddleGAN/scripts/run_SPADE.sh
浏览文件 @
b6f99b31
export
FLAGS_eager_delete_tensor_gb
=
0.0
export
FLAGS_eager_delete_tensor_gb
=
0.0
export
FLAGS_fast_eager_deletion_mode
=
1
export
FLAGS_fast_eager_deletion_mode
=
1
export
FLAGS_fraction_of_gpu_memory_to_use
=
0.01
export
FLAGS_fraction_of_gpu_memory_to_use
=
0.01
CUDA_VISIBLE_DEVICES
=
0 python train.py
--model_net
SPADE
--dataset
cityscapes
--train_list
train_list
--test_list
val_list
--crop_type
Random
--batch_size
1
--epoch
200
--load_height
612
--load_width
1124
--crop_height
512
--crop_width
1024
--label_nc
36
CUDA_VISIBLE_DEVICES
=
0 python train.py
--model_net
SPADE
--dataset
cityscapes
--train_list
./data/cityscapes/train_list
--test_list
./data/cityscapes/
val_list
--crop_type
Random
--batch_size
1
--epoch
200
--load_height
612
--load_width
1124
--crop_height
512
--crop_width
1024
--label_nc
36
PaddleCV/PaddleGAN/trainer/SPADE.py
浏览文件 @
b6f99b31
...
@@ -19,6 +19,7 @@ from network.SPADE_network import SPADE_model
...
@@ -19,6 +19,7 @@ from network.SPADE_network import SPADE_model
from
util
import
utility
from
util
import
utility
import
paddle.fluid
as
fluid
import
paddle.fluid
as
fluid
import
sys
import
sys
import
os
import
time
import
time
import
network.vgg
as
vgg
import
network.vgg
as
vgg
import
pickle
as
pkl
import
pickle
as
pkl
...
@@ -316,6 +317,12 @@ class SPADE(object):
...
@@ -316,6 +317,12 @@ class SPADE(object):
place
=
fluid
.
CUDAPlace
(
0
)
if
self
.
cfg
.
use_gpu
else
fluid
.
CPUPlace
()
place
=
fluid
.
CUDAPlace
(
0
)
if
self
.
cfg
.
use_gpu
else
fluid
.
CPUPlace
()
exe
=
fluid
.
Executor
(
place
)
exe
=
fluid
.
Executor
(
place
)
exe
.
run
(
fluid
.
default_startup_program
())
exe
.
run
(
fluid
.
default_startup_program
())
if
not
os
.
path
.
exists
(
self
.
cfg
.
vgg19_pretrain
):
print
(
"directory VGG19_pretrain NOT EXIST!!! Please download VGG19 first."
)
sys
.
exit
(
1
)
gen_trainer
.
vgg
.
load_vars
(
exe
,
gen_trainer
.
program
,
gen_trainer
.
vgg
.
load_vars
(
exe
,
gen_trainer
.
program
,
self
.
cfg
.
vgg19_pretrain
)
self
.
cfg
.
vgg19_pretrain
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录