要点
背景除去といえば、以前は GPU を積んだサーバーに写真をアップロードするのが前提でした。今はその必要がありません。一度ダウンロードすれば済む大きさ(44 MB)のセグメンテーションモデルが、ブラウザの中で動きます。WebGPU が使えるマシンなら 1 枚あたり 1 秒を大きく下回り、使えない場合は同じモデルが CPU 上で 15〜25 秒かけて処理します。どちらの場合も写真が端末の外に出ることはありません。人物、商品、動物がはっきりした背景の前に写っている写真は得意です。苦手なのは、似た色の背景に重なる髪、ガラス、そして撮影者自身にも輪郭が見えていなかったものです。
どんなモデルか
このツールが使っているのは ISNet で、論文 Highly Accurate Dichotomous Image Segmentation(Qin ほか、ECCV 2022)で発表されたネットワークです。「Dichotomous(二分)」とは、タスクが二値であることを指します。各ピクセルが前景か、そうでないか。ISNet は DIS5K データセットで学習されています。自転車、椅子、木などの高解像度画像 5,000 枚に、ピクセル単位の精密なマスクを手作業で付けたもので、細い構造が従来のモデルを失敗させるという理由でこれらの被写体が選ばれています。1024 × 1024 の入力に対して 1024 × 1024 の確率マップを出力し、ツールはそのマップをしきい値で切り、輪郭をぼかして、PNG のアルファチャンネルとして適用します。
重みは Apache-2.0 で配布されています。サイトはこれを自前でホストし、ダウンロードを再開できるよう 3 つに分割したうえで、初回使用後はブラウザにキャッシュします。2 枚目以降の写真では何もダウンロードしません。
「ブラウザ内」が可能になった理由
必要な部品は 2 つでした。ONNX Runtime Web は学習済みモデルを JavaScript から実行するランタイムで、演算は CPU 上の WebAssembly か、2023 年以降は WebGPU(グラフィックスカードを汎用計算に使えるようにするブラウザ API)が担います。セグメンテーションの順伝播 1 回は数千億回の積和演算です。これは GPU が得意とする処理で、CPU の 1 スレッドには向きません。
このサイトのツール自体で、同じ 1024 ピクセルの入力を使って測った数値です。
| 経路 | 動作環境 | 1 枚あたりの時間 |
|---|---|---|
| WebGPU | Chrome / Edge 113 以降、Safari 26 以降。最近の GPU を搭載したノート PC またはデスクトップ | 1 秒未満 |
| WebAssembly | すべてのブラウザ、1 スレッド | 15〜25 秒 |
WebAssembly の経路は意図的にシングルスレッドにしています。マルチスレッドの WASM を使うにはページを cross-origin isolated にする必要があり、このヘッダー設定はサイトの運営費をまかなう広告コードを含め、サードパーティのスクリプトをすべてブロックします。シングルスレッドは遅いものの、ページを無料のまま保てます。処理は Web Worker に移しているので、計算中も画面の操作は止まりません。
もう一つの制約はメモリです。ランタイム、モデル、中間データを合わせて約 200 MB の空きが必要です。RAM 4 GB のスマートフォンなら CPU 経路で処理できますが、古い機種の一部はバッファを確保できません。その場合、ツールはタブをクラッシュさせずにその旨を表示します。
失敗するケース
- 似た色の背景に重なる髪。 暗い壁の前の黒髪、ベージュのカーテンの前の金髪など。ピクセル上に境界が存在しないため、モデルにも境界が見えません。マスクが髪を削るか、壁の縁取りが残ります。
- 透明なものや反射するもの。 ガラス、水、被写体の手前にあるワイングラス。セグメンテーションは二値なので、ガラスは前景でも背景でもなく、結果はその中を硬い輪郭が横切ります。
- 被写体ブレ。 ぼやけた輪郭には、正しい境界が一つに定まりません。
- 被写体が複数。 モデルは「被写体」と判断したものをすべて残します。人が 2 人ならたいてい両方を残し、人と大型犬の場合はどちらか一方だけを残すことがあります。
- 被写体がとても小さい。 入力は長辺 1024 px です。引きの構図で身長 60 px の人物は、マスク上では数十ピクセルになり、輪郭が崩れた塊として出てきます。
白い背景の商品写真、無地の壁の前のポートレート、床の上のペット、紙に印刷されたロゴなら安定して切り抜けます。学習データの大半がこうした画像だからです。
結果をどう使うか
出力は本物の透過情報を持つ PNG です。スライドや商品ページ、別の写真に重ねるにはこの形式が適していますが、メールで送るには向きません。1200 万画素の切り抜き PNG は 20〜30 MB になります。送り先が小さいファイルを求めていて透過が不要なら、白背景の JPEG に画像形式変換してください。透過を残したまま小さくしたい場合は、アルファ付き WebP にすると PNG の約 3 分の 1 のサイズになります。どちらも画像圧縮で処理できます。