Python で画像から前景を取り出して背景を削除することが簡単にできるようになりました.2022年に公開されたU-2-Net と呼ばれる畳み込みディープニューラルネットワークのモデルが秀逸です.これはU字型の11のステージからなる畳み込みニューラルネットワークで,興味のある物体を切り抜き,背景を削除します.学習済みモデルも入手可能で,僅か数行のコードだけで実行できます.
Python では rembg パッケージをインストールすると U-2-Net を使った背景削除が可能です.これは pip
を使ってインストールできます.
% pip install rembg ⏎
プログラムのソースコードが保存されたフォルダの中に,data
フォルダがあり,その中に背景を削除したい画像データ (ink.png と golf.png) を設置します.また,背景が削除された前景画像は results
フォルダに書き出されるものとします.各フォルダを作成しておいてください.
必要なパッケージをインポートします.
import os
from rembg import remove
from PIL import Image
インクの画像から背景を削除します.わずかなコードで実行できることが確認できます.なお,Windows でも Mac でも動作するようにフォルダとファイルの指定には os モジュールを使用しています.
input_path = os.path.sep.join(['data', 'ink.png'])
output_path = os.path.sep.join(['results', 'rembg_ink.png'])
input = Image.open(input_path)
output = remove(input)
output.save(output_path)
ink.png rembg_ink.png
ゴルフスイングの画像からも背景を削除します.(前景とも言えなくもない)ティーマーカーが残っているのと,白色の手袋を着用した左手が消えているようにも見えますが,ほぼ完璧に前景と背景の切り分けに成功しています.
input_path = os.path.sep.join(['data', 'golf.png'])
output_path = os.path.sep.join(['results', 'rembg_golf.png'])
input = Image.open(input_path)
output = remove(input)
output.save(output_path)
golf.png rembg_golf.png