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

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

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

ここでは、
**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枚の静止画。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635153/6e3930ec-fad4-f109-2df7-793dd18c7fb3.jpeg" width=200>

結果。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635153/7cbf7728-000a-902a-9d99-fcd5043b68af.gif" width=480>



元の1枚の静止画。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635153/dc0b8190-9e7f-8bf4-dd21-29d3613a5e77.jpeg" width=200>

結果。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635153/9ac7d888-0bed-1d48-eb0b-1308af72a676.gif" width=480>




#numpyでdepthを加工

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

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635153/06ed023d-4661-faa5-5fce-f2ee31cdfd8a.gif" width=480>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635153/b6c6bf44-854f-2237-2d07-5dd49762113c.gif" width=480>

**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#######追加
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635153/1030ab1e-696d-12f0-d368-2d19111a2195.gif" width=360>



<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635153/5006463b-e609-7da4-9fb5-8196f2617907.gif" width=480>


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

関連：
[写真1枚で高精度な3D画像簡単作成やってみた【3】。勝手にdepthのみ 別の手法（intel-isl のMiDaS他）。](https://qiita.com/torinokaijyu/items/6889598b732851c2e8fd)

:star2:[写真1枚で高精度な3D画像簡単作成やってみた【0】。(空間の捉え方を確認した)](https://qiita.com/torinokaijyu/items/d93b83b6a135f1b9a660)

:new:[写真1枚で高精度な3D画像簡単作成やってみた【-1】。(隠れた領域が、本当に見えるのか？)](https://qiita.com/torinokaijyu/items/20a5a478881c9d00f9ac)

#役立つかもしれない情報（一連の記事【-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のレンジを
　　変更しても結果が同じだった気がする。:star:

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