feat: scope detection QA to inference coverage
GeoIntel CI / docs-smoke (push) Canceled after 0s
GeoIntel CI / contract-smoke (push) Canceled after 0s

This commit is contained in:
Codex
2026-07-14 11:25:28 +02:00
parent aae6315981
commit 948e50b5e1
17 changed files with 762 additions and 7 deletions
@@ -933,6 +933,33 @@ export function DetectionLab({
<p>Mean IoU: {detectionQaResult.mean_iou?.toFixed(3) ?? 'n/a'}</p>
<p>False positives: {detectionQaResult.false_positives}</p>
<p>False negatives: {detectionQaResult.false_negatives}</p>
{detectionQaResult.coverage ? (
<div className="detection-qa-diagnostic">
<span>Inference coverage</span>
<strong>
{detectionQaResult.coverage.applied
? `${detectionQaResult.coverage.reference_evaluated_count} of ${detectionQaResult.coverage.reference_raw_count} reference features evaluated`
: 'No tile manifest coverage applied'}
</strong>
<p>
{detectionQaResult.coverage.applied
? `${detectionQaResult.coverage.reference_excluded_outside_count} outside coverage, ${detectionQaResult.coverage.reference_clipped_boundary_count} clipped at the boundary, ${detectionQaResult.coverage.tile_count} tiles.`
: 'This run uses the complete selected reference population.'}
</p>
</div>
) : null}
{detectionQaResult.box_to_footprint_diagnostics ? (
<div className="detection-qa-diagnostic detection-qa-diagnostic-caution">
<span>Box-to-footprint diagnostic only</span>
<strong>
{detectionQaResult.box_to_footprint_diagnostics.envelope_matches} envelope matches versus{' '}
{detectionQaResult.box_to_footprint_diagnostics.strict_matches} canonical matches
</strong>
<p>
{detectionQaResult.box_to_footprint_diagnostics.possible_box_to_footprint_mismatch_count} possible matching artifacts. Canonical precision, recall and F1 above remain footprint-IoU based.
</p>
</div>
) : null}
</div>
) : null}
</div>
+32
View File
@@ -983,6 +983,38 @@ details.ai-lab-model-surface > summary strong {
white-space: normal;
}
.detection-qa-diagnostic {
grid-column: 1 / -1;
display: grid;
gap: 0.2rem;
margin-top: 0.35rem;
border-left: 3px solid var(--accent);
padding: 0.55rem 0.65rem;
background: var(--accent-soft);
}
.detection-qa-diagnostic span {
color: var(--muted);
font-size: 0.68rem;
font-weight: 800;
text-transform: uppercase;
}
.detection-qa-diagnostic strong {
font-size: 0.82rem;
}
.detection-qa-diagnostic p {
margin: 0;
color: var(--muted);
font-size: 0.74rem;
}
.detection-qa-diagnostic-caution {
border-left-color: var(--warning);
background: #fff8eb;
}
.basemap-policy-notice {
margin-bottom: 0.65rem;
border: 0;
+32
View File
@@ -559,6 +559,8 @@ export interface DetectionQaResult {
reference_dataset_id: string
candidate_feature_count: number
reference_feature_count: number
candidate_feature_count_raw?: number
reference_feature_count_raw?: number
matches: number
false_positives: number
false_negatives: number
@@ -568,6 +570,36 @@ export interface DetectionQaResult {
mean_iou?: number | null
iou_threshold: number
warnings: string[]
coverage?: {
applied: boolean
mode: string
manifest_path?: string | null
tile_count: number
source_crs_values: string[]
candidate_raw_count: number
candidate_evaluated_count: number
candidate_excluded_outside_count: number
candidate_clipped_boundary_count: number
reference_raw_count: number
reference_evaluated_count: number
reference_excluded_outside_count: number
reference_clipped_boundary_count: number
}
box_to_footprint_diagnostics?: {
diagnostic_only: boolean
canonical_method: string
diagnostic_method: string
iou_threshold: number
strict_matches: number
envelope_matches: number
possible_box_to_footprint_mismatch_count: number
envelope_false_positives: number
envelope_false_negatives: number
envelope_precision?: number | null
envelope_recall?: number | null
envelope_f1_score?: number | null
envelope_mean_iou?: number | null
}
}
export type SegmentationModelCapability = DetectionModelCapability