Amazon などのマーケットプレイスではメインの商品画像を純白の背景にする必要があり、Shopee、Lazada、TikTok Shop でも正方形の画像で統一すると、商品ページがより洗練されて見えます。しかし、数百枚の写真を手作業で切り抜くと何日もかかります。rembg は、AI による背景削除モデルを一般的な CPU サーバーで実行できるオープンソースツールです。この記事では rembg をインストールし、モデルを比較したうえで、短いスクリプトを使ってフォルダー内の商品写真を透過 PNG ファイルと正方形の白背景 JPG メイン画像に一括変換します。
apt install -y python3-venv
python3 -m venv /opt/rembg
/opt/rembg/bin/pip install "rembg[cpu,cli]"
/opt/rembg/bin/rembg --help
各モデルは初回使用時に自動でダウンロードされ、~/.u2net に保存されます。そのため、初回の実行時にはサーバーがインターネットに接続できる必要があります。
/opt/rembg/bin/rembg i photo.jpg cut-u2net.png # default model
/opt/rembg/bin/rembg i -m isnet-general-use photo.jpg cut-isnet.png # often cleaner edges
/opt/rembg/bin/rembg i -m birefnet-general photo.jpg cut-birefnet.png # most accurate, slower, more RAM
/opt/rembg/bin/rembg i -a photo.jpg cut-matting.png # alpha matting for hair and soft edges
カタログから典型的な写真を 5 枚選んで候補のモデルで処理し、等倍で輪郭を比較してから決めてください。
cat > /opt/rembg/whitebg.py <<'EOF2'
import os, sys
from PIL import Image, ImageOps
from rembg import new_session, remove
src, dst = sys.argv[1], sys.argv[2]
size = int(os.environ.get("SIZE", "1600")) # square canvas in pixels
fill = float(os.environ.get("FILL", "0.85")) # share of the canvas the product fills
session = new_session(os.environ.get("MODEL", "isnet-general-use"))
for sub in ("png", "white"):
os.makedirs(os.path.join(dst, sub), exist_ok=True)
for name in sorted(os.listdir(src)):
if not name.lower().endswith((".jpg", ".jpeg", ".png", ".webp")):
continue
base = os.path.splitext(name)[0]
img = ImageOps.exif_transpose(Image.open(os.path.join(src, name))).convert("RGB")
cut = remove(img, session=session)
box = cut.getchannel("A").getbbox()
if not box:
print(name, "no object found, skipped", flush=True)
continue
cut = cut.crop(box) # trim the empty space around the product
cut.save(os.path.join(dst, "png", base + ".png")) # transparent version
scale = size * fill / max(cut.size)
cut = cut.resize((max(1, round(cut.width * scale)), max(1, round(cut.height * scale))),
Image.Resampling.LANCZOS)
canvas = Image.new("RGB", (size, size), (255, 255, 255))
canvas.paste(cut, ((size - cut.width) // 2, (size - cut.height) // 2), cut)
canvas.save(os.path.join(dst, "white", base + ".jpg"), quality=92)
print(name, "done", flush=True)
EOF2
このスクリプトは、スマートフォンで撮影した写真の向きを補正し、背景を削除して周囲の余白をトリミングしたうえで、透過 PNG を保存します。その後、純白(255, 255, 255)の正方形キャンバスの中央に、フレームの約 85% を占めるように商品を配置します。
mkdir -p /data/photos/in /data/photos/out # upload the original photos to /data/photos/in
cd /data/photos
nohup /opt/rembg/bin/python /opt/rembg/whitebg.py in out > whitebg.log 2>&1 &
tail -f whitebg.log
# Other sizes or models, for example:
SIZE=2000 FILL=0.8 MODEL=birefnet-general /opt/rembg/bin/python /opt/rembg/whitebg.py in out
結果は 2 つのフォルダーに出力されます。out/png にはバナー、広告、デザイン作業に使える透過切り抜き画像が、out/white にはそのままアップロードできる正方形のメイン画像が保存されます。処理速度はモデルと CPU によって異なるため、まず 20 枚で処理時間を計測し、カタログ全体にかかる時間を見積もってください。
remove() の呼び出しに alpha_matting=True を追加するか、単一のファイルであれば rembg i -a を使います。処理が遅くなるため、必要な画像だけに使ってください。いいえ。1 日に数十枚から数百枚程度であれば、CPU サーバーで十分です。GPU が大きな差を生むのは、毎日数千枚以上の画像を処理する場合や、最大級のモデルを常に使う場合に限られます。
rembg には、シンプルなページと HTTP API を備えた小さな Web サーバー(rembg s)が含まれています。127.0.0.1 で起動し、Nginx 経由で HTTPS とパスワードを設定して公開してください。公開ポートで直接起動してはいけません。
複数言語のタイトル、箇条書き、商品説明の作成については「AI で商品説明文を多言語で一括生成する」、商品動画の字幕については「faster-whisper で字幕を自動生成する」を参照してください。
上記の手順で解決しない場合は、サポートチケットを送信して IMIDC の 24 時間 365 日対応テクニカルサポートへご連絡ください。サーバー IP、CPU とメモリの構成、使用したモデル、whitebg.log の末尾数行を添えていただくと、より迅速に調査できます。