Pythonライブラリ(画像生成):StyleGAN3
1.緒言
1-1.概要
画像から画像を作成する技術(img2img)として有名なAIモデルにStyleganがあります。今回は最新Versionのstylegan3を実装しました。
1-2.Stylegan1, 2の実装に関する所感
stylegan1,2を実装しようと試みましたが環境構築で無理でした。ver.1,2はtensorflowの1.x系向けで作成されており、2022年9月現在のtensorflowは2.9系までVersion Upしております。
特に1.0系と2.0系でAPI仕様に大きな変化が出ており初学者レベルでは1.0系向けに作られたスクリプトを2.0系で使用することはムリゲーです。参考までに下記を実施してみましたがすべて無理でした(get_default_session()のエラーが抜けなかった)。
【stylegan1,2でのトライアル】
※基本的にはGoogle colabで実行
Version違いによる属性エラーの場合、エラー箇所に"compat.v1"を追加
”import tensorflow as tf”->"import tensorflow.compat.v1 as tf tf.disable_v2_behavior()"に変更
処理前に"%tensorflow_version 1.x"を実行->Colabではエラー
[どうしても消せなかったエラー]
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_13020/4120020643.py in <module>
----> 1 tflib.init_tf()
c:\Users\KIYO\Desktop\note\12. Python-Art\08. stylegan\stylegan\dnnlib\tflib\tfutil.py in init_tf(config_dict)
95
96 def init_tf(config_dict: dict = None) -> None:
---> 97 # Skip if already initialized.
98 if tf.get_default_session() is not None:
99 return
AttributeError: module 'tensorflow' has no attribute 'get_default_session'
2.仮想環境の作成
仮想環境で開発していきますがどこまでPCの影響が出るかを理解できていません。参考までに私のPCではすでにCUDAのセットアップは終えておりNVCC(Nvidia CUDA コンパイラ)コマンドを入れると下記が出力されます。
[Terminal]
nvcc -V
必要環境条件の詳細(各種VersionやOS)は「公式:Requirements」をご確認ください。
2-1.GitHubからstylegan3ファイルのDL
下記コードを実行して「NVIDIA Research Projects」のGithubからstylegan3のファイルをダウンロードします。処理が完了すると"stylegan3"フォルダが作成されます。
[Terminal]
git clone https://github.com/NVlabs/stylegan3.git
2-2.YAMLファイル修正
Anacondaを使用してstylegan3用の仮想環境を作成します。仮想環境の構築やコマンドは下記記事をご確認ください。
stylegan3ファルダ内に仮想環境を作成するための"environment.yml"がありますがこのままだとエラーになります。
[エラー内容]
Collecting package metadata (repodata.json): done
Solving environment: failed
ResolvePackageNotFound:
- cudatoolkit=11.1
修正方法として"cudatoolkit=11.1"の位置をpipの下へ移動させます。
(※参考までに「Windows11でStyleGAN3を試してみる」ではChannelsに"- conda-forge"を追記しています)
[修正後environment.yml"]
name: stylegan3
channels:
- pytorch
- nvidia
dependencies:
- python >= 3.8
- pip
- numpy>=1.20
- click>=8.0
- pillow=8.3.1
- scipy=1.7.1
- pytorch=1.9.1
- requests=2.26.0
- tqdm=4.62.2
- ninja=1.10.2
- matplotlib=3.4.2
- imageio=2.9.0
- pip:
- imgui==1.3.0
- glfw==2.2.0
- pyopengl==3.1.5
- imageio-ffmpeg==0.4.3
- pyspng
- cudatoolkit=11.1
2-3.仮想環境(stylegan3)の作成
YAMLファイルを修正したら作業ディレクトリをstylegan3へ移動して仮想環境を作成するコードを実行します。成功すれば各種パッケージのインストールが始まります。
[Terminal]
cd stylegan3
conda env create -f environment.yml
完了後に仮想環境の一覧を出力してstylegan3という仮想環境が作成されていれば成功です。
[Terminal]
conda info -e
[OUT]
# conda environments:
#
base * C:\Users\KIYO\Anaconda3
stylegan3 C:\Users\KIYO\Anaconda3\envs\stylegan3
【参考】
なんかエラーっぽい内容が出力されていますがとりあえず動いているからヨシ
done
Installing pip dependencies: - Ran pip subprocess with arguments:
['C:\\Users\\KIYO\\Anaconda3\\envs\\stylegan3\\python.exe', '-m', 'pip', 'install', '-U', '-r', 'C:\\Users\\KIYO\\Desktop\\note\\12. Python-Art\\09. stylegan3\\stylegan3\\condaenv.j3al44qt.requirements.txt']
Pip subprocess output:
Pip subprocess error:
Fatal Python error: init_import_size: Failed to import the site module
Python runtime state: initialized
Traceback (most recent call last):
File "C:\Users\KIYO\Anaconda3\lib\site.py", line 580, in <module>
main()
File "C:\Users\KIYO\Anaconda3\lib\site.py", line 566, in main
known_paths = addusersitepackages(known_paths)
File "C:\Users\KIYO\Anaconda3\lib\site.py", line 316, in addusersitepackages
addsitedir(user_site, known_paths)
File "C:\Users\KIYO\Anaconda3\lib\site.py", line 208, in addsitedir
addpackage(sitedir, name, known_paths)
File "C:\Users\KIYO\Anaconda3\lib\site.py", line 164, in addpackage
for n, line in enumerate(f):
File "C:\Users\KIYO\Anaconda3\lib\codecs.py", line 322, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x82 in position 37: invalid start byte
failed
CondaEnvException: Pip failed
2-4.仮想環境の起動:activate stylegan3
仮想環境の生成が確認出来たら起動させます。Terminalの頭が(base)->(stylegan3)に変更されていたら準備は完了です。
[Terminal]
activate stylegan3
2-5.追加ライブラリのインストール
本節は飛ばしてもよいですがもし動かない場合はエラー文に応じて各種ライブラリをインストールします。
[Terminal]
pip install imageio-ffmpeg #動画生成時
[visualizer.py使用時]
>pip install imgui
pip install glfw
pip install pyopengl
3.stylegan3のオプション
stylegan3のコマンドで使用するオプションを確認します。
3-1.画像用:gen_images.py
オプションは画像生成用スクリプト”gen_images.py”から確認しました。
3-2.動画用:gen_video.py
オプションは動画生成用スクリプト”gen_video.py”から確認しました。
4.学習済みモデルで画像生成
StyleGAN3の学習モデルは複数のモデルがあり"https://api.ngc.nvidia.com/
v2/models/nvidia/research/stylegan3/versions/1/files/<MODEL>"のように指定することでAPI経由で実行できます。モデル一覧は下記の通りです。
乱数シードと学習モデルを固定すれば同じ出力結果が得られますので参考結果は下記ご確認ください。
なお学習モデルはAPIを使用せず下記からダウンロードも可能です。
4-1.AFHQv2で画像生成
NVIDIAの学習済みモデルAFHQv2(stylegan3-r-afhqv2-512x512.pkl)を使用して乱数値から画像を生成します。成功すると"out"フォルダが作成され猫の画像が生成されます。
[Terminal]
python gen_images.py --outdir=out --trunc=1 --seeds=2 --network=https://api.ngc.nvidia.com/v2/models/nvidia/research/stylegan3/versions/1/files/stylegan3-r-afhqv2-512x512.pkl
[OUT]
Loading networks from "https://api.ngc.nvidia.com/v2/models/nvidia/research/stylegan3/versions/1/files/stylegan3-r-afhqv2-512x512.pkl"...
C:\Users\KIYO\Anaconda3\envs\stylegan3\lib\site-packages\scipy\__init__.py:146: UserWarning: A NumPy version >=1.16.5 and <1.23.0 is required for this version of SciPy (detected version 1.23.1
warnings.warn(f"A NumPy version >={np_minversion} and <{np_maxversion}"
Generating image for seed 2 (0/1) ...
Setting up PyTorch plugin "bias_act_plugin"... Done.
Setting up PyTorch plugin "filtered_lrelu_plugin"... Done.
シードの指定を"--seedI0-3"のように指定すると乱数値を"0, 1, 2, 3"のように指定した形となり計4枚の画像が出力されます。
[IN]
python gen_images.py --outdir=out --trunc=1 --seeds=0-3 --network=https://api.ngc.nvidia.com/v2/models/nvidia/research/stylegan3/versions/1/files/stylegan3-r-afhqv2-512x512.pkl
[OUT]
Loading networks from "https://api.ngc.nvidia.com/v2/models/nvidia/research/stylegan3/versions/1/files/stylegan3-r-afhqv2-512x512.pkl"...
C:\Users\KIYO\Anaconda3\envs\stylegan3\lib\site-packages\scipy\__init__.py:146: UserWarning: A NumPy version >=1.16.5 and <1.23.0 is required for this version of SciPy (detected version 1.23.1
warnings.warn(f"A NumPy version >={np_minversion} and <{np_maxversion}"
Generating image for seed 0 (0/4) ...
Setting up PyTorch plugin "bias_act_plugin"... Done.
Setting up PyTorch plugin "filtered_lrelu_plugin"... Done.
Generating image for seed 1 (1/4) ...
Generating image for seed 2 (2/4) ...
Generating image for seed 3 (3/4) ...
【参考:学習モデルの重み】
--networkに指定したURLから学習モデルの重み(Pickles)を取得しますが重みは"$HOME/.cache/dnnlib"に保存されています。
[]
"C:/Users/KIYO/.cache/dnnlib/downloads/20755e1ffb4380580e4954f8b0f9e630_stylegan3-r-afhqv2-512x512.pkl"
4-2.学習済みモデルAFHQv2で動画生成
次に動画を作成します。下記条件では「乱数シード0~31を補間(内挿)して生成した画像を4×2グリッドに配置」となります。
[Terminal]
python gen_video.py --output=lerp.mp4 --trunc=1 --seeds=0-31 --grid=4x2 --network=https://api.ngc.nvidia.com/v2/models/nvidia/research/stylegan3/versions/1/files/stylegan3-r-afhqv2-512x512.pkl
参考資料
参考資料1:実装関係
参考資料2:技術関係
参考資料3:StyleGANの記事
あとがき
取り急ぎ先出。stable diffusionの方が汎用性高そうなのでそちらに力注ぐ間も
この記事が気に入ったらサポートをしてみませんか?