diff --git a/scripts/provision_belgium_building_training_portfolio.py b/scripts/provision_belgium_building_training_portfolio.py index fd331768..ee0f4e58 100644 --- a/scripts/provision_belgium_building_training_portfolio.py +++ b/scripts/provision_belgium_building_training_portfolio.py @@ -134,6 +134,13 @@ AOIS = ( Aoi("roeselare-parking-industry-v56-bg", "flanders", "parking-industrial-hard-negative", "train", 3.155, 50.960, "background_candidate"), Aoi("lommel-tree-road-train-v56-bg", "flanders", "park-road-hard-negative", "train", 5.345, 51.215, "background_candidate"), Aoi("nieuwpoort-marina-parking-v56-bg", "flanders", "coastal-parking-hard-negative", "train", 2.770, 51.142, "background_candidate"), + # v63 calibration remediation candidates. The former Genk/Lokeren/Oostende + # calibration labels failed visual roof-alignment review. These start as + # train-role candidates so the immutable holdout rotator can assign only + # visually accepted, spatially independent samples to calibration. + Aoi("aarschot-mixed-cal-candidate-v63", "flanders", "mixed-urban", "train", 4.837, 50.985), + Aoi("beveren-ribbon-cal-candidate-v63", "flanders", "ribbon-development", "train", 4.256, 51.212), + Aoi("oostkamp-suburban-cal-candidate-v63", "flanders", "suburban", "train", 3.226, 51.154), Aoi("bruges-val", "flanders", "historic-urban", "val", 3.224, 51.209), Aoi("turnhout-val", "flanders", "suburban", "val", 4.944, 51.322), Aoi("hasselt-cal", "flanders", "suburban", "calibration", 5.340, 50.930), diff --git a/tests/test_provision_belgium_building_training_portfolio.py b/tests/test_provision_belgium_building_training_portfolio.py new file mode 100644 index 00000000..bd022031 --- /dev/null +++ b/tests/test_provision_belgium_building_training_portfolio.py @@ -0,0 +1,21 @@ +from scripts.provision_belgium_building_training_portfolio import AOIS + + +V63_CANDIDATES = { + "aarschot-mixed-cal-candidate-v63", + "beveren-ribbon-cal-candidate-v63", + "oostkamp-suburban-cal-candidate-v63", +} + + +def test_portfolio_slugs_are_unique() -> None: + slugs = [aoi.slug for aoi in AOIS] + assert len(slugs) == len(set(slugs)) + + +def test_v63_calibration_candidates_are_flemish_train_role_inputs() -> None: + candidates = {aoi.slug: aoi for aoi in AOIS if aoi.slug in V63_CANDIDATES} + assert set(candidates) == V63_CANDIDATES + assert all(aoi.region == "flanders" for aoi in candidates.values()) + assert all(aoi.split == "train" for aoi in candidates.values()) + assert all(aoi.sample_role == "positive" for aoi in candidates.values())