【实战】(以色列·特拉维夫大学)将 E4E 成功移植到Windows 10: StyleGAN2图像处理编码器的设计,支持Pytorch Cuda/C++ Extension

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 成功移植到Windows 10: StyleGAN2图像处理编码器的设计,支持Pytorch Cuda/C++ Extension_第1张图片

【说明】e4e网络架构。e4e使用基于编码器(encoder)的方法,在控制失真量的前提下力求获得反演图像最佳的感知质量与可编辑潜码(editable latents)。它不仅关注于如何获得高质量的反演图像,更加关注于如何获得高质量的可编辑潜码,使得真实图像在数字孪生空间内具有更强的感知质量与演变能力。e4e编码器接收输入图像并输出单个样式代码w以及一组偏移量,Δ(1)......Δ(N-1),其中N表示StyleGAN样式调制层的数量。通过N次复制w向量并将每个 Δ(i) 添加到对应向量上来获得最终的潜码表示。

它的官网上说,项目的源代码只能跑在 Linux 或 macOS 上,现在我们把它移植到Windows 10上。以下为移植步骤和上手试用的简要介绍。

(一)移植到Windows 10

(1.1)必备环境

Windows 10,NVIDIA Geforce RTX 2080Ti,VC 2017/VC++ 2017版本15.4 v14.11工具集,Pytoch 1.6.0,cudatoolkit 10.1

(1.2)下载e4e(encoderforediting)项目

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

(1.3)创建虚拟环境(PowerShell不能激活相应环境,请务必使用cmd)

在 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

(1.4)安装Pytorch环境及其他必要组件

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

(1.5)安装 VS 2017 version 15.4 v14.11 Toolset(经测试这个版本可用,其他版本存疑)

访问微软网站,下载 VS Community 2017,

https://docs.microsoft.com/zh-cn/visualstudio/productinfo/vs2017-system-requirements-vs

【实战】(以色列·特拉维夫大学)将 E4E 成功移植到Windows 10: StyleGAN2图像处理编码器的设计,支持Pytorch Cuda/C++ Extension_第2张图片

(1.5.1)正常安装

运行 vs_Community.exe ,选择 “工作负载--Python开发”和“单个组件--VC++ 2017版本15.4 v14.11工具集”,安装并等待完成。

【实战】(以色列·特拉维夫大学)将 E4E 成功移植到Windows 10: StyleGAN2图像处理编码器的设计,支持Pytorch Cuda/C++ Extension_第3张图片【实战】(以色列·特拉维夫大学)将 E4E 成功移植到Windows 10: StyleGAN2图像处理编码器的设计,支持Pytorch Cuda/C++ Extension_第4张图片

安装 VC 2017 时,若系统中已安装有 VC 2015,不必卸载VC 2015,把VC 2017 当做一个新软件安装即可。

(1.5.2)手工安装(将安装包下载到本地后再安装)

(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工具集”,安装并等待完成。

【实战】(以色列·特拉维夫大学)将 E4E 成功移植到Windows 10: StyleGAN2图像处理编码器的设计,支持Pytorch Cuda/C++ Extension_第5张图片【实战】(以色列·特拉维夫大学)将 E4E 成功移植到Windows 10: StyleGAN2图像处理编码器的设计,支持Pytorch Cuda/C++ Extension_第6张图片

安装 VC 2017 时,若系统中已安装有 VC 2015,不必卸载VC 2015,把VC 2017 当做一个新软件安装即可。

(二)修改部分代码并运行

(2.1)进入cmd,激活开发环境

conda activate e4e_env

(2.2)设置VC 2017编译环境变量

找到 vcvarsall.bat ,并执行类似下面的命令:

"D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" x64

set DISTUTILS_USE_SDK=1

(2.3)修改 cpp_extension.py 文件,解决UTF-8编码的问题

打开 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’).. 即可看到报错信息的完整输出。

(2.4)如果运(2.8)时遇到报错信息

(如果无报错,可跳过此处)

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;
  // 后面的省略...
};

(2.5)如果运行(2.8)时报错

(如果无报错,可跳过此处)


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']
)

(2.6)准备一些图片

在 encoder4editing 工作目录下创建子目录: .\inference_images,把需要反演(Inversion)的图片放到该目录下,可以放多张图片(建议每张图片是经过对齐、裁剪过的1024x1024的图片,对齐的方法可以参考 align_images.py:https://blog.csdn.net/weixin_41943311/article/details/103030194)。

(2.7)下载预训练模型:e4e-ffhq-encode.pt(1.12GB)

百度网盘: https://pan.baidu.com/s/1TrNCcvyJzNCxEanfWrwTqg 提取码: bf7d

下载完成后将e4e-ffhq-encode.pt文件拷贝到项目所在目录的pretrained_models子目录下,如:D:\AI\encoderforediting-main\pretrained_models

(2.8)运行

python scripts/inference.py --images_dir inference_images --save_dir inference_images pretrained_models/e4e_ffhq_encode.pt

(2.9)运行效果

源图                                                                     反演(inversion)图片

  【实战】(以色列·特拉维夫大学)将 E4E 成功移植到Windows 10: StyleGAN2图像处理编码器的设计,支持Pytorch Cuda/C++ Extension_第7张图片

  【实战】(以色列·特拉维夫大学)将 E4E 成功移植到Windows 10: StyleGAN2图像处理编码器的设计,支持Pytorch Cuda/C++ Extension_第8张图片

同时,反演时得到的StyleGAN2潜码,存放在文件 .\inference_images\latents.pt 中(可同时存放多张图片的潜码内容)。

总体上感觉,这个项目实现真实图片反演的逼真程度,较之最好的基于tensorflow的StyleGAN2Encoder(参见:https://blog.csdn.net/weixin_41943311/article/details/106574690)稍微差一点点,但是其反演潜码具备更好的可编辑性,在变更图像属性(如:发型、肤色、表情、胖瘦等)方面有更佳表现。

根据论文所述,有两种实现真实图片反演的技术路线:(1)潜码优化法,(2)反演编码器法,e4e 项目专注于基于反演编码器的方法。首先,因为反演编码器法的速度明显更快,通过一次前向传递即可推断出一个潜在代码,而潜码优化法需要对每幅图像进行昂贵的优化迭代。其次,由于卷积神经网络是分段平滑的,反演编码器的输出位于更适合编辑的紧凑空间中;相反,基于潜码优化法的反演可能会收敛到潜在空间中的任意点(可能并不适宜后续的属性向量编辑)。

本项目是一个基于Pytorch的实现,在应用前景和运算速度上有独到的意义,是一项很不错的工作。

(完)

你可能感兴趣的:(机器学习)