複数の画像にも対応した背景除去「rembg UI」

セルフホスト出来る背景除去ツールです。モデル選択可能なほか、複数の画像にも対応しており、実用的なツールとなっています。

スクリプトの流れ

  1. apt パッケージを最低限インストール(libgl1, python3-venv など)
  2. 専用ユーザー rembg/opt/rembg ディレクトリを作成
  3. Python venvrembg[cpu,cli] + Gradio をインストール
  4. u2net モデルを事前ダウンロード(~170MB)
  5. systemd サービスとして登録・自動起動設定
  6. 起動確認 → アクセス先URLを表示
#!/usr/bin/env bash
# ============================================================
#  rembg UI セルフホスト インストールスクリプト
#  対象: Ubuntu 22.04 / 24.04 (LXD コンテナ / 直インストール両対応)
#  実行方法: bash install_rembg.sh
# ============================================================
set -euo pipefail

PORT=7000
INSTALL_DIR="/opt/rembg"
SERVICE_USER="rembg"
MODEL_DIR="/opt/rembg/models"

RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
info()    { echo -e "${GREEN}[INFO]${NC}  $*"; }
warn()    { echo -e "${YELLOW}[WARN]${NC}  $*"; }
error()   { echo -e "${RED}[ERROR]${NC} $*"; exit 1; }

# ── 0. root チェック ──────────────────────────────────────────
[[ $EUID -eq 0 ]] || error "このスクリプトは root (または sudo) で実行してください"

# ── 1. 基本パッケージ ─────────────────────────────────────────
info "システムパッケージを更新中..."
apt-get update -qq
apt-get install -y --no-install-recommends \
    python3 python3-pip python3-venv \
    libgl1 libglib2.0-0 \
    curl wget ca-certificates \
    > /dev/null

# ── 2. 専用ユーザー & ディレクトリ ───────────────────────────
info "専用ユーザー '$SERVICE_USER' を作成中..."
id "$SERVICE_USER" &>/dev/null || useradd -r -m -d "$INSTALL_DIR" -s /bin/bash "$SERVICE_USER"
mkdir -p "$INSTALL_DIR" "$MODEL_DIR"
chown -R "$SERVICE_USER":"$SERVICE_USER" "$INSTALL_DIR"

# ── 3. Python 仮想環境 & rembg インストール ───────────────────
info "Python 仮想環境を作成中..."
sudo -u "$SERVICE_USER" python3 -m venv "$INSTALL_DIR/venv"

info "rembg[cpu,cli] をインストール中 (数分かかります)..."
sudo -u "$SERVICE_USER" "$INSTALL_DIR/venv/bin/pip" install --quiet --upgrade pip
sudo -u "$SERVICE_USER" "$INSTALL_DIR/venv/bin/pip" install --quiet \
    "rembg[cpu,cli]" \
    "gradio>=4.0" \
    "onnxruntime"

# ── 4. モデルの事前ダウンロード ───────────────────────────────
info "デフォルトモデル (u2net) を事前ダウンロード中..."
sudo -u "$SERVICE_USER" env \
    U2NET_HOME="$MODEL_DIR" \
    HOME="$INSTALL_DIR" \
    "$INSTALL_DIR/venv/bin/python3" -c "
from rembg.session_factory import new_session
new_session('u2net')
print('モデルのダウンロード完了')
" || warn "モデルの事前ダウンロードに失敗しました (起動時に自動ダウンロードされます)"

# ── 5. systemd サービス登録 ───────────────────────────────────
info "systemd サービスを登録中..."

cat > /etc/systemd/system/rembg.service << EOF
[Unit]
Description=rembg Background Removal UI Server
After=network.target
Wants=network-online.target

[Service]
Type=simple
User=${SERVICE_USER}
Group=${SERVICE_USER}
WorkingDirectory=${INSTALL_DIR}
Environment="HOME=${INSTALL_DIR}"
Environment="U2NET_HOME=${MODEL_DIR}"
Environment="GRADIO_SERVER_NAME=0.0.0.0"
ExecStart=${INSTALL_DIR}/venv/bin/rembg s \
    --host 0.0.0.0 \
    --port ${PORT} \
    --log_level info
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal
SyslogIdentifier=rembg

# セキュリティ強化
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ReadWritePaths=${INSTALL_DIR}

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable rembg
systemctl restart rembg

# ── 6. 起動確認 ──────────────────────────────────────────────
info "サービスの起動を確認中 (最大30秒待機)..."
for i in $(seq 1 30); do
    if curl -sf "http://127.0.0.1:${PORT}/" > /dev/null 2>&1; then
        break
    fi
    sleep 1
done

