22
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【rembg】 背景除去の精度とコードのシンプルさが魅力

Last updated at Posted at 2023-05-13

Introduction

以前Google等のブラウザから簡単に画像をクロールするスクリプトを紹介しました。

ここでクローリングしてきた画像から背景除去してオブジェクトを取り出し、合成素材にする手法を試していきます。

使い道としては、画像分類物体検知においてデータセットが不足している場合です。
現実で珍しいものやネットにないものは合成で無理矢理作ってデータセットを補強できます。
データ収集は機械学習パイプラインにおいて工数泥棒なので、特に機械学習のプロジェクトでは覚えておくと重宝します。

機械学習に限定せずとも、画像合成で Web サイトやヘッダー画像を作成したり汎用的に楽しめます。

本記事が少しでも読者様の学びに繋がれば幸いです!
「いいね」をしていただけると今後の励みになるので、是非お願いします!

環境

Ubuntu22.04
Python3.11.1

rembg とは

背景除去には幾つか手段が有りますが、rembgが汎用的で使用感も良好でした。

rembgでは以下の処理を行います。

  • u2netでオブジェクトのセグメンテーション。
  • pymattingでセグメンテーションを用いて背景とオブジェクトを分離。

短いコードで背景除去でき、様々なジャンルや低画質でもある程度の精度を誇っています。

ただ欠点もあります。主に以下の 2 点です。

  • pip限定でconda installができないため、conda環境では使用が難しい。 - ※condapipを混ぜると壊れます。
    - python: >3.7, <3.11とバージョン範囲が狭い。
    - 私はPython3.11.1に上げてしまい、やむを得ずGoogle Colabで動かしました。 - 2023 年 6 月 7 日現在、python: >3.7, <3.12に対応されています。
    Python3.11にも無事インストールできました。

condaで環境管理、Pythonのバージョン指定はどちらも業務でありがちな内容のため注意が必要です。

上記の理由からOpenCVで自作したりImage Mattingを紹介したかったのですが、工数や精度、汎用性で劣ってしまいます。

Image Matting の参考

実装

前述の通りバージョン問題でPythonファイルで実行できないため、Google Colabで作成したrembg.ipynbPythonファイルに書き出しました。
そのままは使えませんが、コード自体は単調なので参考にしていただけると幸いです。

コードはGitHubにもあげてあります。

icrawler同様、こちらも 3 行で背景除去できますので抜粋します。

rembg.py
  # 画像の読み込み
  input_img = cv2.imread(img)
  # 背景除去
  output_img = remove(input_img)
  # png変換して保存(透明度(アルファ値)は`png`にしないと変えられない)
  cv2.imwrite(img.replace(INPUT,OUTPUT).replace('jpg', 'png').replace('jpeg', 'png'), output_img)

元画像のペンギンさん。

Screenshot from 2023-05-13 01-55-16.png

背景除去をしたペンギンさん。

Screenshot from 2023-05-13 02-02-48.png

複数羽いても、綺麗に背景だけ除去されています。
これくらいはっきりした画像であれば自作や他モデルでも除去できそうですが、最低 3 行で背景除去できるのは大きな魅力です。

Gaussian Blurで画像をぼかして試してみます。
実際のデータセットは画質が良いとは限らないので、汎用性は重要です。

rembg.py
# Gaussian Blur
imgs = glob(f'{IN_BLUR}/*')
for i, img in enumerate(imgs):
  input_img = cv2.imread(img)
  img_blur = cv2.GaussianBlur(input_img,     # 入力画像
                               (9,9),    # カーネルの縦/横
                                10,10        # 標準偏差
                            )
  cv2.imwrite(f'{IN_BLUR}/{i}.png', img_blur)

元画像のぼかしペンギンさん。

Screenshot from 2023-05-13 02-08-06.png

背景除去をしたぼかしペンギンさん。

Screenshot from 2023-05-13 02-12-11.png

Gaussian Blurも関係なしに背景除去されています。
ぼかした際は自作するとチューニングが難しかったり、他モデルでは背景除去できなくなることがありますが、rembgは条件にあまり左右されず精度が良い印象です。

それ故に、前述した業務で使い辛い特性が勿体ないですね。

最後に

最後まで閲覧頂きありがとうございました。
備忘録の側面もありますが、本記事がお役に立てば幸いです!

参考 URL

Image Matting の参考

Alpha Matting 技術「HAttMatting」

22
30
6

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
22
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?