feat(erase-object): optional high-quality diffusion inpainting bundle (#566)

Adds an opt-in High Quality mode to the Object Eraser, backed by a new inpaint-hq feature bundle (Stable Diffusion 1.5 inpainting via diffusers). The default fast LaMa path is unchanged. Both arch archives are published to deepsafe/feature-bundles and the manifest carries their real sha256/sizes.

Verified end to end: a fresh container pulls the bundle from HuggingFace, checksum-verifies it, extracts torch/diffusers plus the fp16 model, and the HQ sidecar erases a large object with a plausible fill.

Refs #141
This commit is contained in:
SnapOtter
2026-07-19 20:47:35 +08:00
committed by GitHub
parent 84c18eb82c
commit 1bac663a2e
41 changed files with 954 additions and 35 deletions
+19 -3
View File
@@ -69,6 +69,14 @@ export const FEATURE_BUNDLES: Record<string, FeatureBundleInfo> = {
estimatedSize: "1-2 GB",
enablesTools: ["erase-object", "colorize", "ai-canvas-expand"],
},
"inpaint-hq": {
id: "inpaint-hq",
name: "High-Quality Inpainting",
description:
"Diffusion-based object removal for large objects, detailed textures, and structured backgrounds",
estimatedSize: "5-7 GB",
enablesTools: ["erase-object"],
},
"upscale-enhance": {
id: "upscale-enhance",
name: "Upscale & Enhance",
@@ -107,14 +115,22 @@ export const FEATURE_BUNDLES: Record<string, FeatureBundleInfo> = {
export const TOOL_OPTIONAL_BUNDLE_MAP: Readonly<Record<string, string>> = {
ocr: "ocr",
"ocr-pdf": "ocr",
// High-Quality (diffusion) inpainting upgrades Object Eraser without gating
// it: the base LaMa model in `object-eraser-colorize` stays the tool's
// required primary. `getRequiredBundlesForTool("erase-object")` is unchanged;
// HQ availability is a separate, explicit `inpaint-hq` install check.
"erase-object": "inpaint-hq",
};
export const TOOL_BUNDLE_MAP: Record<string, string> = {};
for (const [bundleId, bundle] of Object.entries(FEATURE_BUNDLES)) {
for (const toolId of bundle.enablesTools) {
if (!TOOL_OPTIONAL_BUNDLE_MAP[toolId]) {
TOOL_BUNDLE_MAP[toolId] = bundleId;
}
// An optional pack must never claim a tool's required-primary slot, but a
// different, non-optional bundle still can. Skip only when THIS bundle is
// the tool's optional pack; the first non-optional bundle to list the tool
// wins. This is behavior-identical for every tool that has no optional pack.
if (TOOL_OPTIONAL_BUNDLE_MAP[toolId] === bundleId) continue;
if (!TOOL_BUNDLE_MAP[toolId]) TOOL_BUNDLE_MAP[toolId] = bundleId;
}
}
+3
View File
@@ -1558,6 +1558,9 @@ export const ar: TranslationKeys = {
progressLabelBatch: "جاري تكبير {count} صورة",
},
"erase-object": {
qualityFast: "سريع",
qualityHq: "جودة عالية",
qualityHint: "الجودة العالية تستخدم نموذج انتشار للأجسام الكبيرة والقوام التفصيلي.",
brushMode: "فرشاة",
lassoMode: "لاسو",
brushSize: "حجم الفرشاة",
+3
View File
@@ -1575,6 +1575,9 @@ export const de: TranslationKeys = {
progressLabelBatch: "{count} Bilder werden hochskaliert",
},
"erase-object": {
qualityFast: "Schnell",
qualityHq: "Hohe Qualität",
qualityHint: "Hohe Qualität nutzt ein Diffusionsmodell für große Objekte und feine Texturen.",
brushMode: "Pinsel",
lassoMode: "Lasso",
brushSize: "Pinselgröße",
+3
View File
@@ -1522,6 +1522,9 @@ export const en = {
progressLabelBatch: "Upscaling {count} images",
},
"erase-object": {
qualityFast: "Fast",
qualityHq: "High quality",
qualityHint: "High quality uses a diffusion model for large objects and detailed textures.",
brushMode: "Brush",
lassoMode: "Lasso",
brushSize: "Brush Size",
+4
View File
@@ -1558,6 +1558,10 @@ export const es: TranslationKeys = {
progressLabelBatch: "Escalando {count} imágenes",
},
"erase-object": {
qualityFast: "Rápido",
qualityHq: "Alta calidad",
qualityHint:
"La alta calidad usa un modelo de difusión para objetos grandes y texturas detalladas.",
brushMode: "Pincel",
lassoMode: "Lazo",
brushSize: "Tamaño del pincel",
+4
View File
@@ -1582,6 +1582,10 @@ export const fr: TranslationKeys = {
progressLabelBatch: "Agrandissement de {count} images",
},
"erase-object": {
qualityFast: "Rapide",
qualityHq: "Haute qualité",
qualityHint:
"La haute qualité utilise un modèle de diffusion pour les grands objets et les textures détaillées.",
brushMode: "Pinceau",
lassoMode: "Lasso",
brushSize: "Taille du pinceau",
+3
View File
@@ -1388,6 +1388,9 @@ export const hi: TranslationKeys = {
progressLabelBatch: "{count} इमेज अपस्केल हो रही हैं",
},
"erase-object": {
qualityFast: "तेज़",
qualityHq: "उच्च गुणवत्ता",
qualityHint: "उच्च गुणवत्ता बड़ी वस्तुओं और विस्तृत बनावट के लिए डिफ्यूज़न मॉडल का उपयोग करती है।",
brushMode: "ब्रश",
lassoMode: "लासो",
brushSize: "ब्रश साइज़",
+4
View File
@@ -1568,6 +1568,10 @@ export const id: TranslationKeys = {
progressLabelBatch: "Memperbesar {count} gambar",
},
"erase-object": {
qualityFast: "Cepat",
qualityHq: "Kualitas tinggi",
qualityHint:
"Kualitas tinggi menggunakan model difusi untuk objek besar dan tekstur mendetail.",
brushMode: "Kuas",
lassoMode: "Laso",
brushSize: "Ukuran Kuas",
+4
View File
@@ -1573,6 +1573,10 @@ export const it: TranslationKeys = {
progressLabelBatch: "Ingrandimento di {count} immagini",
},
"erase-object": {
qualityFast: "Veloce",
qualityHq: "Alta qualità",
qualityHint:
"L'alta qualità usa un modello di diffusione per oggetti grandi e texture dettagliate.",
brushMode: "Pennello",
lassoMode: "Lazo",
brushSize: "Dimensione pennello",
+3
View File
@@ -1530,6 +1530,9 @@ export const ja: TranslationKeys = {
progressLabelBatch: "{count}枚の画像をアップスケール中",
},
"erase-object": {
qualityFast: "高速",
qualityHq: "高品質",
qualityHint: "高品質は大きなオブジェクトや細かいテクスチャに拡散モデルを使用します。",
brushMode: "ブラシ",
lassoMode: "投げ縄",
brushSize: "ブラシサイズ",
+3
View File
@@ -1512,6 +1512,9 @@ export const ko: TranslationKeys = {
progressLabelBatch: "{count}개 이미지 업스케일 중",
},
"erase-object": {
qualityFast: "빠름",
qualityHq: "고품질",
qualityHint: "고품질은 큰 객체와 세밀한 텍스처에 디퓨전 모델을 사용합니다.",
brushMode: "브러시",
lassoMode: "올가미",
brushSize: "브러시 크기",
+4
View File
@@ -1572,6 +1572,10 @@ export const nl: TranslationKeys = {
progressLabelBatch: "{count} afbeeldingen opschalen",
},
"erase-object": {
qualityFast: "Snel",
qualityHq: "Hoge kwaliteit",
qualityHint:
"Hoge kwaliteit gebruikt een diffusiemodel voor grote objecten en gedetailleerde texturen.",
brushMode: "Penseel",
lassoMode: "Lasso",
brushSize: "Penseelgrootte",
+4
View File
@@ -1573,6 +1573,10 @@ export const pl: TranslationKeys = {
progressLabelBatch: "Powiększanie {count} obrazów",
},
"erase-object": {
qualityFast: "Szybko",
qualityHq: "Wysoka jakość",
qualityHint:
"Wysoka jakość używa modelu dyfuzyjnego do dużych obiektów i szczegółowych tekstur.",
brushMode: "Pędzel",
lassoMode: "Lasso",
brushSize: "Rozmiar pędzla",
+4
View File
@@ -1571,6 +1571,10 @@ export const ptBR: TranslationKeys = {
progressLabelBatch: "Ampliando {count} imagens",
},
"erase-object": {
qualityFast: "Rápido",
qualityHq: "Alta qualidade",
qualityHint:
"A alta qualidade usa um modelo de difusão para objetos grandes e texturas detalhadas.",
brushMode: "Pincel",
lassoMode: "Laço",
brushSize: "Tamanho do pincel",
+4
View File
@@ -1571,6 +1571,10 @@ export const ru: TranslationKeys = {
progressLabelBatch: "Увеличение {count} изображений",
},
"erase-object": {
qualityFast: "Быстро",
qualityHq: "Высокое качество",
qualityHint:
"Высокое качество использует диффузионную модель для больших объектов и детальных текстур.",
brushMode: "Кисть",
lassoMode: "Лассо",
brushSize: "Размер кисти",
+4
View File
@@ -1568,6 +1568,10 @@ export const sv: TranslationKeys = {
progressLabelBatch: "Uppskalar {count} bilder",
},
"erase-object": {
qualityFast: "Snabb",
qualityHq: "Hög kvalitet",
qualityHint:
"Hög kvalitet använder en diffusionsmodell för stora objekt och detaljerade texturer.",
brushMode: "Pensel",
lassoMode: "Lasso",
brushSize: "Penselstorlek",
+3
View File
@@ -1548,6 +1548,9 @@ export const th: TranslationKeys = {
progressLabelBatch: "กำลังขยาย {count} ภาพ",
},
"erase-object": {
qualityFast: "เร็ว",
qualityHq: "คุณภาพสูง",
qualityHint: "คุณภาพสูงใช้โมเดล diffusion สำหรับวัตถุขนาดใหญ่และพื้นผิวที่มีรายละเอียด",
brushMode: "แปรง",
lassoMode: "ลาสโซ",
brushSize: "ขนาดแปรง",
+4
View File
@@ -1571,6 +1571,10 @@ export const tr: TranslationKeys = {
progressLabelBatch: "{count} görüntü büyütülüyor",
},
"erase-object": {
qualityFast: "Hızlı",
qualityHq: "Yüksek kalite",
qualityHint:
"Yüksek kalite, büyük nesneler ve ayrıntılı dokular için bir difüzyon modeli kullanır.",
brushMode: "Fırça",
lassoMode: "Kement",
brushSize: "Fırça Boyutu",
+4
View File
@@ -1571,6 +1571,10 @@ export const uk: TranslationKeys = {
progressLabelBatch: "Збільшення {count} зображень",
},
"erase-object": {
qualityFast: "Швидко",
qualityHq: "Висока якість",
qualityHint:
"Висока якість використовує дифузійну модель для великих об'єктів і детальних текстур.",
brushMode: "Пензель",
lassoMode: "Ласо",
brushSize: "Розмір пензля",
+3
View File
@@ -1571,6 +1571,9 @@ export const vi: TranslationKeys = {
progressLabelBatch: "Đang phóng to {count} ảnh",
},
"erase-object": {
qualityFast: "Nhanh",
qualityHq: "Chất lượng cao",
qualityHint: "Chất lượng cao dùng mô hình khuếch tán cho vật thể lớn và kết cấu chi tiết.",
brushMode: "Cọ",
lassoMode: "Lasso",
brushSize: "Kích thước cọ",
+3
View File
@@ -1336,6 +1336,9 @@ export const zhCN: TranslationKeys = {
progressLabelBatch: "正在放大 {count} 张图片",
},
"erase-object": {
qualityFast: "快速",
qualityHq: "高质量",
qualityHint: "高质量使用扩散模型处理大型物体和精细纹理。",
brushMode: "画笔",
lassoMode: "套索",
brushSize: "画笔大小",
+3
View File
@@ -1336,6 +1336,9 @@ export const zhTW: TranslationKeys = {
progressLabelBatch: "正在放大{count}張影像",
},
"erase-object": {
qualityFast: "快速",
qualityHq: "高品質",
qualityHint: "高品質使用擴散模型處理大型物件與精細紋理。",
brushMode: "筆刷",
lassoMode: "套索",
brushSize: "筆刷大小",