SemanticStyleGANって知ってますか ? CVPR2022で発表された技術で、StyleGAN2をベースに目、鼻、口、髪型など特定の個所のみエディットできる技術です。プロジェクトページはこちら。
いきさつ
この技術を使って、視線トラッキングの教師データの顔画像群に様々な髪型や髭、眼鏡などを適用してデータの水増しを行おうというのが当初の目的でした。
というわけで
早速ソースコードをダウンロードしてサンプルを動かしてみます。まず人工顔の生成から。
$ cd SemanticStyleGAN $ cp visualize/generate.py . $ python3 generate.py \ pretrained/CelebAMask-HQ-512x512.pt \ --outdir results/samples \ --sample 20 \ --save_latent
結果を見てみると、実写と見まごうばかりの(でもどこか不自然な気もする)人工セレブの顔画像ができています。
次に顔パーツにエディットしてみます。
$ cp visualize/generate_video.py . $ python3 generate_video.py \ pretrained/CelebAMask-HQ-512x512.pt \ --outdir results/interpolation \ --latent results/samples/000000_latent.npy
そして出来上がった動画をピックアップして表示してみます。
from moviepy.editor import * from moviepy.video.fx.resize import resize concat_video = './results/interpolation/concat.mp4' clip1 = VideoFileClip('./results/interpolation/04_face_shape.mp4') clip2 = VideoFileClip('./results/interpolation/06_eye_shape.mp4') clip3 = VideoFileClip('./results/interpolation/10_mouth_shape.mp4') clip4 = VideoFileClip('./results/interpolation/18_neck_shape.mp4') clip5 = VideoFileClip('./results/interpolation/16_hair_shape.mp4') clip6 = VideoFileClip('./results/interpolation/17_hair_texture.mp4') concat = clips_array([[clip1, clip2], [clip3, clip4], [clip5, clip6]]) concat = resize(concat, width=640) concat.write_videofile(concat_video)
できあがったconcat.mp4を見てみると…(動画だとおどろおどろしい感じもあったので静止画で)
ありゃりゃ、なんかおかしいぞ。まったく正常に動作していない。
動かした人がいるか探してみると
こんな素晴らしい記事([SemanticStyleGAN] 機械学習で任意の画像の画像合成・画像編集)がありました。見るかぎり、正しく動作してるっぽい。大変ありがたいことに、GoogleColabで動作するソースコードも公開されているので早速試してみる。
上から再生していくだけの簡単な作業。そしてすべて正常動作を確認。ちゃんと長髪がさらりと伸びている。うーむ。何が違うのか…
いろいろ試してみる
GoogleColabの環境を調べて、CUDAバージョン、PyTorchをはじめとするPythonライブラリーのバージョンなど合わせてみるも、うまく動かない。仰せの通りにインストールしているはずなのに、なぜだー。
ほとんど諦めかけていた矢先、もしかしてPythonのバージョンじゃない ? とふと思いつきGoogleColabを調べてみると Python 3.7.3。自分の環境は最近一斉に上げたので Python 3.9/3.10。「まさかやー」と思いつつも Python 3.7 に切り替えて動作させてみると…
キタ――(゚∀゚)――!!
無事動作しました。ホッ。
というわけで、SemanticStyleGANがうまく動作しない場合はPythonのバージョンを確認しましょう。Python 3.7(以下 ? )だと正常動作するようです。
肝心の目的は…
実は達成できなかったんですよねー、残念。
というのは、Pretrainedのモデルは CelebAMask-HQ で学習したものなので、データセットはほぼ正面顔で視線も正面を見ているものがほとんどです。なので、inversion.py を利用して latent を生成し、その latent から顔を再構成すると、あさっての方向を見ている視線が保持されずに視点が正面に変換されてしまいました。
顔パーツにエディットするためには latent と呼ばれる顔画像の潜在情報が必要で、latent を生成するために元画像を変換する必要があるのですが、その過程で視線情報が失われてしまうというわけです。
さまざまな方向を見ている顔画像で学習し直せば恐らくうまく行くと予想しますが、顔のセグメンテーションマスクも学習には必要になるので、どうしようかなーと考えあぐねております。
次の予告編になりますが
これ使えるんじゃね ? と思われる技術を見つけました。StyleGAN の本家 NVIDIA の EditGAN です。
なんと黒目だけを動かす、ということができるようで、これをうまく使うとひょっとしたらうまく行くかもー、と思い始めています。
まだまったく触っていませんが、いずれ記事にしたいと思っているのでお楽しみにー。