mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
fix: use U2-Net as default model (fast, 2s) with BiRefNet as opt-in
BiRefNet-Lite times out on first load (~60s+ for 973MB model). U2-Net works in 2 seconds. Users can still select BiRefNet for higher quality when they're willing to wait. Added timing hints in model descriptions and increased timeout for BiRefNet models.
This commit is contained in:
@@ -12,12 +12,12 @@ type BgModel =
|
|||||||
| "u2net";
|
| "u2net";
|
||||||
|
|
||||||
const MODELS: { value: BgModel; label: string; description: string }[] = [
|
const MODELS: { value: BgModel; label: string; description: string }[] = [
|
||||||
{ value: "birefnet-general", label: "BiRefNet", description: "Best quality (recommended)" },
|
{ value: "u2net", label: "U2-Net", description: "Fast, good quality (recommended)" },
|
||||||
{ value: "birefnet-general-lite", label: "BiRefNet Lite", description: "Faster, slightly less accurate" },
|
|
||||||
{ value: "birefnet-portrait", label: "BiRefNet Portrait", description: "Optimized for people" },
|
|
||||||
{ value: "bria-rmbg", label: "BRIA RMBG", description: "Great for products" },
|
|
||||||
{ value: "isnet-general-use", label: "IS-Net", description: "Good general purpose" },
|
{ value: "isnet-general-use", label: "IS-Net", description: "Good general purpose" },
|
||||||
{ value: "u2net", label: "U2-Net", description: "Classic, fast" },
|
{ value: "bria-rmbg", label: "BRIA RMBG", description: "Great for products" },
|
||||||
|
{ value: "birefnet-general-lite", label: "BiRefNet Lite", description: "Higher quality, slower (~15s)" },
|
||||||
|
{ value: "birefnet-portrait", label: "BiRefNet Portrait", description: "Best for people, slower (~15s)" },
|
||||||
|
{ value: "birefnet-general", label: "BiRefNet Full", description: "Best quality, very slow (~60s+)" },
|
||||||
];
|
];
|
||||||
|
|
||||||
const BG_PRESETS = [
|
const BG_PRESETS = [
|
||||||
@@ -34,7 +34,7 @@ export function RemoveBgSettings() {
|
|||||||
const { processFiles, processing, error, downloadUrl, originalSize, processedSize } =
|
const { processFiles, processing, error, downloadUrl, originalSize, processedSize } =
|
||||||
useToolProcessor("remove-background");
|
useToolProcessor("remove-background");
|
||||||
|
|
||||||
const [model, setModel] = useState<BgModel>("birefnet-general-lite");
|
const [model, setModel] = useState<BgModel>("u2net");
|
||||||
const [bgColor, setBgColor] = useState("");
|
const [bgColor, setBgColor] = useState("");
|
||||||
const [elapsed, setElapsed] = useState(0);
|
const [elapsed, setElapsed] = useState(0);
|
||||||
const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);
|
const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ def main():
|
|||||||
output_path = sys.argv[2]
|
output_path = sys.argv[2]
|
||||||
settings = json.loads(sys.argv[3]) if len(sys.argv) > 3 else {}
|
settings = json.loads(sys.argv[3]) if len(sys.argv) > 3 else {}
|
||||||
|
|
||||||
model = settings.get("model", "birefnet-general-lite")
|
model = settings.get("model", "u2net")
|
||||||
bg_color = settings.get("backgroundColor", "")
|
bg_color = settings.get("backgroundColor", "")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -3,7 +3,8 @@ import { writeFile, readFile } from "node:fs/promises";
|
|||||||
import { join } from "node:path";
|
import { join } from "node:path";
|
||||||
|
|
||||||
export interface RemoveBackgroundOptions {
|
export interface RemoveBackgroundOptions {
|
||||||
model?: "u2net" | "isnet";
|
model?: string;
|
||||||
|
backgroundColor?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function removeBackground(
|
export async function removeBackground(
|
||||||
@@ -15,11 +16,13 @@ export async function removeBackground(
|
|||||||
const outputPath = join(outputDir, "output_bg.png");
|
const outputPath = join(outputDir, "output_bg.png");
|
||||||
|
|
||||||
await writeFile(inputPath, inputBuffer);
|
await writeFile(inputPath, inputBuffer);
|
||||||
|
// BiRefNet models need longer timeout (up to 10 min for first load)
|
||||||
|
const timeout = options.model?.startsWith("birefnet") ? 600000 : 300000;
|
||||||
const { stdout } = await runPythonScript("remove_bg.py", [
|
const { stdout } = await runPythonScript("remove_bg.py", [
|
||||||
inputPath,
|
inputPath,
|
||||||
outputPath,
|
outputPath,
|
||||||
JSON.stringify(options),
|
JSON.stringify(options),
|
||||||
]);
|
], timeout);
|
||||||
|
|
||||||
const result = JSON.parse(stdout);
|
const result = JSON.parse(stdout);
|
||||||
if (!result.success) {
|
if (!result.success) {
|
||||||
|
|||||||
Reference in New Issue
Block a user