Segment 085 volumetric ground-truth transfer plan
Summary
plan only No point-cloud processing or upload has started.
After approval, the work will run entirely on Battlebox. The human-annotated LAZ will act as a 3-D class-mask source. The current segmentation pipeline will produce the dense cloud's full-resolution baseline classes. Human labels will then replace that baseline only inside conservatively matched 3-D annotation volumes; every other point will keep its baseline class. A verified full-resolution LAZ and audit report will be copied to the annotated N-drive folder.
| Observed input | Verified fact | Consequence |
|---|---|---|
| Human annotation | LAS 1.4, point format 7, 1 mm scale, 1,872,942 points | Treat it as a sparse/voxelized mask, not as the output point set. |
| Dense target | Eight run3 NPZ shards, 47,847,093 points | Transfer and export must be chunked and must preserve all rows. |
| Coordinate frame | Applying the recorded run3 geoshift places the dense bounds around and over the annotated bounds; their minimum Z agrees | No ICP is planned. The known geoshift is the authoritative transform. |
| Existing exporter | The standard repo writer exports only 1 cm representatives | Reuse fusion and conventions, but use a full-resolution streaming LAZ writer. |
Key decisions
- The LAS
classificationbyte is authoritative. RGB remains sensor RGB by default; ReCap/CloudCompare can display colors by classification. This avoids destroying source color. - “Volumetric” means real XYZ support. The primary mask is the union of occupied 1 cm cubes in pipeline coordinates, using the repo's established
floor(xyz / voxel)convention. Every dense point inside an annotated cube receives that annotation. There is no XY projection, vertical curtain, convex hull, or unbounded nearest-neighbour painting. - Unmatched means byte-for-byte unchanged classification. The baseline is
FuseResult.classificationfrom the current segmentation run. Raw run3 NPZs contain point attributes but no class field, so the fusion must be reproduced before transfer. - Ambiguity is rejected, not guessed. If one annotation voxel contains conflicting classes, or optional gap filling is equally supported by two classes, those dense points retain the baseline class and appear in the report.
- The original annotation and upstream NPZs stay untouched. Work happens in a dedicated D-drive staging directory. N-drive publication uses a temporary filename, hash verification, then rename.
Repo code to reuse
| Component | Use | Boundary |
|---|---|---|
fuse_segment | Generate full-resolution baseline class and point order | Do not pass the final cloud through the decimating standard writer. |
recap_import reader/frame logic | Read the annotated class field and follow the existing geoshift/1 mm conventions | Its 1 mm hash plus 2 mm fallback is identity correction, not dense volumetric transfer. |
voxel convention | Build deterministic 1 cm 3-D annotation cells | The old voxel-map sidecar is absent, so the dense mapping must be reconstructed. |
| writer header conventions | LAS 1.4 PDRF7, 1 mm scale, EPSG:25832 WKT, class codes | Use a new chunked LAZ path because the existing writer decimates and emits LAS. |
Phases
Phase 1 Stage and fingerprint inputs
- Copy the annotated LAZ from the N drive to a dedicated Battlebox D-drive workspace through Windows PowerShell; N is not mounted inside WSL.
- Record SHA-256, point count, LAS version/format, scales, offsets, CRS, bounds, dimensions, and per-class counts before doing any transfer.
- Inventory the eight dense NPZ shards in deterministic filename order and record their hashes, shapes, bounds, and total point count.
- Fail before processing if the annotated file changed since this plan's inspection or any expected shard is missing.
Phase 2 Reproduce the dense baseline classification
- Run the checked-out segmentation fusion at recorded commit/config against segment 085, using only detector artifacts whose manifests and point-row contracts align with this target.
- Capture the resolved configuration, stage skips, class histogram, input records, runtime, and commit/package versions.
- Keep the full
FuseResult.classificationarray aligned to all 47,847,093 source rows. This is the immutable baseline for unmatched points. - Write work products to a new staging folder so the repo's stale-output sweep cannot touch earlier deliveries or human annotation.
Gate Prove coordinate and mask compatibility
- Subtract the recorded run3 geoshift from annotation XYZ and compare world/local bounds.
- Measure 1 mm hash matches and nearest dense-point distances for every annotated point, split by class and connected component.
- Confirm the old cloud is consistent with the expected 1 cm decimation grid. A systematic offset, rotation, CRS disagreement, or unexpectedly low support stops the run for review; no automatic ICP correction is allowed.
- Identify explicit annotation class codes from the histogram. Unclassified/background points define no paint volume unless deliberately selected.
Phase 3 Transfer class masks in 3-D
- Convert annotated points to geoshift-relative 1 cm voxel keys and build a per-class occupied-voxel map. Split disconnected components so nearby objects cannot bridge.
- Stream each dense shard in original row order. Points whose XYZ fall in one unambiguous annotated voxel inherit that voxel's human class.
- Optionally fill only a one-voxel gap when enabled: require a nearest annotated point within a hard 15 mm 3-D radius and unambiguous class support. Otherwise retain the baseline.
- Record, for every class, exact 1 mm matches, same-voxel additions, optional gap-fill additions, ambiguous points, and untouched points.
This paints the full dense contents of annotated 3-D cells while keeping expansion tightly bounded. It does not turn a 2-D footprint into a vertical prism.
Phase 4 Stream a full-resolution LAZ
- Write LAS 1.4 point format 7 with 1 mm XYZ scale, the known world geoshift, EPSG:25832 WKT, intensity, sensor RGB, scan angle, return-count data, and final classification.
- Use chunked LAZ compression so the 47.8M-point cloud is never duplicated unnecessarily in memory or staged as a multi-gigabyte uncompressed LAS.
- Preserve deterministic NPZ shard order and within-shard row order. The standard repo writer is not used for this file because it selects only voxel representatives.
- Write an adjacent JSON audit report with provenance, hashes, algorithms/thresholds, counts, bounds, and class deltas.
Phase 5 Verify, preview, and publish to N
- Reopen the LAZ and require exactly 47,847,093 points, expected bounds/CRS, valid classifications, and the same non-class attributes after LAS quantization.
- Prove by index that every point outside the accepted 3-D mask has the same class as the baseline.
- Generate class-count and top/side component QC summaries; sample boundaries and all ambiguity cases before upload.
- Copy the LAZ and report from WSL staging to a
.partialname on N through Windows, verify size and SHA-256 on both sides, then rename to the final filename. - Report the final N-drive path, hashes, point count, changed/unchanged counts, class deltas, transfer coverage, and any rejected regions.
Risks
| Risk | Control |
|---|---|
| high Baseline config does not match the intended new segmentation | Resolve and record every fusion input/config before transfer; stop on incompatible manifests instead of silently skipping an expected detector. |
| high 3-D propagation leaks into an adjacent object/class | Same-voxel transfer by default, connected-component isolation, ambiguity rejection, and a hard 15 mm limit for any optional gap filling. |
| medium Coordinate or decimation grid mismatch | World/local bounds, 1 mm hashes, distance distributions, and voxel-phase checks are mandatory gates. No automatic rigid registration. |
| medium Standard export accidentally drops most points | Do not use the decimating repo writer; verify the exact full-resolution point count after reopening the LAZ. |
| medium N-drive sync receives a partial file | Upload under a temporary name, compare hashes, then rename only after validation. |
| low Source color is lost | Preserve sensor RGB by default and carry semantic color through standard LAS classification. |
Open questions
- Which dense baseline should define “remain the same class”?
default Re-run the current Battlebox checkout at its recorded commit with packaged defaults and every manifest-compatible detector artifact discoverable for this target; record all resolved inputs and stop if an expected detector cannot be identified.
alt Supply the exact earlier fusion command/config or an existing full-resolution classification artifact, if one exists elsewhere.
- How conservative should the volumetric mask be?
default Paint every dense point in the exact 1 cm 3-D voxels represented by annotated points; do not expand into neighbouring voxels.
alt Permit the documented one-voxel / 15 mm gap fill after reviewing the direct-transfer QC counts.
- Should RGB be changed as well as LAS classification?
default Preserve sensor RGB and update only
classification; use the viewer's classification palette.alt Bake the final class palette into RGB for immediate display, accepting loss of sensor color.
- What should be published to N?
default
segment_085_dense_gt_transferred.lazplussegment_085_dense_gt_transfer_report.jsonbeside the existing annotated file.alt Use a different destination folder or filename supplied before execution.
Reply “approve defaults” to authorize processing, or answer only the question numbers you want to change.