人工知能でアイドルを生成してみた(PyTorch初心者向けチュートリアル使用)

f:id:denim012:20190531225417j:plain

先日まで中国でオンラインセミナー「PyTorchを使ったディープラーニング実践編」を受講していました。

せっかくディープラーニングについて学んだので、自分で敵対生成ネットワーク(GAN)を使って人間の顔の画像を生成してみました。

GANで顔画像を作成する際に必要なもの

GANで顔画像を作成する際に必要なのは下記3点です。

  1. GANのプログラム
  2. プログラムの実行環境
  3. 機械学習するための顔画像

 1.2.は後述の通り簡単に用意できるため、3.の訓練用画像を集めれば顔画像の生成が可能です。

GANのプログラム

PyTorch公式サイトの初心者向けチュートリアルにDCGANについてのプログラム及び解説があります。DCGANとは、GANに対して画像認識等で使われる畳み込みニューラルネットワーク(CNN)の考えを適用したものです。

 このサンプルをそのまま実行するだけで画像生成できます。

プログラム実行環境

DCGANで顔生成する場合、GPUが付いていないパソコンで機械学習を行うと訓練にかなり時間もかかります。

ただ、今はGoogleが無料で機械学習用のクラウドプラットフォーム「Google Colab」を提供しているので、GPU環境での訓練が可能です。

先ほどのPyTorchチュートリアルのページの「Run in Google Colab」リンクをクリックするとColab上でプログラムの実行が出来ます。

機械学習するための顔画像

機械学習用の画像は、下記アイドルグループの公式サイトメンバー紹介ページから取得しました。人数が多く、同じサイズの顔写真が集められるので機械学習データにちょうどいいです。

  • 乃木坂46
  • 欅坂46
  • NGT48
  • STU48
  • NGT48
  • AKB48

顔を中心に64×64のサイズになるよう調整し、260枚集めました。

DCGANによる顔画像生成

プログラム実行時の注意点

公式サイトのDCGANプログラムを実行する前に画像格納ディレクトリのパスを変更します。

# Root directory for dataset
dataroot = "data/celeba"

を下記の通り変更しました。GooleドライブのGAN/imageに訓練画像を配置します。

from google.colab import drive
drive.mount('/content/gdrive')

# Root directory for dataset
dataroot = "/content/gdrive/My Drive/GAN/image"

実行結果

PyTorchチュートリアルでは20万枚以上の顔画像(Celeb-A Faces dataset)を使って訓練しています。今回用意したアイドル画像はわずか260枚。訓練画像が少ないのでハイパーパラメータを変更して訓練を開始します。

batch_size = 32
num_epochs = 500

iterations=0 最初はランダムに色を着色

f:id:denim012:20190525224958j:plain

iterations=500 顔の輪郭。髪、口のようなものが出来ています。

f:id:denim012:20190525225017j:plain

iterations=1000 更に人間に近づきました。

f:id:denim012:20190525225245j:plain

iterations=1500

f:id:denim012:20190525225300j:plain

iterations=2000

f:id:denim012:20190525225316j:plain

iterations=2500

f:id:denim012:20190525225331j:plain

iterations=3000 人間に大分近づきました。ただ、全体的にぼやけています。「Google Colab」上でここまでの訓練時間はわずか10分です。

f:id:denim012:20190525225349j:plain

iterations=3000以降はGeneratorのLossが訓練を繰り返すごとに上がっています。これ以上訓練を繰り返しても性能改善は見込めません。

f:id:denim012:20190525225553p:plain

課題

その後、バッチサイズやエポック数を変更して生成しましたが結果はあまり変わりませんでした。

PyTorch公式サイトのサンプルではもう少し綺麗な顔画像が生成できています。やはり訓練に使用する画像数を増やさないと、このプログラムでは綺麗に画像生成が出来ないようです。