msdd’s blog

deep learning勉強中。プログラム関連のこと書きます。

AIでキャラ画像生成できるサイトまとめ

はじめに

最近、キャラクターの画像をAIで生成できるようになってきているようです。 そこで、そんなキャラ生成が出来るサイトを調べてまとめてみました。

サイトまとめ

This Waifu Does Not Exist

url: https://www.thiswaifudoesnotexist.net/index.html

サイトを開くと、左側に自動生成されたアニメ画像と右側には、同じく自動生成されたアニメプロットが書かれている。 ページは15秒ごとに自動更新されて、アニメキャラが自動で変わっていく。

f:id:msdd:20200511140615p:plain
This Waifu Does Not Existのページ

手動で更新するには、下側にあるボタンを押すことで、更新できる。 また、後進を止めるには、下側にあるボタンの右側のボタン(PAUSE REFRESH)を押すことで止まる。

f:id:msdd:20200511140904p:plain

生成される画像は、サイズが大きく、1024x1024pixelのjpeg画像が生成される。

以下は、生成画像例である。 少し、滲んでいたり、 少し見えている体の部分が色や形がおかしいところがあるが、 きれいに描けている。

f:id:msdd:20191127010446p:plain f:id:msdd:20191127010705p:plain

MakeGirlsMoe

url: https://make.girls.moe/#/

ページを開いて、設定のところで髪の色などのオプションを指定して、 左側にある生成ボタンを押すことで生成できる。This Waifu Does Not Existと 違いオプションを指定できるので、変更したい点を調整しやすい。

f:id:msdd:20191127011442p:plain
サイト

生成画像サイズは256 x 256 pixel のpng画像。

以下は、生成画像例である。 こちらも、首から下の部分がおかしい。顔も描けているが、少し違和感はある。

f:id:msdd:20191127011620p:plain f:id:msdd:20191127204459p:plain


Waifu Labs

url : https://waifulabs.com/

f:id:msdd:20191127011331p:plain
サイト

ページを開くと、下のようなボタンがあるので、それを押すことで、 生成するためのキャラを選ぶページが出てくる。

f:id:msdd:20200511143056p:plain

下の初めの設定のページである。 まずは、ベースとなるキャラを選ぶ。 クリックして選ぶと、次のページへ進む。 このように、ベースとなるキャラ、色、詳細、ポーズを選んでいくことで、 キャラを生成していく。

f:id:msdd:20200511143143p:plain
生成過程のページ

生成画像サイズは400x400 pixel のpng画像で、 生成画像例は以下である。すごくかわいい。 しかし、どのサイトのものもそうだが、体の部分がやはりいびつ なことが多い。

f:id:msdd:20191127205223p:plain f:id:msdd:20191127205231p:plain

Chainer-DCGAN

url: http://mattya.github.io/chainer-DCGAN/

上のような画像を作る技術のサンプルのサイトなので、 他のサイトに比べると画像サイズが小さい。 生成画像サイズは96x96 pixel のpng画像で、

f:id:msdd:20191127211551p:plain
サイト

生成画像例

f:id:msdd:20191127211444p:plain f:id:msdd:20191127211717p:plain


参考サイト

Google Colabで変数をフォームでいじれるようにする

Google Colabでフォーム(form)というpythonの変数を簡単に調節できるような機能があったので、使ってみた。

使い方

コードセルを選択した状態で、 f:id:msdd:20191126013109p:plain

右クリックして、フォームの追加をクリック。(挿入 > フォームの項目追加 でもok)、 f:id:msdd:20191126013040p:plain

こんな感じで、タイトルが自動生成される。#@titleとあるように、#から始まっており、pythonでのコメント形式なので実行時には影響がない。 f:id:msdd:20191126013148p:plain

もう一度右クリックしてフォームの追加すると、新しいフォーム フィールドの追加というのが出てくるので、作りたいフォームフィールのタイプ、変数名など設定する。 f:id:msdd:20191126011516p:plain

保存ボタンを押すと、変数とその初期値が生成される。そのあとに、コメントとして #@param と続き、こちらも実行時には影響がない。 f:id:msdd:20191126013614p:plain

生成したフィールドを書き換えてみると、すぐに左側のコードの方も書き換えた値に変更される。

f:id:msdd:20191126235646g:plain

コードセル選択で右クリック > フォーム > コードを非表示 でコード部分の表示、非表示を切り替えられる。 フォーム部分も同様に表示、非表示を切り替えられる。 f:id:msdd:20191127201700g:plain

フォームの値を変更した時に、自動で変数値変更

下の画像のように、変数のコードセルを実行した後、その変数を違うコードセルで使うことがよくある。 f:id:msdd:20191127014655p:plain

