Files
geointel/docs/DETECTION_PIPELINE_SPEC.md
Jens faeb58ef6d
GeoIntel release gates / Compile, test, contracts and builds (push) Successful in 1m49s
GeoIntel release gates / Python and npm vulnerability policy (push) Successful in 21s
GeoIntel release gates / Production AI image, SBOM and container scan (push) Successful in 5m39s
GeoIntel release gates / Deploy exact gated revision to Unraid (push) Failing after 58m43s
Initial public release
2026-08-31 21:56:53 +02:00

3.0 KiB

GeoIntel Kempen — Detection Pipeline Specification v1.0

The detection pipeline converts geospatial imagery into georeferenced object detections stored as GIS features.

Goal

Run object detection on aerial or satellite imagery and export results as map layers and GeoJSON.

Supported model family

V1 target:

  • Ultralytics YOLO detection model.

Later:

  • custom PyTorch models
  • OpenMMLab detectors

Pipeline

Raster dataset
↓
Raster validation
↓
Tile generation
↓
Model inference per tile
↓
Detection postprocessing
↓
Pixel coordinates → geospatial coordinates
↓
Merge / de-duplicate overlapping detections
↓
Store detections in PostGIS
↓
Render as map overlay
↓
Export as GeoJSON/CSV

Step 1 — Validation

Check:

  • raster exists
  • raster is readable
  • raster has CRS and transform
  • selected bands are valid
  • tile size is valid
  • model file exists or selected model is available

Step 2 — Tile generation

Parameters:

tile_size_px: 640
overlap_px: 96
bands: [1, 2, 3]
area_id: optional

Every tile must store:

  • tile path
  • source pixel window
  • affine transform
  • bounds
  • source dataset id

Step 3 — Inference

For each tile:

  • convert to model input image
  • run YOLO
  • collect boxes, classes, confidence

Raw detection format:

{
  "tile_id": "uuid",
  "class_name": "building",
  "confidence": 0.91,
  "bbox_px": [x1, y1, x2, y2]
}

Step 4 — Georeferencing

Convert pixel bbox corners using the tile affine transform.

Output geometry:

  • polygon footprint of bbox for detection models
  • centroid point optional
  • original pixel bbox kept in metadata

Step 5 — Merge and de-duplicate

Because tiles overlap, duplicated detections must be removed.

Default method:

  • group by class
  • calculate IoU between overlapping geospatial bboxes
  • apply non-maximum suppression by confidence
  • default IoU merge threshold: 0.5
  • implemented for configured-YOLO as EPSG:4326 cross-tile duplicate suppression before Detection persistence; YOLO_DUPLICATE_IOU_THRESHOLD=0 disables the GeoIntel-side pass for debugging.

Step 6 — Storage

Store each detection:

analysis_run_id
class_name
confidence
geometry
bbox_json
source_tile_id
model_name
model_version
metadata_json

Step 7 — Metrics

Calculate:

  • detection count by class
  • mean confidence
  • low confidence count
  • confidence histogram
  • detected area by class when polygon geometry is valid

API

POST /analysis/object-detection
GET /analysis/{id}
GET /analysis/{id}/detections
POST /analysis/{id}/exports/geojson

UI

Detection Lab must allow:

  • raster selection
  • model selection
  • class selection
  • confidence threshold
  • tile size
  • overlap
  • run detection
  • map overlay visibility
  • QA/QC handoff button

V1 acceptable model strategy

If no locally trained model exists yet, the system may support a configurable YOLO model path and clearly mark model classes as model-dependent. The code must not fake detections.