Pull alpha toward 0 in the unknown band where bg_confidence is high, so green that survives in hair gaps and hole pockets goes transparent (doc section 10). Runs between trimap enforcement and alpha cleanup; sure-foreground pixels are never touched, keyed by the bg_confidence we already compute. On the two samples this clears the faint outer green halo (edge pixels 19.3k -> 16.0k) but has little *visible* effect, because their residual is no longer green: it is magenta from the pymatting unmix on genuine semi-transparent hair (vis-magenta p95 ~0.07, identical pre/post despill), which this pass deliberately leaves alone. The magenta needs a separate colour fix. Knobs live in AlphaPostSettings (chroma_suppress*, default on). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
BgFilter
Offline green screen character matting for AI-generated character images.
The first implementation follows the workflow in
docs/green_screen_matting_workflow.md:
RGB input -> chroma confidence -> trimap -> ViTMatte -> alpha cleanup -> despill -> RGBA PNG -> QA previews
Environment
Use the conda environment lightML.
conda activate lightML
pip install -r requirements.txt
If the shell is not activated, call the environment Python directly:
D:\MiniConda\envs\lightML\python.exe -m bgfilter.cli --help
Single Image
D:\MiniConda\envs\lightML\python.exe -m bgfilter.cli `
--input Samples\TestImage.png `
--output Outputs\TestImage_rgba.png `
--debug-dir Outputs\TestImage_debug `
--config configs\default.yaml `
--device cuda
The CLI reads configs/default.yaml when --config is provided. Command-line
options override config values, so tuning can usually happen in YAML while
runtime choices such as --device cpu stay on the command line.
Use CPU for validation when CUDA is unavailable:
D:\MiniConda\envs\lightML\python.exe -m bgfilter.cli `
--input Samples\TestImage.png `
--output Outputs\TestImage_rgba.png `
--debug-dir Outputs\TestImage_debug `
--config configs\default.yaml `
--device cpu
Batch
D:\MiniConda\envs\lightML\python.exe -m bgfilter.cli `
--input-dir Samples `
--output-dir Outputs `
--debug-dir Outputs\debug `
--config configs\default.yaml `
--device cuda
Chroma-Only Debug Mode
This mode skips ViTMatte and uses chroma confidence as an alpha seed. It is useful for fast debugging of chroma confidence, trimap, despill, and QA outputs.
D:\MiniConda\envs\lightML\python.exe -m bgfilter.cli `
--input-dir Samples `
--output-dir Outputs\chroma `
--debug-dir Outputs\chroma_debug `
--config configs\default.yaml `
--matting-method chroma `
--device cpu
Outputs
For each processed image, the CLI writes an RGBA PNG and optional debug files:
bg_confidence.png
trimap.png
alpha.png
foreground_rgb.png
foreground_background.png
foreground_correction.png
despill_mask.png
preview_black.png
preview_white.png
preview_gray.png
preview_red.png
preview_blue.png
qa_grid.png
metadata.json
Quality Check
The quality checker measures alpha validity and green spill on semi-transparent edge pixels.
D:\MiniConda\envs\lightML\python.exe -m bgfilter.quality_cli `
Outputs\TestImage_rgba.png `
--max-edge-green-excess-p95 0.30
Run the bundled sample smoke check:
D:\MiniConda\envs\lightML\python.exe scripts\smoke_samples.py `
--samples-dir Samples `
--output-dir Outputs\smoke_samples `
--config configs\default.yaml `
--device cpu `
--fallback-to-chroma-alpha `
--max-edge-green-excess-p95 0.30
Current Notes
Samples/andOutputs/are ignored by Git.ViTMattemodel weights are loaded from Hugging Face on first use.- Foreground color estimation uses pymatting's
estimate_foreground_mlto propagate clean foreground colour into semi-transparent edges before final de-spill, writing the estimated foreground, background, and a correction map. Setforeground.method: unmixto fall back to the legacy heuristic.