少し前に話題になった「remove.bg」という背景を削除してくれるサービスを使ってみました。その精度の高さに感銘をうけ、興味を持ったため自分でも試してみました。コードはすべてこちらの記事に載せています。
remove.bgとは
Semantic Segmentation
このサービスを使ってみて、まず最初に思いついたのがセグメンテーションの利用です。なのでtorchvisionのDeepLabv3でサクッと試してみました。以下がその結果です。
ある程度上手くいっていますが毛の一本一本を抽出することはできていないようです。
セグメンテーションで背景削除ができない原因としては
・ 毛の一本一本に注目してもlossはそんなに変わらない
・そもそもデータセットのターゲット画像が大雑把
・bilinear interpolation でupsamplingしている
という点があると考えられます。
セグメンテーションと細かな背景削除では目的が違うため上手くいかないのは当然でした、、、
Image Matting
セグメンテーションが上手くいかなかったため、他の策を調べていると「Image Matting」というタスクがあることが分かりました。Image Mattingは画像やビデオから前景を抽出するタスクです。
画像処理範囲
Image Mattingでは画像の一部のみを処理します。まず画像を"前景"、"背景","そのどちらか"に粗く分割します。(この3クラスに分割したものをtrimapをいいます) 次に"そのどちらか"についてのみ、透明度を示すアルファチャンネルを予測していきます。こうすることで細かい部分の予測漏れの損失を相対的に大きくすることができます。以下の例だと画像中のグレーの部分のみ推論します。
データセット
有名なデータセットとしてはAdobeが提供しているMatting Datasetがあります。セグメンテーション用のデータセットに比べてかなり細かくなっています。(AdobeのBrian Priceさんにメールでコンタクトをとることで受け取ることができます)
処理の流れ
- マスクの作成
Image Mattingを実行するためには入力画像とは別に前述のtrimapを準備する必要があります。そのためにまず、セグメンテーションを使用してマスク画像を生成します。 - trimapの作成
生成したマスクからtrimapを作成します。OpenCVの膨張収縮処理を施して作成します。 - IndexNet Mattingで推論
今回はImage MattingのうちIndexNet Mattingというモデルを利用して推論します。理由は、論文の作者による公式実装や学習済みモデルが公開されており試しやすそうだったからです。
##結果
上記のパイプラインで推論した結果をいくつか載せます。左が元画像、中央が推論結果、右がremove.bgを利用した結果です。
まとめ
DeepLearningを用いて背景削除(前景抽出)に取り組みました。
remove.bgの完全再現とはいきませんでしたが、なかなか上手く背景を切り取ることが出来ました!
(この記事で使用した画像は全てぱくたそ様より取得したものです。)