evaluate fresh Flemish remediation training
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-08-10 03:47:51 +02:00
parent b068a5e065
commit 98188e0a44
20 changed files with 5120 additions and 0 deletions
@@ -0,0 +1,9 @@
{
"dataset_yaml_sha256": "038d8cbda5cd85b6228069320a41ad52f43391d23dc3b20cbc553026fabe4dc0",
"promotion_allowed": false,
"release_claim_allowed": false,
"schema_version": 1,
"source_manifest_sha256": "afa0edc5f229e0451d4a3630bb0d716b0ac1d446a6f8c2f22807d4f83b818525",
"status": "experimental_only_human_review_pending",
"tile_asset_chain_sha256": "1b721a48ac567ad11f258e03f753e2763e11f87ce8e9b58f29e9dfda5c83f4f8"
}
@@ -0,0 +1,17 @@
{
"base_model": "/app/models/geointel-building-yolov8s-smallbld-minpx3-img640-ft30.pt",
"base_model_sha256": "a9088b8491dfae36694b53e9e9406cb4e3511d334a5712fa34f75078a47759c1",
"batch": 8,
"candidate_model": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/runs/v73-flanders-remediation-e20/candidate.experimental.pt",
"candidate_model_sha256": "c4d9995ca040dff4ca327f6022f30d679335998ef1968c3061102ae6ed4105ac",
"dataset_yaml_sha256": "038d8cbda5cd85b6228069320a41ad52f43391d23dc3b20cbc553026fabe4dc0",
"device": "NVIDIA GeForce RTX 4080 SUPER",
"epochs": 20,
"human_review_pending": true,
"imgsz": 640,
"promotion_allowed": false,
"release_claim_allowed": false,
"required_next_gate": "independent frozen V72 calibration evaluation",
"schema_version": 1,
"status": "trained_experimental_only"
}
@@ -0,0 +1,116 @@
{
"attempts": [
{
"map50": 0.05677865740374553,
"map50_95": 0.02175035531261916,
"model_path": "/app/models/geointel-building-yolov8s-smallbld-minpx3-img640-ft30.pt",
"model_sha256": "a9088b8491dfae36694b53e9e9406cb4e3511d334a5712fa34f75078a47759c1",
"precision": 0.1576550586330707,
"recall": 0.11781609195402298,
"size_bytes": 22516074,
"status": "ok"
},
{
"map50": 0.01885292400464415,
"map50_95": 0.00378065636983694,
"model_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/runs/v73-flanders-remediation-e20/candidate.experimental.pt",
"model_sha256": "c4d9995ca040dff4ca327f6022f30d679335998ef1968c3061102ae6ed4105ac",
"precision": 0.012361111111111111,
"recall": 0.2557471264367816,
"size_bytes": 22514858,
"status": "ok"
}
],
"candidate_count": 2,
"claim_boundary": "Non-protected validation ranking only; no test, challenge or promotion claim.",
"dataset_overlap_evidence": {
"interpretation": "Tiles do not overlap, but spatial/statistical independence is not established because adjacent tiles share AOI context and edge objects can remain split.",
"overlap_pixels": 0,
"statistical_independence_established": false,
"status": "non_overlapping",
"stride": 512,
"summary_path": "/app/storage/operator-data/building-be-v72-fresh-calibration-r1/diagnostic-yolo512-r2/yolo_tile_dataset_summary.json",
"summary_sha256": "78e16f46fa2a313a147404a19f2ce99417d2cb384b5db5f6ba33e934ff99c631",
"tile_size": 512,
"validation_tiles_non_overlapping": true
},
"dataset_yaml": "/app/storage/operator-data/building-be-v72-fresh-calibration-r1/diagnostic-yolo512-r2/dataset.yaml",
"dataset_yaml_sha256": "d1e85ffb6776d92a4534830f2214fa6444f5a9160329aca0a68d0ea0a1a40144",
"device": "cuda:0",
"generated_at": "2026-08-10T01:34:02.699043+00:00",
"model_lineage_independence_evidence": {
"evaluation_samples": [
"v72-assenede-field-cal-bg",
"v72-ganshoren-lowrise-cal",
"v72-havelange-field-cal-bg",
"v72-laeken-park-cal-bg",
"v72-libramont-lowrise-cal",
"v72-zandhoven-lowrise-cal"
],
"evaluation_summary_path": "/app/storage/operator-data/building-be-v72-fresh-calibration-r1/diagnostic-yolo512-r2/yolo_tile_dataset_summary.json",
"evaluation_summary_sha256": "78e16f46fa2a313a147404a19f2ce99417d2cb384b5db5f6ba33e934ff99c631",
"independent_for_all_supplied_lineage_corpora": true,
"interpretation": "No evaluation AOI occurs in any split of any supplied ancestral corpus.",
"lineage_corpora": [
{
"exposure_roles": {},
"lineage_sample_count": 19,
"lineage_summary_path": "/app/storage/operator-data/yolo-building-aoi1024-expanded-minpx4vis035/yolo_tile_dataset_summary.json",
"lineage_summary_sha256": "1887e2ba5c719d33675a9ed85db99a274fd66d98d5f6ad44558d673620917201",
"overlapping_evaluation_samples": []
},
{
"exposure_roles": {},
"lineage_sample_count": 22,
"lineage_summary_path": "/app/storage/operator-data/yolo-building-aoi1024-smallbld-minpx3vis035/yolo_tile_dataset_summary.json",
"lineage_summary_sha256": "49b2a07d2105d08356431757b83eafc1498eaf1fb76965b1efe05b776824942a",
"overlapping_evaluation_samples": []
},
{
"exposure_roles": {},
"lineage_sample_count": 28,
"lineage_summary_path": "/app/storage/operator-data/yolo-building-aoi1024-reviewedexp6-minpx3vis035/yolo_tile_dataset_summary.json",
"lineage_summary_sha256": "7c917e31216d1df2174c0f9c736f88a81f3835aa991971f8fb8665e17ddf5c9c",
"overlapping_evaluation_samples": []
},
{
"exposure_roles": {},
"lineage_sample_count": 12,
"lineage_summary_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/experimental_dataset_summary.json",
"lineage_summary_sha256": "047874a4f9362c82263ffe11c389a2f65168c449d3f6cbcc77cea709c0ba4c59",
"overlapping_evaluation_samples": []
}
],
"overlapping_evaluation_samples": [],
"status": "independent"
},
"pure_background_confidence": 0.15,
"pure_background_prefixes": [],
"ranking": [
{
"map50": 0.05677865740374553,
"map50_95": 0.02175035531261916,
"model_path": "/app/models/geointel-building-yolov8s-smallbld-minpx3-img640-ft30.pt",
"model_sha256": "a9088b8491dfae36694b53e9e9406cb4e3511d334a5712fa34f75078a47759c1",
"precision": 0.1576550586330707,
"recall": 0.11781609195402298,
"size_bytes": 22516074,
"status": "ok"
},
{
"map50": 0.01885292400464415,
"map50_95": 0.00378065636983694,
"model_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/runs/v73-flanders-remediation-e20/candidate.experimental.pt",
"model_sha256": "c4d9995ca040dff4ca327f6022f30d679335998ef1968c3061102ae6ed4105ac",
"precision": 0.012361111111111111,
"recall": 0.2557471264367816,
"size_bytes": 22514858,
"status": "ok"
}
],
"schema_version": 3,
"status": "ok",
"successful_candidate_count": 2,
"torch_version": "2.11.0+cu128",
"validation_image_count": 24
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 MiB

@@ -0,0 +1,116 @@
{
"attempts": [
{
"map50": 0.05677865740374553,
"map50_95": 0.02175035531261916,
"model_path": "/app/models/geointel-building-yolov8s-smallbld-minpx3-img640-ft30.pt",
"model_sha256": "a9088b8491dfae36694b53e9e9406cb4e3511d334a5712fa34f75078a47759c1",
"precision": 0.1576550586330707,
"recall": 0.11781609195402298,
"size_bytes": 22516074,
"status": "ok"
},
{
"map50": 0.0222135694107064,
"map50_95": 0.005679536478252313,
"model_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/runs/v73-flanders-remediation-controlled-e10/weights/best.pt",
"model_sha256": "e4f5ffc3080dc5781868f7add07176fa7b59cc50fb947ebb9b87495f3d9f20b2",
"precision": 0.017933658902666374,
"recall": 0.32471264367816094,
"size_bytes": 58905741,
"status": "ok"
}
],
"candidate_count": 2,
"claim_boundary": "Non-protected validation ranking only; no test, challenge or promotion claim.",
"dataset_overlap_evidence": {
"interpretation": "Tiles do not overlap, but spatial/statistical independence is not established because adjacent tiles share AOI context and edge objects can remain split.",
"overlap_pixels": 0,
"statistical_independence_established": false,
"status": "non_overlapping",
"stride": 512,
"summary_path": "/app/storage/operator-data/building-be-v72-fresh-calibration-r1/diagnostic-yolo512-r2/yolo_tile_dataset_summary.json",
"summary_sha256": "78e16f46fa2a313a147404a19f2ce99417d2cb384b5db5f6ba33e934ff99c631",
"tile_size": 512,
"validation_tiles_non_overlapping": true
},
"dataset_yaml": "/app/storage/operator-data/building-be-v72-fresh-calibration-r1/diagnostic-yolo512-r2/dataset.yaml",
"dataset_yaml_sha256": "d1e85ffb6776d92a4534830f2214fa6444f5a9160329aca0a68d0ea0a1a40144",
"device": "cuda:0",
"generated_at": "2026-08-10T01:39:48.410342+00:00",
"model_lineage_independence_evidence": {
"evaluation_samples": [
"v72-assenede-field-cal-bg",
"v72-ganshoren-lowrise-cal",
"v72-havelange-field-cal-bg",
"v72-laeken-park-cal-bg",
"v72-libramont-lowrise-cal",
"v72-zandhoven-lowrise-cal"
],
"evaluation_summary_path": "/app/storage/operator-data/building-be-v72-fresh-calibration-r1/diagnostic-yolo512-r2/yolo_tile_dataset_summary.json",
"evaluation_summary_sha256": "78e16f46fa2a313a147404a19f2ce99417d2cb384b5db5f6ba33e934ff99c631",
"independent_for_all_supplied_lineage_corpora": true,
"interpretation": "No evaluation AOI occurs in any split of any supplied ancestral corpus.",
"lineage_corpora": [
{
"exposure_roles": {},
"lineage_sample_count": 19,
"lineage_summary_path": "/app/storage/operator-data/yolo-building-aoi1024-expanded-minpx4vis035/yolo_tile_dataset_summary.json",
"lineage_summary_sha256": "1887e2ba5c719d33675a9ed85db99a274fd66d98d5f6ad44558d673620917201",
"overlapping_evaluation_samples": []
},
{
"exposure_roles": {},
"lineage_sample_count": 22,
"lineage_summary_path": "/app/storage/operator-data/yolo-building-aoi1024-smallbld-minpx3vis035/yolo_tile_dataset_summary.json",
"lineage_summary_sha256": "49b2a07d2105d08356431757b83eafc1498eaf1fb76965b1efe05b776824942a",
"overlapping_evaluation_samples": []
},
{
"exposure_roles": {},
"lineage_sample_count": 28,
"lineage_summary_path": "/app/storage/operator-data/yolo-building-aoi1024-reviewedexp6-minpx3vis035/yolo_tile_dataset_summary.json",
"lineage_summary_sha256": "7c917e31216d1df2174c0f9c736f88a81f3835aa991971f8fb8665e17ddf5c9c",
"overlapping_evaluation_samples": []
},
{
"exposure_roles": {},
"lineage_sample_count": 12,
"lineage_summary_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/experimental_dataset_summary.json",
"lineage_summary_sha256": "047874a4f9362c82263ffe11c389a2f65168c449d3f6cbcc77cea709c0ba4c59",
"overlapping_evaluation_samples": []
}
],
"overlapping_evaluation_samples": [],
"status": "independent"
},
"pure_background_confidence": 0.15,
"pure_background_prefixes": [],
"ranking": [
{
"map50": 0.05677865740374553,
"map50_95": 0.02175035531261916,
"model_path": "/app/models/geointel-building-yolov8s-smallbld-minpx3-img640-ft30.pt",
"model_sha256": "a9088b8491dfae36694b53e9e9406cb4e3511d334a5712fa34f75078a47759c1",
"precision": 0.1576550586330707,
"recall": 0.11781609195402298,
"size_bytes": 22516074,
"status": "ok"
},
{
"map50": 0.0222135694107064,
"map50_95": 0.005679536478252313,
"model_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/runs/v73-flanders-remediation-controlled-e10/weights/best.pt",
"model_sha256": "e4f5ffc3080dc5781868f7add07176fa7b59cc50fb947ebb9b87495f3d9f20b2",
"precision": 0.017933658902666374,
"recall": 0.32471264367816094,
"size_bytes": 58905741,
"status": "ok"
}
],
"schema_version": 3,
"status": "ok",
"successful_candidate_count": 2,
"torch_version": "2.11.0+cu128",
"validation_image_count": 24
}
@@ -0,0 +1,11 @@
{
"schema_version": 2,
"dataset_version": "building-be-v73-fresh-flanders-train-r1",
"manifest_sha256": "afa0edc5f229e0451d4a3630bb0d716b0ac1d446a6f8c2f22807d4f83b818525",
"sample_count": 12,
"immutable": true,
"training_eligibility_policy": "geointel-training-source-eligibility/v1",
"fixture_mode": false,
"training_allowed": true,
"release_claim_allowed": false
}
@@ -0,0 +1,5 @@
{
"status": "ok",
"buffer_m": 64.0,
"findings": []
}
@@ -0,0 +1,822 @@
{
"blank_range_threshold": 3,
"class_names": [],
"columns": 6,
"contact_sheets": [
{
"columns": 6,
"path": "contact_sheet_001.png",
"thumb_size": 320,
"tile_count": 24
},
{
"columns": 6,
"path": "contact_sheet_002.png",
"thumb_size": 320,
"tile_count": 24
}
],
"dataset_output_dir": null,
"highlight_category_counts": {},
"highlighted_label_count": 0,
"invalid_label_count": 0,
"low_visual_variance_tile_count": 0,
"max_tiles": 48,
"missing_image_count": 0,
"missing_label_file_count": 0,
"outlier_highlight_count": 0,
"relationship_highlight_count": 0,
"rendered_tile_count": 48,
"requested_sample_slugs": [],
"selected_sample_count": 12,
"selected_sample_slugs": [
"v73-adinkerke-dunes-train-bg",
"v73-borgloon-rural-train",
"v73-doel-port-train-bg",
"v73-houthulst-forest-train-bg",
"v73-kaprijke-field-train-bg",
"v73-kontich-lowrise-train",
"v73-lede-ribbon-train",
"v73-peer-field-train-bg",
"v73-ronse-industry-train-bg",
"v73-schoten-lowrise-train",
"v73-tielt-rural-train",
"v73-wevelgem-industry-train"
],
"selected_tile_count": 48,
"selected_tiles": [
{
"background_category": "reference_aoi",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-schoten-lowrise-train_0004_r512_c512.png",
"invalid_label_count": 0,
"label_count": 90,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-schoten-lowrise-train_0004_r512_c512.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "positive",
"sample_slug": "v73-schoten-lowrise-train",
"split": "train",
"tile_index": 4,
"valid_label_count": 90
},
{
"background_category": "reference_aoi",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-lede-ribbon-train_0003_r512_c0.png",
"invalid_label_count": 0,
"label_count": 71,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-lede-ribbon-train_0003_r512_c0.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "positive",
"sample_slug": "v73-lede-ribbon-train",
"split": "train",
"tile_index": 3,
"valid_label_count": 71
},
{
"background_category": "reference_aoi",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-kontich-lowrise-train_0003_r512_c0.png",
"invalid_label_count": 0,
"label_count": 70,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-kontich-lowrise-train_0003_r512_c0.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "positive",
"sample_slug": "v73-kontich-lowrise-train",
"split": "train",
"tile_index": 3,
"valid_label_count": 70
},
{
"background_category": "sparse_building_context",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-ronse-industry-train-bg_0000_r0_c0.png",
"invalid_label_count": 0,
"label_count": 70,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-ronse-industry-train-bg_0000_r0_c0.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "background_candidate",
"sample_slug": "v73-ronse-industry-train-bg",
"split": "train",
"tile_index": 0,
"valid_label_count": 70
},
{
"background_category": "reference_aoi",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-tielt-rural-train_0001_r0_c512.png",
"invalid_label_count": 0,
"label_count": 69,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-tielt-rural-train_0001_r0_c512.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "positive",
"sample_slug": "v73-tielt-rural-train",
"split": "train",
"tile_index": 1,
"valid_label_count": 69
},
{
"background_category": "reference_aoi",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-schoten-lowrise-train_0000_r0_c0.png",
"invalid_label_count": 0,
"label_count": 68,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-schoten-lowrise-train_0000_r0_c0.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "positive",
"sample_slug": "v73-schoten-lowrise-train",
"split": "train",
"tile_index": 0,
"valid_label_count": 68
},
{
"background_category": "reference_aoi",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-schoten-lowrise-train_0001_r0_c512.png",
"invalid_label_count": 0,
"label_count": 67,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-schoten-lowrise-train_0001_r0_c512.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "positive",
"sample_slug": "v73-schoten-lowrise-train",
"split": "train",
"tile_index": 1,
"valid_label_count": 67
},
{
"background_category": "reference_aoi",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-kontich-lowrise-train_0001_r0_c512.png",
"invalid_label_count": 0,
"label_count": 65,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-kontich-lowrise-train_0001_r0_c512.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "positive",
"sample_slug": "v73-kontich-lowrise-train",
"split": "train",
"tile_index": 1,
"valid_label_count": 65
},
{
"background_category": "reference_aoi",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-kontich-lowrise-train_0004_r512_c512.png",
"invalid_label_count": 0,
"label_count": 59,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-kontich-lowrise-train_0004_r512_c512.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "positive",
"sample_slug": "v73-kontich-lowrise-train",
"split": "train",
"tile_index": 4,
"valid_label_count": 59
},
{
"background_category": "sparse_building_context",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-adinkerke-dunes-train-bg_0003_r512_c0.png",
"invalid_label_count": 0,
"label_count": 58,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-adinkerke-dunes-train-bg_0003_r512_c0.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "background_candidate",
"sample_slug": "v73-adinkerke-dunes-train-bg",
"split": "train",
"tile_index": 3,
"valid_label_count": 58
},
{
"background_category": "reference_aoi",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-tielt-rural-train_0004_r512_c512.png",
"invalid_label_count": 0,
"label_count": 58,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-tielt-rural-train_0004_r512_c512.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "positive",
"sample_slug": "v73-tielt-rural-train",
"split": "train",
"tile_index": 4,
"valid_label_count": 58
},
{
"background_category": "reference_aoi",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-lede-ribbon-train_0004_r512_c512.png",
"invalid_label_count": 0,
"label_count": 57,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-lede-ribbon-train_0004_r512_c512.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "positive",
"sample_slug": "v73-lede-ribbon-train",
"split": "train",
"tile_index": 4,
"valid_label_count": 57
},
{
"background_category": "reference_aoi",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-tielt-rural-train_0000_r0_c0.png",
"invalid_label_count": 0,
"label_count": 56,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-tielt-rural-train_0000_r0_c0.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "positive",
"sample_slug": "v73-tielt-rural-train",
"split": "train",
"tile_index": 0,
"valid_label_count": 56
},
{
"background_category": "reference_aoi",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-borgloon-rural-train_0003_r512_c0.png",
"invalid_label_count": 0,
"label_count": 54,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-borgloon-rural-train_0003_r512_c0.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "positive",
"sample_slug": "v73-borgloon-rural-train",
"split": "train",
"tile_index": 3,
"valid_label_count": 54
},
{
"background_category": "reference_aoi",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-tielt-rural-train_0003_r512_c0.png",
"invalid_label_count": 0,
"label_count": 48,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-tielt-rural-train_0003_r512_c0.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "positive",
"sample_slug": "v73-tielt-rural-train",
"split": "train",
"tile_index": 3,
"valid_label_count": 48
},
{
"background_category": "reference_aoi",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-kontich-lowrise-train_0000_r0_c0.png",
"invalid_label_count": 0,
"label_count": 45,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-kontich-lowrise-train_0000_r0_c0.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "positive",
"sample_slug": "v73-kontich-lowrise-train",
"split": "train",
"tile_index": 0,
"valid_label_count": 45
},
{
"background_category": "sparse_building_context",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-ronse-industry-train-bg_0001_r0_c512.png",
"invalid_label_count": 0,
"label_count": 43,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-ronse-industry-train-bg_0001_r0_c512.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "background_candidate",
"sample_slug": "v73-ronse-industry-train-bg",
"split": "train",
"tile_index": 1,
"valid_label_count": 43
},
{
"background_category": "sparse_building_context",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-houthulst-forest-train-bg_0003_r512_c0.png",
"invalid_label_count": 0,
"label_count": 42,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-houthulst-forest-train-bg_0003_r512_c0.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "background_candidate",
"sample_slug": "v73-houthulst-forest-train-bg",
"split": "train",
"tile_index": 3,
"valid_label_count": 42
},
{
"background_category": "reference_aoi",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-lede-ribbon-train_0001_r0_c512.png",
"invalid_label_count": 0,
"label_count": 38,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-lede-ribbon-train_0001_r0_c512.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "positive",
"sample_slug": "v73-lede-ribbon-train",
"split": "train",
"tile_index": 1,
"valid_label_count": 38
},
{
"background_category": "reference_aoi",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-wevelgem-industry-train_0001_r0_c512.png",
"invalid_label_count": 0,
"label_count": 36,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-wevelgem-industry-train_0001_r0_c512.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "positive",
"sample_slug": "v73-wevelgem-industry-train",
"split": "train",
"tile_index": 1,
"valid_label_count": 36
},
{
"background_category": "sparse_building_context",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-houthulst-forest-train-bg_0000_r0_c0.png",
"invalid_label_count": 0,
"label_count": 35,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-houthulst-forest-train-bg_0000_r0_c0.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "background_candidate",
"sample_slug": "v73-houthulst-forest-train-bg",
"split": "train",
"tile_index": 0,
"valid_label_count": 35
},
{
"background_category": "reference_aoi",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-wevelgem-industry-train_0003_r512_c0.png",
"invalid_label_count": 0,
"label_count": 35,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-wevelgem-industry-train_0003_r512_c0.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "positive",
"sample_slug": "v73-wevelgem-industry-train",
"split": "train",
"tile_index": 3,
"valid_label_count": 35
},
{
"background_category": "sparse_building_context",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-adinkerke-dunes-train-bg_0004_r512_c512.png",
"invalid_label_count": 0,
"label_count": 34,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-adinkerke-dunes-train-bg_0004_r512_c512.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "background_candidate",
"sample_slug": "v73-adinkerke-dunes-train-bg",
"split": "train",
"tile_index": 4,
"valid_label_count": 34
},
{
"background_category": "sparse_building_context",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-houthulst-forest-train-bg_0001_r0_c512.png",
"invalid_label_count": 0,
"label_count": 34,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-houthulst-forest-train-bg_0001_r0_c512.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "background_candidate",
"sample_slug": "v73-houthulst-forest-train-bg",
"split": "train",
"tile_index": 1,
"valid_label_count": 34
},
{
"background_category": "sparse_building_context",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-ronse-industry-train-bg_0003_r512_c0.png",
"invalid_label_count": 0,
"label_count": 34,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-ronse-industry-train-bg_0003_r512_c0.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "background_candidate",
"sample_slug": "v73-ronse-industry-train-bg",
"split": "train",
"tile_index": 3,
"valid_label_count": 34
},
{
"background_category": "reference_aoi",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-borgloon-rural-train_0000_r0_c0.png",
"invalid_label_count": 0,
"label_count": 33,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-borgloon-rural-train_0000_r0_c0.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "positive",
"sample_slug": "v73-borgloon-rural-train",
"split": "train",
"tile_index": 0,
"valid_label_count": 33
},
{
"background_category": "reference_aoi",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-wevelgem-industry-train_0000_r0_c0.png",
"invalid_label_count": 0,
"label_count": 33,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-wevelgem-industry-train_0000_r0_c0.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "positive",
"sample_slug": "v73-wevelgem-industry-train",
"split": "train",
"tile_index": 0,
"valid_label_count": 33
},
{
"background_category": "reference_aoi",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-wevelgem-industry-train_0004_r512_c512.png",
"invalid_label_count": 0,
"label_count": 33,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-wevelgem-industry-train_0004_r512_c512.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "positive",
"sample_slug": "v73-wevelgem-industry-train",
"split": "train",
"tile_index": 4,
"valid_label_count": 33
},
{
"background_category": "sparse_building_context",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-adinkerke-dunes-train-bg_0000_r0_c0.png",
"invalid_label_count": 0,
"label_count": 32,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-adinkerke-dunes-train-bg_0000_r0_c0.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "background_candidate",
"sample_slug": "v73-adinkerke-dunes-train-bg",
"split": "train",
"tile_index": 0,
"valid_label_count": 32
},
{
"background_category": "reference_aoi",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-lede-ribbon-train_0000_r0_c0.png",
"invalid_label_count": 0,
"label_count": 32,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-lede-ribbon-train_0000_r0_c0.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "positive",
"sample_slug": "v73-lede-ribbon-train",
"split": "train",
"tile_index": 0,
"valid_label_count": 32
},
{
"background_category": "sparse_building_context",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-adinkerke-dunes-train-bg_0001_r0_c512.png",
"invalid_label_count": 0,
"label_count": 30,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-adinkerke-dunes-train-bg_0001_r0_c512.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "background_candidate",
"sample_slug": "v73-adinkerke-dunes-train-bg",
"split": "train",
"tile_index": 1,
"valid_label_count": 30
},
{
"background_category": "sparse_building_context",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-houthulst-forest-train-bg_0004_r512_c512.png",
"invalid_label_count": 0,
"label_count": 29,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-houthulst-forest-train-bg_0004_r512_c512.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "background_candidate",
"sample_slug": "v73-houthulst-forest-train-bg",
"split": "train",
"tile_index": 4,
"valid_label_count": 29
},
{
"background_category": "sparse_building_context",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-doel-port-train-bg_0000_r0_c0.png",
"invalid_label_count": 0,
"label_count": 27,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-doel-port-train-bg_0000_r0_c0.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "background_candidate",
"sample_slug": "v73-doel-port-train-bg",
"split": "train",
"tile_index": 0,
"valid_label_count": 27
},
{
"background_category": "reference_aoi",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-schoten-lowrise-train_0003_r512_c0.png",
"invalid_label_count": 0,
"label_count": 27,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-schoten-lowrise-train_0003_r512_c0.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "positive",
"sample_slug": "v73-schoten-lowrise-train",
"split": "train",
"tile_index": 3,
"valid_label_count": 27
},
{
"background_category": "reference_aoi",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-borgloon-rural-train_0004_r512_c512.png",
"invalid_label_count": 0,
"label_count": 21,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-borgloon-rural-train_0004_r512_c512.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "positive",
"sample_slug": "v73-borgloon-rural-train",
"split": "train",
"tile_index": 4,
"valid_label_count": 21
},
{
"background_category": "sparse_building_context",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-kaprijke-field-train-bg_0003_r512_c0.png",
"invalid_label_count": 0,
"label_count": 21,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-kaprijke-field-train-bg_0003_r512_c0.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "background_candidate",
"sample_slug": "v73-kaprijke-field-train-bg",
"split": "train",
"tile_index": 3,
"valid_label_count": 21
},
{
"background_category": "sparse_building_context",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-doel-port-train-bg_0001_r0_c512.png",
"invalid_label_count": 0,
"label_count": 15,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-doel-port-train-bg_0001_r0_c512.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "background_candidate",
"sample_slug": "v73-doel-port-train-bg",
"split": "train",
"tile_index": 1,
"valid_label_count": 15
},
{
"background_category": "sparse_building_context",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-kaprijke-field-train-bg_0004_r512_c512.png",
"invalid_label_count": 0,
"label_count": 14,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-kaprijke-field-train-bg_0004_r512_c512.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "background_candidate",
"sample_slug": "v73-kaprijke-field-train-bg",
"split": "train",
"tile_index": 4,
"valid_label_count": 14
},
{
"background_category": "sparse_building_context",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-ronse-industry-train-bg_0004_r512_c512.png",
"invalid_label_count": 0,
"label_count": 11,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-ronse-industry-train-bg_0004_r512_c512.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "background_candidate",
"sample_slug": "v73-ronse-industry-train-bg",
"split": "train",
"tile_index": 4,
"valid_label_count": 11
},
{
"background_category": "reference_aoi",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-borgloon-rural-train_0001_r0_c512.png",
"invalid_label_count": 0,
"label_count": 5,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-borgloon-rural-train_0001_r0_c512.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "positive",
"sample_slug": "v73-borgloon-rural-train",
"split": "train",
"tile_index": 1,
"valid_label_count": 5
},
{
"background_category": "sparse_building_context",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-doel-port-train-bg_0003_r512_c0.png",
"invalid_label_count": 0,
"label_count": 5,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-doel-port-train-bg_0003_r512_c0.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "background_candidate",
"sample_slug": "v73-doel-port-train-bg",
"split": "train",
"tile_index": 3,
"valid_label_count": 5
},
{
"background_category": "sparse_building_context",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-doel-port-train-bg_0004_r512_c512.png",
"invalid_label_count": 0,
"label_count": 2,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-doel-port-train-bg_0004_r512_c512.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "background_candidate",
"sample_slug": "v73-doel-port-train-bg",
"split": "train",
"tile_index": 4,
"valid_label_count": 2
},
{
"background_category": "sparse_building_context",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-kaprijke-field-train-bg_0000_r0_c0.png",
"invalid_label_count": 0,
"label_count": 2,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-kaprijke-field-train-bg_0000_r0_c0.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "background_candidate",
"sample_slug": "v73-kaprijke-field-train-bg",
"split": "train",
"tile_index": 0,
"valid_label_count": 2
},
{
"background_category": "sparse_building_context",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-kaprijke-field-train-bg_0001_r0_c512.png",
"invalid_label_count": 0,
"label_count": 1,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-kaprijke-field-train-bg_0001_r0_c512.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "background_candidate",
"sample_slug": "v73-kaprijke-field-train-bg",
"split": "train",
"tile_index": 1,
"valid_label_count": 1
},
{
"background_category": "sparse_building_context",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-peer-field-train-bg_0003_r512_c0.png",
"invalid_label_count": 0,
"label_count": 1,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-peer-field-train-bg_0003_r512_c0.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "background_candidate",
"sample_slug": "v73-peer-field-train-bg",
"split": "train",
"tile_index": 3,
"valid_label_count": 1
},
{
"background_category": "sparse_building_context",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-peer-field-train-bg_0000_r0_c0.png",
"invalid_label_count": 0,
"label_count": 0,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-peer-field-train-bg_0000_r0_c0.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "background_candidate",
"sample_slug": "v73-peer-field-train-bg",
"split": "train",
"tile_index": 0,
"valid_label_count": 0
},
{
"background_category": "sparse_building_context",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-peer-field-train-bg_0001_r0_c512.png",
"invalid_label_count": 0,
"label_count": 0,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-peer-field-train-bg_0001_r0_c512.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "background_candidate",
"sample_slug": "v73-peer-field-train-bg",
"split": "train",
"tile_index": 1,
"valid_label_count": 0
},
{
"background_category": "sparse_building_context",
"highlighted_label_count": 0,
"image_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/images/train/v73-peer-field-train-bg_0004_r512_c512.png",
"invalid_label_count": 0,
"label_count": 0,
"label_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/labels/train/v73-peer-field-train-bg_0004_r512_c512.txt",
"low_visual_variance": false,
"missing_label_file": false,
"rendered": true,
"sample_role": "background_candidate",
"sample_slug": "v73-peer-field-train-bg",
"split": "train",
"tile_index": 4,
"valid_label_count": 0
}
],
"status": "ok",
"summary_path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/experimental_dataset_summary.json",
"thumb_size": 320,
"tiles_per_sheet": 24,
"valid_label_count": 1710
}
@@ -0,0 +1,60 @@
{
"schema_version": 1,
"status": "completed_candidates_rejected",
"claim_boundary": "Experimental training and independent calibration only; no production release claim.",
"training_portfolio": {
"region": "flanders",
"sample_count": 12,
"unique_non_overlapping_tile_count": 48,
"label_count": 1710,
"negative_tile_count": 3,
"excluded_overlapping_edge_cover_tile_count": 60,
"source_authority": "GRB",
"source_manifest_sha256": "afa0edc5f229e0451d4a3630bb0d716b0ac1d446a6f8c2f22807d4f83b818525",
"human_review_complete": false,
"ai_assisted_visual_review_tiles": 48
},
"spatial_independence": {
"status": "independent",
"minimum_required_distance_m": 2000.0,
"observed_minimum_distance_m": 9203.454080711017
},
"frozen_v72_calibration": {
"tile_count": 24,
"instance_count": 348,
"active": {
"model_sha256": "a9088b8491dfae36694b53e9e9406cb4e3511d334a5712fa34f75078a47759c1",
"precision": 0.1576550586330707,
"recall": 0.11781609195402298,
"map50": 0.05677865740374553,
"map50_95": 0.02175035531261916
},
"aggressive_e20": {
"decision": "rejected",
"model_sha256": "c4d9995ca040dff4ca327f6022f30d679335998ef1968c3061102ae6ed4105ac",
"precision": 0.012361111111111111,
"recall": 0.2557471264367816,
"map50": 0.01885292400464415,
"map50_95": 0.00378065636983694
},
"controlled_e10": {
"decision": "rejected",
"model_sha256": "e4f5ffc3080dc5781868f7add07176fa7b59cc50fb947ebb9b87495f3d9f20b2",
"precision": 0.017933658902666374,
"recall": 0.32471264367816094,
"map50": 0.0222135694107064,
"map50_95": 0.005679536478252313
}
},
"production_decision": {
"active_model_unchanged": true,
"reason": "Both fresh-data candidates materially regress precision and mAP on independent V72 calibration.",
"promotion_allowed": false
},
"remaining_evidence_limits": [
"Accepted independent human label review is still pending.",
"V72 contains only 24 calibration tiles and is not a national accuracy claim.",
"Wallonia and Brussels remain diagnostic-only until PICC and UrbIS authority contracts are governed for training.",
"The current active detector remains low-accuracy on fresh regional imagery; fail-closed product messaging is required."
]
}
@@ -0,0 +1,212 @@
{
"schema_version": 1,
"side_m": 256.0,
"resolution_m": 0.25,
"status": "complete",
"samples": [
{
"sample_slug": "v73-kontich-lowrise-train",
"region": "flanders",
"context": "detached-lowrise",
"split": "train",
"sample_role": "positive",
"require_empty": false,
"bbox_epsg4326": [
4.44516936687562,
51.13384821464579,
4.448830715037306,
51.13615176149503
],
"raster_dataset_id": "56c5c3bd-ff0b-4d9a-9c98-572254c12594",
"reference_dataset_id": "f2b444f5-a3d3-4817-a466-d8001099d539",
"provider_reference_feature_count": 238
},
{
"sample_slug": "v73-schoten-lowrise-train",
"region": "flanders",
"context": "detached-lowrise",
"split": "train",
"sample_role": "positive",
"require_empty": false,
"bbox_epsg4326": [
4.498163542581232,
51.248847445287225,
4.501836539774341,
51.25115253072368
],
"raster_dataset_id": "23084649-8bdf-4d82-a5ee-e7be64803039",
"reference_dataset_id": "4d888a2f-561a-4467-8846-def6b5d20f3d",
"provider_reference_feature_count": 252
},
{
"sample_slug": "v73-lede-ribbon-train",
"region": "flanders",
"context": "ribbon-development",
"split": "train",
"sample_role": "positive",
"require_empty": false,
"bbox_epsg4326": [
3.9831684358866886,
50.964843450616485,
3.9868314667126685,
50.967156525915414
],
"raster_dataset_id": "9aa2ae96-4394-469a-8a63-8636b8deba94",
"reference_dataset_id": "439dcbb2-3e42-42dc-8a22-4204523c009c",
"provider_reference_feature_count": 203
},
{
"sample_slug": "v73-tielt-rural-train",
"region": "flanders",
"context": "rural-town",
"split": "train",
"sample_role": "positive",
"require_empty": false,
"bbox_epsg4326": [
3.325151142935416,
50.99783336476096,
3.328848759893323,
51.00016661206988
],
"raster_dataset_id": "eef357e0-a6a0-4f04-b1c6-e2941b25811f",
"reference_dataset_id": "5a4de291-8c02-4cda-960d-ab688592541c",
"provider_reference_feature_count": 234
},
{
"sample_slug": "v73-borgloon-rural-train",
"region": "flanders",
"context": "rural-lowrise",
"split": "train",
"sample_role": "positive",
"require_empty": false,
"bbox_epsg4326": [
5.341160450290418,
50.80383430945873,
5.344839629814088,
50.80616566808069
],
"raster_dataset_id": "7d23526d-3e5b-47aa-a4d2-bd47c3b99147",
"reference_dataset_id": "e39c2b9c-4f6d-4aa7-98d0-bb7284366071",
"provider_reference_feature_count": 123
},
{
"sample_slug": "v73-wevelgem-industry-train",
"region": "flanders",
"context": "industrial",
"split": "train",
"sample_role": "positive",
"require_empty": false,
"bbox_epsg4326": [
3.178154637518103,
50.818831059349314,
3.181845266034672,
50.821168917839366
],
"raster_dataset_id": "a749c01e-8396-49b7-9f22-42428180989d",
"reference_dataset_id": "96b6e2ce-00cf-49b6-a133-94acf4aab96a",
"provider_reference_feature_count": 143
},
{
"sample_slug": "v73-kaprijke-field-train-bg",
"region": "flanders",
"context": "farmland-hard-negative",
"split": "train",
"sample_role": "background_candidate",
"require_empty": false,
"bbox_epsg4326": [
3.618149522227024,
51.21883794179568,
3.6218503796386172,
51.221162034532675
],
"raster_dataset_id": "9efef01e-52f7-4d78-ba37-1667c15a8ec8",
"reference_dataset_id": "5da01064-bb86-4d4e-b42e-3eb81b5ec640",
"provider_reference_feature_count": 42
},
{
"sample_slug": "v73-doel-port-train-bg",
"region": "flanders",
"context": "port-hard-negative",
"split": "train",
"sample_role": "background_candidate",
"require_empty": false,
"bbox_epsg4326": [
4.258161673724995,
51.308847843017254,
4.261838227480093,
51.311152132827466
],
"raster_dataset_id": "bc7b7dbd-c95b-4bc6-b379-e1bc337a35bf",
"reference_dataset_id": "69ba8adc-6f16-4c14-8459-211f32a56a2c",
"provider_reference_feature_count": 48
},
{
"sample_slug": "v73-adinkerke-dunes-train-bg",
"region": "flanders",
"context": "dunes-hard-negative",
"split": "train",
"sample_role": "background_candidate",
"require_empty": false,
"bbox_epsg4326": [
2.588130558194434,
51.068822191152805,
2.591869344793702,
51.07117778596596
],
"raster_dataset_id": "53a169d3-dccd-48d9-9b1c-68be3111a9e1",
"reference_dataset_id": "7bc2d837-19eb-4e80-877c-185b7ea21af2",
"provider_reference_feature_count": 166
},
{
"sample_slug": "v73-houthulst-forest-train-bg",
"region": "flanders",
"context": "forest-hard-negative",
"split": "train",
"sample_role": "background_candidate",
"require_empty": false,
"bbox_epsg4326": [
2.948142792563102,
50.978827613215564,
2.951857110543986,
50.98117236384764
],
"raster_dataset_id": "e44992c5-60b5-4b71-b7e9-5c2120ecf749",
"reference_dataset_id": "6d06cefd-980d-4e78-86f3-d335e87e8a4e",
"provider_reference_feature_count": 165
},
{
"sample_slug": "v73-ronse-industry-train-bg",
"region": "flanders",
"context": "industrial-hard-negative",
"split": "train",
"sample_role": "background_candidate",
"require_empty": false,
"bbox_epsg4326": [
3.608167745037314,
50.748837614018925,
3.611832158531078,
50.75116236305027
],
"raster_dataset_id": "e70a5264-0974-4b6e-aa6f-51c0cb7e3537",
"reference_dataset_id": "f143ffa0-f03e-4ac3-b6e7-13bbac3fed41",
"provider_reference_feature_count": 171
},
{
"sample_slug": "v73-peer-field-train-bg",
"region": "flanders",
"context": "farmland-hard-negative",
"split": "train",
"sample_role": "background_candidate",
"require_empty": false,
"bbox_epsg4326": [
5.448145453581394,
51.11883278920863,
5.451854627730389,
51.1211671879367
],
"raster_dataset_id": "918b6db3-5af9-4f47-b3dc-842c73abf559",
"reference_dataset_id": "dafc6274-8040-4a29-bba3-f6d492ef84b0",
"provider_reference_feature_count": 1
}
]
}
@@ -0,0 +1,110 @@
{
"evaluation_manifest_path": "/app/storage/operator-data/building-be-v72-fresh-calibration-r1/diagnostic-corpus/operator_samples_manifest.json",
"evaluation_manifest_sha256": "66bfaacaee11806ed035d3ac5725f7b3967dfc82e7a12ecf603dc3836bc26ad7",
"evaluation_samples": [
{
"bbox_epsg4326": [
4.66116095047693,
51.21284491062596,
4.664839131648428,
51.21515506560048
],
"minimum_lineage_distance_m": 11742.335203095918,
"nearest_lineage_raster_path": "/app/storage/operator-data/building-be-v73-fresh-flanders-train-r1/corpus/pairs/v73-schoten-lowrise-train/image.tif",
"nearest_lineage_sample_slug": "v73-schoten-lowrise-train",
"passes_minimum_distance": true,
"sample_slug": "v72-zandhoven-lowrise-cal"
},
{
"bbox_epsg4326": [
3.7481516695287884,
51.24483994940647,
3.7518482321727147,
51.24716002681137
],
"minimum_lineage_distance_m": 9203.454080711017,
"nearest_lineage_raster_path": "/app/storage/operator-data/building-be-v73-fresh-flanders-train-r1/corpus/pairs/v73-kaprijke-field-train-bg/image.tif",
"nearest_lineage_sample_slug": "v73-kaprijke-field-train-bg",
"passes_minimum_distance": true,
"sample_slug": "v72-assenede-field-cal-bg"
},
{
"bbox_epsg4326": [
5.378193608487878,
49.91683360963306,
5.381806468144563,
49.91916636935071
],
"minimum_lineage_distance_m": 98427.49240649818,
"nearest_lineage_raster_path": "/app/storage/operator-data/building-be-v73-fresh-flanders-train-r1/corpus/pairs/v73-borgloon-rural-train/image.tif",
"nearest_lineage_sample_slug": "v73-borgloon-rural-train",
"passes_minimum_distance": true,
"sample_slug": "v72-libramont-lowrise-cal"
},
{
"bbox_epsg4326": [
5.237179060792866,
50.38783580367982,
5.2408210177303065,
50.39016417441682
],
"minimum_lineage_distance_m": 46555.585616985845,
"nearest_lineage_raster_path": "/app/storage/operator-data/building-be-v73-fresh-flanders-train-r1/corpus/pairs/v73-borgloon-rural-train/image.tif",
"nearest_lineage_sample_slug": "v73-borgloon-rural-train",
"passes_minimum_distance": true,
"sample_slug": "v72-havelange-field-cal-bg"
},
{
"bbox_epsg4326": [
4.305179924172925,
50.871848393352586,
4.308819978598048,
50.87415158315595
],
"minimum_lineage_distance_m": 24551.91275864387,
"nearest_lineage_raster_path": "/app/storage/operator-data/building-be-v73-fresh-flanders-train-r1/corpus/pairs/v73-lede-ribbon-train/image.tif",
"nearest_lineage_sample_slug": "v73-lede-ribbon-train",
"passes_minimum_distance": true,
"sample_slug": "v72-ganshoren-lowrise-cal"
},
{
"bbox_epsg4326": [
4.349180265292469,
50.89084908113465,
4.3528196373886185,
50.893150895320936
],
"minimum_lineage_distance_m": 26691.61793409974,
"nearest_lineage_raster_path": "/app/storage/operator-data/building-be-v73-fresh-flanders-train-r1/corpus/pairs/v73-lede-ribbon-train/image.tif",
"nearest_lineage_sample_slug": "v73-lede-ribbon-train",
"passes_minimum_distance": true,
"sample_slug": "v72-laeken-park-cal-bg"
}
],
"lineage_sample_count": 12,
"lineage_summaries": [
{
"path": "/app/storage/training/experimental/building-be-v73-fresh-flanders-train-r1/yolo512/experimental_dataset_summary.json",
"sample_slugs": [
"v73-adinkerke-dunes-train-bg",
"v73-borgloon-rural-train",
"v73-doel-port-train-bg",
"v73-houthulst-forest-train-bg",
"v73-kaprijke-field-train-bg",
"v73-kontich-lowrise-train",
"v73-lede-ribbon-train",
"v73-peer-field-train-bg",
"v73-ronse-industry-train-bg",
"v73-schoten-lowrise-train",
"v73-tielt-rural-train",
"v73-wevelgem-industry-train"
],
"sha256": "047874a4f9362c82263ffe11c389a2f65168c449d3f6cbcc77cea709c0ba4c59"
}
],
"minimum_distance_m": 2000.0,
"missing_lineage_sample_slugs": [],
"resolved_lineage_sample_count": 12,
"schema_version": 1,
"status": "independent"
}
@@ -0,0 +1,19 @@
{
"schema_version": 1,
"review_type": "ai_assisted_visual_review",
"human": false,
"reviewed_tile_count": 48,
"coverage": "all canonical V73 training tiles",
"decision": "suitable_for_non_promotable_experiment_only",
"observations": [
"GRB bounding boxes generally cover visible building roofs across all selected contexts.",
"Rotated and complex footprints produce intentionally loose axis-aligned detection boxes.",
"Sparse and empty field tiles are present; background_candidate does not imply pure empty.",
"The first export contained 60 overlapping edge-cover tiles; all were removed before training.",
"This review does not satisfy the independent human release gate."
],
"contact_sheets": [
"contact_sheet_001.png",
"contact_sheet_002.png"
]
}
@@ -0,0 +1,20 @@
{
"schema_version": 1,
"purpose": "Fresh train-only Flemish failure-remediation corpus; never calibration or test",
"frozen_before_acquisition": true,
"revision_note": "r2 replaces the rejected Maaseik border AOI with inland Peer; the provider reported zero Flemish orthophoto coverage for the original rectangle before any sample pair was accepted.",
"aois": [
{"slug": "v73-kontich-lowrise-train", "region": "flanders", "context": "detached-lowrise", "split": "train", "lon": 4.447, "lat": 51.135, "sample_role": "positive"},
{"slug": "v73-schoten-lowrise-train", "region": "flanders", "context": "detached-lowrise", "split": "train", "lon": 4.500, "lat": 51.250, "sample_role": "positive"},
{"slug": "v73-lede-ribbon-train", "region": "flanders", "context": "ribbon-development", "split": "train", "lon": 3.985, "lat": 50.966, "sample_role": "positive"},
{"slug": "v73-tielt-rural-train", "region": "flanders", "context": "rural-town", "split": "train", "lon": 3.327, "lat": 50.999, "sample_role": "positive"},
{"slug": "v73-borgloon-rural-train", "region": "flanders", "context": "rural-lowrise", "split": "train", "lon": 5.343, "lat": 50.805, "sample_role": "positive"},
{"slug": "v73-wevelgem-industry-train", "region": "flanders", "context": "industrial", "split": "train", "lon": 3.180, "lat": 50.820, "sample_role": "positive"},
{"slug": "v73-kaprijke-field-train-bg", "region": "flanders", "context": "farmland-hard-negative", "split": "train", "lon": 3.620, "lat": 51.220, "sample_role": "background_candidate"},
{"slug": "v73-doel-port-train-bg", "region": "flanders", "context": "port-hard-negative", "split": "train", "lon": 4.260, "lat": 51.310, "sample_role": "background_candidate"},
{"slug": "v73-adinkerke-dunes-train-bg", "region": "flanders", "context": "dunes-hard-negative", "split": "train", "lon": 2.590, "lat": 51.070, "sample_role": "background_candidate"},
{"slug": "v73-houthulst-forest-train-bg", "region": "flanders", "context": "forest-hard-negative", "split": "train", "lon": 2.950, "lat": 50.980, "sample_role": "background_candidate"},
{"slug": "v73-ronse-industry-train-bg", "region": "flanders", "context": "industrial-hard-negative", "split": "train", "lon": 3.610, "lat": 50.750, "sample_role": "background_candidate"},
{"slug": "v73-peer-field-train-bg", "region": "flanders", "context": "farmland-hard-negative", "split": "train", "lon": 5.450, "lat": 51.120, "sample_role": "background_candidate"}
]
}
@@ -0,0 +1,60 @@
# V73 Vlaamse foutremediatie
## Uitkomst
V73 heeft de datadekking aantoonbaar verbreed, maar geen beter productiemodel
opgeleverd. Daarom blijft het actieve model ongewijzigd. Dit is een geslaagde
fail-closed beslissing: twee nieuw getrainde GPU-kandidaten zijn afgewezen op
de vooraf bevroren en ruimtelijk onafhankelijke V72-calibratieportfolio.
## Nieuwe dekking
- twaalf nieuwe Vlaamse train-only AOI's;
- woonwijken, lintbebouwing, landelijke kernen, industrie, haven, bos, duinen
en landbouwcontext;
- officiële orthofoto en GRB als primaire gebouwreferentie;
- 48 canonieke niet-overlappende tegels met 1.710 labels;
- drie lege tegels en meerdere moeilijke, dun bebouwde contexten;
- minimale afstand tot een V72-calibratie-AOI: 9.203 meter, tegenover de gate
van 2.000 meter.
De oorspronkelijke Maaseik-grensselectie werd door de provider terecht
geweigerd wegens nuldekking binnen de Vlaamse orthofotozone. De gecheckpointte
acquisitie is hervat met een vooraf geregistreerde inlandse vervanging in Peer.
## Visuele controle
Alle 48 uiteindelijke tegels zijn via twee contact sheets gecontroleerd. De
eerste export maakte een bestaande edge-coverzwakte zichtbaar: rasters die iets
groter dan 1024 pixels waren, leverden vrijwel identieke tegels op de laatste
pixeloffset. Zestig zulke overlappende tegels zijn vóór training verwijderd en
de nieuwe experimentele exporter bevat hiervoor een regressiegate.
De controle is AI-assisted en dus expliciet geen vervanging voor de vereiste
onafhankelijke menselijke labelreview. Het corpus en de modellen blijven
daardoor niet-promoveerbaar.
## GPU-resultaten
| Model | Precision | Recall | mAP50 | mAP50-95 | Besluit |
|---|---:|---:|---:|---:|---|
| Actief | 0,1577 | 0,1178 | 0,0568 | 0,0218 | behouden |
| V73 agressief, 20 epochs | 0,0124 | 0,2557 | 0,0189 | 0,0038 | afgewezen |
| V73 gecontroleerd, 10 epochs | 0,0179 | 0,3247 | 0,0222 | 0,0057 | afgewezen |
Beide kandidaten verhogen recall maar produceren veel te veel foutpositieven.
Een drempel- of gemiddelde-scoretruc rechtvaardigt hier geen promotie: precision
en beide mAP-maten regresseren ernstig.
## Conclusie en resterende grens
De huidige detector is nog niet nauwkeurig genoeg om landelijke, regionale of
"100% correcte" gebouwclaims te dragen. V73 voorkomt wel dat een slechter model
in productie komt en levert nieuwe, herleidbare foutdekking voor een latere
training. Voor een echte volgende kwaliteitsstap zijn minimaal een grotere
onafhankelijk menselijk beoordeelde trainset, meer pure-backgroundtegels en
governed PICC/UrbIS-contracten nodig. Tot dan moeten resultaten als
modelvoorstellen met bronvergelijking en onzekerheid worden gepresenteerd.
Alle ruwe manifests, matrices, hashes en contact sheets staan onder
`artifacts/evidence/accuracy/model-training/20260810-v73-flanders-remediation/`.
@@ -0,0 +1,201 @@
#!/usr/bin/env python3
"""Export an isolated train-only YOLO shard without making a release claim.
This path exists for evidence-generating model experiments when source contracts
are eligible but accepted human label review is still pending. It deliberately
cannot create a training release and must never be used for model promotion.
"""
from __future__ import annotations
import argparse
import hashlib
import json
import shutil
import sys
from pathlib import Path
SCRIPT_DIR = Path(__file__).resolve().parent
if str(SCRIPT_DIR) not in sys.path:
sys.path.insert(0, str(SCRIPT_DIR))
from export_operator_yolo_tile_dataset import ( # noqa: E402
ensure_dependencies,
ensure_yolo_directories,
export_sample_tiles,
file_sha256,
write_dataset_yaml,
)
from training_dataset_eligibility import ( # noqa: E402
TrainingEligibilityError,
assert_frozen_manifest_training_eligible,
)
EXPERIMENTAL_ROOT = Path("/app/storage/training/experimental")
def _inside(path: Path, root: Path) -> bool:
try:
path.resolve().relative_to(root.resolve())
return True
except ValueError:
return False
def validate_experimental_request(manifest_path: Path, output_dir: Path) -> dict:
if not _inside(output_dir, EXPERIMENTAL_ROOT):
raise ValueError(f"output must remain below {EXPERIMENTAL_ROOT}")
if (manifest_path.parent / "NO_TRAINING.json").exists():
raise ValueError("source corpus explicitly prohibits training")
manifest = json.loads(manifest_path.read_text(encoding="utf-8-sig"))
if manifest.get("purpose") != "training_corpus":
raise ValueError("source manifest is not a training corpus")
samples = manifest.get("samples") or []
if not samples:
raise ValueError("source manifest contains no samples")
invalid_splits = sorted(
{
str(sample.get("split") or "").strip().lower()
for sample in samples
if str(sample.get("split") or "").strip().lower() != "train"
}
)
if invalid_splits:
raise ValueError(f"experimental shard accepts train samples only: {invalid_splits}")
return manifest
def is_canonical_train_window(window: dict, tile_size: int) -> bool:
return bool(
int(window["row_off"]) % tile_size == 0
and int(window["col_off"]) % tile_size == 0
and int(window["height"]) == tile_size
and int(window["width"]) == tile_size
)
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--manifest-path", type=Path, required=True)
parser.add_argument("--output-dir", type=Path, required=True)
parser.add_argument("--tile-size", type=int, default=512)
parser.add_argument("--stride", type=int, default=512)
parser.add_argument("--negative-keep-ratio", type=float, default=1.0)
parser.add_argument("--min-label-px", type=float, default=4.0)
parser.add_argument("--min-label-visible-ratio", type=float, default=0.25)
parser.add_argument("--force", action="store_true")
return parser.parse_args()
def main() -> int:
args = parse_args()
try:
manifest = validate_experimental_request(args.manifest_path, args.output_dir)
assert_frozen_manifest_training_eligible(args.manifest_path, verify_live=True)
except (ValueError, TrainingEligibilityError) as exc:
raise SystemExit(str(exc)) from exc
ensure_dependencies()
if args.force and args.output_dir.exists():
shutil.rmtree(args.output_dir)
if args.output_dir.exists() and any(args.output_dir.iterdir()):
raise SystemExit("experimental output directory already exists and is not empty; use --force")
ensure_yolo_directories(args.output_dir)
tiles: list[dict] = []
for sample in manifest["samples"]:
tiles.extend(
export_sample_tiles(
sample=sample,
manifest_path=args.manifest_path,
output_dir=args.output_dir,
val_slugs=set(),
tile_size=args.tile_size,
stride=args.stride,
negative_keep_ratio=args.negative_keep_ratio,
min_label_px=args.min_label_px,
min_label_visible_ratio=args.min_label_visible_ratio,
background_negative_repeat=1,
drop_low_variance_negatives=False,
blank_range_threshold=3,
reference_source="grb",
reference_layer="buildings",
)
)
kept: list[dict] = []
excluded_edge_cover: list[dict] = []
for tile in tiles:
if not tile["kept"]:
continue
if is_canonical_train_window(tile["window"], args.tile_size):
kept.append(tile)
continue
excluded_edge_cover.append(
{
"sample_slug": tile["sample_slug"],
"tile_index": tile["tile_index"],
"window": tile["window"],
"reason": "overlapping_edge_cover_tile",
}
)
Path(tile["image_path"]).unlink(missing_ok=True)
Path(tile["label_path"]).unlink(missing_ok=True)
if not kept:
raise SystemExit("experimental export produced no tiles")
dataset_yaml = write_dataset_yaml(args.output_dir, "building")
# Ultralytics requires a val key while training. Its score is explicitly
# invalid for model selection; independent V72 evaluation is mandatory.
dataset_yaml.write_text(
dataset_yaml.read_text(encoding="utf-8").replace("val: images/val", "val: images/train"),
encoding="utf-8",
)
asset_hash = hashlib.sha256()
for tile in sorted(kept, key=lambda item: str(item["image_path"])):
asset_hash.update(file_sha256(Path(tile["image_path"])).encode())
asset_hash.update(file_sha256(Path(tile["label_path"])).encode())
summary = {
"schema_version": 1,
"status": "experimental_only_human_review_pending",
"promotion_allowed": False,
"release_claim_allowed": False,
"internal_validation_valid_for_selection": False,
"required_independent_evaluation": "frozen V72 calibration portfolio",
"source_manifest": str(args.manifest_path),
"source_manifest_sha256": file_sha256(args.manifest_path),
"dataset_yaml": str(dataset_yaml),
"dataset_yaml_sha256": file_sha256(dataset_yaml),
"tile_asset_chain_sha256": asset_hash.hexdigest(),
"sample_count": len(manifest["samples"]),
"tile_count": len(kept),
"positive_tile_count": sum(not tile["is_negative"] for tile in kept),
"negative_tile_count": sum(tile["is_negative"] for tile in kept),
"excluded_overlapping_edge_cover_tile_count": len(excluded_edge_cover),
"excluded_overlapping_edge_cover_tiles": excluded_edge_cover,
"label_count": sum(int(tile["label_count"]) for tile in kept),
"tile_size": args.tile_size,
"stride": args.stride,
"min_label_px": args.min_label_px,
"min_label_visible_ratio": args.min_label_visible_ratio,
"tiles": kept,
}
summary_path = args.output_dir / "experimental_dataset_summary.json"
summary_path.write_text(json.dumps(summary, indent=2, sort_keys=True), encoding="utf-8")
marker = {
key: summary[key]
for key in (
"schema_version",
"status",
"promotion_allowed",
"release_claim_allowed",
"source_manifest_sha256",
"dataset_yaml_sha256",
"tile_asset_chain_sha256",
)
}
(args.output_dir / "EXPERIMENTAL_ONLY.json").write_text(
json.dumps(marker, indent=2, sort_keys=True) + "\n", encoding="utf-8"
)
print(json.dumps({key: value for key, value in summary.items() if key != "tiles"}, indent=2))
return 0
if __name__ == "__main__":
raise SystemExit(main())
@@ -0,0 +1,130 @@
#!/usr/bin/env python3
"""CUDA-train an isolated, non-promotable YOLO candidate."""
from __future__ import annotations
import argparse
import hashlib
import json
import shutil
from pathlib import Path
EXPERIMENTAL_ROOT = Path("/app/storage/training/experimental")
def sha256(path: Path) -> str:
digest = hashlib.sha256()
with path.open("rb") as handle:
for chunk in iter(lambda: handle.read(1024 * 1024), b""):
digest.update(chunk)
return digest.hexdigest()
def _inside(path: Path, root: Path) -> bool:
try:
path.resolve().relative_to(root.resolve())
return True
except ValueError:
return False
def validate_paths(dataset_dir: Path, output_dir: Path) -> dict:
if not _inside(dataset_dir, EXPERIMENTAL_ROOT) or not _inside(output_dir, EXPERIMENTAL_ROOT):
raise ValueError(f"dataset and output must remain below {EXPERIMENTAL_ROOT}")
marker_path = dataset_dir / "EXPERIMENTAL_ONLY.json"
yaml_path = dataset_dir / "dataset.yaml"
if not marker_path.is_file() or not yaml_path.is_file():
raise ValueError("experimental marker or dataset.yaml is missing")
marker = json.loads(marker_path.read_text(encoding="utf-8"))
if marker.get("promotion_allowed") is not False or marker.get("release_claim_allowed") is not False:
raise ValueError("experimental marker does not prohibit promotion and release claims")
if marker.get("dataset_yaml_sha256") != sha256(yaml_path):
raise ValueError("experimental dataset.yaml checksum mismatch")
return marker
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--dataset-dir", type=Path, required=True)
parser.add_argument("--base-model", type=Path, required=True)
parser.add_argument("--output-dir", type=Path, required=True)
parser.add_argument("--run-name", default="v73-flanders-remediation")
parser.add_argument("--epochs", type=int, default=20)
parser.add_argument("--imgsz", type=int, default=640)
parser.add_argument("--batch", type=int, default=8)
parser.add_argument("--learning-rate", type=float, default=0.0001)
parser.add_argument("--freeze", type=int, default=10)
parser.add_argument("--workers", type=int, default=0)
return parser.parse_args()
def main() -> int:
args = parse_args()
validate_paths(args.dataset_dir, args.output_dir)
if not args.base_model.is_file():
raise SystemExit(f"base model missing: {args.base_model}")
import torch
from ultralytics import YOLO
if not torch.cuda.is_available():
raise SystemExit("CUDA is required for GeoIntel experimental training")
model = YOLO(str(args.base_model))
result = model.train(
data=str(args.dataset_dir / "dataset.yaml"),
epochs=args.epochs,
imgsz=args.imgsz,
batch=args.batch,
workers=args.workers,
device=0,
project=str(args.output_dir),
name=args.run_name,
exist_ok=False,
pretrained=True,
deterministic=True,
seed=73,
amp=False,
val=False,
lr0=args.learning_rate,
lrf=0.1,
freeze=args.freeze,
mosaic=0.0,
translate=0.05,
scale=0.1,
plots=False,
verbose=True,
)
run_dir = Path(result.save_dir)
best = run_dir / "weights" / "best.pt"
if not best.is_file():
best = run_dir / "weights" / "last.pt"
candidate = run_dir / "candidate.experimental.pt"
shutil.copy2(best, candidate)
summary = {
"schema_version": 1,
"status": "trained_experimental_only",
"promotion_allowed": False,
"release_claim_allowed": False,
"human_review_pending": True,
"dataset_yaml_sha256": sha256(args.dataset_dir / "dataset.yaml"),
"base_model": str(args.base_model),
"base_model_sha256": sha256(args.base_model),
"candidate_model": str(candidate),
"candidate_model_sha256": sha256(candidate),
"epochs": args.epochs,
"imgsz": args.imgsz,
"batch": args.batch,
"learning_rate": args.learning_rate,
"freeze": args.freeze,
"workers": args.workers,
"device": torch.cuda.get_device_name(0),
"required_next_gate": "independent frozen V72 calibration evaluation",
}
(run_dir / "experimental_training_summary.json").write_text(
json.dumps(summary, indent=2, sort_keys=True) + "\n", encoding="utf-8"
)
print(json.dumps(summary, indent=2))
return 0
if __name__ == "__main__":
raise SystemExit(main())
+28
View File
@@ -0,0 +1,28 @@
from pathlib import Path
import pytest
from scripts.export_experimental_yolo_train_shard import (
is_canonical_train_window,
validate_experimental_request,
)
from scripts.train_experimental_yolo_candidate import validate_paths
def test_export_refuses_non_experimental_output(tmp_path: Path) -> None:
manifest = tmp_path / "manifest.json"
manifest.write_text("{}", encoding="utf-8")
with pytest.raises(ValueError, match="output must remain"):
validate_experimental_request(manifest, tmp_path / "output")
def test_training_refuses_paths_outside_experimental_root(tmp_path: Path) -> None:
with pytest.raises(ValueError, match="must remain"):
validate_paths(tmp_path / "dataset", tmp_path / "output")
def test_train_shard_rejects_near_duplicate_edge_cover_windows() -> None:
canonical = {"row_off": 512, "col_off": 0, "height": 512, "width": 512}
edge_cover = {"row_off": 513, "col_off": 0, "height": 512, "width": 512}
assert is_canonical_train_window(canonical, 512)
assert not is_canonical_train_window(edge_cover, 512)