MXNetのDeep3Dで二次元画像を三次元画像に変換してみました。
以下の記事でインストールした、Deep3Dに対応させたMXNetを使用します。
なお、Deep3Dの詳細は、以下の論文をご覧ください。
Junyuan Xie, Ross Girshick, Ali Farhadi, “Deep3D: Fully Automatic 2D-to-3D Video Conversion with Deep Convolutional Neural Networks”
また、日本語の解説は、こちら(http://qiita.com/supersaiakujin/items/417a79889b7433148820)
Deep3D
必要条件
CUDA 7.0以上、cuDNN 4以上を使用するMXNetが必要です。
また、Deep3D(https://github.com/piiswrong/deep3d)をcloneし、MXNetのconfig.mkのEXTRA_OPERATORS
にDeep3Dのoperatorsを追加して、MXNetを(再)ビルドする必要があります。
なお、Deep3Dに対応させたMXNetのインストール方法は、前回の記事をご覧ください。
準備
deep3d.ipynb上で2D・3D変換を行いますので、jupyterをインストールしていない場合は、インストールしておきます。
また、MXNet 0.7.0を使用する場合、deep3dディレクトリのdeep3d-symbol.jsonをエディタで開いて、962行目の”type”を”mode”に変更しておきます。
更に、自分で二次元画像を用意する場合、2D・3D変換処理の前に横384・縦160(アスペクト比2.4)にリサイズされるので、予めアスペクト比2.4に近い画像を準備しておきます。
Boymaus – Cat with goldfish / CC-BY-SA-3.0
ここでは、上の写真を横384・縦160に加工した下の画像(cat2d.jpg)を使用します。

cat2d.jpg
2D・3D変換
deep3dディレクトリに移動し、以下のコマンドを実行します。
$ ipython notebook deep3d.ipynb
すると、ブラウザが立ち上がって、以下の図のようなnotebookが表示されます。
ここでは、入力画像をdemo.jpgからcat2d.jpgに変更するため、In [3]:の
img = cv2.imread('demo.jpg')
を
img = cv2.imread('cat2d.jpg')
に変更しています。
また、出力画像のファイル名をdemo.gifからcat3d.gifに変更するためと、Deep3DのアニメーションGIFのサンプルを見て、フレーム間隔が短いと感じたため、In [4]:の
writeGif('demo.gif', [left, right], duration=0.08)
を
writeGif('cat3d.gif', [left, right], duration=0.2)
に変更しています。
出力されたアニメーションGIFが、下の画像です。

cat3d.gif
なお、自分で画像を加工したい場合、以下のコードを追加すると、生成された右目用画像と入力画像をリサイズしただけの左目用画像を保存できます。
right.save("cat3d_right.jpg") left.save("cat3d_left.jpg")
まとめ
MXNetのDeep3Dで二次元画像を三次元画像に変換してみました。
なお、最初のアナグリフ風の画像は、以下のAdobe Photoshop Elementsで加工したもので、Deep3Dで生成した画像を変換した画像ではありません。
また、この記事の『Cat with goldfish』を素材とする画像のライセンスは、CC-BY-SA-3.0となります。