今回は、フリーのAI画像高解像化ツール「Real-ESRGAN」と 「ffmpeg」を組み合わせて、動画を高解像化するツールを紹介したいと思います。
以前、「【初心者歓迎】動画⇔画像変換ツールを作ろう(ffmpegで動画から画像の切り出し&結合)」の記事で、動画から画像と音声を抽出するツールを紹介しましたが、その際に作成した VideoImageConverter クラスも使っています。
動画の高解像化はフリーのツールもたくさん存在しますが、いづれも回数制限のあるデモ版ばかりです。
「Real-ESRGAN」は、これらの有料ツールと同様のAIが搭載されおり、しかも無制限で利用できるので、興味のある方は是非この記事を参考にしてください。
自作ツールを作るためのポイントと今後公開予定の自作ツール一覧を「【実践】Pythonで事務処理向け自作ツールを作ろう!」で紹介していますので、併せてご覧ください。
動画超解像化ツールの概要
今回紹介する動画超解像化ツールは、メニューと設定の2画面構成で、次の特徴があります。
- メニュー画面と設定画面が簡単に切り替え可能です。
- 登録できるプログラム数は、メモリの許す限り無制限です。
- 登録は、タイトルとコマンドをカンマ区切りで列挙するだけの簡単仕様です。
- 設定画面に入力した内容は、画面を閉じる際に自動でjsonファイルに保存されます。
Real-ESRGAN とは
低解像度の画像を高解像度化する方法として、深層学習(ディープラーニング)を用いたESRGAN(Enhanced Super-Resolution Generative Adversarial NetworksReal-ESRGANが2018年に発表されました。Real-ESRGANは、ESRGANの進化版にあたります。
Real-ESRGAN は Pythonのモジュールとして提供され、Pythonから呼び出して利用しますが、必要なAIモデルとEXEファイルを同梱したコマンドラインツール「realesrgan-ncnn-vulkan.exe」が用意されており、だれでも無料で簡単に超解像化することができます。
動画超解像化ツールの使い方
画面項目の説明
画面項目 | 説明 |
---|---|
入力動画ファイル | 高解像化したい動画ファイルのパス |
拡大倍率 | realesr-animevideov3のみ、動画の拡大倍率を2,3,4の中から選択 これ以外のモデルの場合、4以外を選択すると画像が崩れる |
モデル | 高解像化のAIモデルを、次の3つの中から選択 ・realesr-animevideov3(アニメ動画向け) ・realesrgan-x4plus(一般動画向け) ・realesrgan-x4plus-anime (アニメ動画向け、モデルサイズが小さい) |
出力動画ファイル | 高解像化された動画の出力ファイルのパス |
高解像化の手順
高解像化したい動画ファイルを選択します。
- 拡大倍率を選択します。
- モデルを選択します。
- 出力先の動画ファイルの出力先パスを指定します。(※)
- 「高解像化を実行する」ボタンをクリックします。
(※)出力先パスはフォルダではなく、ファイル名を指定してください。
拡大倍率は最大4倍まで指定できますが、極端に解像度が低い画像を4倍にしてもあまり綺麗になりません。
モデルは実写用とアニメ用が用意されていますが、必ずしもそれが良いというわけではなく、動画によって仕上がり具合が異なりますので、必要に応じて試してください。
作業用フォルダについて
カレントディレクトリ(highresoconverter.pyが置かれているフォルダ)に tempフォルダが作成され、ここに画像と音声が格納されます。temp は自動的に削除しませんが、高画質化を実行するたびに中身が全て削除されます。
動画を画像に変換するとドライブを圧迫するため、実行時には十分な空き容量(数百GB)を確保しておいてください。
プログラムのダウンロードと動作環境の設定
事前に、Pythonのインストールが必要です。既に構築済みの方は読み飛ばしてください。詳細は下記の個別記事をご確認ください。
自作ツールのためのポータブルPython開発・実行環境を作ろう! | プログラム実行時に必要 |
WinPythonにVSCode Portable版を入れよう! | プログラム修正時に必要 |
Python 環境に下記のライブラリをインストールします。 command.bat を実行後、下記のコマンドを実行します。
pip install customtkinter
pip install tkinterdnd2
こちらのダウンロードリックをクリックすると、realesrgan-ncnn-vulkan-20220424-windows.zip がダウンロードできます。
ダウンロードしたZipを解凍し、次の4つを丸ごと high_resolutionフォルダにコピーします(デモ画像やデモ動画が同梱されているだけなので、丸ごとコピーしても構いません)。
- vcomp140.dll
- vcomp140d.dll
- realesrgan-ncnn-vulkan.exe
- models
実行方法
次の手順で実行してください。
- WinPython のインストールフォルダ内にある command.bat を実行
- ダウンロードしたプログラムファイルをコピーした場所にカレントディレクトリを移動
- Python main.py を実行
Python main.py
しばらくすると下記の画面が表示されます。入力動画ファイル、拡大倍率、モデル、出力動画ファイルを指定し、「高解像化を実行する」ボタンをクリックします。
実行すると、コマンドプロンプトに随時 FFMPEGや realesrgan-ncnn-vulkan の進捗状況が表示されます。
変換速度と画質について
一般的な有料版ツールも同様ですが、非常に時間が掛かります。
私の環境(Core-i5 13400、メモリ48GB、RTX-4070)で 15秒の動画を4倍のサイズに拡大させた時の所要時間です。
モデル | 15秒の動画の処理時間 | 元の再生時間を1とした時の倍率 |
---|---|---|
realesrgan-x4plus | 約5分 | 20倍 |
realesrgan-x4plus-anime | 約5分 | 20倍 |
realesr-animevideov3 | 1分 | 4倍 |
下記は、4倍に拡大した時の画質比較です。realesr-animevideov3はアニメに特化しているため、水彩画的な画質になってしまいました。realesrgan-x4plus は一般用なので、自然に仕上がっています。
小さなサイズだと割と綺麗に見えますが、拡大すると顔や服の細部が潰れてしまっているため、画質に対して過度の期待は禁物です。
動画超解像化ツールの仕様
プログラムの構成
main.py の中で画面の表示と「高解像化を実行する」ボタンのイベント処理を記述しています。イベント処理の中でvideoimageconverter.py と highresconverter.py を呼び出し、動画⇒画像⇒高解像化⇒動画 の順に処理しています。
モジュール名 | 役割 |
---|---|
main.py | 画面の表示とボタンクリックのイベント処理 |
highresconverter.py | 指定したフォルダの画像を高解像化する |
videoimageconverter.py | 動画⇔画像・音声の相互変換 |
create_ui.py | UI定義ファイルを読み込んで画面にウィジェットを表示 |
customtkinter | ファイル選択やフォルダ選択、ドラッグ&ドロップを実現するための補助 |
appconfig.py | 画面に入力された値をJson形式のファイルに保存/読込する |
ソースコード
main.py
UI画面の表示と「高解像化を実行する」ボタンの処理が記述されています。
import os
import sys
import shutil
sys.path.append(os.path.join(os.path. dirname(__file__), '../libs'))
from create_ui import CreateUI
from videoimageconverter import VideoImageConverter
from highresconverter import MovieHighResolition
# ボタンが押された時の処理
def func(param):
temp_folder = "./temp"
target_image = f"{temp_folder}/image"
old_image = f"{temp_folder}/old_image"
if os.path.isdir(temp_folder):
shutil.rmtree(temp_folder)
vic = VideoImageConverter(temp_folder)
vic.movie_to_image(param["input_file"])
shutil.move(target_image,old_image)
os.makedirs(target_image, exist_ok=True)
mh = MovieHighResolition()
scale = int(param["scale_combo"])
model = param["model_combo"]
mh.convert(old_image,target_image,scale,model)
vic.image_to_movie(param["output_save"])
shutil.rmtree(old_image)
# インスタンス生成
ui = CreateUI(func)
# 画面の表示
ui.show()
highresoconverter.py
このファイルには、MovieHighResolitionクラスが含まれています。MovieHighResolitionは 、realesrgan-ncnn-vulkan.exe を起動してフォルダ内の画像を高解像化するconvertメソッドが搭載されています。
メソッド | 説明 |
---|---|
__init__() | なし |
convert( input_videos, #動画入力ファイルのパス audio_file, # 置き換えるオーディオファイルパス output_video, # 出力動画ファイルパス ) | input_videos,output_videoには画像を直接指定することもできるが、フォルダを指定することで、複数画像をまとめて高解像化することが可能。 |
import subprocess
import os
class MovieHighResolition:
def convert(self, input_folder, output_folder,scale=4,model="realesrgan-x4plus"):
"""
動画のオーディオトラックを指定されたオーディオファイルで置き換えます。
Args:
input_video (str): 入力動画ファイルパス
audio_file (str): 置き換えるオーディオファイルパス
output_video (str): 出力動画ファイルパス
"""
# 入力と出力が全く同じなら、なにもしない
if input_folder != output_folder:
# ffmpegコマンドを作成
# -i: 入力画像のパス、又はフォルダ
# -o: 出力画像のパス、又はフォルダ
# -s: アップスケール比率(2,3,4のいづれか)
# -m: 事前学習済みモデルへのフォルダパス(初期値=models)
# -n: モデル名(下記4つのいづれか)
# realesr-animevideov3
# realesrgan-x4plus
# realesrgan-x4plus-anime
# -g: GPUデバイス(初期値=Auto,又はGPU番号(0,1,2・・・)
command = f'realesrgan-ncnn-vulkan.exe -i "{input_folder}" -o "{output_folder}" -n {model} -s {scale}'
subprocess.call(command, shell=True)
design.txt
title:動画高解像化ツール
mode:light
max:1024,280
size:600,280
min:600,280
input_file:入力動画ファイル,ファイル選択
{
label: 拡大倍率
scale_combo:2,3,4
label:モデル
model_combo:realesr-animevideov3,realesrgan-x4plus,realesrgan-x4plus-anime
}
output_save:出力動画ファイル,ファイル選択
exec_button:高解像化を実行する
design.txt の記述方法については、下記の記事で詳しく解説しています。
まとめ
今回は、「動画超解像化ツール」について、環境構築の手順と使い方、ソースコードを紹介しました。
AIを搭載した動画の超解像化は、無料ツールと謳っていながら、回数制限や機能制限のあるものばかりです。
しかし、コマンドラインツールである「Real-ESRGAN」と 「ffmpeg」を組み合わせると、AIを使った超解像化が実現できます。
「動画超解像化ツール」は、コマンドを入力する代わりに、画面から必要事項を入力することで、簡単に超解像化することができます。
Pythonから簡単に呼び出せるように機能別にクラス化しているので、本記事を参考にして、是非動画の高解像化に挑戦してみてください。
コメント