1. HOME
  2. ブログ
  3. IT技術
  4. GANで本物のように精巧な画像生成モデルを作ってみた【Pytorch】

GANで本物のように精巧な画像生成モデルを作ってみた【Pytorch】

GANとは?

あなたは下の画像が「機械が生成した実在しない人の顔写真」か「実在する人の顔写真」かを見分けられますか?

近年AI技術が発達し、「機械が考える」レベルが現実的になってきています。

また、CNN(Convolution Neural Network)の登場により、画像分野はさらに目覚ましい発展を遂げ、未知の画像を生成する生成モデルなるものが提案されました。

その中でも、ここ最近では「GAN(Generative Adversarial Networks)」とよばれる技術が一躍注目を浴びています。

実は、先程の画像も、GANが生成した画像であり、現実に存在する本物の人ではありません

ただ、機械が作ったとは思えないほど精巧さで、判別は難しいです。

さて今回は、そんなGANの仕組みの解説と実践を行ってみたいと思います!

GANのネットワーク構造

GANのネットワーク構造は2つに分かれます。

  1. 実際に画像を生成するGenerator
  2. 画像が与えられたとき、それが機械から生成された画像かどうかを判定する識別器であるDiscriminator

(※ニューラルネットは識別問題を解くのが得意です)

Generator:画像生成器

「Generator」のネットワーク構造は、以下の画像のようになっています。

ノイズから顔画像を生成します。

Discriminator:本物or偽物かの識別機

「Discriminator」のネットワーク構造は、このようになっています。

画像を入力として、その画像が「本物」か「偽物」かどうかを判定します。

ノイズについて

ノイズは、いわゆる正規分布からサンプリングされます。

この分布の次元は、一般に画像空間よりも低次元です。

(※画像空間は、縦×横のピクセル数だけ次元が存在します)

2次元で考えた場合

例えば、2次元で考えたとしましょう。

そうしたとき上の図のように、「二次元上の点」が「ひとつの画像」を表すように画像空間を埋め込みます

それぞれの青丸の点は、正規分布からサンプリングされた点です。

このように、「Generator」の入力部のノイズは二次元上の点を表しています。(今回の場合)

そして出力は、その二次元上の点に埋め込まれた画像空間上の画像を生成することになります。

本来のノイズは、もっと高次元です。

さすがに、顔写真を二次元空間に落とし込むのは無理があります。

GANの損失関数

それでは、まずは学習の話です。

「Discriminator」の学習では、本物を本物、偽物を偽物と見分ける能力が必要です

「Generator」から生成された画像に対しては、偽物ラベルの「0」を出力

データセットの画像に対しては、本物ラベルの「1」を出力するようにします。

こうすることで「Discriminator」は、本物画像と偽物画像それぞれの特徴を学習し、本物か偽物かを見分ける能力を伸ばしていきます。

特徴を学習するための損失関数

そのため。損失関数は以下のようになります。

$$\frac{1}{2}(D(x)-1)^2+\frac{1}{2}(D(G(z)))^2$$

\(x\)本物の顔画像
\(z\)ノイズ
\(D\)\(Discriminator\)
\(G\)\(Generator\)

そして「Generator」の学習では、偽物画像を本物だと騙したいため、「Generator」から出力された画像を入力として「Discriminator」に入れた時の出力が「1」に近づくようにします。

偽物を本物と思わせるための損失関数

そのため、損失関数は以下のようになります。

$$\frac{1}{2}(D(G(z))-1)^2$$

\(x\)本物の顔画像
\(z\)ノイズ
\(D\)\(Discriminator\)
\(G\)\(Generator\)

このようにして「Generator」は、本物画像と偽物画像の特徴を学習した「Discriminator」を、さらに騙すように偽物画像をより本物画像へと近づけていきます

これが「Adversarial(敵対的)」という由来です。

GANの実験結果

では、実際にGANの学習を行ってみます!

そして、epoch 1~14までの結果を見ていきましょう!

使ったデータセットは、以下のリンクのzipフォルダを解凍した画像群です。

かなり枚数が多いので、その一部の20万枚だけ使いました。

【Celeb-aデータセット】
https://drive.google.com/drive/folders/0B7EVK8r0v71pTUZsaXdaSnZBZzg

発生させるノイズは固定で、どのように顔が作られていくかを見ることができます。

epoch = 1

epoch = 2(ぼんやりと顔の形が)

epoch = 3(水彩画みたいな顔が出来始める)

epoch = 4(サンダーバードみたいな顔が出来はじめる)

epoch = 5(あまり変化なし、大体みんな同じ顔)

epoch = 6(輪郭が綺麗に)

epoch = 7(ちらほらいい結果が)

epoch = 8(割愛)

epoch = 9

epoch = 10

epoch = 11

epoch = 12

epoch = 13(斜め顔は苦手っぽい?)

epoch = 14

結果に対する感想

顔画像の生成が出来ましたが、なにより生成データの多様性があるのが素晴らしいと思いました。

笑っている人もいれば、口を閉じている人もいるし、顔の向きも特徴付けられています。

それに肌の色なんかも、よく再現できているのではないでしょうか。

GAN は学習自体が難しいのですが、たった数epochで成果が目で見えるので、総合的にみると楽になるな感じました。

そして、学習は「データ数が命」ということに気付かされました。

実験に用いたソースコード(Pytorch)

では最後に、実験に用いたソースコードを紹介したいと思います。

まず、Pytorch が入っていない方はコチラ!

【Pytorch公式サイト】
https://pytorch.org/

こちらから、自分の環境にあったインストールコードを terminal に入力します。

ソースコード

さいごに

今回は、画像生成モデルについてお話ししました。

画像生成モデルは、「GAN」以外にも様々存在し、「GAN」自体の派生形も多く存在します。

その研究は、盛んに行われており、多くの研究者が血肉を割いて実験しています。

この分野での成長は凄まじく、今までの常識だった事がたった数ヶ月で覆される可能性もあります。

そのため私たちエンジニアは、日々新しい知識を吸収し自分の手で動かし、使えるようにならなければなりません

もしかしたら、次に技術革新を起こすのは、あなたかもしれません!

こちらの記事もオススメ!

参考

【GANの元論文】
https://arxiv.org/abs/1406.2661

【LSGAN】
https://arxiv.org/abs/1611.04076

書いた人はこんな人

広告メディア事業部
広告メディア事業部
「好きを仕事にするエンジニア集団」の(株)ライトコードです!

ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。
現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。
いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。

システム開発依頼・お見積もり大歓迎!

また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です!
インターンや新卒採用も行っております。

以下よりご応募をお待ちしております!
https://rightcode.co.jp/recruit

関連記事

採用情報

\ あの有名サービスに参画!? /

バックエンドエンジニア

\ クリエイティブの最前線 /

フロントエンドエンジニア

\ 世界を変える…! /

Androidエンジニア

\ みんなが使うアプリを創る /

iOSエンジニア