0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

背景除去ツールが髪の毛を食べてしまう理由 — アルファマスクは 0/255 ではない

0
Posted at

犬の写真で背景除去を試して、エッジを拡大してみました。毛が残っている。しかも一本ずつ。

正直、意外でした。切り抜き結果といえば「ハサミで切った紙」のようなものばかり見てきたからです。

設定パネルを確認して理由が分かりました。エッジ収縮 0、マスクのぼかし 0px、背景色被りの除去はオフ。後処理を一切していない。モデルが出したマスクをそのまま渡している。

この三つの既定値は珍しい選択なので、その理由を書きます。

マスクは連続値であって、二値ではない

セグメンテーションモデルが出力するのはアルファマスク、つまりピクセルごとの「どれだけ被写体に属するか」です。

完全に被写体なら 255、完全に背景なら 0。エッジはその中間に落ちます。

髪の毛が 1 ピクセルの 6 割を覆っているなら、そのアルファは 153 前後であるべきです。ガラスの縁、薄いレース、モーションブラーの輪郭も同じ話です。

この中間値こそが切り抜き品質のすべてです。被写体の中心が正しいかどうかは難易度が低く、どのモデルでもできます。差がつくのはエッジの帯だけです。

既定でオンになっていることが多い三つの処理

多くのツールは既定で次の三つを行います。

  • エッジ収縮 — マスクを内側に 1〜2px 縮める。背景の残りが消えて見栄えは良くなる。ただし髪の先端はまさにそこにある。
  • マスクのぼかし — アルファをぼかして遷移を滑らかにする。モデルのギザギザを隠せるが、本来シャープだった境界も一緒にぼける。
  • 背景色被りの除去 — エッジに混ざった背景色を抜く。被写体と背景の色が近いと被写体側を誤って削る。

どれも悪い機能ではありません。問題は既定でオンにすることです。不可逆だからです。ユーザーが受け取る時点で既に加工済みで、元のマスクはもう存在しません。

既定でオフにしておけば、必要な人が自分でオンにできます。既定でオンだと、生のマスクが欲しい人には戻る手段がありません。

手動ブラシの隣に「AI の元の透明度チャンネルに戻す」ボタンがあり、これがこの設計を成立させています。やりすぎても戻せる。

正直に言うと、既定出力のエッジは「自動最適化済み」のものほど綺麗には見えません。それは事実です。ただしその綺麗さは情報と引き換えであり、情報は戻ってきません。

三段階のモデルと、容量が買っているもの

モデルはブラウザにダウンロードされるので、容量は厳しい制約です。

段階 モデル 容量 位置づけ
高速 ISNet INT8 約 42 MB 汎用的な被写体認識
プロ BEN2 FP16 約 219 MB 髪、半透明素材、複雑なエッジ
最高 BiRefNet HR-Matting FP16 約 447 MB 2048px、髪・薄布・ガラス

説明文をもう一度見てください。上位二段の説明はすべてエッジに関するものです。髪、薄布、ガラス、半透明。「被写体認識がより正確」とは一つも書かれていません。

これが選択基準そのものです。被写体認識はボトルネックではなく、エッジがボトルネックです。

二段階を実行した実測値:

高速 プロ
実際のダウンロード 42.2 MB 209.0 MB
バックエンド WebGPU WebGPU
POST リクエスト数 0 0

モデルはブラウザにキャッシュされ、同じ段階なら再ダウンロードされません。ただしシークレットウィンドウを開いたりサイトデータを消すと、また落とし直しになります。実測時は新しいコンテキストだったので、以前落とした段階の「ダウンロード済み」表示は消えていました。

つまり「一度落とせばずっと使える」という前提は、複数デバイスのユーザーやキャッシュを消す習慣のあるユーザーには成立しません。

モデルを使わない、もう一つの経路

背景が均一なら、そもそもモデルは要りません。

連結性ベースの経路があります。キャンバスの四辺から連結して入ってくる背景に近い色だけを削る。「白に近いピクセルを全部削る」ではありません。この違いは実務的です。被写体の上に乗った白い文字は残ります。被写体に囲まれていて、外側の背景とは連結していないからです。

薄いグレー白の背景を持つスクリーンショットで試したところ、自動判定された背景色は #F2F6F5、純白ではありませんでした。仮定ではなく実際にサンプリングしています。許容値を調整する往復が省けます。

この経路は二回実行して、POST は 0、モデルファイルのダウンロードもゼロ。数秒で終わります。

マスクが加工されているかを確かめる方法

サンプル三種類、数分で済みます。

被写体内部に背景と同色の要素がある商品画像。 白背景に白い文字が乗った製品。アルゴリズム経路で処理して、被写体に穴が空くかを見ます。空くなら連結判定ではなく色の閾値処理です。

髪や毛。 結果を暗い背景に合成して見ます。自動収縮されたエッジは、暗背景では一目で分かります。

半透明のもの。 ガラス、薄布、煙。マスクが二値に潰されていると、消えるか不透明の塊になります。

未公開の製品画像やクライアント素材を扱うなら、もう一つ。DevTools の Network を開いて POST で絞り、一枚処理してみる。5 秒で終わりますし、どんなプライバシーポリシーより直接的です。

上の数値はこの記事を書きながら実際に計測したものです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?