AIでキャラ画像生成できるサイトまとめ
はじめに
最近、キャラクターの画像をAIで生成できるようになってきているようです。 そこで、そんなキャラ生成が出来るサイトを調べてまとめてみました。
サイトまとめ
This Waifu Does Not Exist
url: https://www.thiswaifudoesnotexist.net/index.html
サイトを開くと、左側に自動生成されたアニメ画像と右側には、同じく自動生成されたアニメプロットが書かれている。 ページは15秒ごとに自動更新されて、アニメキャラが自動で変わっていく。
手動で更新するには、下側にあるボタンを押すことで、更新できる。 また、後進を止めるには、下側にあるボタンの右側のボタン(PAUSE REFRESH)を押すことで止まる。
生成される画像は、サイズが大きく、1024x1024pixelのjpeg画像が生成される。
以下は、生成画像例である。 少し、滲んでいたり、 少し見えている体の部分が色や形がおかしいところがあるが、 きれいに描けている。
MakeGirlsMoe
url: https://make.girls.moe/#/
ページを開いて、設定のところで髪の色などのオプションを指定して、 左側にある生成ボタンを押すことで生成できる。This Waifu Does Not Existと 違いオプションを指定できるので、変更したい点を調整しやすい。
生成画像サイズは256 x 256 pixel のpng画像。
以下は、生成画像例である。 こちらも、首から下の部分がおかしい。顔も描けているが、少し違和感はある。
Waifu Labs
url : https://waifulabs.com/
ページを開くと、下のようなボタンがあるので、それを押すことで、 生成するためのキャラを選ぶページが出てくる。
下の初めの設定のページである。 まずは、ベースとなるキャラを選ぶ。 クリックして選ぶと、次のページへ進む。 このように、ベースとなるキャラ、色、詳細、ポーズを選んでいくことで、 キャラを生成していく。
生成画像サイズは400x400 pixel のpng画像で、 生成画像例は以下である。すごくかわいい。 しかし、どのサイトのものもそうだが、体の部分がやはりいびつ なことが多い。
Chainer-DCGAN
url: http://mattya.github.io/chainer-DCGAN/
上のような画像を作る技術のサンプルのサイトなので、 他のサイトに比べると画像サイズが小さい。 生成画像サイズは96x96 pixel のpng画像で、
生成画像例
参考サイト
Google Colabで変数をフォームでいじれるようにする
Google Colabでフォーム(form)というpythonの変数を簡単に調節できるような機能があったので、使ってみた。
使い方
コードセルを選択した状態で、
右クリックして、フォームの追加をクリック。(挿入 > フォームの項目追加 でもok)、
こんな感じで、タイトルが自動生成される。#@title
とあるように、#から始まっており、pythonでのコメント形式なので実行時には影響がない。
もう一度右クリックしてフォームの追加すると、新しいフォーム フィールドの追加というのが出てくるので、作りたいフォームフィールのタイプ、変数名など設定する。
保存ボタンを押すと、変数とその初期値が生成される。そのあとに、コメントとして #@param
と続き、こちらも実行時には影響がない。
生成したフィールドを書き換えてみると、すぐに左側のコードの方も書き換えた値に変更される。
コードセル選択で右クリック > フォーム > コードを非表示 でコード部分の表示、非表示を切り替えられる。 フォーム部分も同様に表示、非表示を切り替えられる。
フォームの値を変更した時に、自動で変数値変更
下の画像のように、変数のコードセルを実行した後、その変数を違うコードセルで使うことがよくある。
変数の値をフォームで変える時、変数のコードセルを再実行する必要がある。実行を忘れると、前回の変数の状態のままその変数を使うことになってしまう。 変数の値をいじるたびに実行する必要があるので、変数の値を変更したら自動でコードの実行をして変数の値を更新してくれる機能がある。
#@title デフォルトのタイトル テキスト{ run: "auto" }
のようにtitleのところに{ run: "auto" }
を付け加えると、フォームで変数更新した時に自動で再実行してくれる。
フォームフィールドタイプ使用例
フォームフィールドタイプは4つある。
- dropdown
- input
- slider
- markdown
dropdown
プルダウン項目を設定して、作成するとその項目を選べるdropdownができる。
入力を許可することで{allow-input: true}
が生成され、自分で値を入れられるようになる。
input
入力欄に入力することで、値を変更する。 タイプはboolean, date, integer, number, raw, stringから選べる。
slider
スライダーが表示されるもの。スライダーを動かす、数字を入力、上下ボタンをクリックで数字を増やしたり減らしたりできる。最小値、最大値、ステップ幅を決めれる。
markdown
#@markdown ~~aaa~~
のように#@markdown
の後に、マークダウンを書くと、マークダウンの表示結果が右側に出る。
type : rawについて
入力したものがそのまま変数に入る。
最後に
Google Colabでフォームを使ってみました。 機械学習でパラメータを調節することがよくあるので、その時にフォームを使うことで、 調節が楽になるのではないかと思います。 とても便利なので、使ってみてはどうですか。
参考サイト
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を使う方法の方がいいと思う。しかし、パラメータ共有などを使っている時は、バグっているので注意が必要。