# ── 7. 完了メッセージ ─────────────────────────────────────────
echo ""
echo -e "${GREEN}╔══════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║        rembg UI インストール完了!                ║${NC}"
echo -e "${GREEN}╚══════════════════════════════════════════════════╝${NC}"
echo ""

# LXDコンテナのIPを取得
CONTAINER_IP=$(hostname -I | awk '{print $1}')
echo -e "  🌐 Web UI:    ${GREEN}http://${CONTAINER_IP}:${PORT}${NC}"
echo -e "  📡 API:       ${GREEN}http://${CONTAINER_IP}:${PORT}/api${NC}"
echo -e "  📁 モデル:    ${MODEL_DIR}"
echo ""
echo -e "  サービス管理:"
echo -e "    状態確認:  ${YELLOW}systemctl status rembg${NC}"
echo -e "    ログ確認:  ${YELLOW}journalctl -u rembg -f${NC}"
echo -e "    停止:      ${YELLOW}systemctl stop rembg${NC}"
echo -e "    再起動:    ${YELLOW}systemctl restart rembg${NC}"
echo ""
echo -e "  APIテスト例:"
echo -e "    ${YELLOW}curl -s -F file=@input.jpg http://${CONTAINER_IP}:${PORT}/api/remove -o output.png${NC}"
echo ""

# LXDホストからのポートフォワード案内
echo -e "  💡 LXDホストからアクセスする場合:"
echo -e "    ${YELLOW}lxc config device add <コンテナ名> rembg-port proxy \\"
echo -e "      listen=tcp:0.0.0.0:${PORT} connect=tcp:127.0.0.1:${PORT}${NC}"
echo ""

完了後のアクセス方法

用途URL
Gradio Web UIhttp://<コンテナIP>:7000
API ドキュメントhttp://<コンテナIP>:7000/api

LXDホストからポートフォワードする場合は、スクリプト末尾に表示されるコマンドを実行してください。

lxc config device add <コンテナ名> rembg-port proxy \
  listen=tcp:0.0.0.0:7000 connect=tcp:127.0.0.1:7000

その後、ホストの http://localhost:7000 で直接アクセスできます。
モデルは簡単に切り替え可能です。

Screenshot

使用出来るモデルの特徴

モデル名公式説明・特徴主な用途・おすすめシーンサイズ目安 / 速度の傾向精度の傾向・特記事項
u2net (デフォルト)汎用性の高い事前学習モデル一般的な背景除去(写真・イラスト問わず)大(約176MB) / 標準高精度・バランス良し。最も安定
u2netpu2netの軽量版速度重視の大量処理超軽量(4.7MB) / 非常に速いやや精度↓だが十分実用的
u2net_human_seg人体セグメンテーション専用人物写真・ポートレート中 / 標準人物の輪郭が非常に綺麗
u2net_cloth_seg衣服解析専用(上半身・下半身・全身に分類)ファッション・服の切り抜き中 / 標準衣服の境界が正確
siluetau2netと同等品質だがサイズを43MBに圧縮軽量かつ高品質を両立43MB / 高速u2net並の品質+高速
isnet-general-use新世代の汎用モデル一般写真・最新の汎用処理中 / 高速最近の画像で特に強い
isnet-animeアニメキャラクター高精度セグメンテーションアニメ・イラスト・2Dキャラ中 / 標準アニメ特化で最高クラス
samSegment Anything Model(エンコーダ+デコーダ)どんな画像も柔軟に処理大 / やや重万能だがリソース多め
birefnet-generalBiRefNetの汎用版(最新SOTA寄り)高精度を求める一般用途大 / やや遅め細部(髪・透明物)で優秀
birefnet-general-liteBiRefNetの軽量版速度と精度のバランス軽量 / 高速軽快で実用的
birefnet-portrait人物ポートレート専用BiRefNet人物写真・セルフィー中 / 標準ポートレート最強
birefnet-dis二値画像セグメンテーション(DIS)専用シンプルな前景・背景分離中 / 標準明暗差の大きい画像に強い
birefnet-hrsod高解像度顕著物体検出(HRSOD)専用高解像度画像・詳細重視大 / やや遅め4K以上で特に有効
birefnet-cod隠蔽物体検出(Concealed Object Detection)専用背景に溶け込むような物体大 / 遅め迷彩・隠れた物体に特化
birefnet-massive大規模データセットで学習したBiRefNet最高峰の汎用高精度最大 / 遅め現時点で最強クラス
bria-rmbgBRIA AIによるState-of-the-Art背景除去モデル最高精度を求めるプロ用途大 / 標準〜やや遅現時点で最先端
タイトルとURLをコピーしました