LoginSignup
5
4

深度推定モデル Deep Anything v2を試してみる

Last updated at Posted at 2024-06-14

Deep Anything v2とは

Deep Anything v2とは、2024年6月14日に発表された深度推定モデルです。

深度推定モデルとは、ざっくり言うと奥行きを推定するモデルです。

プロジェクトページはこちらです。

Deep Anything v2はその名前から分かる通り、Deep Anything (v1) というモデルの進化版です。

Deep Anything v1との大きな違いは、以下3点です。証拠画像も併せて載せます。画像はいずれもプロジェクトページからの抜粋です。

  1. よりきめ細やかで詳細な推定が可能

    SS 251.jpg

  2. ロバスト性が向上

    SS 252.jpg

  3. モデルが軽量になって推論速度が向上

    SS 253.jpg

モデルのアーキテクチャや学習方法については論文を参照してください。

モデルを動かす

私はGoogle ColabのCPU環境で動作確認しました。
そんなに大きなモデルではないので、GPUではなくCPUで動かしました。
まずは、諸々のインストールです。

!git clone https://github.com/DepthAnything/Depth-Anything-V2
%cd Depth-Anything-V2
!pip install -r requirements.txt

次に、モデルのダウンロードです。
モデルサイズは4種類ありますが、そのうち3種類が公開されています。
好きなものを選んで重みファイルをダウンロードしましょう。

  • Smallモデル(公開中)
  • Baseモデル(公開中)
  • Largeモデル(公開中)
  • Giantモデル(近日公開予定らしい(2024/6/14時点))
# Smallモデルの場合
!wget https://huggingface.co/depth-anything/Depth-Anything-V2-Small/resolve/main/depth_anything_v2_vits.pth

# Baseモデルの場合
!wget https://huggingface.co/depth-anything/Depth-Anything-V2-Base/resolve/main/depth_anything_v2_vitb.pth

# Largeモデルの場合
!wget https://huggingface.co/depth-anything/Depth-Anything-V2-Large/resolve/main/depth_anything_v2_vitl.pth

最後に、推論です。

下のコードを実行するときに、encoderという変数にモデルの種類を指定してください。具体的には、

  • Smallモデルなら"vits"
  • Baseモデルなら"vitb"
  • Largeモデルなら"vitl"
  • Giantモデルなら"vitg"

を指定します。

私はSmallモデルで推論してみました。

import cv2
import torch

from depth_anything_v2.dpt import DepthAnythingV2

encoder = "vits" # ここにモデルの種類を指定

model_configs = {
    'vits': {'encoder': 'vits', 'features': 64, 'out_channels': [48, 96, 192, 384]},
    'vitb': {'encoder': 'vitb', 'features': 128, 'out_channels': [96, 192, 384, 768]},
    'vitl': {'encoder': 'vitl', 'features': 256, 'out_channels': [256, 512, 1024, 1024]},
    'vitg': {'encoder': 'vitg', 'features': 384, 'out_channels': [1536, 1536, 1536, 1536]}
}

model = DepthAnythingV2(**{**model_configs[encoder]})
model.load_state_dict(torch.load(f"depth_anything_v2_{encoder}.pth", map_location="cpu"))
model.eval()

raw_img = cv2.imread("画像のファイルパス")
depth = model.infer_image(raw_img)

深度推定の結果はdepthにあります。
depthは1チャンネルの画像ですので、これを画像ファイルとして保存するなり表示するなりして結果を確認してください。

私は、以下の画像で試してみました。

image.png

結果はこんな感じ↓です。いい感じですね。

image.png

最後に

深度推定モデルについては詳しくないですが、Xで見つけたのでなんとなくDeep Anything v2を動かしてみました。

ただ、正直に言うと、個人的には深度推定モデルを使うシーンはあまりないかなと思っています笑。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4