Skip to content

Distill Any Depth -- 蒸留ベースの深度推定

概要

このセクションでは、Distill Any Depthがどのようなモデルであるか、そしてその基盤技術である「知識蒸留」について説明します。

知識蒸留とは何か、なぜ使うのか

知識蒸留(Knowledge Distillation)とは、大きく高精度な「教師モデル(teacher model)」の出力を学習信号として、小さな「生徒モデル(student model)」を訓練する手法です。

通常、高精度なモデルは巨大なパラメータを持ち、推論に時間がかかります。一方、小さなモデルは高速ですが精度が劣ります。知識蒸留では、教師モデルが出力する「どのクラスがどのくらいの確率か」という柔らかい情報(soft label)を生徒モデルに学習させます。正解ラベル(hard label)だけでは得られない教師の「暗黙知」を生徒が吸収するため、生徒モデル単独で学習するよりも高い精度を達成できます。

新人エンジニア向けに噛み砕くと、「ベテランの先輩(教師モデル)が仕事のやり方を新人(生徒モデル)に教える。マニュアル(正解ラベル)だけでは伝わらないコツや勘所も、先輩の仕事ぶりを見て学ぶことで身につく」というイメージです。

Distill Any Depthの特徴

Distill Any Depthでは、複数の既存深度推定モデル(Depth Anything、Marigoldなど)を教師として利用し、それらの長所を統合した生徒モデルを生成します。単一の教師モデルを超える精度を目指しており、各教師モデルの弱点を補完し合うことで全体的な品質向上を図っています。正式名称は「Distill Any Depth: Distillation Creates a Stronger Monocular Depth Estimator」(Westlake-AGI-Lab)です。

なぜこのモデルを検証したか

知識蒸留という手法により、Depth Anything V2やMarigoldといった既存モデルの「いいとこ取り」が実現できるとされています。本当にそのような効果があるのか、LKGでの立体視品質においても既存モデルを上回るのかを確認するために検証を行いました。

前提条件

このセクションでは、Distill Any Depthを動作させるために必要な環境を説明します。

項目要件
OSWindows 10/11 + WSL(Ubuntu 22.04)
Python3.10(conda環境)
GPUCUDA対応のNVIDIA GPU
Gitインストール済みであること
AnacondaWSL内にインストール

bashスクリプトを使用するため、WSL環境が必要です。WSLのセットアップについてはVideo Depth Anythingの「WSLのセットアップ」セクションを参照してください。

なぜAnaconda(conda)を使うのか

Distill Any Depthの導入では、通常のpip + venvではなくAnaconda(conda)を使用します。これには明確な理由があります。

  1. detectron2のビルドにC++コンパイラが必要: Distill Any Depthはdetectron2に依存しています。detectron2にはC++拡張のビルドが含まれており、適切なコンパイラとCUDAライブラリのバージョンを揃える必要があります。condaはこれらPython以外の依存関係も一元管理できます
  2. CUDAライブラリのバージョン管理: condaはCUDA Toolkit自体をconda環境内にインストールできるため、システムのCUDAバージョンとの競合を回避しやすいです
  3. 再現性の確保: conda環境はPythonバージョンを含めて環境全体を厳密に管理できるため、他の環境との干渉を防げます

一般に、純粋なPythonパッケージのみで構成されるプロジェクトにはpip + venvで十分ですが、C++拡張のビルドやCUDAライブラリの管理が必要な場合はcondaが適しています。

導入手順

このセクションでは、Anacondaのインストールから推論実行までの手順を説明します。すべてWSL内での作業です。

手順1. Anacondaのインストール

