【中級Linux】動画にAI効果を入れるテクニックと並列処理③【rembg】
下記事のつづきです。
少し複雑な合成例
DaVinci ResolveやAdobeの動画処理ソフトウェアでは当たり前のようになってきたAI背景差し替え機能をスクリプトだけで実現します。
背景除去AIはrembgを利用します。導入等は(Windowsですがやり方は同じです)下記事で説明しています。
1画像に対する処理例では、まず背景を除去します。
rembg i input.png output.png
背景画像と合成
convert <background.png> <object.png> -gracity south -compose over output.png
この処理をすべてのフレーム画像で実行します。
並列処理
前回と同じで、AIフィルタ(背景除去)はCUDA担当なので事実上の並列化済みです。30枚程度だと一瞬で終わります。
rembg.runはrembgのラッパーコマンドで、仮想環境の有効化処理を入れたものです。rembgは「p」でフォルダ指定で一括処理ができます。
rembg.run p mov_out mov_rembg
背景画像も30枚のフレーム画像として「mov_bg」フォルダに格納します。
ffmpeg -i background.mp4 mov_bg/%04d.png
レイヤー合成作業を並列化します。
#!/bin/bash
set -eu
#作業ディレクトリに移動
cd ~/app/work
#並列処理数
num_cpus=8
#出力フォルダを作成
export out_dir=mov_out2
if [ ! -e $out_dir ]; then
mkdir $out_dir
fi
#movフォルダの画像一枚ごとに処理
export folder1=mov_bg #背景動画
export folder2=mov_rembg #AI処理動画
#並列処理する関数
composite_image()
{
local file=$1
local f=`basename $file`
#レイヤー合成
convert $folder1/$f $folder2/$f \
-gravity south \
-compose over \
-composite $out_dir/$f
}
export -f composite_image
#parallelコマンドで並列処理
find $folder1 -maxdepth 1 -type f -name "*.png" | parallel -j${num_cpus} composite_image
もちろん、30枚程度の処理であれば一瞬で終わりますが、数千、数万(ext4ファイルシステムは万のファイル数を扱えます)を処理する場合には、並列化の恩恵が効いてきます。
出力した画像を動画に戻すためにffmpegを利用します。
ffmpeg -i mov_out2/%04d.png -c:v huffyuv -an result.mkv
まとめ
一枚ごとのCPU処理を行うimagemagickを利用した動画編集は、時間がかかりすぎて現実的でないと思われがちですが、並列化する事で十分「動画処理ツール」になりえます。
特に、最近は家庭用パソコンCPUでも24〜64スレッドが当たり前になってきました。しかもフレーム画像毎に処理を行う並列化は、100%に近い並列効率を出します。場合によっては、(オーバーヘッドの多い)動画専用ソフトウェアよりも早く終わるのではと思います。
以下、関連する記事等の【PR】です。