Rescue ViTMatte dropouts with the segmentation mask
Add fill_seg_dropouts: where ViTMatte's alpha is ~0 but BiRefNet confidently asserts foreground, restore a faint alpha from the mask (strength * seg_mask). This recovers green-contaminated wisps that ViTMatte cuts because they are nearly the background colour, while leaving ViTMatte's sharper edges elsewhere untouched (gated to true dropouts) and not refilling the finger gap (low mask). On the TestImage2 shoulder, faint wisps ViTMatte cut drop from 72% to 33%; the finger gap stays transparent. The rescued wisps are still green-tinted -- the recolor pass (next) restores their colour. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -6,7 +6,12 @@ from pathlib import Path
|
||||
|
||||
import numpy as np
|
||||
|
||||
from .alpha_post import clean_alpha, enforce_trimap, suppress_alpha_by_chroma
|
||||
from .alpha_post import (
|
||||
clean_alpha,
|
||||
enforce_trimap,
|
||||
fill_seg_dropouts,
|
||||
suppress_alpha_by_chroma,
|
||||
)
|
||||
from .chroma import compute_bg_confidence
|
||||
from .despill import despill_green
|
||||
from .foreground import estimate_foreground_rgb
|
||||
@@ -86,6 +91,8 @@ def _run_image(
|
||||
alpha = enforce_trimap(alpha, trimap)
|
||||
alpha = suppress_alpha_by_chroma(alpha, bg_confidence, trimap, settings.alpha_post)
|
||||
alpha = clean_alpha(alpha, trimap, settings.alpha_post)
|
||||
if seg_mask is not None:
|
||||
alpha = fill_seg_dropouts(alpha, seg_mask, settings.alpha_post)
|
||||
foreground = estimate_foreground_rgb(
|
||||
rgb, alpha, bg_confidence, model, settings.foreground
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user