まひろ量子のハックログ

プログラミングや機械学習などの知識を記録・共有します

Image Inpaintingをやってみた【中間報告編】

f:id:twx:20180913152447p:plain

画像出典: https://arxiv.org/pdf/1804.07723.pdf

Image Inpaintingとは

不定形に塗りつぶされた画像を修復させるというタスクだ。NVIDAが発表した論文とデモ動画が、その精度の高さで話題となっている。

元論文

元論文はこちら。 Image Inpainting for Irregular Holes Using Partial Convolutions https://arxiv.org/pdf/1804.07723.pdf

実装

サードパーティー製の実装がGithubにある。こちらを使わせていただこう。

GitHub - MathiasGruber/PConv-Keras: Keras implementation of "Image Inpainting for Irregular Holes Using Partial Convolutions"

画像の準備

画像データは自分で用意した。 ImageNet画像を全部で約2万9000枚ほど用意し、train, test ,validationという名前のディレクトリに振り分けた。

trainに約2万7000枚、trainvalidationにそれぞれ約1000枚という配分にした。

これらをzipで固めてGoogle Driveに送り、以下の要領でColaboratory環境に移した。

www.mahirokazuko.com

学習

はじめ、コードをそのまま実行したところサイズが512x512x3の画像を入力として学習がはじまった。しかし、1エポック進むのにかなりの長時間を要しそうだということが分かったため、入力サイズを256x256x3に変更した。

model = PConvUnet(img_rows=256, img_cols=256, weight_filepath='data/logs/')

また、試しに動作確認をしたかったので、現実時間で待てるレベルまでエポック数を下げた。

model.fit(
    train_generator, 
    steps_per_epoch=100,
    validation_data=val_generator,
    validation_steps=50,
    epochs=50,        
    plot_callback=plot_callback,
    callbacks=[
        TensorBoard(log_dir='data/logs/initial_training', write_graph=False)
    ]
)

90分くらいで20エポックまで来た。

Epoch 1/1
Found 27308 images belonging to 1 classes.
 99/100 [============================>.] - ETA: 1s - loss: 1192959.7986Found 1000 images belonging to 1 classes.
100/100 [==============================] - 149s 1s/step - loss: 1192393.0381 - val_loss: 1140785.5613
Epoch 2/2
100/100 [==============================] - 145s 1s/step - loss: 929772.3394 - val_loss: 1083900.0400
Epoch 3/3
100/100 [==============================] - 139s 1s/step - loss: 896846.2562 - val_loss: 918737.5038
Epoch 4/4
100/100 [==============================] - 141s 1s/step - loss: 832707.7262 - val_loss: 912742.8137
Epoch 5/5
100/100 [==============================] - 144s 1s/step - loss: 817528.7878 - val_loss: 907044.2275
Epoch 6/6
100/100 [==============================] - 143s 1s/step - loss: 765230.2653 - val_loss: 918365.0200
Epoch 7/7
100/100 [==============================] - 148s 1s/step - loss: 748308.9103 - val_loss: 863127.1031
Epoch 8/8
100/100 [==============================] - 149s 1s/step - loss: 753139.3806 - val_loss: 886118.9925
Epoch 9/9
100/100 [==============================] - 146s 1s/step - loss: 733665.1872 - val_loss: 820381.9600
Epoch 10/10
100/100 [==============================] - 148s 1s/step - loss: 724513.2947 - val_loss: 807128.7750
Epoch 11/11
100/100 [==============================] - 150s 1s/step - loss: 718573.7362 - val_loss: 842021.4556
Epoch 12/12
100/100 [==============================] - 147s 1s/step - loss: 687009.6784 - val_loss: 792984.8875
Epoch 13/13
100/100 [==============================] - 146s 1s/step - loss: 717200.5312 - val_loss: 793620.3700
Epoch 14/14
100/100 [==============================] - 141s 1s/step - loss: 671126.3444 - val_loss: 784162.4425
Epoch 15/15
100/100 [==============================] - 141s 1s/step - loss: 664130.9928 - val_loss: 768478.3525
Epoch 16/16
100/100 [==============================] - 141s 1s/step - loss: 641558.0719 - val_loss: 734417.9025
Epoch 17/17
100/100 [==============================] - 150s 2s/step - loss: 654648.5581 - val_loss: 778414.4363
Epoch 18/18
100/100 [==============================] - 145s 1s/step - loss: 643995.8372 - val_loss: 727236.1906
Epoch 19/19
100/100 [==============================] - 146s 1s/step - loss: 633081.0981 - val_loss: 703399.7200
Epoch 20/20
100/100 [==============================] - 146s 1s/step - loss: 630721.5150 - val_loss: 742294.0931
Epoch 21/21
100/100 [==============================] - 147s 1s/step - loss: 626138.9844 - val_loss: 715688.0587
Epoch 22/22
100/100 [==============================] - 146s 1s/step - loss: 606827.5503 - val_loss: 690054.2956

ロスのオーダーが105なのが気になる…

TensorBoardで見てみるとこんな感じ↓。

f:id:twx:20180913153940p:plain

20エポック時点でのテスト結果を見てみるとこんな感じ↓。

f:id:twx:20180913154136p:plain f:id:twx:20180913154150p:plain f:id:twx:20180913154201p:plain

いい感じではある。

論文によると、「10日間学習させる必要があった」と書かれているので、もう少し経過を待ってみようと思う。

追記 (50エポック終了)

約3時間で50エポックが終了しました。

f:id:twx:20180913180646p:plain

まだまだロスは下がりそうです。

テストデータでの結果は以下の通り。

f:id:twx:20180913180842p:plain f:id:twx:20180913180850p:plain f:id:twx:20180913180859p:plain

さらに学習は継続していくので、続報をお楽しみに。

以上、本日は「Image Inpaintingをやってみた」ということで、Image InpaintingをGoogle Colaboratoryで回してみました。最終的な結果は後日追ってご報告します。

良い記事だと思っていただいた方は、以下の「★+」ボタンのクリック、SNSでのシェア、「読者になる」ボタンのクリックをお願いします。 それではまたー!

Kozuko Mahiro's Hacklog ―― Copyright © 2018 Mahiro Kazuko