StyleClip项目支持写一段文字,指导StyleGAN2生成具备指定特征的图像。但这个项目往往需要一些中间数据,比如:在Pytorch环境下对应于输入原图的StyleGAN2反演(Inversion)潜码,格式是 .pt 文件,这与基于tensorflow实现的StyleGAN2Encoder不同。StyleClip项目官网主页上推荐这些中间数据可以通过 e4e 工具推理得到,所以我们需要把 e4e 这个项目跑起来。
e4e 项目的相关资源:
论文地址:hthttps://arxiv.org/abs/2102.02766
Github项目:https://github.com/omertov/encoder4editing
【说明】e4e网络架构。e4e使用基于编码器(encoder)的方法,在控制失真量的前提下力求获得反演图像最佳的感知质量与可编辑潜码(editable latents)。它不仅关注于如何获得高质量的反演图像,更加关注于如何获得高质量的可编辑潜码,使得真实图像在数字孪生空间内具有更强的感知质量与演变能力。e4e编码器接收输入图像并输出单个样式代码w以及一组偏移量,Δ(1)......Δ(N-1),其中N表示StyleGAN样式调制层的数量。通过N次复制w向量并将每个 Δ(i) 添加到对应向量上来获得最终的潜码表示。
它的官网上说,项目的源代码只能跑在 Linux 或 macOS 上,现在我们把它移植到Windows 10上。以下为移植步骤和上手试用的简要介绍。
Windows 10,NVIDIA Geforce RTX 2080Ti,VC 2017/VC++ 2017版本15.4 v14.11工具集,Pytoch 1.6.0,cudatoolkit 10.1
https://github.com/omertov/encoder4editing
将下载后的压缩包解压,创建encoder4editing工作目录,如:D:\AI\encoderforediting-main
或者,也可以使用Git工具(需要先安装Git,然后进入cmd,进入目录 D:\AI):
git clone https://github.com/omertov/encoder4editing.git
cd encoder4editing
在 environment子目录下创建文件 win_e4e_env.yaml ,内容如下:
name: e4e_env
channels:
- conda-forge
- defaults
dependencies:
- _libgcc_mutex=0.1
- ca-certificates=2020.4.5.1
- certifi=2020.4.5.1
- libffi=3.2.1
- ninja=1.10.0
- openssl=1.1.1g
- pip=20.0.2
- python=3.6.7
- python_abi=3.6
- setuptools=46.4.0
- sqlite=3.31.1
- tk=8.6.8
- wheel=0.34.2
- xz=5.2.5
- zlib=1.2.11
- pip:
- absl-py==0.9.0
- cachetools==4.1.0
- chardet==3.0.4
- cycler==0.10.0
- decorator==4.4.2
- future==0.18.2
- google-auth==1.15.0
- google-auth-oauthlib==0.4.1
- grpcio==1.29.0
- idna==2.9
- imageio==2.8.0
- importlib-metadata==1.6.0
- kiwisolver==1.2.0
- markdown==3.2.2
- matplotlib==3.2.1
- mxnet==1.6.0
- networkx==2.4
- numpy==1.18.4
- oauthlib==3.1.0
- opencv-python==4.2.0.34
- pillow==7.1.2
- protobuf==3.12.1
- pyasn1==0.4.8
- pyasn1-modules==0.2.8
- pyparsing==2.4.7
- python-dateutil==2.8.1
- pytorch-lightning==0.7.1
- pywavelets==1.1.1
- requests==2.23.0
- requests-oauthlib==1.3.0
- rsa==4.0
- scikit-image==0.17.2
- scipy==1.4.1
- six==1.15.0
- tensorboard==2.2.1
- tensorboard-plugin-wit==1.6.0.post3
- tensorboardx==1.9
- tifffile==2020.5.25
- tqdm==4.46.0
- urllib3==1.25.9
- werkzeug==1.0.1
- zipp==3.1.0
- pyaml
prefix: ~/anaconda3/envs/e4e_env
进入cmd,进入目录 D:\AI\encoderforediting-main\environment ,运行:
conda env create -f win_e4e_env.yaml
conda activate e4e_env
pip uninstall torch
conda install pytorch==1.6.0 torchvision==0.7.0 cudatoolkit=10.1 -c pytorch
pip install intel-openmp
pip install dlib
这里,若没有安装 intel-openmp 组件包,则在运行(2.8)时会报告错误:
Error loading ".........\site-packages\torch\lib\caffe2_detectron_ops.dll" or one of its dependencies.
【注意】
安装dlib需要VC 2015,如果系统默认的编译环境是VC 2017,请先安装VC2015/tools(1.4.1)和Windows SDK(10.0.14393),然后执行以下命令:
git clone https://github.com/davisking/dlib.git
cd dlib
mkdir build
cd build
cmake .. -G "Visual Studio 14 2015 Win64" -T host=x64
cmake --build .
cd …
python setup.py install
访问微软网站,下载 VS Community 2017,
https://docs.microsoft.com/zh-cn/visualstudio/productinfo/vs2017-system-requirements-vs
运行 vs_Community.exe ,选择 “工作负载--Python开发”和“单个组件--VC++ 2017版本15.4 v14.11工具集”,安装并等待完成。
安装 VC 2017 时,若系统中已安装有 VC 2015,不必卸载VC 2015,把VC 2017 当做一个新软件安装即可。
(1.5.2.1)安装界面“假死”或“闪退”时怎么办
有时,运行 vs_Community.exe 时会出现安装界面“假死”或“闪退”的情况,这时可能需要用手工方法进行安装,方法如下:
进入Powershell(管理员),到 vs_community.exe 所在目录下运行:
.\vs_community.exe --layout d:\visualstudio2017
若弹出界面“假死”、“闪退”或显示了错误的安装信息,可以到 Windows 系统的临时目录下查看报错信息,如:C:\Users\Administrator\AppData\Local\Temp\****.log,遇到报错“Unable to find ***.json”时,往往是对应的目录下找不到 ***.json 文件,这时做类似下面的操作即可:
把文件:C:\Users\Administrator\AppData\Local\Temp\1.bqp\vs_installer.version.json
拷贝到目录:C:\Users\Administrator\AppData\Local\Temp\1.bqp\resources\app\layout
然后重新执行:
.\vs_community.exe --layout d:\visualstudio2017
这样安装包下载到本地的过程就可以继续了。
以上的错误会出现若干次,每次都需要在 C:\Users\Administrator\AppData\Local\Temp 下的不同子目录下操作,直到所有软件包都离线下载到本地为止(完整的VC 2017软件包大概有48GB左右,下载过程中有些可以跳过的错误也没有关系,甚至于不用下载到最后也可以,只要能安装“VC++ 2017版本15.4 v14.11工具集”即可)。
(1.5.2.2)安装证书
下载完成后,打开下载的文件目录,如:D:\visualstudio2017,找到certificates子目录并打开,依次安装该目录内的证书。双击证书,根据提示安装。
(1.5.2.3)运行安装程序
运行安装程序,如:
D:\visualstudio2017\vs_Community.exe
选择 “工作负载--Python开发”和“单个组件--VC++ 2017版本15.4 v14.11工具集”,安装并等待完成。
安装 VC 2017 时,若系统中已安装有 VC 2015,不必卸载VC 2015,把VC 2017 当做一个新软件安装即可。
conda activate e4e_env
找到 vcvarsall.bat ,并执行类似下面的命令:
"D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" x64
set DISTUTILS_USE_SDK=1
打开 cpp_extentsion.py 文件(注意:要选择envs\e4e_env\路径下的文件),如:d:\Anaconda3\envs\e4e_env\lib\site-packages\torch\utils\cpp_extension.py,做如下修改(注意:gbk前面有一个空格):
# match = re.search(r'(\d+)\.(\d+)\.(\d+)', compiler_info.decode().strip())
match = re.search(r'(\d+)\.(\d+)\.(\d+)', compiler_info.decode(' gbk').strip())
其他地方(多数是报错处理,如果编译过程无错误也可以不用修改),可以类似地进行修改:..decode()..修改为:..decode(‘ gbk’).. :
# message += ": {}".format(error.output.decode()) # type: ignore
message += ": {}".format(error.output.decode(' gbk'))
如果这里不做修改,往往运行(2.8)时会报错:
UserWarning: Error checking compiler version for cl: 'utf-8' codec can't decode byte 0xd3 in position 0: invalid continuation byte
如果在(1.5)中没有安装正确的编译工具版本及相关头文件,往往会报错:
subprocess.CalledProcessError: Command ‘[‘ninja‘, ‘-v‘]‘ returned non-zero exit status 1
这实际上是编译器报错(但由于有UTF-8错误不能正确输出)导致异常退出,只要将报错语句的..decode()..修改为:..decode(‘ gbk’).. 即可看到报错信息的完整输出。
(如果无报错,可跳过此处)
error: member “torch::jit::ProfileOptionalOp::Kind“ may not be initialized
找到 ir.h 这个文件,如:d:\Anaconda3\envs\e4e_env\lib\site-packages\torch\include\torch\csrc\jit\ir\ir.h ,
把这一行注释掉就可以运行了:
struct TORCH_API ProfileOptionalOp : public Node {
// static constexpr Symbol Kind = ::c10::prim::profile_optional;
// 后面的省略...
};
(如果无报错,可跳过此处)
fused_bias_act_kernel.cuda.o : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl c10::cuda::CUDAStream::operator struct CUstream_st *(void)const " (__imp_??BCUDAStream@cuda@c10@@QEBAPEAUCUstream_st@@XZ) referenced in function "class at::Tensor __cdecl fused_bias_act_op(class at::Tensor const &,class at::Tensor const &,class at::Tensor const &,int,int,float,float)" (?fused_bias_act_op@@YA?AVTensor@at@@AEBV12@00HHMM@Z)
fused_bias_act_kernel.cuda.o : error LNK2019: unresolved external symbol "__declspec(dllimport) class c10::cuda::CUDAStream __cdecl c10::cuda::getCurrentCUDAStream(short)" (__imp_?getCurrentCUDAStream@cuda@c10@@YA?AVCUDAStream@12@F@Z) referenced in function "class at::Tensor __cdecl fused_bias_act_op(class at::Tensor const &,class at::Tensor const &,class at::Tensor const &,int,int,float,float)" (?fused_bias_act_op@@YA?AVTensor@at@@AEBV12@00HHMM@Z)
fused.pyd : fatal error LNK1120: 2 unresolved externals
ninja: build stopped: subcommand failed.
可以修改 \models\stylegan2\op\fused_act.py,增加一行:extra_ldflags = ['c10_cuda.lib']
fused = load(
'fused',
sources=[
os.path.join(module_path, 'fused_bias_act.cpp'),
os.path.join(module_path, 'fused_bias_act_kernel.cu'),
],
extra_ldflags = ['c10_cuda.lib']
)
同时修改 \models\stylegan2\op\upfirdn2d.py,增加一行:extra_ldflags = ['c10_cuda.lib']
upfirdn2d_op = load(
'upfirdn2d',
sources=[
os.path.join(module_path, 'upfirdn2d.cpp'),
os.path.join(module_path, 'upfirdn2d_kernel.cu'),
],
extra_ldflags = ['c10_cuda.lib']
)
在 encoder4editing 工作目录下创建子目录: .\inference_images,把需要反演(Inversion)的图片放到该目录下,可以放多张图片(建议每张图片是经过对齐、裁剪过的1024x1024的图片,对齐的方法可以参考 align_images.py:https://blog.csdn.net/weixin_41943311/article/details/103030194)。
百度网盘: https://pan.baidu.com/s/1TrNCcvyJzNCxEanfWrwTqg 提取码: bf7d
下载完成后将e4e-ffhq-encode.pt文件拷贝到项目所在目录的pretrained_models子目录下,如:D:\AI\encoderforediting-main\pretrained_models
python scripts/inference.py --images_dir inference_images --save_dir inference_images pretrained_models/e4e_ffhq_encode.pt
源图 反演(inversion)图片
同时,反演时得到的StyleGAN2潜码,存放在文件 .\inference_images\latents.pt 中(可同时存放多张图片的潜码内容)。
总体上感觉,这个项目实现真实图片反演的逼真程度,较之最好的基于tensorflow的StyleGAN2Encoder(参见:https://blog.csdn.net/weixin_41943311/article/details/106574690)稍微差一点点,但是其反演潜码具备更好的可编辑性,在变更图像属性(如:发型、肤色、表情、胖瘦等)方面有更佳表现。
根据论文所述,有两种实现真实图片反演的技术路线:(1)潜码优化法,(2)反演编码器法,e4e 项目专注于基于反演编码器的方法。首先,因为反演编码器法的速度明显更快,通过一次前向传递即可推断出一个潜在代码,而潜码优化法需要对每幅图像进行昂贵的优化迭代。其次,由于卷积神经网络是分段平滑的,反演编码器的输出位于更适合编辑的紧凑空间中;相反,基于潜码优化法的反演可能会收敛到潜在空间中的任意点(可能并不适宜后续的属性向量编辑)。
本项目是一个基于Pytorch的实现,在应用前景和运算速度上有独到的意义,是一项很不错的工作。
(完)