Anaconda公式サイト(https://www.anaconda.com/download/)からLinux版のshファイルをダウンロードし、WSL内で以下を実行します。

bash
cd /mnt/c/work
bash Anaconda3-2024.10-1-Linux-x86_64.sh

インストーラの指示に従って進めます。

参考: Linux版Anacondaのインストール - python.jp

手順2. 環境変数の設定

インストール直後はcondaコマンドが見つからない場合があります。環境変数を設定して解決します。

bash
echo 'export PATH=~/anaconda3/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
conda --version
# conda 24.9.2 と表示されれば成功

手順3. conda環境の作成と有効化

conda initの実行を求められた場合は、実行後にPowerShellを再起動してWSLを起動し直します。

bash
conda init
# ここでPowerShellを再起動 → wsl -d Ubuntu-22.04 で再度入る

再起動後、conda環境を作成して有効化します。

bash
conda create -n distill-any-depth -y python=3.10
conda activate distill-any-depth

conda環境管理の基本コマンド

  • conda activate <環境名> -- 環境を有効化
  • conda deactivate -- 環境を無効化
  • conda env list -- 作成済み環境の一覧を確認
  • conda env remove -n <環境名> -- 不要な環境を削除

手順4. リポジトリのクローンと依存パッケージのインストール

bash
git clone https://github.com/Westlake-AGI-Lab/Distill-Any-Depth.git
cd Distill-Any-Depth
pip install -r requirements.txt

手順5. detectron2のインストール

Distill Any Depthはdetectron2に依存しています。リポジトリ内に同梱されているdetectron2をインストールします。

bash
cd detectron2
pip install -e .
cd ..
pip install -e .

手順6. チェックポイントの配置

checkpointフォルダとその中にlargeフォルダを作成し、GitHubからダウンロードしたモデルファイルをlargeフォルダ内に配置します。

Distill-Any-Depth/
  checkpoint/
    large/
      <ダウンロードしたモデルファイル>

手順7. 推定対象の画像を配置

深度推定したい画像を以下のパスに配置します。

Distill-Any-Depth/data/input/

手順8. 推論の実行

bash
bash scripts/00_infer.sh

出力結果は以下のフォルダで確認できます。

Distill-Any-Depth/output/

出力結果

このセクションでは、Distill Any Depthの出力結果を示します。サンプルデータと、他のモデルとの比較に使用しているテスト画像(バスケゴール、ハト、ポートレート、トムジェリ)の両方で確認を行いました。

サンプルデータの出力

付属のサンプルデータを使った出力結果:

DADsam1.pngDADsam2.pngDADsam3.pngDADsam4.png

テスト画像の出力

深度推定モデル比較と同じテスト画像で出力した結果です。他のモデル(Depth Anything V2、Marigold、MoGe、Apple Depth Pro)の結果と比較して読むと、Distill Any Depthの特性が理解しやすいです。

DADSDSBasuke.pngDADSDSHato.pngDADSDSModel.pngDADSDSTom.png

LKGでの評価

このセクションでは、各画像をLKG(Looking Glass)で表示して評価した結果をまとめます。深度推定モデル比較の評価基準(立体感の強さ、自然さ、破綻の有無)と同じ観点で評価しています。

バスケゴール

松崎所感: ボールに丸みもついていないし、網の出力もだいぶボロボロ。

比較記事のモデルではDepth Anything V2がバスケゴールで1位でしたが、Distill Any Depthはボールの丸みすら出せていません。バスケゴールのような屋外かつ構造が複雑な被写体は苦手と言えます。

ハト

松崎所感: 立体感はすごく出ているが、背景のほうの深度推定がうまくできていない印象。ハトの丸みはすごくうまく表現できてる。

前景(ハト)の立体表現は良好ですが、背景の深度推定に弱さがあります。知識蒸留により前景の被写体に対する精度は高いものの、遠景の処理に課題が残る結果となりました。

ポートレート

松崎所感: 首がものすごく下手。すごく顔を前に出している人みたいに見える。ただし、顔の立体感は自然。目のくぼみの表現もできている。体の厚みもほかのものに比べたら一番出ている感じがする。

顔部分の深度推定は自然で、目のくぼみの表現は他モデルと比較しても遜色ありません。しかし、首と顔の接続部分の深度推定が不自然であり、体全体としての一貫性にはまだ課題があります。体の厚みの表現が良い点は、知識蒸留の効果が出ている部分かもしれません。

トムとジェリー

松崎所感: ほかのモデルに比べて一番下手。トムの顔も平面的だし、トムの体と足、奥の方の手もペーパーマリオ的に出力されている。

「ペーパーマリオ的」という表現は、深度推定が連続的なグラデーションではなく、いくつかの平面に分離して見えることを意味しています。これは深度マップの値が段階的に変化している(なめらかな勾配になっていない)ことが原因と考えられます。

制限事項

このセクションでは、Distill Any Depthを使用する際の制限事項と注意点をまとめます。

モデル切り替えの問題

松崎所感: モデルの切り替えも試してみたが、モデルの指定がコードにべた書きされていて書き換えできなかった。GitHubからbaseモデルとlargeモデルの2つダウンロードできるが、ファイル名が2つとも同じである。試しにlargeモデルを避難させてからbaseモデルをlargeフォルダ内に置いてみたが、エラーが出て推定できなかった。

この問題はリポジトリの推論スクリプト(scripts/00_infer.sh)内でモデルパスがハードコードされていることに起因します。baseモデルとlargeモデルはアーキテクチャの構成が異なるため、単にファイルを置き換えるだけではパラメータの形状が合わずエラーになります。

モデル切り替えの回避策

本記事執筆時点では、以下の方法での切り替えが考えられます(未検証)。

  • scripts/00_infer.sh内のモデルパス指定を直接編集する
  • 合わせて、スクリプト内でモデルアーキテクチャの指定(base / large)が行われている箇所があれば、そちらも変更する
  • baseモデル用に別のチェックポイントフォルダ(例: checkpoint/base/)を作成し、スクリプトのパスを書き換える

ただし、現状では松崎の検証でもエラーが解消できていないため、largeモデルのみの使用を前提とするのが現実的です。

総評 -- 結論として使うべきか

このセクションでは、検証結果を総合的に評価し、Distill Any Depthの実用性について結論を述べます。

松崎所感: ほかのモデルに比べたら下手な方と思う。一番出力がうまかったのはポートレートの顔部分。とても自然に出力ができていたと思う。

他モデルとの比較における位置づけ

深度推定モデル比較で評価した4モデル(Depth Anything V2、Marigold、MoGe、Apple Depth Pro)と比較すると、Distill Any Depthは全体的な品質ではやや劣る結果となりました。特にトムジェリやバスケゴールのような被写体では「ペーパーマリオ的」な平面分離が目立ちます。

一方で、ポートレートの顔部分では自然な立体感を表現できており、被写体によって得手不得手が明確に出るモデルです。知識蒸留によって教師モデル(Depth AnythingやMarigold)の長所を統合するというコンセプトは魅力的ですが、現時点では教師モデルそのものを直接使った方がLKGでの立体視品質は高いという結果になりました。

結論

現時点でLKG向けの深度推定という用途においては、Depth Anything V2やApple Depth Proを直接使用する方が品質・利便性ともに優れています。Distill Any Depthは研究としての意義は大きいですが、実運用で採用するにはモデル切り替えの制限やセットアップの煩雑さ(conda + detectron2)も考慮する必要があります。

ただし、ポートレートの顔表現については注目に値する結果であり、人物写真に特化した用途では再検証の余地があります。また、知識蒸留ベースのモデルは今後の発展が期待される分野であるため、新バージョンのリリース時には改めて検証することを推奨します。

参考リンク


Author: 松崎 | Source: 松崎/Distill Any Depth 1aeaba435ee780a3adefdceb311e8f61.md | AI補完: 2026-03-05