evaluate fresh Flemish remediation training
This commit is contained in:
+9
@@ -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"
|
||||
}
|
||||
+17
@@ -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"
|
||||
}
|
||||
+116
@@ -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
|
||||
}
|
||||
BIN
Binary file not shown.
|
After Width: | Height: | Size: 4.2 MiB |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 4.2 MiB |
+116
@@ -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
|
||||
}
|
||||
+11
@@ -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
|
||||
}
|
||||
+1743
File diff suppressed because it is too large
Load Diff
+5
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": "ok",
|
||||
"buffer_m": 64.0,
|
||||
"findings": []
|
||||
}
|
||||
+1441
File diff suppressed because it is too large
Load Diff
+822
@@ -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
|
||||
}
|
||||
+60
@@ -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."
|
||||
]
|
||||
}
|
||||
+212
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
+110
@@ -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"
|
||||
}
|
||||
+19
@@ -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())
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user