1.はじめに
今まで、GANで人の鮮明な全身画像を生成することは、その複雑な形状から難しい課題でした。今回ご紹介するのは、それを可能にしたStyleGAN-Humanという技術です。
2.StyleGAN-Humanとは?
現時点で、まだこの技術の論文は公開されていませんので詳細は不明ですが、Abstract(概略)を眺めて見ると、
StyleGANを使って、学習データのサイズ、分散、アラインメントについて特に注力して研究した結果以下の3点が明らかになった。
- データサイズは、40Kを超える大規模なものが必要
- バランスの取れたトレーニングセットが重要だが、衣服のテクスチャ分布のバランスをとるだけでは十分ではない。
- アライメントはボディセンターを使うモデルが、顔のセンターや骨盤の位置を使うモデルよりも優れている。
まだベールに包まれていますが、とりあえずコードが公開されているので動かしてみましょう。
3.コード
コードはGoogle Colabで動かす形にしてGithubに上げてありますので、それに沿って説明して行きます。自分で動かしてみたい方は、この「リンク」をクリックし表示されたノートブックの先頭にある「Colab on Web」ボタンをクリックすると動かせます。
まず、セットアップを行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#@title **Setup** # check gpu spec ! nvidia-smi -L # get code from github ! git clone https://github.com/cedro3/StyleGAN-Human.git %cd StyleGAN-Human # install ninja ! wget https://github.com/ninja-build/ninja/releases/download/v1.8.2/ninja-linux.zip ! sudo unzip ninja-linux.zip -d /usr/local/bin/ ! sudo update-alternatives --install /usr/bin/ninja ninja /usr/local/bin/ninja 1 --force # install library ! pip install lpips ! pip install --upgrade gdown # select tensorflow_version %tensorflow_version 1.x # download pretrained models ! mkdir pretrained_models import gdown gdown.download('https://drive.google.com/uc?id=1FlAb1rYa0r_--Zj_ML8e6shmaF28hQb5', 'pretrained_models/stylegan2_1024.pkl', quiet=False) gdown.download('https://drive.google.com/uc?id=125OG7SMkXI-Kf2aqiwLLHyCvSW-gZk3M', 'pretrained_models/ffhq.pkl', quiet=False) gdown.download('https://drive.google.com/uc?id=1MduBgju5KFNrQfDLoQXJ_1_h5MnctCIG', 'pretrained_models/mmod_human_face_detector.dat', quiet=False) gdown.download('https://drive.google.com/uc?id=1A82DnJBJzt8wI2J8ZrCK5fgHcQ2-tcWM', 'pretrained_models/shape_predictor_68_face_landmarks.dat', quiet=False) # define function from function import * |
まず、単純に画像生成してみましょう。seeds に数字を指定(1,2 の様にカンマで区切っても、0-4の様に範囲でもOK)して、実行します。なお、表示の関係で数字は50個以内にして下さい。
1 2 3 4 5 6 7 8 9 10 11 12 |
#@title **Generate images** seeds = "0-4" #@param {type:"string"} ! python generate.py --outdir=outputs/stylegan2_1024/\ --seeds=$seeds\ --trunc=0.7\ --network=pretrained_models/stylegan2_1024.pkl\ --version 2 # display_pic display_pic('outputs/stylegan2_1024') |
次に、2つの画像で補間動画を作成してみましょう。seeds に2つ数字を指定(3つ以上指定した場合は先頭の2つのみ有効)して、実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#@title **interpolate images** seeds = "97,9" #@param {type:"string"} ! python interpolation.py --network=pretrained_models/stylegan2_1024.pkl\ --seeds=$seeds\ --outdir=outputs/inter_gifs # gif2mp4 ! ffmpeg -y -i outputs/inter_gifs/latent_space_traversal.gif -pix_fmt yuv420p -loglevel error outputs/inter_gifs/inter.mp4 # display_mp4 display_mp4('outputs/inter_gifs/inter.mp4') |
今度は、InterfaceGANで衣服の長さを編集してみましょう。attr_nameでupper_length(上半身)かbotom_length(下半身)を選択し、実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#@title **Editing with InterfaceGAN, StyleSpace, and Sefa** attr_name = 'upper_length' #@param ["upper_length", "botom_length"] seeds = 61570 #@param {type:"integer"} ! python edit.py --outdir outputs/editing\ --network pretrained_models/stylegan2_1024.pkl\ --attr_name $attr_name\ --seeds $seeds # display mp4 video_path = 'outputs/editing/video/'+attr_name+'_'+str(seeds)+'.mp4' display_mp4(video_path) |
左から、元画像、InterfaceGAN、StyleSpace、Sefa です(stylespaceとSefaは比較)。ついでに下半身も変化していますが、ご愛嬌ということで。
styleGANを使っているので、当然style-mixingができます。rows(縦軸)とcols(横軸)を数字で選んで実行します。縦軸の人が横軸の人のスタイルに影響を受けて画像が変化します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#@title **style-mixing** rows = "85,100,75,458,1500" #@param {type:"string"} cols = "55,821,1789,293" #@param {type:"string"} styles = "0-3" #@param {type:"string"} ! python style_mixing.py --outdir=outputs/stylemixing\ --rows=$rows\ --cols=$cols\ --network=pretrained_models/stylegan2_1024.pkl\ --styles=$styles # display png from IPython.display import Image,display_png display_png(Image('outputs/stylemixing/grid.png')) |
最後に、insetGANを使って、顔とボディを組み合わせてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#@title **Perform joint optimization and generate seamless images** face_seed = "10" #@param {type:"string"} body_seed = "89180" #@param {type:"string"} !python insetgan.py --face_seed=$face_seed\ --body_seed=$body_seed\ --joint_steps=500\ --outdir outputs/insetgan\ --video 1 # display mp4 video_path = 'outputs/insetgan/'+face_seed.zfill(4)+'_'+body_seed.zfill(4)+'.mp4' display_mp4(video_path) |
この技術、ファッション関係の様々なルーチン作業を根本的に変革させるパワーを秘めていますね。凄い!
では、また。
(オリジナルgithub)https://github.com/stylegan-human/StyleGAN-Human