今回は、PaddleSegによるセグメンテーションの実装方法を紹介します。
人物の切り抜きを行い、背景を置換した動画を作成してみましょう。
Google colabを使用して簡単にセグメンテーションを実装することができますので、ぜひ最後までご覧ください。
今回の内容
・PaddleSegの概要
・画像セグメンテーションの実装
・人物の切り抜きと背景置換動画を作成
PaddleSegとは
PaddleSegは2020年5月に公開された、画像セグメンテーションの高効率開発ツールキットです。
PaddlePaddle (Baidu) によって開発されました。
セグメンテーションモデルの設計、モデルのトレーニング、パフォーマンスの最適化などプロセス全体における支援を提供しており、CityscapesデータセットではSoTAを達成しています。
最先端のセグメンテーションテクノロジーと組み合わせて、80以上の高品質モデルをサポートしています。
PaddleSegの導入
それでは早速、PaddleSegの準備をしていきましょう。
ここからはGoogle colabを使用していきます。
from google.colab import drive
drive.mount('/content/drive')
%cd ./drive/MyDrive
PaddlePaddleをインストールします。
!python -m pip install paddlepaddle-gpu==2.2.1.post101 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html
PaddlePaddleが正常にインストールされたことを確認します。
import paddle
paddle.utils.run_check()
!python -c "import paddle; print(paddle.__version__)"
次にPaddleSegをインストールします。
!pip install paddleseg
必要なライブラリをインストールします。
!git clone https://github.com/PaddlePaddle/PaddleSeg
cd PaddleSeg
pip install -r requirements.txt
以上で準備が完了しました。
PaddleSegのチュートリアル
実際にチュートリアルでセグメンテーションを行なってみます。
!python predict.py \
--config configs/quick_start/bisenet_optic_disc_512x512_1k.yml \
--model_path https://bj.bcebos.com/paddleseg/dygraph/optic_disc/bisenet_optic_disc_512x512_1k/model.pdparams\
--image_path docs/images/optic_test_image.jpg \
--save_dir output/result
実行してエラーが出ていないようであれば、無事に準備ができています。
このテスト結果の画像は「PaddleSeg/output/result」に保存されています。
興味がある方は確認してみてください。
PP-HumanSegとは
ここからはPP-HumanSegについて紹介します。
PP-HumanSegは、大規模な人間データでトレーニングされた人間を対象としたセグメンテーションモデルです。
軽量なモデルから高精度なモデルまで用意されており、さまざまなシーンで使用することができます。
ここからは3つのモデルについて紹介します。
表:各モデルのパフォーマンス
Model | Input Size | FLOPS | Parameters | Latency | Model Size |
PP-HumanSeg-Server | 512×512 | 114G | 26.8M | 37.96ms | 103Mb |
PP-HumanSeg-Mobile | 192×192 | 584M | 1.54M | 13.17ms | 5.9Mb |
PP-HumanSeg-Lite | 192×192 | 121M | 137K | 10.51ms | 543Kb |
PP-HumanSegの実装
ここからはPP-HumanSegを実装していきます。
まずはモデルとテストデータをダウンロードします。
%cd contrib/PP-HumanSeg
!python export_model/download_export_model.py
!python data/download_data.py
ここからは、人物の切り抜きを行い、背景を置換していきます。
まずは動画を用意して、人物のみの切り抜きをしてみましょう。
今回はフリー動画を使用します。
この動画から背景を削除して、人物のみの切り抜きをします。
上の動画をダウンロードして、「input_video.mp4」と名前を変更します。
変更が終わったら、「PaddleSeg/contrib/PP-HumanSeg/data」に配置します。
!python bg_replace.py --config export_model/deeplabv3p_resnet50_os8_humanseg_512x512_100k_with_softmax/deploy.yaml --video_path data/input_video.mp4
結果は「
PaddleSeg/contrib/PP-HumanSeg/output」に出力されます。
出力された動画は以下のようになります。
結果を実際に見てみると、背景が削除され、人物のみの切り抜きができています。
PP-HumanSegによる背景置換(動画+背景静止画)
先ほどの動画と静止画の背景を組み合わせます。
ここでは上の画像を使用します。
!python bg_replace.py --config export_model/deeplabv3p_resnet50_os8_humanseg_512x512_100k_with_softmax/deploy.yaml --input_shape 224 398 --video_path data/input_video.mp4 --bg_img_path data/background_sea.jpg
#--video_path メインとなる人物の動画
#--bg_img_path 背景の画像(または動画)
先ほど切り抜いた動画と背景をうまく重ね合わせることができました。
今回は人物(動画)と背景(静止画)を組み合わせました。
この他にも「人物(静止画)+ 背景(静止画)」や「人物(動画)+ 背景(動画)」といった組み合わせも可能です。
興味のある方は試してみてください。
組み合わせ別のコードを以下にまとめます。
#人物(静止画)と背景(静止画)
!python bg_replace.py --config export_model/deeplabv3p_resnet50_os8_humanseg_512x512_100k_with_softmax/deploy.yaml --input_shape 224 398 --img_path ***.jpg --bg_img_path ***.jpg
#--img_path メインとなる人物の画像
#--bg_img_path 背景の画像
#人物(動画)と背景(動画)
!python bg_replace.py --config export_model/deeplabv3p_resnet50_os8_humanseg_512x512_100k_with_softmax/deploy.yaml --input_shape 224 398 --video_path ***.mp4 --bg_video_path ***.mp4
#--video_path メインとなる人物の動画
#--bg_video_path 背景の動画
(参考)人物(動画)と背景(動画)の組み合わせの場合の動画です。
まとめ
今回は、画像セグメンテーションの実装とPaddleSegを使った人物の切り抜きと背景置換動画を作成の方法を紹介しました。
背景を置換する手法は近年増えているリモート会議などで活用されている技術となります。
実際に自分の手で実装してみることで、理解が深まったかと思います。
PaddleSegを使ったセグメンテーションにはいくつも種類がありますので、ぜひ他の記事もご覧ください。