初めに
dav2videoは1枚の静止画から深度を推定するDepth Anything V2を使って通常の2D動画へ深度画像を追加するPython用のツールです。
作成した深度付き動画は専用アプリを使って立体映像として視聴できます。
- 深度付き動画
できること
- 通常の2D動画から深度付きの動画を作成する
- RIFEを使って30fpsの動画を60fpsや120fpsにする
最終的にはVRで立体映像として視聴するので 30fpsだとカクカク感が2D映像のときより目立ってしまいます。そこでECCV2022-RIFEを使ってフレーム補完し、60fpsや120fpsの動画として仕上げます。
動作条件
- Windows10 / 11
- 4GB以上のnVIDIA製ビデオカード
- Python 3.11.4
処理速度
FullHD 30fps 1分の動画を処理するのにかかる時間は次の通りです。
設定 | GTX1050Ti 4GB |
GTX1080 8GB |
RTX4090 24GB |
備考 |
---|---|---|---|---|
fast | 137秒 | 64秒 | 34秒 | 速度優先 スモールモデル |
midle | 44分 | 12分 | 104秒 | 標準設定 ベースモデル |
slow | メモリ不足 約2時間 |
37分 | 5分 | 品質重視 ラージモデル フレーム補完あり GTX1050Tiで使うには |
ダウンロード
- dav2video1_0_0.zip
-
dav2video1_0_3.zip
解凍してできる 'dav2video'フォルダへ 以下をコピーしてください。
-
Depth-Anything-V2 一式
https://github.com/DepthAnything/Depth-Anything-V2- (1) 'Depth-Anything-V2-main'フォルダ内のファイル全部
- 同ページのPre-trained Modelsの項にある 学習データ 3つ
'checkpoints' フォルダへコピーしてください
-
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
- (6) 'train_log'フォルダ内のファイル全部
-
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を公式サイトからダウンロードしてインストールしてください。
- Windows installer (64-bit) (python-3.11.4-amd64.exe)
インストール画面ではカスタマイズを選択し Pythonへ パスを通すオプションをONにしてください。
インストールが終わったらPCを再起動します(再起動しないとパス設定が有効にならない)。
Windows PowerShellを起動してPythonが使えることを確認します。Pythonから抜けるには[Ctrl] + [Z]。
AppStoreのPythonのページが表示されるようなら パスの設定ができていません。
インストーラーで修復か再インストールしてください。
Pythonで必要なモジュール
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版が必要です。CPU版や CUDA 11版では動かない場合があります。
動かない場合は 次の様に上書きインストールしてください。
pip install --upgrade --force-reinstall torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
使い方
以下のバッチファイルへ動画をD&Dしてください。
カレントフォルダ(dav2videoのフォルダ)へ深度付き動画が作成されます。
処理中は[Shift]を押しながら[S]キーで処理中の画像を表示します。画像ウインドウを閉じれば処理を再開します。
[Shift]+[ESC]で処理を途中で終了します。音声のコピー処理を行うので終了まで少し時間がかかります。
バッチファイル | モデル | 処理 解像度 |
フレーム 補完 |
備考 |
---|---|---|---|---|
drop_here_fast.bat | vits | x1 | 無し | スモールモデルを使った 処理速度優先の設定 |
drop_here_midle.bat | vitb | x2 | 無し | ベースモデルを使って 処理解像度を上げた 標準設定 |
drop_here_slow.bat | vitl | x2 | -60 | ラージモデルを使って さらに動画を60fpsにする 品質重視設定 |
drop_here_60fps.bat | - | - | -60 | フレーム補完で60fpsの動画を作成する 深度推定は行わない |
drop_here_120fps.bat | - | - | -120 | フレーム補完で120fpsの動画を作成する 深度推定は行わない |
numpyでエラーが起こる場合はもう一度module_install.batを実行してください。
PyTorchのインストールによりnumpyのバージョンが変わってしまいエラーが起こります。
コマンドライン オプション
python dav2video.py [input_path] [opions]
input_path
入力動画のフルパス
options
オプション | 説明 |
---|---|
-d --output_dir | 処理結果を保存するフォルダを指定する 省略した場合は カレントフォルダへ出力 最後の'¥'または'/'はあってもなくてもいい 例 -d="C:/video" |
-m --model | 深度推定に使うモデルを選択する 省略した場合は vitb vits スモールモデル 早いけど精度が悪い フレーム毎のばらつきが多い お勧めしない vitb ベースモデル 精度が高い フレーム毎のばらつきが少ない bitl ラージモデル 最も精度が高い |
-t --depth_scale | 深度推定処理解像度 518x518を基本に 何倍にするかを指定します 大きいほど深度推定の精度が上がります 省略した場合は 2倍 1倍:518x518 2倍:1036x1036 3倍:1554x1554 |
-s --slow_factor | スローファクター フレーム数をn倍にし且つfpsもn倍にする 省略した場合は 1倍 1,2,4,8,16... 2のN乗のみ可 マイナスにすると目標fpsに合わせて倍率を自動設定する 例 -s -120 なら120fpsに近い倍率になるよう自動設定される |
-c --crop | 画像の端を切り取ります(画像サイズが小さくなる) 左 右 上 下 (右と下はマイナスにすると 幅と高さと解釈します) 例 -c 100 -320 200 -240 左上(100,200)から320x240の画像を切り出す |
-k --blank | 深度推定処理のときだけ端を切り取ります 左 右 上 下 (右と下はマイナスにすると 幅と高さと解釈します) クロップと異なり作成される動画の画像サイズはそのままです。 例 -k 4 4 4 4 左右上下それぞれ4画素切り取って 深度推定処理を行います。 |
-i --input_option | 入力ストリームのffmpeg オプション 例 -i="-ss 1:30:00 -to 2:10:00" 処理する時間を指定する |
-o --output_options | 出力ストリームのffmpeg オプション 例 -o="-c:v h264_nvenc -cq 26" nvencを使う |
-n --no_suffix | 作成する動画のファイル名に接尾語を付けない |
--log | ログファイルを作成する |
-r --rife_onty | フレーム補完のみ行います 深度推定は無効になります |
-a --analyze | 解析ファイルを作成する |
更新履歴
日付 | バージョン | 内容 |
---|---|---|
2025.2.11 | 1.0.0 | - 初版 |
2025.2.20 | 1.0.3 | - 深度推定後の正規化を変更 - 解析オプション追加(-a) - フレーム補完のみのオプション追加(-r) |
ヒント
処理解像度が精度に大きく影響する
とにかく精度を上げたい場合はベースモデルかラージモデルで処理解像度オプション(-t)を上げること
SD動画など低解像度の場合も 画像サイズ以上の処理解像度にすると顕著に精度が上がります。
VR動画の一部を切り出して無理やり2D動画として扱う(クロップ)
クロップオプション(-c)を使ってVR動画の一部を切り出して2D動画として扱うことができます。
python dav2video.py input_vr.mp4 -c 350 -1350 100 -1800
古いアナログ映像を扱う(ブランク)
画面の端にアナログ映像特有の不安定な箇所があると深度推定が非常に不安定になります。
クロップで切り落としてもいいですが画像サイズが変わってしまうので、
画像サイズが変わらないブランクオプション(-k)を使って下さい。
ブランクは深度推定処理を行う時だけ一時的にクロップし、深度推定以外は元の画像を使います。
デジタル映像の場合もブランクで安定する場合があります。
python dav2video.py input_analog.mp4 -k 4 4 4 4
黒帯付の動画
アナログ映像と同様、黒帯も深度推定に影響を与えるので、なるべくブランクして黒帯を取り除いてください。
出力ファイルと同じ名前のファイルがある場合
ファイル名の最後に番号を付けて保存されます。
動画の一部を処理する(処理する時間を指定する)
入力ストリームオプションでffmpegコマンドを使います。
python dav2video.py input.mp4 -i="-ss 1:30:00 -to 2:10:00"
ハードウエアエンコーダーnvencを使う
出力ストリームオプションでffmpegコマンドを使ってエンコーダーを指定できます。
python dav2video.py input.mp4 -o="-c:v h264_nvenc -cq 26"
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)。
# 1回目 深度付き動画を作る (フレーム補完はメモリ不足で一緒にできない)
python dav2video.py input.mp4 -m vitl -t2
# 2回目 フレーム補完のみを行う (--rife_ontyで深度推定を無効にする)
python dav2video.py "1回目で作った動画" --rife_onty -s -120
ちなみに FHD 30fps 1分の動画を処理するのに 1時間53分
そのあとフレーム補完で31分、計2時間24分かかった。