Real-ESRGANで動画の画質改善をしてみた

# 何をするのか
アナログテレビ時代の動画データ（アニメ）があります。
視聴に何も問題はありませんが、デジタル放送の動画と比べると、輪郭が甘かったり、全体に「ざらついた」感じがしたりします。
**遅まきながら[Real-ESRGAN](https://github.com/xinntao/Real-ESRGAN/)という、AIを利用した超解像度処理があることを知りました。**

:::note info
生きているうちにチューリングテストをクリアする人工知能が出てくるとは思っていませんでした。
最近は、AI技術の発展速度が速すぎて、話題すら追いつくことができません。
:::

Real-ESRGANの超解像度処理は、画像の大きさを縦・横4倍（標準設定で16倍の面積）に拡大してくれるとともに、輪郭を保ったまま「ノイズ」を消してくれます。
「古典画像処理」でも、輪郭を保ったままでノイズを除去する手法(画像先鋭化)があります（OpenCVに組み込まれたいます）が、Real-ESRGANのほうがきれいな結果を得ることができます。
そこで、Real-ESRGANを利用して動画データの画質を改善してみようと思います。
本稿は、画質改善したときのメモです。
* [Real-ESRGANを使った動画の画質向上の方法について](https://qiita.com/suzukiyukizi/items/55ff49d3294a7dc323b9)
* [ffmpegで連番画像から動画生成 動画から連番画像を生成 ~コマ落ちを防ぐには~](https://qiita.com/livlea/items/a94df4667c0eb37d859f)
* realesrgan-ncnn-vulkan-20220424-windows.zip の中のREADME.md

を参考にしました。

# Real-ESRGANとは
[「デノイズを強化した超解像モデル」](https://medium.com/axinc/real-esrgan-%E3%83%87%E3%83%8E%E3%82%A4%E3%82%BA%E3%82%92%E5%BC%B7%E5%8C%96%E3%81%97%E3%81%9F%E8%B6%85%E8%A7%A3%E5%83%8F%E3%83%A2%E3%83%87%E3%83%AB-91a434b3683b)だそうです。
画像を縦・横4倍に拡大する場合、面積は16倍になりますので、元の画像の15個分のピクセルを作ることになります。
「古典画像処理」では、近傍のピクセルの値を利用して、拡大画像のピクセルを作るのですが、どうしてもぼやけたものになります。
Real-ESRGANでは、ニューラルネットを利用して拡大（超解像）画像を作ります。
拡大と同時に、ノイズもなくしてくれます。
動画を1秒間に30枚の絵と考えれば、動画の画質改善もできます。
アニメに特化しているみたいですが、実写画像にも利用できるみたいです。
例えば、640x850ピクセルの画像を
<img width="640" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885787/090ae699-e570-643a-8cef-f22e6a9c5d09.jpeg">
(クリックすると、実際の大きさで表示されます）
Real-ESRGANで縦・横2倍の大きさに拡大すると、
<img width="640" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885787/989e1fc1-be53-850d-ec5c-b4cd4a0e36fd.jpeg">
ぼけることなく輪郭を保ったままで大きくし、かつ、ノイズも除去してくれています。

# 使用したPCのスペックと使用したソフトウエア
| 項目 | スペック |
|:-|:-|
| CPU  | Core-i9 13900   |
| GPU  | GeForce GTX 1660Ti RAM 6GB <br>Real-ESRGANにGPUは必須です|
| OS  | Windows11 Pro  |
| [ffmpeg](https://www.ffmpeg.org/download.html) | ffmpeg-2023-02-27-git-891ed24f77-essentials_build <br>ffmpeg.exeはデータファイルと同じディレクトリに置きます|
| [Real-ESRGAN](https://github.com/xinntao/Real-ESRGAN/) | realesrgan-ncnn-vulkan-20220424-windows.zip <br>realesrgan-ncnn-vulkanは付属ファイルがたくさんありますので、データファイルとは別のディレクトリにします|

Real-ESRGANの実行ファイルは、「**Portable Windows / Linux / MacOS executable files**」にリンクされていますので、リンクよりダウンロードします。
Portable executable filesには実行ファイルと一緒に、モデルデータも入っていますので、ほかに用意することなく試すことができます。

# 試した動画データ
| 項目 | スペック |
|:-|:-|
| ファイル名  | nanoha_op.mkv <br>2004年の作品 |
| 画像サイズ  | 1440 x 1080<br>mpeg|
| 長さ  | 1分43秒  |

<img width="540" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885787/2ed2a43d-aace-870d-7576-37e6d303d6ab.png">

（ほんとうは、ちゃんとした画像です）

:::note info
奈々様が歌うオープニング innosent starter が好きなんです。
:::

# 画質改善の手順

### 1．元の動画を静止画に分解する
~~~ bat
ffmpeg -i nanoha_op.mkv -vcodec png -s 720x540 -r 30 png0\image_%05d.png
~~~

DOS窓のコマンドラインに打ち込んで実行してください。（ffmpegは動画と同じディレクトリに入れておきます）
パラメータの中に `%05d` というのがあるので、バッチファイルでは動きません。
`-s 720x540` で、画像の大きさを縦・横１／２にしています。
元の大きさですと、超解像度処理をするときや動画に再合成するときに時間がかかります。
１／４の大きさの画像ですと、時間は短縮されますが、できあがりが良くありませんでした。
`png0`のディレクトリは、あらかじめ作っておく必要があります。

### 2．元の動画から音声を分離する
~~~ bat
ffmpeg -i nanoha_op.mkv -vn -acodec aac -b:a 128k -ac 2 -ar 48000 temp.aac
~~~
あとで、画像処理した動画に結合させます。

### 3．Real-ESRGANで、分解した画像を拡大した画像を作る
~~~ bat
realesrgan-ncnn-vulkan.exe -i "D:\ProgramTest\AI Enhance\png0" -f png -o "D:\ProgramTest\AI Enhance\png1"
~~~
`D:\ProgramTest\AI Enhance\png0` 、 `D:\ProgramTest\AI Enhance\png1` は私の環境です。
`png1`のディレクトリもあらかじめ作っておきます。
realesrgan-ncnn-vulkan.exeはデフォルトのパラメータで動かしました。
`png0`、`png1`ディレクトリはともに、SSDに作っています。

:::note
realesrgan-ncnn-vulkan.exeのオプションに
-i input-path input image path (jpg/png/webp) or **directory**
とディレクトリを指定できるようになっているのが不思議でした。
一括変換は、今回のようなときに使うのですね。
:::

### 4．拡大した画像から動画を作る
~~~ bat
ffmpeg -framerate 30 -i png1\image_%05d.png -vcodec libx264 -preset slower -tune animation -pix_fmt yuv420p -s 1280x720 -aspect 16:9 -r 30 temp.mp4
~~~
ffmpegを使って静止画像を結合して動画にします。
このとき、動画のコーデック(H264)、サイズ(1280x720)、アスペクト比(16:9)、フレームレート(30)、コンテナ(mp4)も指定します。
画質はGPU(h264_nvenc)よりも、CPU(libx264)の方が良いので、libx264を使います。

### 5．作成した動画に音声を付ける
~~~ bat
ffmpeg -i temp.mp4 -i temp.aac -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 nanoha_op_eh.mp4
~~~
先に分離しておいた音声データを結合し、動画にします。

# 画質改善結果
処理にかかった時間など。
| 処理 | 時間 | その他 |
|:-|:-|:-|
| 静止画に分解  | すぐに終了  | 3118枚の画像ができました  |
| 音声分離  | すぐに終了  |   |
| Real-ESRGAN処理  | 約4分40秒  | GPUの使用率が60%ぐらいになりました  |
| 動画再構成  | 約40秒  | CPUの使用率は100%近く  |
| 音声結合 | すぐに終了 |  |

:::note info
今回、Real-ESRGANのオプションは標準で行いました。
オプションや画像の大きさによって処理時間はかなり変わります。
:::

Real-ESRGAN処理をしているときのGPUの稼働状況です。
<img width="540" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885787/46776cd1-3433-9bb5-9602-2eff13011b9f.png">
GPUは約60%、温度は約85℃になっていました。
GPUは「3D」だけグラフが上がっています。
メモリーをもっと食うと思っていましたが意外です。
GPUのファンが大きな音を立てて回りました。
Real-ESRGAN処理をしているときのCPUの稼働状況です。
<img width="540" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885787/baf6a39d-45a5-5fd7-89c9-68e27c602e0b.png">
約15%、周波数も5GHzになっています。

できた動画はというと、
<img width="540" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885787/7afbe475-f61a-d3b3-52d1-0f5d638192a0.png">
（ほんとうは、ちゃんとした画像です）

* 輪郭がはっきりし、
* ”ぼけ”がなくなり、
* **「色を塗り直した」ような感じ** になりました。

音声もうまく合っていて、**十分満足できる品質**です。

### 使うことができるか
静止画に分解、音声分離、音声結合はすぐに終わりますが、Real-ESRGAN処理と動画再構成に、合わせて5分20秒かかっています。
もし、24分（30分番組は、オープニング、エンディング込みで正味24分です）の動画ならば、約75分かかる計算になります。
オープニングやエンディングを高画質化するのならば良いのですが、本編を高画質化することは、私の環境では、実用的ではないようです。