Keep visible roof merging opt-in
GeoIntel release gates / Compile, test, contracts and builds (push) Canceled after 0s
GeoIntel release gates / Python and npm vulnerability policy (push) Canceled after 0s
GeoIntel release gates / GIS image, SBOM and container scan (push) Canceled after 0s

This commit is contained in:
Jens
2026-07-27 05:19:14 +02:00
parent de0406130c
commit 741ad20dcb
2 changed files with 9 additions and 8 deletions
+7 -7
View File
@@ -95,10 +95,10 @@ audit but excluded from training as `created_after_imagery_period`. UrbIS does
not expose an equivalent feature creation field in this acquisition contract, not expose an equivalent feature creation field in this acquisition contract,
so its remaining temporal relation stays an explicit sample-level limitation. so its remaining temporal relation stays an explicit sample-level limitation.
The detector target is an imagery-visible roof instance, not an administrative An opt-in visible-roof experiment can dissolve source footprints that truly
address or cadastral unit. Source footprints that truly touch or overlap are touch or overlap; separated footprints are never bridged. The audit retains
dissolved into one roof instance before tiling; separated footprints are never every contributing native feature identifier and reports both source-feature
bridged. The audit retains every contributing native feature identifier and and visible-instance counts. This mode is not the default: the Belgium v8
reports both the accepted source-feature count and resulting visible-instance experiment showed that unconditional touching-footprint dissolve can merge
count. This prevents dense row-house subdivisions that cannot be distinguished whole urban blocks and therefore must pass the same independent gates before
from the orthophoto from becoming contradictory image labels. it can replace native instances.
+2 -1
View File
@@ -102,6 +102,7 @@ def main() -> int:
parser.add_argument("--output-dir", type=Path, required=True) parser.add_argument("--output-dir", type=Path, required=True)
parser.add_argument("--version", default="building-be-v1") parser.add_argument("--version", default="building-be-v1")
parser.add_argument("--min-label-px", type=float, default=3.0) parser.add_argument("--min-label-px", type=float, default=3.0)
parser.add_argument("--merge-touching-roofs", action="store_true")
parser.add_argument("--freeze", action="store_true") parser.add_argument("--freeze", action="store_true")
args = parser.parse_args() args = parser.parse_args()
@@ -150,7 +151,7 @@ def main() -> int:
), ),
reference_observed_at=reference.observed_at.isoformat() if reference.observed_at else None, reference_observed_at=reference.observed_at.isoformat() if reference.observed_at else None,
imagery_valid_to=raster.valid_to.isoformat() if raster.valid_to else None, imagery_valid_to=raster.valid_to.isoformat() if raster.valid_to else None,
merge_touching_roofs=True, merge_touching_roofs=args.merge_touching_roofs,
) )
normalized_target.write_text(json.dumps(normalized, ensure_ascii=False), encoding="utf-8") normalized_target.write_text(json.dumps(normalized, ensure_ascii=False), encoding="utf-8")
audit_target.write_text(json.dumps(audit, ensure_ascii=False, indent=2), encoding="utf-8") audit_target.write_text(json.dumps(audit, ensure_ascii=False, indent=2), encoding="utf-8")