LoginSignup
147
117

More than 3 years have passed since last update.

自動で背景を削除 remove.bgを再現してみた

Last updated at Posted at 2020-01-20

少し前に話題になった「remove.bg」という背景を削除してくれるサービスを使ってみました。その精度の高さに感銘をうけ、興味を持ったため自分でも試してみました。コードはすべてこちらの記事に載せています。

remove.bgとは

  • 自動で画像から背景を削除してくれるサービス
  • 基本無料で使用可能、API取得は有料
  • 髪の毛の一本まで抽出してくれる
    man2.png man.png

Semantic Segmentation

このサービスを使ってみて、まず最初に思いついたのがセグメンテーションの利用です。なのでtorchvisionのDeepLabv3でサクッと試してみました。以下がその結果です。

catt.png
ある程度上手くいっていますが毛の一本一本を抽出することはできていないようです。
セグメンテーションで背景削除ができない原因としては
・ 毛の一本一本に注目してもlossはそんなに変わらない
・そもそもデータセットのターゲット画像が大雑把
・bilinear interpolation でupsamplingしている
という点があると考えられます。
 セグメンテーションと細かな背景削除では目的が違うため上手くいかないのは当然でした、、、

Image Matting

 セグメンテーションが上手くいかなかったため、他の策を調べていると「Image Matting」というタスクがあることが分かりました。Image Mattingは画像やビデオから前景を抽出するタスクです。

画像処理範囲

Image Mattingでは画像の一部のみを処理します。まず画像を"前景"、"背景","そのどちらか"に粗く分割します。(この3クラスに分割したものをtrimapをいいます) 次に"そのどちらか"についてのみ、透明度を示すアルファチャンネルを予測していきます。こうすることで細かい部分の予測漏れの損失を相対的に大きくすることができます。以下の例だと画像中のグレーの部分のみ推論します。

image.png

データセット

有名なデータセットとしてはAdobeが提供しているMatting Datasetがあります。セグメンテーション用のデータセットに比べてかなり細かくなっています。(AdobeのBrian Priceさんにメールでコンタクトをとることで受け取ることができます)

image.png

処理の流れ

  1. マスクの作成
    Image Mattingを実行するためには入力画像とは別に前述のtrimapを準備する必要があります。そのためにまず、セグメンテーションを使用してマスク画像を生成します。
  2. trimapの作成
    生成したマスクからtrimapを作成します。OpenCVの膨張収縮処理を施して作成します。
  3. IndexNet Mattingで推論
    今回はImage MattingのうちIndexNet Mattingというモデルを利用して推論します。理由は、論文の作者による公式実装や学習済みモデルが公開されており試しやすそうだったからです。
    image.png

結果

上記のパイプラインで推論した結果をいくつか載せます。左が元画像、中央が推論結果、右がremove.bgを利用した結果です。  

image.png

まとめ

DeepLearningを用いて背景削除(前景抽出)に取り組みました。
remove.bgの完全再現とはいきませんでしたが、なかなか上手く背景を切り取ることが出来ました!

(この記事で使用した画像は全てぱくたそ様より取得したものです。)

147
117
9

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
147
117