Depth Anything (AI)を使って 深度付き動画を作成する dav2video

# 初めに
dav2videoは1枚の静止画から深度を推定する[Depth Anything V2](https://github.com/DepthAnything/Depth-Anything-V2)を使って通常の2D動画へ深度画像を追加するPython用のツールです。
作成した深度付き動画は次のアプリで立体映像として視聴できます。


|視聴用アプリ|対応機種|備考|
|-|-|-|
|[Depth Video Player VR](https://qiita.com/amaman/items/03393c91e0314bbe2be1)|Windows<br>OpenXR|簡易デプスプレイヤー<br>簡単に使えるけど本格的な機能はない
|[アマレコVR](http://amalabo.blog35.fc2.com/blog-entry-432.html)|Meta Quest|上級者向けメディアプレイヤー|

## 深度付き動画例（デプス動画）
![depth_sample1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624096/0246271b-445b-4fd0-ba08-8047b14e2e79.png)
![depth_sample2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624096/3f8e77fd-32f9-457b-8a9f-78ca5faa4ad6.png)
- [深度付きサンプル動画 第一弾](http://www.amarectv.com/cgi-bin/kz_dl_counter.cgi?http://www.amarectv.com/download/depth_sample.zip)
- [深度付きサンプル動画 第二弾](http://www.amarectv.com/cgi-bin/kz_dl_counter.cgi?http://www.amarectv.com/download/depth_sample2.zip)

# できること
- 通常の2D動画から深度付きの動画を作成する
- RIFEを使って30fpsの動画を60fpsや120fpsにする

最終的にはVRで立体映像として視聴するので 30fpsだとカクカク感が2D映像のときより目立ってしまいます。そこで[ECCV2022-RIFE](https://github.com/hzwer/ECCV2022-RIFE)を使ってフレーム補完し、60fpsや120fpsの動画として仕上げます。



# 動作条件
- Windows10 / 11 64bit
- 4GB以上のnVIDIA製ビデオカード
- Python 3.11.4


# 処理速度

FullHD 30fps 1分の動画を処理するのにかかる時間は次の通りです。
|設定|GTX1050Ti<br>4GB|GTX1080<br>8GB|RTX4090<br>24GB|備考|
|-|-|-|-|-|
|fast|137秒|64秒|34秒|速度優先<br>スモールモデル|
midle|44分|12分|104秒|標準設定<br>ベースモデル|
slow|メモリ不足<br>約2時間|37分|5分|品質重視<br>ラージモデル フレーム補完あり<br>[GTX1050Tiで使うには](#geforce-gtx1050ti-4gbで使うには)|





# ダウンロード
- [dav2video1_1_1.zip](http://www.amarectv.com/cgi-bin/kz_dl_counter.cgi?http://www.amarectv.com/download/dav2video1_1_1.zip)
解凍してできる 'dav2video'フォルダへ 以下をコピーしてください。

![file.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624096/7972ecd8-0b47-1990-9a58-4885016b5ca3.png)


- Depth-Anything-V2 一式
https://github.com/DepthAnything/Depth-Anything-V2
  - (1) 'Depth-Anything-V2-main'フォルダ内のファイル全部
  - 同ページのPre-trained Modelsの項にある 学習データ 3つ
    'checkpoints' フォルダへコピーしてください
    - (2) [depth_anything_v2_vits.pth](https://huggingface.co/depth-anything/Depth-Anything-V2-Small/resolve/main/depth_anything_v2_vits.pth?download=true)
    - (3) [depth_anything_v2_vitb.pth](https://huggingface.co/depth-anything/Depth-Anything-V2-Base/resolve/main/depth_anything_v2_vitb.pth?download=true)
    - (4) [depth_anything_v2_vitl.pth]()
		

- ECCV2022-RIFE 一式
https://github.com/megvii-research/ECCV2022-RIFE
  - (5) 'ECCV2022-RIFE-main'フォルダ内のファイル全部
  - 同ページのInstallationの項にある 学習データ
    - (6) 'train_log'フォルダ内のファイル全部
		https://drive.google.com/file/d/1APIzVeI-4ZZCEuIRE1m6WYfSCaOsi_7_/view?usp=sharing

- ffmpeg
  https://github.com/GyanD/codexffmpeg/releases/tag/2020-12-20-git-ab6a56773f
  ffmpeg-2020-12-20-git-ab6a56773f-full_build.zipを解凍してできる
  - (7) ffmpeg.exe
  - (8) ffprobe.exe


# Pythonのインストール
このツールはPython用のスクリプトになっています。[Pythonを公式サイト](https://www.python.org/)からダウンロード およびインストールしてください。




- [Windows installer (64-bit)](https://www.python.org/downloads/release/python-3114/) (python-3.11.4-amd64.exe)



インストール画面ではカスタマイズを選択し Pythonへ パスを通すオプションをONにしてください。

<img width="120" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624096/e188ec98-2de1-0516-d855-b0cb400bd3d8.png"> <img width="120" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624096/8c9449d0-9a62-4178-5401-656c53ff4d5d.png">
インストールが終わったらPCを再起動します（再起動しないとパス設定が有効にならない）。


Windows PowerShellを起動してPythonが使えることを確認します。Pythonから抜けるには[Ctrl] + [Z]。
![power_python.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624096/2c6c185d-cadb-4305-9358-de9c94c67040.png)


AppStoreのPythonのページが表示されるようなら パスの設定ができていません。
インストーラーで修復か再インストールしてください。



# Pythonで必要なモジュール
```python:requirements.txt
ffmpeg-python==0.2.0
keyboard==0.13.5
numpy==1.26.4
tqdm==4.66.1
opencv-contrib-python==4.8.0.76
Pillow==9.3.0
```
同梱のmodule_install.batで一括インストールできます。

また、[PyTorchのCUDA 12版](https://pytorch.org/)が必要です。CPU版や CUDA 11版では動かない場合があります。
動かない場合は 次の様に上書きインストールしてください。
```python
pip install --upgrade --force-reinstall torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
```





# 使い方
以下のバッチファイルへ動画を`D&D`してください。
カレントフォルダ（dav2videoのフォルダ）へ深度付き動画が作成されます。

処理中は`[Shift]`を押しながら`[S]`キーで処理中の画像を表示します。画像ウインドウを閉じれば処理を再開します。
`[Shift]`＋`[ESC]`で処理を途中で終了します。音声のコピー処理を行うので終了まで少し時間がかかります。

|バッチファイル|モデル|処理<br>解像度|フレーム<br>補完|備考|
|-|-|-|-|-|
|drop_here_fast.bat|vits|x1|無し|スモールモデルを使った<br>処理速度優先の設定|
|drop_here_midle.bat|vitb|x2|無し|ベースモデルを使って<br>処理解像度を上げた<br>標準設定|
|drop_here_slow.bat|vitl|x2|-60|ラージモデルを使って<br>さらに動画を60fpsにする<br>品質重視設定|
|drop_here_slow_4GB.bat|vitl|x2|無し|4GB用の高品質設定<br>2倍速で処理する|
|drop_here_60fps.bat|-|-|-60|フレーム補完で60fpsの動画を作成する<br>深度推定は行わない|
|drop_here_120fps.bat|-|-|-120|フレーム補完で120fpsの動画を作成する<br>深度推定は行わない|


:::note alert
numpyでエラーが起こる場合はもう一度module_install.batを実行してください。
PyTorchのインストールによりnumpyのバージョンが変わってしまいエラーが起こります。
:::

# コマンドライン オプション
```PowerShell:書式
python dav2video.py [input_path] [opions]
```

## input_path
入力動画のフルパス

## options
|オプション|説明|
|-|-|
|-d<br>--output_dir|処理結果を保存するフォルダを指定する<br>省略した場合は カレントフォルダへ出力<br>最後の'￥'または'/'はあってもなくてもいい<br>例 -d="C:/video"|
|-m<br>--model|深度推定に使うモデルを選択する<br>省略した場合は vitb<br>例 -m vitl<br><br>vits:スモールモデル<br>早いけど精度が悪い フレーム毎のばらつきが多い<br>**お勧めしない**<br><br>vitb:ベースモデル<br>精度が高い フレーム毎のばらつきが少ない<br><br>vitl:ラージモデル<br>最も精度が高い|
|-t<br>--depth_scale|深度推定処理解像度<br>518x518を基本に 何倍にするかを指定します<br>大きいほど深度推定の精度が上がります<br>省略した場合は 2倍<br>例 -t 2<br><br>1倍:518x518<br>2倍:1036x1036<br>3倍:1554x1554|
|-s<br>--slow_factor|スローファクター<br>フレーム数をn倍にし且つfpsもn倍にする<br>省略した場合は 1倍<br>1,2,4,8,16... 2のN乗のみ可<br>マイナスにすると目標fpsに合わせて倍率を自動設定する<br>例 -s -120<br>120fpsに近い倍率になるよう自動設定される|
|-c<br>--crop|クロップ<br>画像の端を切り取ります(画像サイズが小さくなる)<br>左 右 上 下 （右と下はマイナスにすると 幅と高さと解釈します）<br>例 -c 100 -320 200 -240<br>左上(100,200)から320x240の画像を切り出す|
|-k<br>--blank|ブランク<br>深度推定処理のときだけ端を切り取ります<br>左 右 上 下 （右と下はマイナスにすると 幅と高さと解釈します）<br>クロップと異なり作成される動画の画像サイズはそのままです。<br>例 -k 4 4 4 4<br>左右上下それぞれ4画素切り取って 深度推定処理を行います。|
|-i<br>--input_option|入力ストリームのffmpeg オプション<br>例 -i="-ss 1:30:00 -to 2:10:00" 処理する時間を指定する|
|-o<br>--output_options|出力ストリームのffmpeg オプション<br>例 -o="-c:v h264_nvenc -cq 26" nvencを使う|
|-n<br>--no_suffix|作成する動画のファイル名に接尾語を付けない|
|--log|ログファイルを作成する|
|-r<br>--rife_only|フレーム補完のみ行います 深度推定は無効になります|
|-a<br>--analyze|解析ファイルを作成する|
|-b<br>--buffering|バッファリング<br>画像をビデオメモリへ貯め込んで処理します。<br>これにより突発的な深度値の変化に対応できず つぶれてしまうケースを改善します。<br>（将来どうなるか分かるので対処できる）<br>また、30フレーム以下の場合はレンジを常に5％多くなるよう設定します。<br><br>バッファリングはビデオメモリを大量に消費します。<br>ビデオメモリが足りない状態で使うと ものすごく遅くなりますので注意してください。<br>省略した場合は60フレームで8GBのビデオカードを想定しています。<br><br>8GB未満の場合は バッファ数を下記の通り下げてください。<br>4GB -b 3:ほとんどバッファリングできないので効果は無い<br>6GB -b 30:効果中 レンジを5％多めにとる<br>8GB -b 60から90:効果大 レンジを多めにとることなく効率よく殆ど対処できる|
|-x<br>--frame_skip|フレームスキップ（倍速）<br>深度推定をnフレーム毎に行い、飛ばしたフレームはRIFEで補完します。<br>深度推定よりRIFEの方が早い場合に処理時間を短縮できます。<br>省略した場合は 1倍（スキップしない）<br>1,2,4,8,16... 2のN乗のみ可<br>マイナスにするとfpsに合わせて倍率を自動設定する<br><br>例 -x 4<br>4倍を指定すると 4フレーム毎に深度推定し 間の3フレームを補完します。<br><br>例 -x -30<br>30fps以下の動画の場合 1倍（スキップしない）になります。<br>60fpsの動画の場合 2倍で動作します。<br><br>処理時間を懸念してクォリティを落とすより、クォリティを上げて倍速を使った方が同じ処理時間で良い結果が得られます。<br><br>ただしデメリットとして動画の画像と補完した深度画像の位置が僅かにズレる場合があります。<br>位置がズレると立体映像として視聴した際に、被写体の輪郭に背景が少し表示されたり、輪郭の段差が目立つようになります。2倍は殆どズレない、4倍からよく見るとズレを認識できる場面がある。|

# 更新履歴
|日付|バージョン|内容|
|-|-|-|
|2025.2.11|1.0.0<br>[ダウンロード](http://www.amarectv.com/cgi-bin/kz_dl_counter.cgi?http://www.amarectv.com/download/dav2video1_0_0.zip)|- 初版|
|2025.2.20|1.0.3<br>[ダウンロード](http://www.amarectv.com/cgi-bin/kz_dl_counter.cgi?http://www.amarectv.com/download/dav2video1_0_3.zip)|- 深度推定後の正規化を変更<br>- 解析オプション追加(-a)<br>- フレーム補完のみのオプション追加(-r)|
|2025.4.17|1.1.1<br>[ダウンロード](http://www.amarectv.com/cgi-bin/kz_dl_counter.cgi?http://www.amarectv.com/download/dav2video1_1_1.zip)|- バッファリングにより<br>レンジオーバーを改善<br>- バッファリング オプション追加(-b)<br>- 倍速オプション追加(-x)<br>- --rife_ontyオプションを --rife_onlyに修正|
# ヒント
## 処理解像度が精度に大きく影響する
とにかく精度を上げたい場合はベースモデルかラージモデルで処理解像度オプション(-t)を上げること
SD動画など低解像度の場合も 画像サイズ以上の処理解像度にすると顕著に精度が上がります。

## 深度付きVR動画を作成する（暫定版）
サイド バイ サイドのVR動画の右側をまるごとクロップ(-c)して取り除くことで 簡易的に深度付きのVR動画を作成することができます。
また、バッファリング(-b)が標準の60フレームだと12GB程度のビデオメモリを必要とします。
8GBのビデオカードの場合はバッファ数を20以下に下げる必要があります。
最初は倍速オプション(-x)を使って処理を早めて多くの動画を試すことをお勧めします。

VR動画の画像サイズが4096x2048の場合は次のようになります。
```PowerShell:4096x2048のVR動画の場合
python dav2video.py input_vr.mp4 -c 0 2048 0 0 -x 4
```
※ ビデオメモリ容量の関係で8GB未満のビデオカードではVR動画の処理は無理と思われます


## 古いアナログ映像を扱う（ブランク）
画面の端にアナログ映像特有の不安定な箇所があると深度推定が非常に不安定になります。
クロップで切り落としてもいいですが画像サイズが変わってしまうので、
画像サイズが変わらないブランクオプション(-k)を使って下さい。
ブランクは深度推定処理を行う時だけ一時的にクロップし、深度推定以外は元の画像を使います。
**デジタル映像の場合もブランクで安定する場合があります**。

```PowerShell:古い映像の端を4画素ブランクして 安定させる
python dav2video.py input_analog.mp4 -k 4 4 4 4
```

## 黒帯付の動画
アナログ映像と同様、黒帯も深度推定に影響を与えるので、なるべくブランクして黒帯を取り除いてください。

## 出力ファイルと同じ名前のファイルがある場合
ファイル名の最後に番号を付けて保存されます。

## 動画の一部を処理する（処理する時間を指定する）
入力ストリームオプションでffmpegコマンドを使います。

```PowerShell:1時間30分から2時間10分までを処理する場合
python dav2video.py input.mp4 -i="-ss 1:30:00 -to 2:10:00"
```

## ハードウエアエンコーダーnvencを使う
出力ストリームオプションでffmpegコマンドを使ってエンコーダーを指定できます。

```PowerShell:h264 画質26の場合
python dav2video.py input.mp4 -o="-c:v h264_nvenc -cq 26"
```
```PowerShell:h265 画質30の場合
python dav2video.py input.mp4 -o="-c:v hevc_nvenc -g 30 -cq 30"
```

## GeForce GTX1050Ti 4GBで使うには
深度推定のみならラージモデルもギリギリ動作する。
しかし、一緒にフレーム補完までするとビデオメモリ不足で動かない。
最初に深度付き動画を作って、出来上がった深度付き動画を フレーム補完のみオプション(-r --rife_onty)を付けてもう一度処理することで深度付きの滑らかな動画を作成できる（drop_here_120fps.bat へドロップしてもOK）。

```PowerShell:GeForce GTX1050Ti 4GBの場合
# 1回目 深度付き動画を作る （フレーム補完はメモリ不足で一緒にできない）
python dav2video.py input.mp4 -m vitl -t 2

# 2回目 フレーム補完のみを行う （--rife_ontyで深度推定を無効にする）
python dav2video.py "1回目で作った動画" --rife_onty -s -120
```

ちなみに FHD 30fps 1分の動画を処理するのに 1時間53分
そのあとフレーム補完で31分、計2時間24分かかった。