nezumi-sketch lab
nezumi-inpaint.js
ブラウザだけで動く LaMa インペインティング・ライブラリ。
onnxruntime-web + Web Worker で推論し、Float16 転送・IndexedDB キャッシュに対応。依存ゼロ、UMD 形式で全環境対応。
▶ ライブデモ
実際に NezumiInpaint が動いています。画像を開き、消したい部分を赤くマスクして「実行」を押してください。初回はモデルのダウンロード(約 200 MB)があります。2 回目以降は IndexedDB キャッシュから即時読み込み。
初期化中…
概要
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
onnxruntime-web — MIT — Microsoft
Space Mono — OFL — Google Fonts
Noto Sans JP — OFL — Google Fonts
| 特徴 | 詳細 |
|---|---|
| ゼロ依存 | ONNX Runtime Web CDN から自動取得 |
| Float32 / Float16 | dtype:'float16' で転送量を半減 |
| imgSize 可変 | 256 / 512 / 768 / 1024 から最近値へ自動スナップ |
| UMD | ESM / CJS / グローバルすべて対応 |
| Promise API | loadImage() / run() は Promise を返す |
| Undo スタック | 上限付き(デフォルト 20) |
COOP / COEP ヘッダ必須
SharedArrayBuffer のため
Cross-Origin-Opener-Policy: same-origin と Cross-Origin-Embedder-Policy: require-corp が必要です。
→ 設定ガイドへ
インストール
script タグ
<script src="nezumi-inpaint.js"></script>
モデルファイル
| dtype | 自動選択 URL | サイズ |
|---|---|---|
| float32 default | lama_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 )
基本オプション
| オプション | 型 | デフォルト | 説明 |
|---|---|---|---|
| container | string | HTMLElement | — | CSS セレクタか DOM 要素。省略でヘッドレス。 |
| workerSrc | string | — | Worker スクリプトの文字列。省略時は id="workerSrc" を探す。 |
| modelUrl | string | auto | dtype に応じて自動選択。 |
| brushSize | number | 24 | 初期ブラシサイズ (2〜200 px) |
| undoLimit | number | 20 | Undo スタックの上限 |
| preferWebGPU | boolean | true | WebGPU EP 優先。遅延検出時 WASM へ自動フォールバック。 |
dtype / imgSize
| オプション | 型 | デフォルト | 説明 |
|---|---|---|---|
| dtype | 'float32' | 'float16' | 'float32' | fp16 で転送量半減。Native Float16Array (Chrome 120+) または pure-JS エンコーダを使用。 |
| imgSize | number | 512 | 256 / 512 / 768 / 1024 の最近値へスナップ。コンストラクタ時のみ設定可。 |
| roi | boolean | false | マスクのバウンディングボックスを ROI として推論。 |
| roiPad | number | 128 | ROI に追加する余白 (px)。 |
| roiMinSize | number | 256 | ROI 推論サイズの最小値。 |
| roiMaxSize | number | imgSize | ROI 推論サイズの最大値。 |
| profile | boolean | false | 前処理や推論の計測を有効化。 |
コールバック
| オプション | 引数 | 説明 |
|---|---|---|
| onStatus | { state, text } | state: 'ok' / 'busy' / 'err' |
| onProgress | { pct, label } | 0〜100 |
| onResult | { elapsedMs, ep, profile } | 推論完了時 |
| onProfile | { totalMs, inferMs, prepMs, size, roi } | profile 有効時の計測結果 |
| onError | message: 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) | void | 2〜200 px |
| getBrushSize() | number | |
| clearMask() | void | マスク全消去 |
| undo() | boolean | 直前の run() を元に戻す |
| undoCount() | number | 残り Undo 回数 |
書き出し
| メソッド | 返り値 | 説明 |
|---|---|---|
| toDataURL() | string | PNG の dataURL |
| download(filename?) | void | PNG ダウンロード |
その他
| メソッド | 返り値 | 説明 |
|---|---|---|
| isReady() | boolean | run() を受け付けられるか |
| hasImage() | boolean | 画像が読み込まれているか |
| getImgSize() | number | 推論解像度 |
| getDtype() | string | 'float32' | 'float16' |
| destroy() | void | Worker 終了・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 | フィールド | 説明 |
|---|---|---|
| init | modelUrl, threads, preferWebGPU | 起動時 1 度。モデル DL・セッション初期化。 |
| run | imgArr, maskArr, dtype | Transferable バッファ。fp16 時は Uint16Array。 |
Worker が送るメッセージ
| type | フィールド | 説明 |
|---|---|---|
| ready | ep | 初期化完了 |
| status | state, text | ステータス更新 |
| progress | pct, label | 進捗 0〜100 |
| result | rgba, ep, elapsedMs | Uint8ClampedArray (RGBA, S×S) |
| error | text | エラー |
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 ヘッダを返すので通常は問題ありません。