GAN_thum6.png

2022.05.30

読了時間:5分

CLIPとGANを組み合わせた画像加工

A2B_102 (2).png

國田圭佑

どうも、sodaエンジニアの國田です!
突然ですが、皆さま、CLIPってご存じですか!?

CLIPは2021年1月にOpenAIにより公開されたモデルで、「画像」と「画像の説明文」4億組を学習させているという、大規模モデルです(*1)。CLIPを使いますと、ある画像に対し、その説明文がどの程度合っているかを出力することができます。(これを難しい言葉で画像とテキストの類似度と言います。)
例えば、「たわわに実った赤いリンゴ」という説明文と「リンゴの実がたくさん宿った木の写真」はよく似ているという評価が得られ、同じ説明文に対し「猫のイラスト」を渡したり、「女優の顔写真」を渡したりするとあまり似ていない、合っていないという結果が数値で出力されるというわけです。

今回はこのCLIPとおなじみのStyleGANを使った実験をしてみたいと思います。

過去、本ブログではStyleGANを使って様々な画像を生成してきましたが、ある問題点がありました。
それは「自分の思い通りの画像を生成することができない」という点です。
せいぜいできるのは、他の画像とミックスさせて雰囲気を変える程度でした。
GANの生成器に画像を生成させる時、「もう少し髪の色を明るくしたい」とか「無愛想なので、笑顔に変えて欲しい」とか、あらかじめ欲しい画像のイメージがあると思います。
でも、イメージ通りの画像を生成するためには、そのイメージに近い画像を最初にGANに生成させておく必要があるという矛盾を抱えていました。

ただ、CLIPを使えばそんな問題を解決することができます。

詳しく説明します。
ここに、GANの生成器に適当に生成させた画像が1枚あるとしましょう。そして、別途、欲しい画像を説明した一文(例えば「ハンサムなアメリカ人男性の顔」など)があるとします。
先ほど述べたように、CLIPは画像と文章がどの程度似ているかを出力させることができます。つまりCLIPに「GANで適当に生成した画像」と「欲しい画像の説明文」を渡せば、両者の近しさを数値で得られるのです。

説明文に近い画像を手に入れるためには、この似ている度合いができるだけ高くなるような画像をGANに生成させることができれば良いわけです。重要なのは「GANが生成した画像と欲しい画像の説明文との差をGAN自身に埋めさせる」こと。
つまり、以下の要領でいけるでしょう。
① 学習済みのGANの生成器を使い、画像を適当に⽣成させる。
② 「⽣成された画像」と「欲しい画像の説明文」をCLIPで⽐較することによって、似ている度合い(類似度)を算出する。
 この値を誤差として、誤差逆伝播を行い、 GANのパラメータを更新する(≒類似度が大きくなってくれるような潜在変数を探してくる)。
③ 更新されたパラメータを⽤いて、生成器に新しい画像を⽣成させる。
④ 似ている度合い(類似度)が⼗分に⼩さくなるまで②、③を繰り返す。

お気付きの方もいるかも知れませんが、この方法のベースとなる考え方は以前紹介した記事(『GANは私の顔を作れるのか?』)に非常に似ているものです。

さぁ、やってみよう

では、解説が終わったところで実際にやってみましょう。
今回は、こちらの画像(私の顔画像を学習済みのStyleGANに生成させたものです*1)を最初に用意し、狙い通りの画像に変換できるようにGANの生成器にテキストで命令していきます。

origin_face.png

「イケメンアメリカ人の画像を生成してくれ!」

では、GANにイケメンアメリカ人の画像を生成してもらいましょう。CLIPは英語しか対応しておりませんので、英語で説明文を提示します。
元の画像を"Japanese with black hair"(黒髪の日本人)として、欲しい画像の説明文を"Blonde handsome American"(金髪のハンサムなアメリカ人)としておくことで、元の画像と欲しい画像との差分を考慮しながら画像を生成させることができます。

以下、結果です。比較のために左側に元の画像を配置してあります。
BlondeHandsomeAmerican.pngかなり良いのではないでしょうか? でも、メガネかけたままなので、裸眼にしてみたいですよね?
上記の説明文のままではメガネに関する情報が無いため、説明文をちょっと変えましょう。
元の画像を"Japanese with black hair and eyeglasses"(黒髪でメガネを掛けた日本人)として、欲しい画像の説明文を"Blonde handsome American with eyes"(ハンサムで金髪の裸眼のアメリカ人)とします。
BlondeHandsomeAmericanWithEyes.png完璧・・!すごくカッコいいです。今度から私のSNSアイコンにしたいぐらい。
これ、ヒゲなどを足すともっとカッコよくなるのではないでしょうか。
元の画像を"Japanese with black hair and eyeglasses"(黒髪でメガネを掛けた日本人)として、欲しい画像の説明文を"Blonde handsome American with eyes and beard"(ハンサムで金髪の裸眼のアメリカ人)とします。
BlondeHandsomeAmericanWithEyesBeard.pngちょっとワイルドな印象に・・!ここまでいってしまうと最早別人ですね笑

「表情の異なる画像を作ってくれ!」

先ほどとは変化の方向性を変えてみます。GANの生成器に表情のコントロールをさせることはできるのでしょうか?
元の画像を"Expressionless"(無表情)として、欲しい画像の説明文を"Smiling Face"(笑顔)とします。
smiling.png滅茶苦茶良い笑顔です笑
では、怒ってもらいましょう。欲しい画像の説明文を"Angry Face"(怒り顔)とします。
Angry.png怒り顔と言えば怒り顔なのでしょうが、何か違う印象を受けるのは私だけでしょうか?眉が吊り上がったり、口がすぼまったりはしていますが・・。今回の実験では、GANでうまく生成できるかどうかは、CLIP次第ですので、そもそも「怒り顔の日本人」というのがCLIPにあまり含まれていないのかも知れません。(海外からは「日本人は表情に乏しい」とも言われてますしね。)

