深層学習を用いた欠損画像補完論文サンプルの動作確認

# 目的

深層学習を用いた欠損画像の補完に関する論文（"Image Inpainting for Irregular Holes Using Partial Convolutions", [https://arxiv.org/abs/1804.07723](https://arxiv.org/abs/1804.07723)）の動作確認の方法を以下に示します。

<img width="1171.6799999999998" alt="sample_results.png (4.3 MB)" src="https://img.esa.io/uploads/production/attachments/8793/2018/10/29/31597/633e3638-f6de-4d04-94f8-174fd0cdc006.png">

具体的には **Github に公開されている上記論文の実装サンプルのレポジトリ（ https://github.com/chuangtc/PConv-Keras ）の Jupyter Notebook である [Step3 - UNet Architecture.ipynb](https://github.com/chuangtc/PConv-Keras/blob/master/Step3%20-%20UNet%20Architecture.ipynb) というソースコードを [Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb) 上で動作させる手順** を示します。

# 環境

基本的に Google Colaboratory 上に用意されている下記の深層学習およびGPU環境にて動作確認をしました。Google Colaboratory を利用するメリットとしては下記2点です。

* メリット
    1. 深層学習&GPU環境構築の手間が不要
    2. GPU環境が12時間限定で無料で利用可能）

* 動作環境（Google Colaboratory ）
    * ソフトウェア
        * Python 3.6
        * Keras 2.2.0
        * Tensorflow 1.8
    * ハードウェア
        * -memory description: System memory physical id: 0 size: 12GiB
        * -cpu product: Intel(R) Xeon(R) CPU @ 2.30GHz vendor: Intel Corp. physical id: 1 bus info: cpu@0 width: 64 bits
        * -display description: 3D controller product: GK210GL [Tesla K80]

# 手順

## 1. Google Colaboratory ログイン 

[Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb) を開いて、Colaboratory にログインします。

Colaboratory 画面左上のファイル > ノートブックをアップロード を選択し、別途ローカルにダウンロードした [Step3 - UNet Architecture.ipynb](https://github.com/chuangtc/PConv-Keras/blob/master/Step3%20-%20UNet%20Architecture.ipynb) というソースコードをアップロードします。

<img width="1050.75" alt="2018-10-29_181751.png (77.7 kB)" src="https://img.esa.io/uploads/production/attachments/8793/2018/10/29/31597/06820cfd-f1ff-4c3c-ba51-197e9170da8a.png">

## 2. GPU 利用設定

Colaboratory 画面上のランタイム > ランタイムのタイプを変更を選択します。

<img width="463.5" alt="2018-10-29_183504.png (27.5 kB)" src="https://img.esa.io/uploads/production/attachments/8793/2018/10/29/31597/46073546-d2b7-4f3e-9a4a-88d598f07f98.png">

ノートブックの設定 > ハードウェア アクセラレータを "GPU" に設定し、OK を押します。

<img width="382.5" alt="2018-10-29_183535.png (10.8 kB)" src="https://img.esa.io/uploads/production/attachments/8793/2018/10/29/31597/b383a7d6-a2c0-44dd-9d03-d70bf12256a0.png">


## 3. Google Drive にライブラリのアップロード

Colaboratory からファイルアクセスするために画像補完論文の実装レポジトリ（ https://github.com/chuangtc/PConv-Keras ）のライブラリ等一式を Google Drive にアップロードします。

libs フォルダが画像補完ライブラリ、data フォルダが画像データ等が格納されています。

<img width="1344.75" alt="2018-10-29_182048.png (27.3 kB)" src="https://img.esa.io/uploads/production/attachments/8793/2018/10/29/31597/00a7517e-c122-44ec-a82f-83b5abd34eb7.png">

## 4.  Jupyter Notebook の追記修正および実行

1.でアップロードした Jupyter Notebook [Step3 - UNet Architecture.ipynb](https://github.com/chuangtc/PConv-Keras/blob/master/Step3%20-%20UNet%20Architecture.ipynb) の最初に下記を追記します。

追記理由としては Colaboratory から Google Drive 上に置いたライブラリ、画像データへのアクセスのためです。

```:Step3-UNetArchitecture.ipynb冒頭へ以下を追記
!apt-get install -y -qq software-properties-common python-software-properties module-init-tools
!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null
!apt-get update -qq 2>&1 > /dev/null
!apt-get -y install -qq google-drive-ocamlfuse fuse
from google.colab import auth
auth.authenticate_user()
from oauth2client.client import GoogleCredentials
creds = GoogleCredentials.get_application_default()
import getpass
!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL
vcode = getpass.getpass()
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}
!cp -f ~/.gdfuse/default/config config
!sed -i -e "s/^root_folder=$/root_folder=17MgrYRO39sXs16fqU5V1qgyUI17KEW2l/" config

!mkdir -p drive
!google-drive-ocamlfuse -config ./config -cc drive
```

追記例：
<img width="787.5" alt="2018-10-29_182609.png (41.2 kB)" src="https://img.esa.io/uploads/production/attachments/8793/2018/10/29/31597/76c90b6a-714e-4f5e-8361-958118e0991b.png">

追記後、Shift + Enter にて Step3 - UNet Architecture.ipynb の1セル目の計算を実行します。

そのまま、2セル目も同様に実行し、3セル目のソースコードを下記2行を追記・修正します。

```:追記・修正行
img = cv2.imread('drive/data/sample_image.jpg')
img = cv2.resize(img, (256, 256)) / 255
```

それ以外はそのまま上から順に実行していくと、最後のセルにてオリジナルと画像補完画像の結果を比較した図が得られます。

サンプルの動作確認結果画面：
<img width="855" alt="2018-10-29_183406.png (836.5 kB)" src="https://img.esa.io/uploads/production/attachments/8793/2018/10/29/31597/2d10a84f-742b-4a67-86d9-9f2ef767d910.png">

注目すべきポイントとしては上記の計算時間で、620 sec とあり、およそ 10分程度で学習および推論の計算が実施されています。こちら GPU を利用しない場合は 約3時間程度かかるため、**GPU 利用することでおよそ 18倍程度の高速化がなされているということが分かります**。

## 5. 実行結果

上記の実行結果データについては下記よりアクセスできます（計算実行済みのもの）。

実行結果
https://colab.research.google.com/drive/1C1J_j7uFaQa7Mm_mM8pm4Yay_XQSpW4p