久々に画像処理したい気分で機械学習が気になったのでGANを試します。
PyTorchで利用できる実装があったのでそれを使わせてもらいます。
PyTorch
PyTorchはPythonの機械学習ライブラリです。
Pythonのバーションを確認して古すぎるようなら更新する。
また、NvidiaのGPUを使っていてCUDAをインストールしている場合はそのバージョンも確認する。
|
1 2 3 4 5 |
> python --version Python 3.5.2 > nvcc -V Cuda compilation tools, release 9.2, V9.2.148 |
ちょっと古い気もしますがpipだけ更新して続けます※。
|
1 |
python -m pip install --upgrade pip |
※のちにバージョン起因のエラーで悩むのでバージョンアップ推奨。
PyTorchのページから環境を選択するとコマンドを教えてくれます。

GAN
GAN (Generative Adversarial Network / 敵対的生成ネットワーク)は機械学習の手法の1つです。その中でもCycleGAN(2つのデータセットの特徴を変換する)とpix2pix(ペアデータを学習して変換する)を試します。
https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix
サンプルの実行
まずはリポジトリを持ってくる。
|
1 2 |
git clone https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix cd pytorch-CycleGAN-and-pix2pix |
サンプルデータセットのダウンロードですがそのままだと以下のエラーが出るのでシェルのwgetに--no-check-certificateオプションを追記する。
|
1 2 3 4 5 6 7 8 9 10 |
//コマンド > bash ./datasets/download_cyclegan_dataset.sh maps /* エラーメッセージ エラー: people.eecs.berkeley.edu の証明書(発行者: /C=US/ST=MI/L=Ann Arbor/O=Internet2/OU=InCommon/CN=InCommon RSA Server CA)の検証に失敗しました: 自己署名証明書です。 */ // datasets/download_cyclegan_dataset.sh:L18の追記 wget -N $URL -O $ZIP_FILE --no-check-certificate |
visdomという情報視覚化ツールを起動させます。
|
1 2 |
pip install visdom python -m visdom.server |
初回は少し時間がかかります。また実行ターミナルはメインとは別で。
メインターミナルで学習を始めましょう。
|
1 |
python train.py --dataroot ./datasets/maps --name maps_cyclegan --model cycle_gan |
ここで以下のエラーが出ました。
|
1 2 3 4 |
TypeError: _resolve_type_from_object(): incompatible function arguments. The following argument types are supported: 1. (arg0: object, arg1: torch._C._jit_tree_views.SourceRange, arg2: Callable[[str], function]) -> torch._C.Type Invoked with: typing.Union[int, NoneType], None, <function try_ann_to_type.<locals>.fake_rcb at 0x0000014169DEDAE8> |
原因はわかりませんでしたが、どうもPythonのバージョンが悪い気がする。
3.8.2にアップデートしてPytorch, visdomもインストールしなおします。
今度はこのようなエラー。
|
1 |
ModuleNotFoundError: No module named 'dominate' |
これは pip install dominate で解決しました。
エラーも解決したので学習に戻りますが、CycleGANのサンプルはめちゃくちゃ時間がかかります。途中で止めましたがGTX1060で50時間くらいかかりそう。
pix2pixの方は3時間弱でした。
サンプルの動きを見たら pre-trained model にあるように、学習ファイル(.pth)をダウンロードすることもできます。結構容量ありますが。
pix2pixの場合このようにテストを行います。こっちはすぐに終わります。
|
1 |
python test.py --dataroot ./datasets/facades --name facades_pix2pix --model pix2pix --direction BtoA |
./results/facades_pix2pix/test_latest/index.htmlを開くと簡単に確認できます。
その他のサンプル
正直これらのREADMEのサンプルを見てもうーんといった感じだったので、モネの絵画を写真に変換するサンプルも紹介します。
|
1 2 3 |
bash ./scripts/download_cyclegan_model.sh monet2photo bash ./datasets/download_cyclegan_dataset.sh monet2photo python test.py --dataroot datasets/monet2photo/testA --name monet2photo_pretrained --model test --no_dropout |

どれもが上手くいくわけではないですが、わりと面白いです。
この辺のサンプルを眺めて興味を持ったものを試してみましょう。
pix2pixデータセット, pix2pixモデル, CycleGANデータセット, CycleGANモデル
写真をモネ風にするモデルも欲しかったのですが見当たらない。
CycleGANの学習って双方向の変換ができるのかと思いきや、学習で方向を決めてるのでこんな風にする学習してみます。
|
1 2 3 |
python train.py --dataroot ./datasets/monet2photo --name photo2monet --model cycle_gan --direction BtoA python test.py --dataroot datasets/monet2photo/mytest --name photo2monet --model test --no_dropout --direction BtoA |
しかしこれは 1 epoch にやたら時間がかかります(90分。200epochだと…)。
再度モデルを探しに行くとstyle_monetという名前で用意されていました。
|
1 2 |
bash ./scripts/download_cyclegan_model.sh style_monet python test.py --dataroot datasets/monet2photo/mytest --name style_monet_pretrained --model test --no_dropout |
同様にukiyoe, gogh cezanneなどを使って思い出の写真を絵画にしてみるのも面白いかもしれません。ただ色々やってみた感じだと基本的に風景以外は難しいです。
冬の華厳の滝の画像が思いのほかいい感じに変換できたので載せます。

所感
こういったものの中では比較的エラーも少なくてすんなり楽しめました。
ツールとしてのドキュメントが欲しい気はしますがなんとなくわかりますし。
面白いデータセットとかモデルを見つけたら、色々試してみたいですね。
学習はちょっと時間と暇のある時に気合入れないときつそうですが。