変数の値をフォームで変える時、変数のコードセルを再実行する必要がある。実行を忘れると、前回の変数の状態のままその変数を使うことになってしまう。 変数の値をいじるたびに実行する必要があるので、変数の値を変更したら自動でコードの実行をして変数の値を更新してくれる機能がある。

#@title デフォルトのタイトル テキスト{ run: "auto" }のようにtitleのところに{ run: "auto" }を付け加えると、フォームで変数更新した時に自動で再実行してくれる。 f:id:msdd:20191127194103g:plain

フォームフィールドタイプ使用例

フォームフィールドタイプは4つある。

  • dropdown
  • input
  • slider
  • markdown

プルダウン項目を設定して、作成するとその項目を選べるdropdownができる。 入力を許可することで{allow-input: true}が生成され、自分で値を入れられるようになる。 f:id:msdd:20191127013240p:plain

input

入力欄に入力することで、値を変更する。 タイプはboolean, date, integer, number, raw, stringから選べる。 f:id:msdd:20191127012427p:plain

slider

スライダーが表示されるもの。スライダーを動かす、数字を入力、上下ボタンをクリックで数字を増やしたり減らしたりできる。最小値、最大値、ステップ幅を決めれる。 f:id:msdd:20191127012248p:plain

markdown

#@markdown ~~aaa~~のように#@markdownの後に、マークダウンを書くと、マークダウンの表示結果が右側に出る。

f:id:msdd:20191127012043p:plain

type : rawについて

入力したものがそのまま変数に入る。 f:id:msdd:20191127195520p:plain

最後に

Google Colabでフォームを使ってみました。 機械学習でパラメータを調節することがよくあるので、その時にフォームを使うことで、 調節が楽になるのではないかと思います。 とても便利なので、使ってみてはどうですか。

参考サイト

colab.research.google.com

PyTorchでTensorBoardのエラーが出た

はじめに

前までは、PyTorchでTensorBoardを使う時は、tensorboardX というものを使っていた。 最近では、PyTorchでもtorch.utils.tensorboardを使うことで、tensorboardを使えるようになっている。

このtorch.utils.tensorboardを使おうとした時に、エラーが出てつまったので、その解決方法を残しておく。

エラー

下のようなコードを実行してエラーが出た。

from torch.utils.tensorboard import SummaryWriter

出たエラーは下のようなものだった。

