久々に画像処理したい気分で機械学習が気になったので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
などを使って思い出の写真を絵画にしてみるのも面白いかもしれません。ただ色々やってみた感じだと基本的に風景以外は難しいです。
冬の華厳の滝の画像が思いのほかいい感じに変換できたので載せます。
所感
こういったものの中では比較的エラーも少なくてすんなり楽しめました。
ツールとしてのドキュメントが欲しい気はしますがなんとなくわかりますし。
面白いデータセットとかモデルを見つけたら、色々試してみたいですね。
学習はちょっと時間と暇のある時に気合入れないときつそうですが。