Python RIFE(AI)を使って滑らかな動きの動画を作成するrife_video

# はじめに
rife_videoは[ECCV2022-RIFE](https://github.com/megvii-research/ECCV2022-RIFE)を使ってフレーム補完をすることで30fpsの動画を60fpsにしたり スローモーション動画を作成するPython用のツールです。動画をドラックアンドドロップするだけで使えるようになっています。
また、別のAIモデル[Super-SloMo](https://github.com/avinashpaliwal/Super-SloMo)を使ったslomo_videoも同梱しています。どちらも同じことができますがAIモデルが異なるので処理速度やクオリティに違いがあります。

https://twitter.com/amarectv/status/1758702336388759623

# できること
- 30fpsの動画を60fps(2倍)または120fps(4倍)にする
- スローモーション動画を作成する
- 検証用サイドバイサイド動画を作成する


# 処理速度(処理時間)
処理時間はビデオカードの性能で大きく変わります。
FullHD(1920x1080) 30fps 1分の動画を 60fps(2倍)にする場合の目安は次の通りです。
||GTX1080|RTX4090|所感|
|:-|:-:|:-:|:-:|
|slomo_video|約 14分|約 2分30秒|精細感が高く良好<br>極稀に破綻する|
|rife_video (scale1.0)|約 5分|約 1分|ややぼやけた印象<br>破綻しにくい|
|rife_video (scale0.5)|約 2分|約 30秒|ややぼやけた印象<br>さらに破綻しにくい|

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


# ダウンロード
[rife_video1_0_0.zip](http://www.amarectv.com/cgi-bin/kz_dl_counter.cgi?http://www.amarectv.com/download/rife_video1_0_0.zip) を解凍してできる'rife_video'フォルダへ下記のものをコピーしてください。
全てコピーすると次のようになります。

![files.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624096/e5fd4c3f-eb95-7ff1-fe16-913fec0b4883.png)

## 共通
- ffmpeg
https://github.com/GyanD/codexffmpeg/releases/tag/2020-12-20-git-ab6a56773f
ffmpeg-2020-12-20-git-ab6a56773f-full_build.zipを解凍してできる
・ffmpeg.exe
・ffprobe.exe
- ffstream
[ffstream1_4_1.zip](http://www.amarectv.com/cgi-bin/kz_dl_counter.cgi?http://www.amarectv.com/download/ffstream1_4_1.zip)を解凍してできる
・'ffstream'フォルダ



## rife_video
- ECCV2022-RIFE 一式
https://github.com/megvii-research/ECCV2022-RIFE
ECCV2022-RIFE-main.zipを解凍してできる
・'ECCV2022-RIFE-main'フォルダ
- 学習データ
同ページのInstallationの項にある「Download the pretrained HD models from here.」から
RIFE_trained_model_v3.6.zipを解凍してできる
・'train_log'フォルダ


## slomo_video
- Super-SloMo 一式
https://github.com/avinashpaliwal/Super-SloMo
Super-SloMo-master.zipを解凍してできる
・'Super-SloMo-master'フォルダ
- 学習データ
同ページのPretrained modelの項にある「You can download the pretrained model trained on adobe240fps dataset here.」から
・SuperSloMo.ckpt







# Pythonのインストール
このツールはPython用のスクリプトになっていますので、Pythonを公式サイトからダウンロードしてインストールしてください。

https://www.python.org/

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
tqdm==4.66.1
Pillow==9.3.0
numpy==1.26.4
#torch==2.2.0.dev20230915+cu121
#torchvision==0.17.0.dev20230915+cu121

```
同梱のmodule_install.batで一括インストールできます。

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

# 使い方
以下のバッチファイルへ動画をD&Dしてください。
カレントフォルダ（rife_videoのフォルダ）へfpsを2倍または4倍にした動画が作成されます。

- drop_here_rife_x2.bat
fpsを2倍にする
- drop_here_rife_x4.bat
fpsを4倍にする
- drop_here_rife_sbs.bat
入力画像と補完画像を左右に並べたスロー動画を作成


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

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

## options
|オプション|説明|
|:--------------|:-|
|-d --output_dir|処理結果を保存するフォルダを指定する<br>省略した場合は カレントフォルダへ出力 最後の'￥'または'/'は<br>あってもなくてもいい<br>例 -d="C:/video"|
|-s --slow_factor|スローファクター<br>フレーム数をn倍にし且つfpsもn倍にする<br>省略した場合は 2倍<br>rifeでは2,4,8,16... 2のn乗のみ可<br>slomoは3や5も可<br>マイナスにすると目標fpsに合わせて倍率を自動設定する<br>例 -s -120 なら120fpsに近い倍率になるよう自動設定される
|-f --fps_ratio|作成する動画のfpsを元動画のfpsのn倍にする<br>0.5や 1.5など実数も可<br>このオプションを使うと音声はコピーされない<br>省略した場合はslow_factorの倍率が適用される<br>例 -s 4 -f 2 フレーム数を4倍 fpsは2倍にする|
|-a --scale|画像を縮小して処理を早くする<br>rife専用<br>省略した場合は 0.5|
|-i --input_option|入力ストリームのffmpeg オプション<br>例 -i="-ss 1:30:00 -to 2:10:00" 処理する時間を指定する|
|-o --output_options|出力ストリームのffmpeg オプション<br>例 -o="-c:v h264_nvenc -cq 26" nvencを使う|
|-n --no_suffix|作成する動画のファイル名に接尾語を付けない|
|--log|ログファイルを作成する|
|--sbs|入力画像と補完画像を左右に並べた動画を作成する|
|--fp16|実数演算にfloat16を使う<br>少し早くなるかわりにクオリティ（画質）が低下する<br>rife専用|

## 補足
### 30fpsの動画と60fpsの動画がある場合に いずれも120fpsにしたい
通常は--slow_factorを使って-s 4と-s 2のように異なるオプションを指定しますが、-s -120(マイナスの場合は目標fpsとみなされる)とすると いずれも120fpsにすることができます。
```PowerShell:30fpsまたは60fpsの動画を120fpsにする
python rife_video.py input.mp4 --slow_factor -120
```
:::note alert
24fpsの動画を120fpsにするにはslomo_video.pyで--slow_factorを5にしてください
:::


### スローモーション動画を作成する
--slow_factorで補完フレームを多めに指定した後 '--fps_ratio'を1.0等 小さめにして調整します。

```PowerShell:8倍スローモーション
python rife_video.py input.mp4 --slow_factor 16 --fps_ratio 2
```

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

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

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

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

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

※ nvencはビデオカードが対応している必要があります。
※ （大抵の場合）処理のボトルネックはAI部分なので エンコーダーを早いものに変えても処理時間を早くする効果は得られません。