「髪型を変化させてくれ!」

続けて、髪型を変化させてみましょう。
元の画像を"medium hair"(中間的な長さの髪)として、欲しい画像の説明文を"Buzz Cut"(坊主刈り)とします。

BuzzCut.png

良いですね!では長髪にしてみましょう!欲しい画像の説明文を"long hair"(長髪)として、

Longhair.png

あー、私が髪伸ばしたらこういう感じになるのかー。なんて、ちょっとしたヘアカタログ閲覧してる気分になりますね、これ。

では、最後にこちらはできるのでしょうか?
欲しい画像の説明文を"Afro hair"(アフロ)にしてみます。

Afro.png

大成功!笑

「性別・年齢・輪郭変化はできる?」

性別や年齢、体型の変化もやってみましょう。
説明文を"female"(女性)にして、

female.png

なるほど。私が女性だったら、こうなるわけですね。
今度は逆に男性っぽさを強くしてみましょう。オリジナル画像の説明文を"female"(女性)にして、欲しい画像の説明文を"male"(男性)にしてしまえば、差分として計算させることはできますね。

male.pngやだ、カッコいい・・!

続きまして、老人化。説明文を"aged"(老人)にして、
aged.pngよくできていますね。逆(若返り)はどうでしょう。
young.pngずいぶんと印象変わりますね。かなり若くなった感じ、10代くらいの印象です。
個人的には、私自身は今も"young"だと思ってますので、変化が殆ど無いと予測していたのですが、どうやら私はCLIP上では"young"に分類されない様子(軽くショック)。

気を取り直して、輪郭変化させてみます。まず"skinny"(痩せ)を見てみましょう。
skinny.pngそこまで大きな変化はないですが、輪郭が細くなっているのが分かるかと思います。

次に"fat"(肥満)です。

fat_man.png

結構大きな変化がありますね笑 顔だけでなく、首周りや肩も大きくなっている様子。こんなに印象変わるのは驚きですね。

いかがでしたでしょうか?
これまで精密なコントロールができなかったGANの画像生成を、CLIPを組み合わせることでテキストに基づいて自由度の高い編集加工ができるようになったことがよく分かったと思います。
今回は学習済みのStyleGANを使いましたが、勿論自身で作成したオリジナルのモデルを使って行うことも可能です。但し、元々のGANで学習させてない種類の画像(今回で言えば、人の顔画像でないもの、例えば動物画像や風景画像など)を生成させることは難しいので、多様性という面ではGANのモデルを適宜入れ替えるなどするしかないです。また、CLIPの学習が不十分だったり、CLIPに学習させていない画像についてはできないという弱点もあります。

今回の実験では英語版のCLIPを利用しましたが、実は最近、日本語版もrinna株式会社から発表されています(*3)。こちらを使っての実験もまた面白そうですね。

おまけ

英語版CLIPには有名俳優の画像も入っているようです。つまり、俳優の名前を指定するだけで顔画像を変化させることもできます。

"Arnold Schwarzenegger"(アーノルド・シュワルツェネッガー)

ArnoldSchwarzenegger.png

"Tom Cruise"(トム・クルーズ)

TomCruise.png

"Keanu Reeves"(キアヌ・リーヴス)

KeanuReeves.png

"Emma Watson"(エマ・ワトソン)

EmmaWatson.png

ではまた!


参考
*StyleGANとCLIPの組み合わせについての論文
Or Patashnik, Zongze Wu, Eli Shechtman, Daniel Cohen-Or and Dani Lischinski "StyleCLIP Text-Driven Manipulation of StyleGAN Imagery" 2021, (https://arxiv.org/abs/2103.17249)
*1. Alec Radford, Jong Wook Kim, Chris Hallacy, Aditya Ramesh, Gabriel Goh, Sandhini Agarwal, Girish Sastry, Amanda Askell, Pamela Mishkin, Jack Clark, Gretchen Krueger and Ilya Sutskever "Learning Transferable Visual Models From Natural Language Supervision" 2021, (https://cdn.openai.com/papers/Learning_Transferable_Visual_Models_From_Natural_Language_Supervision.pdf)
*2. Omer Tov, Yuval Alaluf, Yotam Nitzan, Or Patashnik and Daniel Cohen-Or "Designing an Encoder for StyleGAN Image Manipulation" 2021, (https://arxiv.org/abs/2102.02766)
*3. rinna社、日本語に特化した言語画像モデルCLIPを公開

RELATED POST

GAN_thum14.png
  • Tech Blog
  • 技術説明

2023.11.17

Stable Diffusionでミロのヴィーナスを復元してみる

お久しぶりです!sodaエンジニアの國田です! 「ミロのヴィーナス」って不思議ですよね?両腕の無い像で、現在に至るまで、多くの芸術家や科学者が欠けた部分を補った姿を推定していますが、現在のところ、定説と呼べるようなものはありません。「どのようなポーズをとっていたのか?」想像は多岐に及びますが、これに...

SentimentSLDA_thum1.png
  • Tech Blog
  • 技術説明

2023.09.25

感情分析とSLDAで文章から感情係数付きトピックを抽出してみる

こんにちは! sodaの古橋です。 ブログ投稿の間隔が結構空いてしまいまして、気付けば世間では阪神タイガースが18年ぶりとなるリーグ優勝を決めていました。 久々の優勝ということで大いに盛り上がっていますが、我が敬愛する中日ドラゴンズは2年連続の最下位争いを繰り広げているという状態で、私は...