[MergeNet] 機械学習で一枚の画像から単眼デプス(深度)推定

2022年7月27日水曜日

Artificial Intelligence

本記事では、機械学習手法MergeNetを用いて一枚の画像から深度推定を行う方法をご紹介します。

アイキャッチ

MergeNet

概要

MergeNetは、既存の単眼デプス推定手法を使用し、低解像度の推定結果と高解像度の推定結果をマージすることで、ゼロショットで精細な単眼デプス推定を実現する手法です。

overview
出典: compphoto/BoostingMonocularDepth

従来、低解像度の画像をネットワークに入力した場合、高周波成分が欠落し画像の細かい部分の深度推定精度が低いという課題がありました。

反対に、高解像度の画像の場合、全体的な構造の一貫性が下がり本来フラットであるはずの壁などの推定結果にムラができるという課題がありました。

このように構造の一貫性と、高周波成分にはトレードオフが存在していることが知られています。

MergeNetでは、トレードオフ解消のため、低解像度・高解像度の2つの画像の推定結果をマージするための変換ネットワークを構築し、精度の向上を実現しています。

詳細はこちらの論文をご参照ください。

本記事では上記手法を用いて、任意の画像で単眼デプス推定を行います。

デモ(Colaboratory)

それでは、実際に動かしながら単眼デプス推定を行っていきます。
ソースコードは本記事にも記載していますが、下記のGitHubでも取得可能です。
GitHub - Colaboratory demo

また、下記から直接Google Colaboratoryで開くこともできます。
Open In Colab

また、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。

環境セットアップ

それではセットアップしていきます。 Colaboratoryを開いたら下記を設定しGPUを使用するようにしてください。

「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更

初めにGithubからソースコードを取得します。

%cd /content

!git clone https://github.com/compphoto/BoostingMonocularDepth.git

次ににライブラリをインポートします。

from PIL import Image
from matplotlib import pyplot as plt
import numpy as np

以上で環境セットアップは完了です。

学習済みモデルのセットアップ

Mergeのため学習済みモデルと既存単眼デプス推定手法Midas, LeResの学習済みモデルをダウンロードします。

%cd /content/BoostingMonocularDepth

# Download Merge model weights
!mkdir -p pix2pix/checkpoints/mergemodel/
!wget -c https://sfu.ca/~yagiz/CVPR21/latest_net_G.pth \
      -O pix2pix/checkpoints/mergemodel/latest_net_G.pth

# Download Midas model weights
!wget -c https://github.com/AlexeyAB/MiDaS/releases/download/midas_dpt/midas_v21-f6b98070.pt \
      -O midas/model.pt

# Download LeRes model weights
!wget -c https://cloudstor.aarnet.edu.au/plus/s/lTIJF4vrvHCAI31/download \
      -O res101.pth

テスト画像のセットアップ

モデルに入力するテスト画像をダウンロードします。
本記事では、こちらの画像を使用させていただきます。

img_url = 'https://www.pakutaso.com/shared/img/thumb/pakuphoto39890PAR57308_TP_V.jpg' # @param {type:'string'}

%cd /content/BoostingMonocularDepth

# ディレクトリ作成
!mkdir -p inputs
!mkdir -p outputs_midas
!mkdir -p outputs_leres

!wget -c {img_url} \
      -O inputs/test_01.jpg
input image


単眼デプス推定

用意が整ったので、単眼デプス推定を行っていきます。
初めに、MiDasを使用します。この手法は、逆深度を予測します。

!python run.py --Final --data_dir ./inputs --output_dir  ./outputs_midas/ --depthNet 0

input = Image.open('./inputs/test_01.jpg')
midas_output = Image.open('./outputs_midas/test_01.png')

fig = plt.figure(num=None, figsize=(12, 5))

ax = fig.add_subplot(1, 2, 1, xticks=[], yticks=[])
plt.imshow(np.asarray(input))
ax.set_title('input')

ax = fig.add_subplot(1, 2, 2, xticks=[], yticks=[])
plt.imshow(np.asarray(midas_output))
ax.set_title('midas output')

予測結果は以下の通りです。

midas result

続いてLeResをベースとした推定を行います。

!python run.py --Final --data_dir ./inputs --output_dir  ./outputs_leres/ --depthNet 2

input = Image.open('./inputs/test_01.jpg')
midas_output = Image.open('./outputs_leres/test_01.png')

fig = plt.figure(num=None, figsize=(12, 5))

ax = fig.add_subplot(1, 2, 1, xticks=[], yticks=[])
plt.imshow(np.asarray(input))
ax.set_title('input')

ax = fig.add_subplot(1, 2, 2, xticks=[], yticks=[])
plt.imshow(np.asarray(midas_output))
ax.set_title('leres output')

出力結果は以下の通りです。

LeRes result

LeResの方が、建物全体の奥行がうまく表現されています。

まとめ

本記事では、MergeNetを用いた単眼デプス推定の方法をご紹介しました。

また本記事では、機械学習を動かすことにフォーカスしてご紹介しました。
もう少し学術的に体系立てて学びたいという方には以下の書籍などがお勧めです。ぜひご一読下さい。


また動かせるだけから理解して応用できるエンジニアの足掛かりに下記のUdemyなどもお勧めです。

参考文献

1.  論文 - Boosting Monocular Depth Estimation with Lightweight 3D Point Fusion

2. GitHub - compphoto/BoostingMonocularDepth

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology