Introduction
以前Google等のブラウザから簡単に画像をクロールするスクリプトを紹介しました。
ここでクローリングしてきた画像から背景除去してオブジェクトを取り出し、合成素材にする手法を試していきます。
使い道としては、画像分類や物体検知においてデータセットが不足している場合です。
現実で珍しいものやネットにないものは合成で無理矢理作ってデータセットを補強できます。
データ収集は機械学習パイプラインにおいて工数泥棒なので、特に機械学習のプロジェクトでは覚えておくと重宝します。
機械学習に限定せずとも、画像合成で Web サイトやヘッダー画像を作成したり汎用的に楽しめます。
本記事が少しでも読者様の学びに繋がれば幸いです!
「いいね」をしていただけると今後の励みになるので、是非お願いします!
環境
Ubuntu22.04
Python3.11.1
rembg とは
背景除去には幾つか手段が有りますが、rembgが汎用的で使用感も良好でした。
rembgでは以下の処理を行います。
-
u2netでオブジェクトのセグメンテーション。 -
pymattingでセグメンテーションを用いて背景とオブジェクトを分離。
短いコードで背景除去でき、様々なジャンルや低画質でもある程度の精度を誇っています。
ただ欠点もあります。主に以下の 2 点です。
-
pip限定でconda installができないため、conda環境では使用が難しい。 - ※condaにpipを混ぜると壊れます。
-python: >3.7, <3.11とバージョン範囲が狭い。
- 私は- 2023 年 6 月 7 日現在、Python3.11.1に上げてしまい、やむを得ずGoogle Colabで動かしました。python: >3.7, <3.12に対応されています。
Python3.11にも無事インストールできました。
condaで環境管理、Pythonのバージョン指定はどちらも業務でありがちな内容のため注意が必要です。
上記の理由からOpenCVで自作したりImage Mattingを紹介したかったのですが、工数や精度、汎用性で劣ってしまいます。
実装
前述の通りバージョン問題でPythonファイルで実行できないため、Google Colabで作成したrembg.ipynbをPythonファイルに書き出しました。
そのままは使えませんが、コード自体は単調なので参考にしていただけると幸いです。
コードはGitHubにもあげてあります。
icrawler同様、こちらも 3 行で背景除去できますので抜粋します。
# 画像の読み込み
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)
元画像のペンギンさん。
背景除去をしたペンギンさん。
複数羽いても、綺麗に背景だけ除去されています。
これくらいはっきりした画像であれば自作や他モデルでも除去できそうですが、最低 3 行で背景除去できるのは大きな魅力です。
Gaussian Blurで画像をぼかして試してみます。
実際のデータセットは画質が良いとは限らないので、汎用性は重要です。
# 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)
元画像のぼかしペンギンさん。
背景除去をしたぼかしペンギンさん。
Gaussian Blurも関係なしに背景除去されています。
ぼかした際は自作するとチューニングが難しかったり、他モデルでは背景除去できなくなることがありますが、rembgは条件にあまり左右されず精度が良い印象です。
それ故に、前述した業務で使い辛い特性が勿体ないですね。
最後に
最後まで閲覧頂きありがとうございました。
備忘録の側面もありますが、本記事がお役に立てば幸いです!
参考 URL



