【実践】Python と MiDaS で深度推定!DepthMapを作ろう!

当ページのリンクには広告が含まれています。

Quest2を買って早一年、この10月にはQuest3が出るようですが、VRの楽しみ方の1つとして、普通の2D写真を疑似的に3D化して大画面で鑑賞するという方法があります。

2D写真を3D化するには、写っている物の奥行きを推定(=深度推定)し、そこから左右の視差を計算し、それを元に左目と右目用の写真を作り出すという手順を踏みます。

今回は、3D化に欠かせない深度推定において、MiDaS と呼ばれるモデルを使って実現する方法を紹介したいと思います。

目次

MiDasとは

MiDaSは(Mixed Depth and Scale Network)の略で、画像から奥行き(深度)を推定するニューラルネットワークです。

1枚の写真から各部分の深度を推測し、DepthMapを生成します。これを使うことで2D画像を疑似的に3D化することが可能となります。

MiDaSは、自動運転、バーチャルリアリティ、3D復元、セマンティックセグメンテーションなど、さまざまな応用分野で活用されています。

WinPython環境の構築

まず最初に、「【お手軽】WinPython+Portable Gitでお手軽Python環境を構築しようよ」の手順に従ってPython環境を構築して下さい。

以降は、この環境のことを「WinPython+PortablGit」環境を呼び、この環境を前提とした説明を行います。自身の環境で動作させる場合は、適宜読み替えをお願いします。

MiDaSのインストール

MiDaSを使えるようにするには、次の手順が必要です。

  • MiDaSのダウンロード( git Clone ~ 又は Download.Zipファイルのダウンロード&解凍)
  • モデルのダウンロード
  • 必要モジュールのインストール(pip install ~)

では、それぞれの手順について詳しく説明していきます。

MiDaSのダウンロード

MiDaSはGitHubに公開されているので、git clone を使ってダウンロードするか、下記のページから直接 Download.Zipをダウンロードして下さい。

https://github.com/isl-org/MiDaS

MiDaS公式ページのキャプチャ画像

ダウンロードに成功すると、MiDaS-master.zip というファイルが出来上がっています。これを任意のフォルダに解凍して下さい。

解凍すると下記のフォルダ構成が展開されます。

MiDaSで深度推定を行うには学習済みモデルが必要ですが、Zipファイルには同梱されていません。後述する手順で使いたいモデルをダウンロードし、 weights フォルダに格納して下さい。

フォルダ構成図

モデルのダウンロード

Download.Zipをダウンロードしたページ(https://github.com/isl-org/MiDaS)を下方向に少しスクロールすると、よく使われるモデルのリンクが張られていますので、ここからダウンロードして下さい。

MiDaSモデルダウンロード方法の図

過去バージョンのモデルや、サイズが小さいモデルを利用したい場合は、下記のリンクからダウンロードすることが可能です。

モジュールのインストール

@CommandPrompt を起動し、下記のコマンドを実行して下さい。

pip install opencv-python
pip install imutils
pip install timm==0.6.12

既に timm の最新がインストールされている場合は、MiDaS 3.1のモデルを指定するとエラーになりますこの場合は一旦 timmをアンインストールしてから、timmのバージョンに0.6.12を指定して再インストールして下さい。

pip uninstall timm
pip install timm==0.6.12

また、GPUを使いたい場合は、下記も併せてインストールしておきましょう。

pip install torch==2.0.1.0+cu118 torchvision torchaudio -f
https://download.pytorch.org/whl/torch_stable.html

MiDaSの使い方

run.py というサンプルプログラムが同梱されていますので、これを使えば簡単に深度マップが作成できます。

MiDaSの使い方のイメージ図

まず run.pyを実行する前に、下記の準備をしておきましょう。

  • モデルファイル dpt_beit_large_512 をダウンロードし、weights フォルダに格納しておく
  • @CommandPrompt 上で、MiDaS-master.zipを解凍したフォルダ(run.pyが格納されているフォルダ)にカレントフォルダを移動する。
  • run.pyと同じ階層にある inputフォルダに、深度推定したい画像ファイルを任意の数だけ格納

準備が終わったら、下記のコマンドを実行します。

python run.py --model_type dpt_beit_large_512 --input_path input --output_path output

実行するとコマンドプロンプトに結果が表示されます。

コマンドプロンプトでのMiDaS実行時のキャプチャ画像

深度マップは run.py と同じ解像にある output フォルダに格納されます。

今回は inputフォルダに1枚だけ画像を格納しましたので、下記の深度マップ(DepthMap)が生成されました。

Depth Mapのサンプル画像

コマンドには数多くの引数がありますので、紹介しておきます。よく使いそうなのは、元画像と深度マップを並べて1つの画像として出力する --side オプションと、深度マップをグレイスケールで生成する --grayscaleオプションくらいでしょうか。

オプション説明
-h
--help
ヘルプメッセージを表示して終了します。
-i INPUT_PATH
--input_path INPUT_PATH
入力画像が含まれるフォルダを指定します(入力パスが指定されていない場合、カメラから画像を取得しようとします)。
-o OUTPUT_PATH
--output_path OUTPUT_PATH
出力画像を保存するフォルダを指定します。
-m MODEL_WEIGHTS
--model_weights MODEL_WEIGHTS
学習済みモデルの重みへのパスを指定します。
-t MODEL_TYPE
--model_type MODEL_TYPE
モデルタイプを指定します。
可能なモデルタイプ
dpt_beit_large_512、dpt_beit_large_384、dpt_beit_base_384、dpt_swin2_large_384、dpt_swin2_base_384、dpt_swin2_tiny_256、dpt_swin_large_384、dpt_next_vit_large_384、dpt_levit_224、dpt_large_384、dpt_hybrid_384、midas_v21_384、midas_v21_small_256、openvino_midas_v21_small_256。
-s
--side
出力画像にRGB画像と深度画像を横に並べて表示します。
--optimizeハーフフロートの最適化を使用します。
--height HEIGHT推論時にエンコーダに供給される画像の好ましい高さを指定します。好ましい高さは32の倍数に整列されるため、実際の高さとは異なる場合があります。このパラメータが設定されていない場合、多くのモデルはトレーニング時に選択された高さを自動的に使用します。
--square画像を正方形の解像度にリサイズするオプションです。画像がエンコーダに供給される際に幅を変更して解像度を正方形にします。このパラメータが設定されていない場合、モデルがサポートする場合は画像のアスペクト比を維持しようとします。
--grayscaleinfernoカラーマップの代わりにグレースケールカラーマップを使用します。デフォルトで使用されるinfernoカラーマップは視認性が向上しますが、このカラーマップの精度制限により、PNGファイルには8ビットの深度値しか保存できません(16ビットの深度値は保存できません)。

深度マップの生成例

run.py に--sideオプションを付けて、色々な画像から深度マップを生成してみました。結構上手く深度推定されているようです。

Depth Mapのサンプル画像

まとめ

今回は 深層学習を使って1枚の画像の深度推定を行う MiDaSについて、ダウンロード方法、インストール方法、使い方について紹介しました。

1枚の2D写真から奥行きを推定するという難しそうなテーマですが、かなり現実に近い形で推定できました。

ただ、推定する処理は結構重いので、ある程度性能のあるGPU(RTX-3000シリーズ、RTX-4000シリーズ)がないと辛いかもしれません。

AIがもっと普及して、高性能はGPU(又はAI専用チップ)が安く購入できるようになれば有難いですね。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次