はじめに
「3D Photo Inpainting」ってご存知ですか?AIで写真から3Dのデータが作れちゃうんです。
私は下記記事で知りました。googleの仮想環境を使っての使い方について説明があります。
gigazine:画像から簡単に精巧な3D写真が作成できる論文が公開される、実際に3D写真を生成することも可能
私はAIとかディープラーニングとかほとんど触ったことがありません。質問に答えるとそれが誰なのか答えてくれるアキ○イターのおっさんと会話したぐらいです。
それでも機械学習はGPUを使うらしいぐらいは知っていました。私のPCはGPUが搭載されており、ちょっと有効に使って見ようかと自分のPCで作業できるようにチャレンジしてみました。
立体化するターゲットは以前我が家の猫の紹介で紹介したうちの猫です。
動作環境
OS:Ubuntu18.04(Ubuntu20.04でも動作しました)
グラフィックボード:GeForce GTX 1050 Mobile
ドライバ:nvidia-driver-440
その他:pyenv+anaconda
導入
Anacondaを利用している人は下記の説明のとおりにすればいいです。
github:vt-vl-lab / 3d-photo-inpainting
ですが、私はpyenvを使いたく、そのままAnacondaを入れるとpyenvが壊れるとか情報がありましたので、下記方法で環境を構築しました
git clone https://github.com/vt-vl-lab/3d-photo-inpainting
cd 3d-photo-inpainting
pyenv install anaconda3-2020.02
pyenv local anaconda3-2020.02
conda create -n 3DP python=3.7 anaconda
pyenv local anaconda3-2020.02/envs/3DP
pip install -r requirements.txt
conda install pytorch==1.4.0 torchvision==0.5.0 cudatoolkit==10.1.243 -c pytorch
chmod +x download.sh
./download.sh
ここまでで準備完了です。あとは説明通りにimageフォルダに立体化したいjpgファイルを配置し、
python main.py --config argument.yml
を実行すればvideoフォルダにできるはず・・・でしたが
running on device 0
0%| | 0/1 [00:00 IMG_20181229_104636
Running depth extraction at 1589007050.8208249
initialize
device: cpu
start processing
processing image/IMG_20181229_104636.jpg (1/1)
torch.Size([1, 3, 384, 288])
finished
Start Running 3D_Photo ...
Loading edge model at 1589007060.1773477
Loading depth model at 1589007061.5922308
Loading rgb model at 1589007062.6888661
Writing depth ply (and basically doing everything) at 1589007063.7478602
Writing mesh file mesh/IMG_20181229_104636.ply ...
Making video at 1589007153.8306077
fov: 53.13010235415598
Segmentation fault (コアダンプ)
とエラーが出て止まってしまいました
結論から言うと、下記からCUDA Toolkit 10.2をインストールすると動くようになりました。
https://developer.nvidia.com/cuda-downloads
私の場合はこれでうまいこと行きましたが、ドライバのバージョンによって、CUDA、pytorch、cudatoolkitのバージョンを変更しないといけないようです。
あと試していませんが、argument.ymlのgpu_idsの値を−1にするとcpuのみで動くらしいです
成果物!
その1
その2
感想:後ろの猫の輪郭の影っぽい部分が少し違和感がありますが、うちのにゃんこが素材なら何でもかわいい!!(親ばか)
実験
もっとカメラを大きく動かしたらどうなるのか気になったので、argument.ymlの値をいじってみる。
こいつを・・・
x_shift_range: [0.00, 0.00, -0.02, -0.02]
python
y_shift_range: [0.00, 0.00, -0.02, -0.00]
z_shift_range: [-0.05, -0.05, -0.07, -0.07]
traj_types: ['double-straight-line', 'double-straight-line', 'circle', 'circle']
video_postfix: ['dolly-zoom-in', 'zoom-in', 'circle', 'swing']
こうする
x_shift_range: [0.00, 0.00, -0.02, -0.50]
y_shift_range: [0.00, 0.00, -0.02, -0.00]
z_shift_range: [-0.05, -0.50, -0.07, -0.07]
traj_types: ['double-straight-line', 'double-straight-line', 'circle', 'circle']
video_postfix: ['dolly-zoom-in', 'zoom-in', 'circle', 'swing']
x_shift_rangeが横、y_shift_rangeが縦、z_shift_rangeが奥行きの振り幅
traj_typesはカメラを一方方向に動かすか、グリグリ動かすか
video_postfixはファイル名につける名前となっており、
太字の部分を大きめに変更しています。zoom-inとswingのファイルが影響あるはず。
(パラメータは縦読みで1セット)
結果:zoom-in
結果:swing
感想:zoom-inは迫力がでましたね。swingはやりすぎ注意です。でもやっぱりso pretty cute!(親ばか)
おまけ
その1:gifアニメーションにしてみた(動かない場合はクリックしてください)
その2:動画から画像を抜き出して、立体視用の画像を作ってみた
平行法用
交差法用
最後に
実は導入が大変でした。
・元々PCはwindowsで、pyenvやAnacondaめんどくさそー、環境汚れるのやダナーという気持ちから、VirtualBoxでトライ。
・pyenv使いたいけど、anacondaとの同居がよくわからない。Docker使おう!
・Dockerでどうやってグラボ使うの?そもそも非力なので機械学習に向いているわけがない(たぶん)。→Docker諦める
・pyenvとanacondaの同居の方法発見するも、VirtualBoxから(私の腕では)GPU使えない →VirtualBox諦める
・開発機としてlinuxほしかったので、デュアルブートでやるか!
・Ubuntu20.04のUSBインストール時、nvidiaがあるとエラーで落ちる → セキュアモードで実行すればいいことがわかる
・セキュアモードで実行すると、画面が小さいため「実行」ボタンが画面からはみ出て押せない!! → Windowsボタンを押しながらドラッグすればいいことがわかる
・インストール成功するも「Segmentation fault (コアダンプ)」のエラーに遭遇 → いままでごちゃごちゃやった中でCUDAが無い!みたいなエラーと遭遇していたので試しにnvidiaのCUDAToolKitを入れてみたらうごいた。
・別のプロジェクトでkivyの開発があったのだが、ビルドできない!!VirtualBoxのUbuntu18.04ではできたのに!!!→20.04は出たばかりで情報が少ないので諦める。サポートも延長したことだし18.04でいいや!
・Ubuntu18.04のUSBインストール時、セキュアモードがない! → Grubのパラメータにnomodesetを記載する必要があることがわかる
・Ubuntu18.04インストール成功!
というストーリでした。
じつはなぜnvidiaのCUDAToolKitを入れないといけないのかよくわからない。condaでcudatoolkitいれてるからええんとちゃうの?それとも両方いれるもんなの??
という課題を残して終了。最後までお付き合いいただきありがとうございました!!