見出し画像

【中級Linux】動画にAI効果を入れるテクニックと並列処理①【Imagemagick】

はじめに

動画ファイルにAI効果・フィルタを入れる場合、通常は対応している動画ソフトウェアやComfyUI等のフレームワークを利用する必要があります。

つまり、それらに対応していないAI処理の場合は、動画のAI効果として利用できません。

この記事では、画像1枚に対してAI処理を行えるコマンドの仕組みがある場合に、動画にも応用できるやり方を紹介します。

環境

Linuxを利用します。WSLでも可能です。利用するコマンドは以下になります。

  • bashシェル

    • Linuxのデフォルトシェルです

  • ffmpeg

    • sudo apt install ffmpeg

    • 有名な動画変換フリーソフトHandbrakeにも利用されている変換エンジンです。ここでは動画を各フレーム画像に変換する処理に利用します。変換後のフレーム画像を動画に戻す処理にも利用します。

  • convert or magick(Imagemagick)

    • sudo apt install imagemagick

    • 画像処理をコマンドラインで実行できます

  • parallel(並列化コマンド)

    • sudo apt install parallel

    • コマンドを並列実行します

  • 適用したいAIコマンド

    • GFPGANやrembg等が利用できる環境が必要です

GFPGANやrembgの導入は下記事で紹介しています。Windowsの記事ですが同じコマンドです。

並列処理の仕組みはカーネルとしてのLinuxやwslが必要です。つまりプロセス管理の仕組みが異なるWindowsのbash(cygwinやgitbash)では実現できません。

動画にGPFGANを適用

例として、短い動画にGFPGANを適用します。ただし、100%適用すると効果が強くなりすぎるので、50%(画像の平均)にします。

convert -average 処理を行う

ffmpegコマンドを利用して動画すべてのフレームを書き出す

ffmpeg -i input.mp4 mov/%04d.png
movフォルダに全フレームが書き出されます

GFPGANを適用する

GFPGAN(Generative Facial Prior GAN)とは、AI技術で画像の顔部分を修復するためのモデルです。特に低解像度や劣化した顔画像を高品質に復元する事ができます。

※ 動画ファイルが「~/app/work/mov」にあるとします。コマンドが長いので、ファイルにまとめるか、ラッパーコマンドにする方が良いです。

GFPGANリポジトリに用意されているinference例のコマンド(inference_gfpgan.py)をそのまま利用します。フォルダを指定できるので、フォルダ内の画像ファイル全てを処理し、指定フォルダへ出力します。

# Anaconda gfpgan仮想環境に入る
. ~/anaconda3/etc/profile.d/conda.sh
conda activate gfpgan
cd ~/app/gfpgan/GFPGAN

# GFPGAN実行
python ~/app/gfpgan/GFPGAN/inference_gfpgan.py -i ~/app/work/mov \
	       -o ~/app/work/results-gfpgan \
	       -v 1.4 \
	       -s 2 \
	       --ext png
restored_imgsに2倍にアップスケールされたすべてのファイルが保存されます

convertコマンドで画像平均をとる

imagemagickのコマンドですが、画像平均をとる場合は、下記コマンドで実現できます。

convert -average img1.png img2.png out.png

ただし、同じサイズである必要があるため、先にリサイズ機能も利用します。

convert -resize 512 img.png out.png

これらの処理をまとめると、次のシェルスクリプトになります。

#!/bin/bash
set -eu

#作業ディレクトリに移動
cd ~/app/work

#出力フォルダを作成
out_dir=mov_out
if [ ! -e $out_dir ]; then
    mkdir $out_dir
fi

#movフォルダの画像一枚ごとに処理
folder1=mov #元動画
folder2=results-gfpgan/restored_imgs #AI処理動画
for file in ${folder1}/*.png
do
    f=`basename $file`
    echo $f

    #画像サイズを統一する
    convert -resize 512 $folder1/$f tmp1.png
    convert -resize 512 $folder2/$f tmp2.png

    #画像平均をとる
    convert -average tmp1.png tmp2.png $out_dir/$f
done

ffmpegコマンドを利用してフレーム画像から動画に戻す

ffmpeg -r 15 -i mov_out/$04d.png -c:v huffyuv -an out.mkv

フレームレートは15、動画コーデックは可逆圧縮のhuffyuv、音声なしで動画を作成します。

以上で、GFPGANの適用方法は終了です。しかし、今回は30フレーム程度の動画ですぐに終了しますが、通常は1分程度のショート動画でも1800〜3600フレームを処理する必要があります。高速化方法としての並列処理の方法を次回の②にて紹介します。

以下、関連する【PR】です。


この記事が気に入ったらサポートをしてみませんか?