写真1枚で高精度な3D画像簡単作成やってみた【2】。(depthをnumpyで加工してみる)


概要

写真1枚で
高精度な3D画像↓ 簡単作成できるよう。

写真1枚で高精度な3D画像簡単作成やってみた【1】。(depthがPNGで編集できるようになりましたよ。)
の記事参照。

ここでは、
depthをnumpyで加工してみる

以下が論文とgithub。

https://arxiv.org/pdf/2004.04727.pdf
論文『3D Photography using Context-aware Layered Depth Inpainting』
Meng-Li Shih1 さんら

githubは、以下。
https://github.com/vt-vl-lab/3d-photo-inpainting

まず、普通の実施例

加工元画像 
https://pixabay.com/ja/ を利用

元の1枚の静止画。

結果。

元の1枚の静止画。

結果。

numpyでdepthを加工

とりあえず、depthの値を20段階ぐらいに?離散化してみた。
(すみません、例として、失敗しています。作用が全くわからない。。。 作用は、次項参照。)

2行たしてみた
実際は、例えば、意味のある関数をつくって作用させればいい?ここの処理フェーズでやるのがいいかどうかは検討がいると思うが。

run.py
        # compute
        with torch.no_grad():
            out = model.forward(img_input)

        out = out//0.1#######追加
        out = out*0.1#######追加

        depth = utils.resize_depth(out, target_width, target_height)
        img = cv2.resize((img * 255).astype(np.uint8), (target_width, target_height), interpolation=cv2.INTER_AREA)

numpyでdepthを加工(作用を強くした例)

上記より粒度を5倍にあげた。

        out = out//0.5#######追加
        out = out*0.5#######追加

あとがき

pngの編集を前の記事に書いたが、デフォルトのnumpyのほうが扱いやすいかもと思い、numpyでの編集の例を示した。(残念ながら、意味ある編集に至らず。。。)
コメントなどあればお願いします。

関連:
写真1枚で高精度な3D画像簡単作成やってみた【3】。勝手にdepthのみ 別の手法(intel-isl のMiDaS他)。

写真1枚で高精度な3D画像簡単作成やってみた【0】。(空間の捉え方を確認した)

写真1枚で高精度な3D画像簡単作成やってみた【-1】。(隠れた領域が、本当に見えるのか?)

役立つかもしれない情報(一連の記事【-1】~【3】総合)

【1】
・GFORCE GTX1050Ti(専用GPUメモリ4.0GB)では、
GPUのメモリ不足で動かない場合あり
 これは、画像サイズに依存するのではなく
 おそらく、画像の中身で3Dの表現に必要なメモリ量の関係か何か。
 解決策、見つけていません。パラメータ変更等でなんとかなるのかも。
赤い車ので、専用GPUメモリ3.4GB程度、白のは2.7GB程度使用されていました。
 このメモリ問題に関しては、とりえず、Google Colabとかを使うのがいいのでは?
・PNGによるdepth情報の編集を示しましたが、確か、デフォルトはnumpy?。
 そのデータ(numpy)をガタガタ扱うのができる方は、そちらを編集するのもありかも。
・PNGで表現されたdepthの情報は、どこかで正規化されている気がする。PNGのdepthのレンジを
  変更しても結果が同じだった気がする。

【3】
・全面が壁のような画像の場合、垂直面がうまく検出できないような気がする。
  (簡単だと思うので、不思議。)depthの手法をいくつか試したが、
  いまのところ良いものに出会ってない。