ディープラーニングで人物画像の背景を好きな画像に変える

スポンサーリンク
ディープラーニング
スポンサーリンク

今回は、セグメンテーションで人物と背景を分けて、背景を任意の画像に置き換える方法を解説します。

スポンサーリンク

手順

これから行う大まかな流れを下の図に表しました。

Step1:元画像の人物と背景をセグメンテーションで分ける(マスク画像)

Step2:元の画像とマスク画像を用いて、背景を黒に塗りつぶした画像を作る

Step3:入れたい背景画像とマスク画像を用いて、人物の位置が切り取られた画像を作る

Step4Step2Step3の画像をピクセルごとに足し合わせる

Step1:人物と背景のセグメンテーション

MobileUnetで人物と背景のセグメンテーションをします。MobileUnetはUnetにMobilenetを組み合わせることで、計算の高速化を目指したモデルです。

出力は人物部分のピクセルが1、背景部分のピクセルが0になります。そのため、画像で見てみると、人物部分が白で背景が黒のマスク画像が出力されることになります。

参考にしたサイトはこちらです。MobileUnetを用いて、人物と背景のセグメンテーションをしています。

Background Removal in Real-Time Video Chats using TensorflowJS

こちらのサイトからGithubに移動できるので、公開されているデータセットとjupyter notebookのコードで学習させてみてください。

Step2:元画像の背景を黒で塗りつぶす

上で述べたように、出力は人物部分が1、背景部分が0になっています。

したがって、元画像と出力画像を掛け算することで、元画像の背景が黒に塗りつぶされた画像が出力されます。

pythonで書くと次のようになります。

Step3::背景画像の処理

続いて、背景画像の処理に移ります。考え方はStep2と同じですが、背景画像では、人物以外の部分を残したいので、出力の0と1を入れ替える必要があります。そのため、出力の全てのピクセルを1で引いて絶対値を取ります。

これを、背景に挿入したい画像と掛け合わせます。

pythonで書くと次のようになります。

Step4:Step2とStep3の画像を足し合わせる

最後にStep2とStep3で得られた画像を足し合わせると完成です。

もう少し工夫すると背景削除にも使えそうです。

タイトルとURLをコピーしました