raise ImportError('TensorBoard logging requires TensorBoard with Python summary writer installed. '
ImportError: TensorBoard logging requires TensorBoard with Python summary writer installed. This should be available in 1.14 or above.

解決法

何通りか解決しそうな方法を試したので、書いておく。

1. TensorBoardのバージョン変更

エラー内容からTensorBoardのバージョンが低いことによるエラーと思われる。 TensorBoardのバージョンを確認して、もし1.14より低かったら、 1.14以降のバージョンのTensorBoardをインストールする。

pipでインストールしてるなら、下のようなコマンドで、出てくる。

pip list | grep tensorboard

anacondaとかなら、conda listを使って、表示されるものから探してみれば見れる。

実際に確認してみたが、きちんと、1.14以降であったので、これが原因ではなかった。

2. PyTorchのバージョン変更

PyTorchのTensorBoardはどのバージョンでも動くわけではない。 PyTorchでtensorboardが実験的(experimental)に使えるようになったのがv1.1.0で、v1.2.0からはexperimentalが外れて正式に使えるようになった。 なので、PyTorchのバージョンを確認して、もしバージョンがv1.2.0より下ならPyTorchのバージョンを上げる必要がある。 PyTorchのバージョンを確認方法は、下で見ることが出来る。

import torch
print(torch.__version__)

実際に確認してみたが、これも、1.2.0以降のバージョンがインストールされていたので、原因ではなかった。

3. 実行ファイル名をtensorboard.pyというファイル名にする

実行ファイル名がtensorboard.pyであったら変更する。

バージョンも全部そろってるはずなのにエラー出るので、ソースコード見に行った。

try:
    from tensorboard.summary.writer.record_writer import RecordWriter  # noqa F401
except ImportError:
    raise ImportError('TensorBoard logging requires TensorBoard with Python summary writer installed. '
                      'This should be available in 1.14 or above.')

ここで、テスト用で名前をtensorboard.pyという名前にしていまっていることに気が付いた。 tensorboardという名前が一致しているので、モジュールの読み込みが失敗していた。 ファイル名変えたらエラーが出なくなった。

まとめ

試しに動かしてみたいと、試し用で同じ名前にしてしまったことで、 結構な時間をとられてしまった。 モジュールと同じ名前を付けないように気を付けたい。

PyTorchでニューラルネットワークのパラメータ数を取得する方法

パラメータ取得方法

PyTorchでニューラルネットワークのパラメータを取得する方法として、自分で関数を 書いて求める方法、ライブラリを使って求める方法がある。 その方法を説明していく。

1. 自作関数を書く

自作の関数を使って、PyTorchのネットワークのパラメータ数を求めることが出来る。 作る関数は、下のような関数である。

count_parameters(model)がネットワーク(model)の全パラメータ数を取得するもので、 count_trainable_parameters(model)が全ての学習可能なパラメータを取得するものである。 引数は、いずれもパラメータ数を知りたいネットワーク。

中身はすごく単純で、model.parameters()でネットワークの層を取得して、 そのパラメータ数を数え上げている。count_trainable_parametersの方では、さらにrequires_gradがTrue、つまりパラメータが学習可能なもののみを数え上げる。

def count_parameters(model):
    return sum(p.numel() for p in model.parameters())

def count_trainable_parameters(model):
    return sum(p.numel() for p in model.parameters() if p.requires_grad)

使い方は、下のようになる。 まず、パラメータ数をしりたいネットワークを読み込む。 下の例では、resnet18を読み込んでいる。そして、上の関数を適用して パラメータ数を取得する(count_parameters(model)の部分)。 2つの関数を2つの条件で試している。 1つ目の条件は重みを固定しない時、もう一つは、ネットワークの重みを固定した時である。

import torch
import torchvision

#モデル読み込み
model=torchvision.models.resnet18()

#重み固定なし
#パラメータ取得して表示
num_parameters=count_parameters(model)
print(num_parameters)
num_parameters=count_trainable_parameters(model)
print(num_parameters)

#重み固定してみる
for param in model.parameters():
    param.requires_grad=False
#パラメータ取得して表示
num_parameters=count_parameters(model)
print(num_parameters)
num_parameters=count_trainable_parameters(model)
print(num_parameters)

結果は、下のようになった。 上の2つは、ネットワークの重みを固定していないときで、どちらのパラメータ取得関数も同じ値となり、ネットワークの全パラメータ数が表示されている。 一方、下の2つは、ネットワークの重みを固定した時の結果で、重みを固定しているので、 パラメータは学習できない状態になるので、学習可能なパラメータ数を得る、count_trainable_parameters()は、結果として、0を返した。

11689512
11689512
11689512
0

注意点としては、モデルのパラメータをlistで保持しているときちんと数えれない。 listではなくnn.ModuleList()を使うことで、数えることができる。

2. torchsummaryというライブラリを使う方法

PyTorchのパラメータ数を取得するライブラリに、 torchsummaryというライブラリがある。

GitHub - sksq96/pytorch-summary: Model summary in PyTorch similar to `model.summary()` in Keras

このライブラリは便利なもので、 レイヤーごとのに出力サイズとパラメータ数を出してくれて、さらに全体でのパラメータ数も表示してくれる。

使い方

pipでインストールできる。

pip install torchsummary

使い方は、簡単で、 下のmodelのところに、自分のネットワークモデルを入れる。(channel,H,W)を 自分のネットワークの入力の次元に変える。

from torchsummary import summary
summary(model, input_size=(channels, H, W))

resnet18で試してみる。使うPyTorchのモデルをsummary()の第1引数に 入れて、第2引数に、入力するtensorのサイズ、(3,224,224)を入れた。

import torchvision.models as models
from torchsummary import summary

model=models.resnet18()
summary(model,(3,224,224))

結果は、下のようなものが出力される。 それぞれのLayerにレイヤーの名前、Output Shapeに第2引数で入れた時の出力のサイズ、 そして、Param #にパラメータの数が表示される。そして、最後の部分に、 全体のパラメータ数と学習可能なパラメータ数が表示される。

----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1         [-1, 64, 112, 112]           9,408
       BatchNorm2d-2         [-1, 64, 112, 112]             128
              ReLU-3         [-1, 64, 112, 112]               0
         MaxPool2d-4           [-1, 64, 56, 56]               0
            Conv2d-5           [-1, 64, 56, 56]          36,864
       BatchNorm2d-6           [-1, 64, 56, 56]             128
              ReLU-7           [-1, 64, 56, 56]               0
            Conv2d-8           [-1, 64, 56, 56]          36,864
       BatchNorm2d-9           [-1, 64, 56, 56]             128
             ReLU-10           [-1, 64, 56, 56]               0
       BasicBlock-11           [-1, 64, 56, 56]               0
           Conv2d-12           [-1, 64, 56, 56]          36,864
      BatchNorm2d-13           [-1, 64, 56, 56]             128
             ReLU-14           [-1, 64, 56, 56]               0
           Conv2d-15           [-1, 64, 56, 56]          36,864
      BatchNorm2d-16           [-1, 64, 56, 56]             128
             ReLU-17           [-1, 64, 56, 56]               0
       BasicBlock-18           [-1, 64, 56, 56]               0
           Conv2d-19          [-1, 128, 28, 28]          73,728
      BatchNorm2d-20          [-1, 128, 28, 28]             256
             ReLU-21          [-1, 128, 28, 28]               0
           Conv2d-22          [-1, 128, 28, 28]         147,456
      BatchNorm2d-23          [-1, 128, 28, 28]             256
           Conv2d-24          [-1, 128, 28, 28]           8,192
      BatchNorm2d-25          [-1, 128, 28, 28]             256
             ReLU-26          [-1, 128, 28, 28]               0
       BasicBlock-27          [-1, 128, 28, 28]               0
           Conv2d-28          [-1, 128, 28, 28]         147,456
      BatchNorm2d-29          [-1, 128, 28, 28]             256
             ReLU-30          [-1, 128, 28, 28]               0
           Conv2d-31          [-1, 128, 28, 28]         147,456
      BatchNorm2d-32          [-1, 128, 28, 28]             256
             ReLU-33          [-1, 128, 28, 28]               0
       BasicBlock-34          [-1, 128, 28, 28]               0
           Conv2d-35          [-1, 256, 14, 14]         294,912
      BatchNorm2d-36          [-1, 256, 14, 14]             512
             ReLU-37          [-1, 256, 14, 14]               0
           Conv2d-38          [-1, 256, 14, 14]         589,824
      BatchNorm2d-39          [-1, 256, 14, 14]             512
           Conv2d-40          [-1, 256, 14, 14]          32,768
      BatchNorm2d-41          [-1, 256, 14, 14]             512
             ReLU-42          [-1, 256, 14, 14]               0
       BasicBlock-43          [-1, 256, 14, 14]               0
           Conv2d-44          [-1, 256, 14, 14]         589,824
      BatchNorm2d-45          [-1, 256, 14, 14]             512
             ReLU-46          [-1, 256, 14, 14]               0
           Conv2d-47          [-1, 256, 14, 14]         589,824
      BatchNorm2d-48          [-1, 256, 14, 14]             512
             ReLU-49          [-1, 256, 14, 14]               0
       BasicBlock-50          [-1, 256, 14, 14]               0
           Conv2d-51            [-1, 512, 7, 7]       1,179,648
      BatchNorm2d-52            [-1, 512, 7, 7]           1,024
             ReLU-53            [-1, 512, 7, 7]               0
           Conv2d-54            [-1, 512, 7, 7]       2,359,296
      BatchNorm2d-55            [-1, 512, 7, 7]           1,024
           Conv2d-56            [-1, 512, 7, 7]         131,072
      BatchNorm2d-57            [-1, 512, 7, 7]           1,024
             ReLU-58            [-1, 512, 7, 7]               0
       BasicBlock-59            [-1, 512, 7, 7]               0
           Conv2d-60            [-1, 512, 7, 7]       2,359,296
      BatchNorm2d-61            [-1, 512, 7, 7]           1,024
             ReLU-62            [-1, 512, 7, 7]               0
           Conv2d-63            [-1, 512, 7, 7]       2,359,296
      BatchNorm2d-64            [-1, 512, 7, 7]           1,024
             ReLU-65            [-1, 512, 7, 7]               0
       BasicBlock-66            [-1, 512, 7, 7]               0
AdaptiveAvgPool2d-67            [-1, 512, 1, 1]               0
           Linear-68                 [-1, 1000]         513,000
================================================================
Total params: 11,689,512
Trainable params: 11,689,512
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.57
Forward/backward pass size (MB): 62.79
Params size (MB): 44.59
Estimated Total Size (MB): 107.96
----------------------------------------------------------------

前の自作関数のものと比べると、パラメータ数が同じになっているので、正しいことがわかる。

各層ごとのパラメータも見れて、とても便利である。

バグ

しかし、githubのissueを見てみると、パラメータ共有をしていると、バグってしまう と書いてあった。パラメータ共有をしているネットワークを使う時には、このライブラリ 以外でも確認した方がよさそうである。

まとめ

PyTorchのネットワークのパラメータ数を取得する方法として、自分で関数を作って求める方法と、torchsummaryというライブラリを使って取得する方法を紹介した。 torchsummaryは、importして、summary関数のみで、各層のパラメータ数など様々な情報を表示できるので、個人的にはtorchsummaryを使う方法の方がいいと思う。しかし、パラメータ共有などを使っている時は、バグっているので注意が必要。

参考サイト