Modular satellite image intelligence engine built on top of Digital Earth Sweden (DES).
Analyzes cloud-free Sentinel-2 imagery for change detection, spectral classification, and object detection.
executors/ ← How jobs are submitted and run
local.py ← Run locally from CLI or notebook
colonyos.py ← Run inside a ColonyOS container job
base.py ← Interface — add new executors here
imint/ ← Core engine (executor-agnostic)
job.py ← IMINTJob and IMINTResult data models
engine.py ← run_job() — the single entry point
analyzers/ ← One file per analyzer
base.py ← Abstract BaseAnalyzer + AnalysisResult
change_detection.py
spectral.py
object_detection.py
exporters/
export.py ← PNG, GeoTIFF, GeoJSON output helpers
config/
analyzers.yaml ← Enable/disable analyzers and tune params
outputs/ ← Generated files (gitignored)
The executor resolves job context (coordinates, dates, data fetching, cloud detection) and hands a populated IMINTJob to run_job(). The engine runs analyzers and writes outputs. Neither side knows about the other's internals.
git clone https://github.com/YOUR_ORG/imint-engine
cd imint-engine
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
# Run with synthetic data (for analyzer development)
python executors/local.py \
--date 2022-06-15 \
--west 14.5 --south 56.0 --east 15.5 --north 57.0Outputs land in outputs/2022-06-15/.
Add my_cloud_filtering/ from erikkallman/ai-pipelines-poc to your PYTHONPATH or clone it alongside this repo. The local executor will pick it up automatically.
PYTHONPATH=../ai-pipelines-poc python executors/local.py \
--date 2022-06-15 \
--west 14.5 --south 56.0 --east 15.5 --north 57.0# Sync code to ColonyOS filesystem
colonies fs sync -l imint -d . --yes
# Submit a job
colonies function submit --spec config/get_cloud_free.json --followThe ColonyOS executor reads DATE, WEST, SOUTH, EAST, NORTH from environment variables set by the job spec.
- Create
imint/analyzers/my_analyzer.py, subclassBaseAnalyzer, implementanalyze() - Register it in
imint/engine.py:from .analyzers.my_analyzer import MyAnalyzer ANALYZER_REGISTRY = { ... "my_analyzer": MyAnalyzer, }
- Add a config block to
config/analyzers.yaml
That's it — no other files need to change.
To run on a different scheduler (Airflow, cron, AWS Batch):
- Subclass
BaseExecutorinexecutors/ - Implement
build_job()andhandle_result() - Call
executor.execute()
The engine code is untouched.
| File | Description |
|---|---|
{date}_rgb.png |
Cloud-free RGB composite |
{date}_change_overlay.png |
Change regions highlighted in red |
{date}_change_regions.geojson |
Change region bounding boxes (WGS84) |
{date}_ndvi.png |
NDVI colormap |
{date}_land_cover.tif |
GeoTIFF land cover classification |
{date}_detections.geojson |
Detected regions of interest |
{date}_imint_summary.json |
Full run summary |
MIT