見出し画像

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

下記事のつづきです。

少し複雑な合成例

DaVinci ResolveやAdobeの動画処理ソフトウェアでは当たり前のようになってきたAI背景差し替え機能をスクリプトだけで実現します。

背景除去AIはrembgを利用します。導入等は(Windowsですがやり方は同じです)下記事で説明しています。

1画像に対する処理例では、まず背景を除去します。

rembg i input.png output.png
rembgで背景を除去

背景画像と合成

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】です。


いいなと思ったら応援しよう!