SIGGRAPH論文の画像補完を試してみたら、やはりすごかった

SIGGRAPH(シーグラフ)という学会があるのですが、空白部分の画像をきれいに補完してしまうという論文が発表されていました。 そのモデルがGithubで公開されていたので、早速試してみる事にしました。

Github image

SIGGRAPH - ディープネットワークによる画像補完

発表された論文については、この記事が詳しいです。

記事にあるように、画像の空白部分を良い具合に補完してくれるんですね。すごいですね!

論文はこちらです。

公開されたGithubを見てみる

このGithubリポジトリで公開されていました。今年2018年2月に公開されたようです。

学習済みのモデルをダウンロードできるようなので、実行して試してみましょう!

Lua, Torch, OpenCVなどがインストールされた環境が必要なので、Dockerで構築する事にしました。

Dockerで環境構築を行う

何をベースイメージに使おうか迷ったんですが、OpenCVが入っているものを利用して、必要なものをインストールしていきました。(ですが結局、OpenCVの3.1.0が必要という事が分かりインストールしなおしてます…)

思い出しながらDockerfile作りましたが、抜けがあるかも知れないのでご参考まで。

FROM jjanzic/docker-python3-opencv

RUN apt-get install lua
    && curl -R -O http://www.lua.org/ftp/lua-5.3.4.tar.gz \
    && tar zxf lua-5.3.4.tar.gz \
    && cd lua-5.3.4 \
    && make linux test \
    && make install

RUN apt-get install sudo

RUN cd \
    && git clone https://github.com/torch/distro.git ~/torch --recursive \
    && cd ~/torch \
    && bash install-deps \
    && ./install.sh

RUN sudo apt-get install build-essential \
    && sudo apt-get install -y cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev \
    && sudo apt-get install -y python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

RUN wget https://github.com/opencv/opencv/archive/3.1.0.tar.gz \
    && mv 3.1.0.tar.gz opencv-3.1.0.tar.gz \
    && tar zxf opencv-3.1.0.tar.gz \
    && cd opencv-3.1.0 \
    && mkdir build \
    && cd build \
    && cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local .. \
    && make -j7 \
    && make install

RUN luarocks install cv

ビルドは結構時間がかかります。

Docker imageをPull

上記のDockerfileで作成したイメージをDocker HubにPUSHしてあるので、これを使ってみてください。(この方が早いです)

$ docker pull takp/torch-opencv:latest

ダウンロードに時間がかかるのでしばらく待ちましょう。

Run: 実行

さて、論文のコードもクローンしましょう。

$ git clone git@github.com:satoshiiizuka/siggraph2017_inpainting.git
$ cd siggraph2017_inpainting

では、先ほど作成したDockerイメージを用いて実行してみましょう。

$ cd siggraph2017_inpainting
$ docker images
takp/torch-opencv    latest     76a6895xxxxx        9 hours ago         4.61GB
$ docker run -it -v `pwd`:/mount takp/torch-opencv  /bin/bash

ここからは、Dockerの起動したコンテナ内で実行していきます。

$ cd /mount
$ bash download_model.sh
$ th inpaint.lua --input example.png --mask example_mask.png
{
  gpu : false
  mask : "example_mask.png"
  input : "example.png"
  nopostproc : false
  maxdim : 500
}
Loding model...	
Inpainting...	
Performing post-processing...	
libdc1394 error: Failed to initialize libdc1394
Done.	

このように Done. と表示されれば正しく動いてます。そして、結果の out.png が生成されます。

では、Exampleの画像で試してみます。

(Original: オリジナルの画像)

Original Example

(Input: 空白部分のある状態の画像)

Input Example

(Output: 補完させてみた結果)

Output Example

空白部分だった所が補完されてますね!人がいた部分が生成された背景になっています。

画像を拡大すると、空白部分だった所が少しだけ分かりますが、これはスゴイです。

他の画像でも試してみる

空白部分を指定するmaskを指定しなかった場合は、自動でランダムに空白部分を作成してくれます。

$ th inpaint.lua --input b.png

違う画像で試した所、このようになりました。

カフェの外観画像の場合

(Original: オリジナルの画像)

(Input: 空白部分のある状態の画像)

Input 1

(Output: 補完させてみた結果)

Output 1

大きい方の空白部分の補完はとてもきれいに出来てますね。オリジナルと見紛うレベルです。 対して、左下のテーブルの補完はちょっと変(?)に見えますが、全体としては気になりません。

我が家のトイプードル(犬)の場合

(Original: オリジナル)

Original 3

(Input: 空白部分のある状態の画像)

Input 3

(Output: 補完させてみた結果)

Output 3

目のところが少しグチャっとなってますが、耳の雰囲気などがちゃんと再現されてます。 首輪のリードの所などはほぼ完璧ですね。

本当に素晴らしいですね! 上記の環境さえ構築すれば、色んな画像を試せます。ぜひやってみてください。

@takp