[GANgealing] AIでSnowのように動画を加工する

2022年1月11日火曜日

Artificial Intelligence

本記事では、GAN-Supervised Dense Visual Alignmentと呼ばれる機械学習手法を用いて、動画にフィルターをかける方法を紹介します。

アイキャッチ

GAN-Supervised Dense Visual Alignment

概要

GAN-Supervised Dense Visual Alignmentは、識別モデルとそのGAN生成トレーニングデータをエンドツーエンドで共同で学習するためのフレームワークです。 GANgealingアルゴリズムは、空間トランスフォーマー(Spatial Transformer)をトレーニングし、非整列データでトレーニングされたGANからのランダムサンプルを共同学習されたターゲットにマッピングします。

上記説明は非常に難解に感じる方も多いかと思います。簡略化した説明としては、GANgealingアルゴリズムは下図のような非整列な画像データから平均的な画像を獲得します。

出典: https://github.com/wpeebles/gangealing

そして、上記の平均化した画像は、その他の非整列データのテンプレートとして作用します。 つまり、平均化画像に適用したフィルターは、他の画像や動画に映る対象物に対して位置を合わせながら伝搬させることができます。

上図の例でいえば猫の平均化画像を獲得し、下図のように他の猫の画像や動画に適用したフィルターを適用できます。

GAN-Supervised Dense Visual Alignmentの導入手順

セットアップ①: conda環境構築

それでは早速、開発環境にMMOCRをセットアップしていきます。
動作確認は下記の環境で行っています。

OS: Ubuntu 18.04.3 LTS
GPU: GeForce GTX 1080

なお、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。

それでは、GAN-Supervised Dense Visual Alignmentをインストールしていきます。他の機械学習環境に影響を与えないためにMinicondaの仮想環境上に構築していきます。Minicondaのインストール手順は公式ドキュメントをご参照ください。

# Proxy配下の場合は事前に下記を設定
$ export http_proxy="http://"username":"password"@proxy:port"
$ export https_proxy="http://"username":"password"@proxy:port"

# GitHubからコードをclone
$ git clone https://github.com/wpeebles/gangealing.git
$ cd gangealing
$ export PYTHONPATH=$(pwd):$PYTHONPATH
# 設定した環境変数確認
$ echo $PYTHONPATH
中略/anaconda3/envs/gangealing:

# cudaバージョン確認
$ ls /usr/local/ | grep cuda
cuda-10.2

# cuda11系は下記
$ conda env create -f environment.yml

# cuda10系は下記
$ conda env create -f environment_cu102.yml
$ conda activate gg

# torchの動作確認
$ python -c "import torch; print(torch.__version__); print(torch.cuda.is_available()); print(torch.cuda.device_count());"
1.10.1
True
2

以上で、conda環境の構築は以上です。
注意点として、必ずgangealingディレクトリ配下でPYTHONPATHを設定するようにしてください。
上記設定が抜けていると以降の処理でエラーが発生します。

平均化画像適用結果の表示(オプション)

ここでは、lsunから取得した猫の画像から生成した平均化画像をテストデータに適用した結果を表示します。
なお、動画や画像に対するフィルター適用のみ試してみたい方はこちらを飛ばしてもらっても影響はありません。

$ python prepare_data.py --input_is_lmdb --lsun_category cat --out data/lsun_cats --size 512 --max_images 10000

# 平均化したイメージの生成
$ python applications/vis_correspondence.py \
--ckpt cat \
--real_data_path data/lsun_cats \
--vis_in_stages \
--real_size 512 \
--output_resolution 512 \
--resolution 256 \
--label_path assets/masks/cat_mask.png \
--dset_indices 2363 9750 7432 1946

# RuntimeError: CUDA out of memory. Tried to allocate 50.00 MiB (GPU 0; 10.92 GiB total capacity; 9.80 GiB already allocated; 28.50 MiB free; 10.13 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF
$ python applications/vis_correspondence.py \
--ckpt cat \
--real_data_path data/lsun_cats \
--vis_in_stages \
--real_size 512 \
--output_resolution 256 \
--resolution 256 \
--label_path assets/masks/cat_mask.png \
--dset_indices 2363 9750 7432 1946

こちらの処理が完了すると以下のような動画が出力されます。
各画像の猫の顔の位置を正確に抽出していることが見て取れます。

Propagateの視覚化

一点実行時の注意点ですが、GeForce GTX 1080 Tiでは--output_resolution 512でOutOfMemoryが発生しました。
--output_resolutionで解像度を調整してください。

フィルター適用(Mixed Reality)

最後に、任意の動画にフィルターを適用してみます。
本記事では、人の顔にフィルターを適用する方法を記載します。 なお、こちらも実行時に比較的多くのGPUメモリを消費するためOut of Memoryが発生する可能性があります。 適宜入力画像や、出力解像度を下げてメモリ消費量を調整してください。

$ pwd
envs/gangealing

$ mkdir sample_data
# 下記からダウンロードしsample_dataに配置
# https://pixabay.com/ja/videos/%E5%A5%B3%E3%81%AE%E5%AD%90-%E8%8B%A5%E3%81%84%E3%81%A7%E3%81%99-%E5%A5%B3%E6%80%A7-%E3%83%9D%E3%83%BC%E3%82%BA-45132/

# videoからframe画像を生成
$ sh ./process_video.sh ./sample_data/sample_data.mp4
# data/video_frames/"mp4ファイル名"にframe画像が出力される

$ python prepare_data.py --path data/video_frames/sample_data --out data/my_video_dataset --pad center --size 1024
# data/my_video_datasetにdata.mdbとlock.mdbが出力される
# GPUメモリが11GB以下の場合は下記
$ python prepare_data.py --path data/video_frames/sample_data --out data/my_video_dataset --pad center --size 512

# 実行
$ torchrun --nproc_per_node=2 applications/mixed_reality.py --ckpt celeba --objects --label_path assets/objects/celeba/celeba_moustache.png --sigma 0.3 --opacity 1 --real_size 1024 --resolution 8192 --real_data_path data/my_video_dataset --no_flip_inference
# GPUメモリが11GB以下の場合は下記
$ torchrun --nproc_per_node=2 applications/mixed_reality.py --ckpt celeba --objects --label_path assets/objects/celeba/celeba_moustache.png --sigma 0.3 --opacity 1 --real_size 512 --resolution 2048 --real_data_path data/my_video_dataset --no_flip_inference
# visuals/video_"real_data_pathのディレクトリ名"

上記コマンドが完了すると、以下のような動画が出力されます。 動画内の顔の正確な位置にひげが付与されています。

ひげを付与した結果

--label_pathに自作のフィルターを指定すれば、異なるフィルターを適用した動画を生成することも可能です。

また、学習データを用意すれば、人や、猫のみならずその他のオブジェクトに対してもフィルターを伝搬させることができます。

まとめ

本記事では、GAN-Supervised Dense Visual Alignmentを使って、動画にSnowのフィルターのような加工を行う方法を紹介しました。
日常生活で遊びとして使っているアプリケーションにも、裏では様々な技術が使われていることが良く分かりますね。
また、技術を如何に人に使ってもらうか、についても考えさせられます。

また、本記事では、機械学習を動かすことにフォーカスしてご紹介しました。
もう少し学術的に体系立てて学びたいという方には以下の書籍などがお勧めです。ぜひご一読下さい。


また動かせるだけから理解して応用できるエンジニアの足掛かりに下記のUdemyなどもお勧めです。

参考文献

1.  論文 - GAN-Supervised Dense Visual Alignment

2. GitHub - wpeebles/gangealing

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology