GAN_thum.png

2021.07.12

読了時間:10

最近流行りのGANに挑戦してみた(生成タスク編)

A2B_102 (2).png

國田圭佑

お久しぶりです!sodaエンジニアの國田です!

突然ですが、GAN(ギャン、ガン)ってご存じでしょうか?
最近では、「AIに絵を描かせる」とか「存在しないアニメ画像を生成する」、「ディープフェイク」といったワードを中心に非常に有名になりつつありますので、「ちょっと耳にしたことがある!」なんて方もけっこういるのではないかと思います。でも、具体的にどんなネットワークか、その原理を説明できる方は、一般にはまだまだ少ないのではないかと思います。私もJDLA E資格の勉強をするまで、なんとなくしかGANのことを分かっておりませんでした。今回は、GANの説明をするとともに、実際にGANをお試ししてみたいと思います!

GANってなに?

GAN:Generative Adversarial Network
日本語に訳すと、「敵対的生成ネットワーク」になります。これだけ言っても「なんのこと?」だと思いますので、ちゃんと順を追って説明したいと思います。

そもそも、GANって、どんなことができるのでしょう?
答えは上にも少し書いているのですが、「存在しない画像を生成する」とか「既存の画像を他の画像に変更する」などのタスクが可能です。
今、実際に使われているサービスで見ていきますと、アイドル画像・キャラクター画像を生成するサービスや、音楽を生成できるクラウドサービス、また線画に着色してくれる自動サービスや、人の●年後の顔を予測するAI、ピンぼけした画像を高解像度の画像に変換する技術なんかもみんなGANを使ってます。動画での利用例もありますね。つまり、GANとは「生成」や「変換」することが得意なモデルと言えます。あるデータから特徴を学習することで、全く新しいデータを生成したり、そのデータの特徴に沿って違ったデータに変換するなどのタスクを行うことができます。

では、こういったタスクを精度良く行うためには、どのようなモデルを作れば良いのでしょうか?
そこで出てくるのが「敵対的学習」という言葉です。GANでは「生成器(Generator)」と呼ばれるネットワークと、それに敵対する「識別器(Discriminator)」と呼ばれるネットワークが備わっているのです。それぞれの役割は以下の通り。

  • 生成器(Generator):画像を生成して出力する
  • 識別器(Discriminator):入力として画像を受け取る。その画像が本物か、それとも生成器によって生成された偽物かを予測して出力する

識別器の予測結果は生成器にフィードバックされます。このフィードバックを受けて、生成器は「よし!識別器が偽物と判断できないような画像を作ろう!」と学習を進めていき、一方で、識別器は「生成器の画像に騙されないように観察眼を磨いていこう!」と学習を進めていきます。

以上のように、識別器と生成器で、互いが互いを上回るように学習を続けていく様子が敵対的学習と呼ばれる所以です。

さぁ、やってみよう

では、GANの仕組みの解説が終わったところで、実際にGANの生成タスクをやってみたいと思います。今回は、こちらのようなアメコミ風画像をGANを使って生成させてみます。

GAN_trainpic.jpg

今回は数多くあるGANの中で、比較的気軽に取り組めるFastGAN(light-weight GAN)を試してみました!総枚数9,000枚ほどの画像を学習させます。では、いきなり結果に...!
まずは学習開始1,000回の出力から...

01000_1200.jpg

んー、まぁ概形は取れてますね。続いて、2,000回目

02000_1200.jpg

だいぶはっきりとしてきた印象です。では、5,000回目

05000_1200.jpg

部分部分で「完成」と言っても良い画像が出力され始めているのではないでしょうか?
次、10,000回目行ってみましょう!

10000_1200.jpg

一気に30,000回目

30000_1200.jpg

50,000回目

50000_1200.jpg

一部サイズや継ぎ目、輪郭など違和感あるものもありますが、ほぼほぼ自然な画像になっているのではないでしょうか?

通常、GANの学習は複数のGPU使ったり、数週間スケールで行うのですが、今回使ったFastGANでは、1GPUで1日で学習できるという特徴があります。(その分、画像品質やモード崩壊※などの問題が起きやすいのですが...)
※モード崩壊:GANの生成器が同じ画像ばかりを生成してしまう現象。

では、最後におまけです。
少し難しい話になるのですが、GANでは、画像を生成する際にある潜在空間上からサンプリングしたランダムベクトルを入力にしています。つまり、そのベクトルを変更することで、様々な異なる画像が作れるようになるんですね。その入力するベクトルを変えて生成していく様子を動画にすると、面白いものが見られます。

generated-07-06-2021_08-22-44++.gif

いかがだったでしょうか?

「GANって面白いなぁ‥」と感じていただけたら、とても嬉しいです。
ちなみに、今回のブログのタイトルでお気づきの方も多いと思いますが、私、GANの生成タスクだけではなく、変換タスクも試してみてます。詳しい記事は今後アップしていきたいと思っておりますが、予告も含め、変換タスクの結果もチラ見せしますと...

kunita_00_04.jpg

このように、人物写真のアメコミ風変換も実現できました!少しワイルドになり過ぎですかね?笑

参考
Comic faces (paired, synthetic) -a paired dataset for pix2pix or similar model training

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年連続の最下位争いを繰り広げているという状態で、私は...