nezumi-sketch lab
nezumi-inpaint.js

ブラウザだけで動く LaMa インペインティング・ライブラリ。
onnxruntime-web + Web Worker で推論し、Float16 転送・IndexedDB キャッシュに対応。依存ゼロ、UMD 形式で全環境対応。

▶ ライブデモ

実際に NezumiInpaint が動いています。画像を開き、消したい部分を赤くマスクして「実行」を押してください。初回はモデルのダウンロード(約 200 MB)があります。2 回目以降は IndexedDB キャッシュから即時読み込み。

🖼
ここをクリック、または画像をドロップ
mode
size 32
dtype
初期化中…

概要

nezumi-inpaint.js は、LaMa Inpaint アプリのコードを NezumiInpaint クラスとして整理したライブラリです。

Credits / Licenses LaMa — Apache-2.0 — Resolution-robust Large Mask Inpainting — Suvorov et al., Samsung Research
onnxruntime-web — MIT — Microsoft
Space Mono — OFL — Google Fonts
Noto Sans JP — OFL — Google Fonts
特徴詳細
ゼロ依存ONNX Runtime Web CDN から自動取得
Float32 / Float16dtype:'float16' で転送量を半減
imgSize 可変256 / 512 / 768 / 1024 から最近値へ自動スナップ
UMDESM / CJS / グローバルすべて対応
Promise APIloadImage() / run() は Promise を返す
Undo スタック上限付き(デフォルト 20)
COOP / COEP ヘッダ必須 SharedArrayBuffer のため Cross-Origin-Opener-Policy: same-originCross-Origin-Embedder-Policy: require-corp が必要です。 → 設定ガイドへ

インストール

script タグ

<script src="nezumi-inpaint.js"></script>

モデルファイル

dtype自動選択 URLサイズ
float32 defaultlama_fp32.onnx~200 MB
float16 高速lama_fp16.onnx~100 MB

クイックスタート

const inpainter = new NezumiInpaint({
  container:  '#wrap',
  workerSrc:  workerSourceString,
  onStatus:   ({ state, text }) => updateUI(state, text),
  onResult:   ({ elapsedMs, ep }) => console.log(ep, elapsedMs),
});
await inpainter.loadImage(file);
await inpainter.run();
inpainter.download();
  • COOP / COEP を設定SharedArrayBuffer を有効化
  • コンテナを用意position:relative なボックスを置く
  • インスタンス生成キャンバスが自動生成され、モデル取得が開始
  • 画像をロードloadImage() に File / Blob / URL を渡す
  • マスクを描いて実行ブラシで塗って run() を呼ぶだけ

コンストラクタ

new NezumiInpaint( opts )

基本オプション

オプションデフォルト説明
containerstring | HTMLElementCSS セレクタか DOM 要素。省略でヘッドレス。
workerSrcstringWorker スクリプトの文字列。省略時は id="workerSrc" を探す。
modelUrlstringautodtype に応じて自動選択。
brushSizenumber24初期ブラシサイズ (2〜200 px)
undoLimitnumber20Undo スタックの上限
preferWebGPUbooleantrueWebGPU EP 優先。遅延検出時 WASM へ自動フォールバック。

dtype / imgSize

オプションデフォルト説明
dtype'float32' | 'float16''float32'fp16 で転送量半減。Native Float16Array (Chrome 120+) または pure-JS エンコーダを使用。
imgSizenumber512256 / 512 / 768 / 1024 の最近値へスナップ。コンストラクタ時のみ設定可。
roibooleanfalseマスクのバウンディングボックスを ROI として推論。
roiPadnumber128ROI に追加する余白 (px)。
roiMinSizenumber256ROI 推論サイズの最小値。
roiMaxSizenumberimgSizeROI 推論サイズの最大値。
profilebooleanfalse前処理や推論の計測を有効化。

コールバック

オプション引数説明
onStatus{ state, text }state: 'ok' / 'busy' / 'err'
onProgress{ pct, label }0〜100
onResult{ elapsedMs, ep, profile }推論完了時
onProfile{ totalMs, inferMs, prepMs, size, roi }profile 有効時の計測結果
onErrormessage: stringエラー時

メソッド

loadImage(source)

inpainter.loadImage( source ) → Promise<{ width, height }>

File / Blob / HTMLImageElement / URL を受け付けます。マスクとアンドゥスタックはリセットされます。

run()

inpainter.run() → Promise<{ elapsedMs, ep }>

現在のマスクでインペインティング実行。完了時にキャンバスへ反映。マスクが空なら即 reject。

ブラシ操作

メソッド返り値説明
setMode(m)void'mask' / 'erase'
getMode()string
setBrushSize(n)void2〜200 px
getBrushSize()number
clearMask()voidマスク全消去
undo()boolean直前の run() を元に戻す
undoCount()number残り Undo 回数

書き出し

メソッド返り値説明
toDataURL()stringPNG の dataURL
download(filename?)voidPNG ダウンロード

その他

メソッド返り値説明
isReady()booleanrun() を受け付けられるか
hasImage()boolean画像が読み込まれているか
getImgSize()number推論解像度
getDtype()string'float32' | 'float16'
destroy()voidWorker 終了・DOM 削除

Float16 モード

dtype:'float16' でテンソルを fp16 (2 bytes/値) で転送。512×512×3ch なら約 1.5 MB → 750 KB に削減。

const inpainter = new NezumiInpaint({
  container: '#wrap',
  dtype:     'float16',  // lama_fp16.onnx を自動選択
});
console.log(inpainter.getDtype());  // 'float16'
fp16 モデルが必要 Worker 側で lama_fp16.onnx を使用してください。modelUrl 省略時は自動で fp16 URL が選ばれます。

ヘッドレス利用

container を省略するとキャンバス DOM を生成しません。

const inpainter = new NezumiInpaint({ workerSrc: workerCode });
await inpainter.loadImage('https://example.com/photo.jpg');
const dataUrl = inpainter.toDataURL();

ワーカー接続

Worker が受け取るメッセージ

typeフィールド説明
initmodelUrl, threads, preferWebGPU起動時 1 度。モデル DL・セッション初期化。
runimgArr, maskArr, dtypeTransferable バッファ。fp16 時は Uint16Array。

Worker が送るメッセージ

typeフィールド説明
readyep初期化完了
statusstate, textステータス更新
progresspct, label進捗 0〜100
resultrgba, ep, elapsedMsUint8ClampedArray (RGBA, S×S)
errortextエラー

COOP / COEP ヘッダ設定

HTML meta タグ

<meta http-equiv="Cross-Origin-Opener-Policy"   content="same-origin">
<meta http-equiv="Cross-Origin-Embedder-Policy" content="require-corp">

Firebase Hosting

{ "hosting": { "headers": [{ "source": "**", "headers": [
  { "key": "Cross-Origin-Opener-Policy",   "value": "same-origin" },
  { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }
]}]}}
ハマりポイント require-corp 設定後は外部リソースに crossorigin 属性が必要な場合があります。ONNX Runtime CDN は CORS ヘッダを返すので通常は問題ありません。