背景除去は実際にどう動いているのか — そしてどこで失敗するのか
何かを切り抜いているわけではありません。モデルは画素ひとつひとつについて「これはどれくらい被写体に属するか」を推測しています。それがわかると、これまで見た妙な結果がすべて説明できます。
更新
出てくるのは切り抜きではなくマスクです
モデルは写真を見て、同じ形の白黒画像を一枚返します。被写体だと確信している場所は白く、背景だと確信している場所は黒く、迷っている場所はその間の灰色です。その白黒画像がそのまま結果の透明度になります。
つまり輪郭線もパスもなく、何かをなぞってもいません。返ってくるのは確信の度合いで、それが透明度として描かれているだけです。髪・毛・ぶれ・ガラス・影はその中間に落ちます。縁がにじむのはモデルが下手だからではなく、正直だからです。
モデルは「目立つひとつ」を探しています
ここで動くU²-Netは顕著性物体検出のモデルです。学習した問いはひとつだけ — この絵で目立っているものは何か。そこそこ単純な背景の前に被写体がひとつ、というのがまさにこのモデルの居場所です。
答えがひとつでない絵を渡しても拒みません。代わりに弱くあいまいなマスクを全体に敷きます。写真24枚を通してアルファ値を直接読んでみたところ、被写体がひとつでない10枚は半透明のしみか、あるいは何もない状態でした。森を上空から撮った航空写真は確信のある画素が0.0%なのに、形のうえでは「成功」していました。
静かに失敗する種類なので、いまはツールがマスクを実際に測り、空のPNGを渡す代わりに言葉で知らせます。
- 通ります: 人物ひとり、机の上の品物、ペット、靴、自転車、空を背にした山。
- 通りません: 群衆、渋滞、チューリップ畑、本棚、サンゴ礁、上から見た森。
- 中間: 似たものが複数ある絵 — 一部だけ、しかも半透明で出ることがあります。
縁が甘くなる理由、大きな写真ほどそうなる理由
モデルは実際の大きさに関係なく写真を320×320で見ます。マスクも320×320で返ります。それをかぶせるには元の寸法まで引き伸ばさなければなりません。4000ピクセルの写真なら、マスクの1画素が実際の10数画素を覆うことになり、それが輪郭で見えます。
より良い写真を選んでも解決しません。手法そのものの形だからです。結果を小さく使うなら問題になりませんし、大きく使うなら問題になります。
ダウンロード量と品質を引き換える場所もあります。速いモデルは4.4MB、精密なモデルは168MBで40倍の差ですが、同じ写真で結果が目に見えて違います。小さいほうは背景の薄い幽霊が残り、大きいほうは髪や小物までくっきり分かれます。
モデルに選ばせてはいけないとき
写真に物が複数あるとき、あるいは欲しいものが画面の主役でないときは、モデルの品質を上げても意味がありません。そもそもどれのことかを尋ねられていないからです。
そのときは道具が違います。クリック切り抜きは重いエンコーダーで絵を一度だけ通しておき、その後はクリックごとにほぼ即座に答えます。CPUでエンコーダー6.0秒、クリック0.10秒と計測しました。だからこそ「待って見る」画面ではなく「押してすぐ見る」画面にできたのです。点ひとつではたいてい物の一部が取れ、二つ目の点がどこまでがその物かを教えます。
PNGで保存しないと透明が消えます
JPGには透明度の場所がそもそもありません。切り抜きをJPGで保存すると、透明だったところは透明のまま残らず、白か黒になって返ってきます。作り終えてからこれに驚く人がとても多いのです。PNGとWebPは透明を持てるので、そちらで保存してください。
もうひとつ言っておきます。背景除去にかける写真は、たいてい人が写った写真です。この処理はブラウザーのタブの中で動くので写真はどこにも送られません — ただし始めるにはモデルを先に受け取る必要があり、その容量は押す前にお伝えします。
アップロードせずに、いま試す
被写体が見つからないと出ます。なぜですか。
マスクがどこかで強く出たのではなく、全体に弱く出たからです。確信のある画素とあいまいな画素を別々に数えており、確信のあるものがほとんどないか、あいまいなものに大きく負けている場合、その写真には探すべき被写体がひとつではない、というのが正直な答えです。
髪の縁をきれいに抜けますか。
ある程度までです。精密モデルは髪に対してはるかに強くなります。ただしマスクは320×320で計算して引き伸ばすので、高解像度の写真では縁の細かさに限界があります。手で切ったマスクと同じにはなりません。
違う物を消してしまいました。選べますか。
背景除去ではできません。モデルは目立つものを選ぶだけで、何が欲しいのかを知る方法がありません。クリック切り抜きをお使いください — 欲しい物を直接指し、点を足して含めたり外したりできます。