SIGGRAPH(シーグラフ)という学会があるのですが、空白部分の画像をきれいに補完してしまうという論文が発表されていました。 そのモデルがGithubで公開されていたので、早速試してみる事にしました。
SIGGRAPH - ディープネットワークによる画像補完
発表された論文については、この記事が詳しいです。
記事にあるように、画像の空白部分を良い具合に補完してくれるんですね。すごいですね!
論文はこちらです。
- ディープネットワークによるシーンの大域的かつ局所的な整合性を考慮した画像補完 (日本語)
- Globally and Locally Consistent Image Completion (English)
公開された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
- Docker Hub - https://hub.docker.com/r/takp/torch-opencv/
ダウンロードに時間がかかるのでしばらく待ちましょう。
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: オリジナルの画像)
(Input: 空白部分のある状態の画像)
(Output: 補完させてみた結果)
空白部分だった所が補完されてますね!人がいた部分が生成された背景になっています。
画像を拡大すると、空白部分だった所が少しだけ分かりますが、これはスゴイです。
他の画像でも試してみる
空白部分を指定するmaskを指定しなかった場合は、自動でランダムに空白部分を作成してくれます。
$ th inpaint.lua --input b.png
違う画像で試した所、このようになりました。
カフェの外観画像の場合
(Original: オリジナルの画像)
(Input: 空白部分のある状態の画像)
(Output: 補完させてみた結果)
大きい方の空白部分の補完はとてもきれいに出来てますね。オリジナルと見紛うレベルです。 対して、左下のテーブルの補完はちょっと変(?)に見えますが、全体としては気になりません。
我が家のトイプードル(犬)の場合
(Original: オリジナル)
(Input: 空白部分のある状態の画像)
(Output: 補完させてみた結果)
目のところが少しグチャっとなってますが、耳の雰囲気などがちゃんと再現されてます。 首輪のリードの所などはほぼ完璧ですね。
本当に素晴らしいですね! 上記の環境さえ構築すれば、色んな画像を試せます。ぜひやってみてください。