猫の手ツール

Algorithm & UI/UX

AI背景透過と手動補正を
支える「マスクレイヤー」戦略

本ツールは、GoogleのMediaPipeを用いた最新のAIセグメンテーションと、Canvas APIによる伝統的な画像合成を組み合わせた「ハイブリッド型」の構成をとっています。AIの限界を人間がカバーするための、実装の工夫を紐解きます。

このツールの入力から出力まで

現行コードの確認日:

入力
人物写真を入力し、自動結果のあとに消しゴム・復元ブラシで境界を調整します。
処理
selfie_segmenterのマスクから人物側の画素を残します。編集するマスクを所有配列へコピーしてから、MediaPipeの結果資源を解放します。
出力
透明背景はPNG、白背景はJPEG品質0.95で出力します。

まず確認する点:復元は処理画像の元画素を戻す操作です。髪や透明な物を新しく生成する処理ではなく、縮小で消えた細部も復元できません。

仕上がりの例

人物写真の背景を取り除き、透過PNGにした例です。

加工前・加工後
左は青いシャツを着た人物の写真。右は人物を切り抜き、周囲の透明部分を市松模様で示した画像。

サンプルにはAIで生成した架空の人物画像を使用しています。市松模様は透明部分を示す表示用の背景です。ツールで保存する透過PNGには含まれません。

加工前・加工後

左は青いシャツを着た人物の写真。右は人物を切り抜き、周囲の透明部分を市松模様で示した画像。

掲載画像はサイトにある既存の公開作例です。保存済みの資料ではAIで作成した架空の人物・手の画像を使用しています。今回の確認日が、この作例を実行した日を表すわけではありません。

保存済み検証記録の条件を見る

資料の種類は「ツールの出力画像を保存した記録」です。公開作例と保存済み記録で素材や色などが異なる場合があるため、下の数値は保存済み検証記録の条件として読んでください。

架空の人物写真を読み込み、自動処理の結果を透過PNGで保存。

記録の入力画像
1788×2400px (JPEG)
記録の出力画像
1117×1500px (PNG)
保存済み記録の主な操作・出力条件
画面の項目記録の値現行コードの初期値・範囲
記録の背景透明—
記録の手動修正なし—

資料ファイルの作成日は実行日として扱っていません。個別端末の処理速度や、ほかの写真に対する検出・加工の精度を測定した資料でもありません。

実装の確認箇所:src/pages/ai/ima-seg/bg-remover/index.astro。以下のコード抜粋と出力条件は、この本番実装に基づいて説明します。

仕組みを読み進めるときは、MediaPipeの画像セグメンテーション(人物マスクの寸法、カテゴリと資源解放)、Canvas APIと画像処理(画像寸法、drawImage、画素と透明度の扱い)が参考になります。

1. マスクキャンバスによる非破壊的な手動補正

AIが切り抜きに失敗した際、ユーザーが指でなぞって「消去」や「復元」を行えるようにするため、「表示状態を管理する専用のマスク用Canvas」を裏側に持っています。

元画像そのものを加工するのではなく、白黒のマスクデータ(白=見える、透明=見えない)を介して元画像をくり抜く(destination-in)手法を採用しました。これにより、一度消した部分も「復元ブラシ」で元のピクセルデータを完全に再表示させることが可能になります。

元画像と編集用マスクを合成する例です。maskは白い部分が表示対象で、透明な部分が非表示です。白黒の色そのものではなく、マスクの透明度が使われます。

function applyMask(canvas, image, mask) {
  const ctx = canvas.getContext('2d');
  if (!ctx) return;
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
  ctx.globalCompositeOperation = 'destination-in';
  ctx.drawImage(mask, 0, 0, canvas.width, canvas.height);
  ctx.globalCompositeOperation = 'source-over';
}

2. 人物の確信度を透明度へ変換するマスク

現行のMediaPipe Tasks Vision 0.10.34とselfie_segmenter.tfliteのカテゴリマスクは、人物が0、背景が255です。ラベルはselfieのみで、単一の確信度マスクは人物の確率を表します。画像の端のカテゴリから背景を推測する処理は使いません。

本ツールはconfidenceMasks[0]の人物確信度を0〜255の透明度へ変換して編集用マスクを作ります。人物の確信度が低い境界ほど薄く残すため、二値の切り抜きより滑らかに表現できます。誤推定は消しゴムと復元ブラシで補正できます。

3. ブラウザ内完結(Edge AI)によるプライバシーと速度の両立

一般的な背景透過サービスは画像をサーバーに送信して処理しますが、本ツールはWebAssembly(WASM)を活用したエッジ処理を行っています。

一度数メガバイトのAIモデルをロードしてしまえば、その後は1ピクセルも外部に送信することなく、クライアントサイドのGPUを活用して高速に推論を実行します。選んだ画像を送信してサーバーの処理結果を待つ工程はありません。ただしモデル取得の通信、初期化、端末内の推論には待ち時間があります。

出力の仕様と確認する点

マスクの大きさは返却されたwidth・heightを参照します。readMaskDataで処理Canvasの寸法へ合わせ、カテゴリは最近傍、確信度は双線形補間で所有配列へコピーします。コピー後にImageSegmenterResult.close()で元のマスク資源を解放し、編集と描画にはコピーを使います。

使用するselfie_segmenterは人物向けのモデルです。商品やペットを自動で正確に切り抜く機能ではありません。自動結果が合わない部分は、消しゴムでマスクを消し、復元ブラシで表示する領域を足します。

復元できるのは読み込み後の処理画像にある画素です。入力は長辺1500px以下へ縮小するため、縮小で失われた細部や、写真に写っていない部分を生成して戻すことはできません。

透明背景はPNG、白背景はJPEG品質0.95で出力します。細い髪、半透明の物、背景と似た色の境界を拡大確認し、保存先でも透明度が保持されているか確認してください。

制作時に確かめたこと