修正 mini_npz 深度数据职责
This commit is contained in:
@@ -9,7 +9,6 @@ DEPTH_KEY_CANDIDATES = ("depth", "depths")
|
||||
INTRINSICS_KEY_CANDIDATES = ("intrinsics", "ixts")
|
||||
DISPLACEMENT_STRENGTH = 1.0
|
||||
DISPLACEMENT_MIDLEVEL = 0.0
|
||||
REFERENCE_DEPTH_KEY = "snapform_reference_depth"
|
||||
ORIGINAL_DISPLACEMENT_STRENGTH = 1.0
|
||||
ORIGINAL_DISPLACEMENT_MIDLEVEL = 0.0
|
||||
BUMP_BASE_DISTANCE = 0.001
|
||||
@@ -695,25 +694,6 @@ def extract_intrinsics_array(npz_path):
|
||||
return intrinsics
|
||||
|
||||
|
||||
def extract_reference_depth(npz_path):
|
||||
try:
|
||||
import numpy as np
|
||||
except ImportError as error:
|
||||
raise RuntimeError("Blender Python does not provide NumPy") from error
|
||||
|
||||
try:
|
||||
with np.load(npz_path, allow_pickle=False) as archive:
|
||||
if REFERENCE_DEPTH_KEY not in archive.files:
|
||||
return None
|
||||
reference_depth = float(archive[REFERENCE_DEPTH_KEY])
|
||||
except OSError as error:
|
||||
raise ValueError(f"Unable to read Mini NPZ: {npz_path}") from error
|
||||
|
||||
if not np.isfinite(reference_depth) or reference_depth <= 0.0:
|
||||
raise ValueError("Mini NPZ has an invalid reference depth")
|
||||
return reference_depth
|
||||
|
||||
|
||||
def prepare_depth_values(depth):
|
||||
import numpy as np
|
||||
|
||||
@@ -725,6 +705,13 @@ def prepare_depth_values(depth):
|
||||
return values
|
||||
|
||||
|
||||
def depth_displacement_values(depth):
|
||||
"""Convert raw DA3 camera distance to positive outward displacement."""
|
||||
import numpy as np
|
||||
|
||||
return 1.0 - np.asarray(depth, dtype=np.float32)
|
||||
|
||||
|
||||
def camera_plane_bounds(
|
||||
source_object,
|
||||
depth,
|
||||
@@ -1407,18 +1394,19 @@ def build_depth_plane(
|
||||
depth_frames_directory=None,
|
||||
):
|
||||
source_name = source_object.name
|
||||
depth_arrays = extract_depth_arrays(npz_path)
|
||||
depth = depth_arrays[0]
|
||||
raw_depth_arrays = extract_depth_arrays(npz_path)
|
||||
raw_depth = raw_depth_arrays[0]
|
||||
intrinsics = extract_intrinsics_array(npz_path)
|
||||
stored_reference_depth = extract_reference_depth(npz_path)
|
||||
depth_values = prepare_depth_values(depth)
|
||||
raw_depth_values = prepare_depth_values(raw_depth)
|
||||
bounds, reference_depth = camera_plane_bounds(
|
||||
source_object,
|
||||
depth_values,
|
||||
raw_depth_values,
|
||||
intrinsics,
|
||||
DISPLACEMENT_STRENGTH,
|
||||
reference_depth=stored_reference_depth,
|
||||
)
|
||||
depth_arrays = [
|
||||
depth_displacement_values(frame) for frame in raw_depth_arrays
|
||||
]
|
||||
depth_name = depth_name or depth_data_name(source_object)
|
||||
frame_count = len(depth_arrays)
|
||||
foreground_image = (
|
||||
|
||||
@@ -36,7 +36,6 @@ HF_ENDPOINT = "https://huggingface.co"
|
||||
MODELSCOPE_ENDPOINT = "https://modelscope.cn"
|
||||
MODELSCOPE_REVISION = "master"
|
||||
MODELSCOPE_TIMEOUT = 60.0
|
||||
REFERENCE_DEPTH_KEY = "snapform_reference_depth"
|
||||
|
||||
|
||||
class TaskCancelled(RuntimeError):
|
||||
@@ -48,37 +47,6 @@ def check_cancelled(cancel_check):
|
||||
raise TaskCancelled("Task cancelled")
|
||||
|
||||
|
||||
def convert_ai_depth_for_displacement(prediction):
|
||||
"""Convert DA3 distance into Blender's positive displacement direction."""
|
||||
import numpy as np
|
||||
|
||||
prediction.depth = 1.0 - np.asarray(prediction.depth)
|
||||
|
||||
|
||||
def depth_reference_value(depth):
|
||||
"""Return the unmasked depth used to size the imported camera plane."""
|
||||
import numpy as np
|
||||
|
||||
values = np.asarray(depth)
|
||||
valid = np.isfinite(values) & (values > 0.0)
|
||||
if not valid.any():
|
||||
raise ValueError("Depth array contains no positive finite values")
|
||||
return float(np.median(values[valid]))
|
||||
|
||||
|
||||
def write_npz_reference_depth(npz_path, reference_depth):
|
||||
"""Add SnapForm metadata without changing exported prediction arrays."""
|
||||
import numpy as np
|
||||
|
||||
npz_path = Path(npz_path)
|
||||
temporary_path = npz_path.with_name(f"{npz_path.stem}.tmp.npz")
|
||||
with np.load(npz_path, allow_pickle=False) as archive:
|
||||
values = {key: archive[key] for key in archive.files}
|
||||
values[REFERENCE_DEPTH_KEY] = np.asarray(reference_depth, dtype=np.float32)
|
||||
np.savez_compressed(temporary_path, **values)
|
||||
temporary_path.replace(npz_path)
|
||||
|
||||
|
||||
def write_status(
|
||||
path,
|
||||
progress,
|
||||
@@ -1640,10 +1608,6 @@ def reconstruct(args, model_cache=None, cancel_check=None):
|
||||
ref_view_strategy=args.ref_view_strategy,
|
||||
)
|
||||
check_cancelled(cancel_check)
|
||||
reference_depth = None
|
||||
if args.export_format == "mini_npz":
|
||||
reference_depth = depth_reference_value(prediction.depth[0])
|
||||
convert_ai_depth_for_displacement(prediction)
|
||||
write_status(args.status, 0.88, f"Exporting {args.export_format}")
|
||||
if args.export_format == "mesh":
|
||||
export_textured_mesh_glb(
|
||||
@@ -1701,10 +1665,6 @@ def reconstruct(args, model_cache=None, cancel_check=None):
|
||||
result_paths,
|
||||
cancel_check=cancel_check,
|
||||
)
|
||||
if args.export_format == "mini_npz":
|
||||
result_path = output_directory / "results.npz"
|
||||
if reference_depth is not None:
|
||||
write_npz_reference_depth(result_path, reference_depth)
|
||||
check_cancelled(cancel_check)
|
||||
copy_frames(images, output_directory)
|
||||
write_status(
|
||||
|
||||
Reference in New Issue
Block a user