Deep Anything v2とは
Deep Anything v2とは、2024年6月14日に発表された深度推定モデルです。
深度推定モデルとは、ざっくり言うと奥行きを推定するモデルです。
プロジェクトページはこちらです。
Deep Anything v2はその名前から分かる通り、Deep Anything (v1) というモデルの進化版です。
Deep Anything v1との大きな違いは、以下3点です。証拠画像も併せて載せます。画像はいずれもプロジェクトページからの抜粋です。
モデルのアーキテクチャや学習方法については論文を参照してください。
モデルを動かす
私は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チャンネルの画像ですので、これを画像ファイルとして保存するなり表示するなりして結果を確認してください。
私は、以下の画像で試してみました。
結果はこんな感じ↓です。いい感じですね。
最後に
深度推定モデルについては詳しくないですが、Xで見つけたのでなんとなくDeep Anything v2を動かしてみました。
ただ、正直に言うと、個人的には深度推定モデルを使うシーンはあまりないかなと思っています笑。