Add image selection refinement functionality with BEN2 integration

- Implemented viewport.py for handling 3D view projections, gestures, and overlay drawing.
- Created refine_image_selection.py to manage the refinement of gesture masks and output image bounds.
- Added selection module with refine_selection.py to process and crop images based on alpha channel visibility.
- Introduced __init__.py for selection module to expose refine_selection function.
This commit is contained in:
2026-08-31 22:10:05 +08:00
parent 14d63001d2
commit c97b4a3e41
76 changed files with 2127 additions and 1137 deletions

View File

@@ -1,35 +1,35 @@
"""Generate optional AI files for one Blender-rasterized Cutout Region."""
"""Generate optional AI files for one Blender-rasterized Cutout Selection."""
import json
from pathlib import Path
from ..geometry.prediction_artifacts import generate_moge2_artifacts
from ..region import refine_region
from ..selection import refine_selection
def run(context, parameters):
context.progress(0.05, "Preparing Cutout Region")
context.progress(0.05, "Preparing Cutout Selection")
context.directory.mkdir(parents=True, exist_ok=True)
input_path = Path(parameters["input"])
region_image_path = input_path
selection_image_path = input_path
result = {}
if parameters.get("refine_region"):
context.progress(0.2, "Refining Region")
region_image_path, bounds = refine_region(
if parameters.get("refine_selection"):
context.progress(0.2, "Refining Selection")
selection_image_path, bounds = refine_selection(
context,
input_path,
parameters["refine_model"],
parameters["device"],
context.directory / "region.png",
context.directory / "selection.png",
)
bounds_path = context.directory / "region_bounds.json"
bounds_path = context.directory / "selection_bounds.json"
bounds_path.write_text(
json.dumps(bounds, separators=(",", ":")),
encoding="utf-8",
)
result.update(
region_image=region_image_path.name,
region_bounds=bounds_path.name,
selection_image=selection_image_path.name,
selection_bounds=bounds_path.name,
)
depth_mode = str(parameters.get("depth_mode", "NONE"))
@@ -38,7 +38,7 @@ def run(context, parameters):
artifacts = generate_moge2_artifacts(
context,
parameters,
region_image_path,
selection_image_path,
depth_mode=depth_mode,
normal_mode=normal_mode,
)

View File

@@ -1,18 +1,18 @@
import json
import time
from ..region import refine_region
from ..selection import refine_selection
def run(context, parameters):
"""Refine a gesture mask with BEN2 and return its source-image bounds."""
started = time.perf_counter()
context.progress(0.05, "Preparing image Region")
context.progress(0.05, "Preparing image Selection")
context.check_cancelled()
output_directory = context.directory
output_directory.mkdir(parents=True, exist_ok=True)
context.progress(0.2, f"Loading BEN2 for {parameters['device'].upper()}")
output_path, bounds = refine_region(
output_path, bounds = refine_selection(
context,
parameters["input"],
parameters["model"],
@@ -22,6 +22,6 @@ def run(context, parameters):
bounds_path = output_directory / "bounds.json"
bounds_path.write_text(json.dumps(bounds, separators=(",", ":")), encoding="utf-8")
elapsed_ms = (time.perf_counter() - started) * 1000.0
message = f"Image Region refined in {elapsed_ms:.0f} ms"
message = f"Image Selection refined in {elapsed_ms:.0f} ms"
context.progress(1.0, message)
return {"region_image": output_path.name, "region_bounds": bounds_path.name}
return {"selection_image": output_path.name, "selection_bounds": bounds_path.name}