The complete intelligent systems system for Computer Vision tasks like object detection and mapping. It integrates with the Intelligent Systems Ground System (GS) and Imaging System's Ground Server for real time communication. In addition to its light-weight process for mission-critical ML tasks, it also hosts some other important functionality, including a script to transform annotated data into an easily-processable CSV for ML training.
To delete the images on the frontend, delete the ./exports folder completely. The folder includes the images and metadata for the images shown on the frontend.
DO NOT delete the ./exports folder when local-hawk-ai is running.
To clear the images in the queue and best-saved images:
http://<cloud ip>:8000/api/clear
NOTE! This will not fully clear the images because the queues are shared between processes, so clearing once won't necessarily clear all the images actually in the queue.
{
“lat”: float,
“lng”: float,
“target_type” : str, either “person” or “tent”
“id”: 0, 1, 2, 3 (increment up every time something is sent)
}
You can also run the local worker without Docker:
python core.py [options]The local worker (core.py) accepts the following command-line arguments:
-
--local(flag)- Use localhost defaults for GS/CS addresses. When set, the worker will use:
gs = 127.0.0.1:9000cs = 127.0.0.1:8000
- Use localhost defaults for GS/CS addresses. When set, the worker will use:
-
--gsip <host:port>- Ground Station API address (used when
--localis not set). - Default:
127.0.0.1:9000
- Ground Station API address (used when
-
--csip <host:port>- Cloud Server API address (used when
--localis not set). - Default:
34.106.160.143:8000
- Cloud Server API address (used when
-
--server-port <int>- Port for the API/command HTTP server (dashboard API, SSE, exports, mapping/command endpoints). Also serves the dashboard UI directly for backward compatibility.
- Default:
8080
-
--frontend-port <int>- Port for the frontend dashboard HTTP server (serves the same dashboard UI, pointed at
--server-portfor its API calls). - Default:
8081
- Port for the frontend dashboard HTTP server (serves the same dashboard UI, pointed at
-
--interval-seconds <float>- Scheduler interval (seconds) between cloud polls. Autopilot sends are manual — triggered only by pressing "Send to Autopilot" on a dashboard card.
- Default:
20.0
-
--aip <host:port>- Autopilot address (
host:port) to which target payloads are POSTed. If omitted, autopilot posting is disabled. - Default:
192.168.1.3:8001
- Autopilot address (
-
--map-idle-timeout <float>- Seconds of ingest idle time before the mapping pipeline auto-triggers. Set to
0to disable auto-trigger. - Default:
20
- Seconds of ingest idle time before the mapping pipeline auto-triggers. Set to
Example usage:
python core.py --gsip 192.168.1.2:9000 --csip 10.0.0.2:8000 --server-port 8080 --frontend-port 8081 --interval-seconds 20 --aip 127.0.0.1:8001 --map-idle-timeout 20Download the model weights from the Box folder and place them in the model_weights directory. The required weight files are:
Current local runtime for GS ingestion, cloud upload/pull, GroundingDINO fallback detection, mapping, and a small results dashboard.
- Pulls image assignments from GS and fetches image bytes.
- Uploads full images to the cloud inference service.
- Polls cloud best-image endpoints (tent + mannequin), deduplicates repeated detections, and stores current best results.
- Runs a local GroundingDINO fallback proposal step (
GDDetection) for person/tent candidates when cloud results are unavailable. - Projects selected targets to lat/lon and optionally posts to an autopilot endpoint.
- Runs a local HTTP server for:
- result dashboard UI,
- SSE updates,
- map trigger commands,
- cloud push result ingestion.
- Runs a GPS+SIFT stitching pipeline to generate map outputs from session telemetry/images.
Primary entrypoint: core.py
- Worker loop and scheduler: core.py
- GS/cloud HTTP client: communication/work_client.py
- HTTP API + dashboard server: communication/intsys_gs_api.py
- Frontend UI: frontend/index.html
- Mapping pipeline: mapping/main_gps_sift.py
- GroundingDINO wrapper used by worker: constructs/detection.py
- Lightweight websocket uploader/listener client: client.py
- Install dependencies:
python -m pip install -r requirements.txt- Run the worker:
python core.py --local- Open dashboard:
- http://127.0.0.1:8081 (dedicated frontend server), or http://127.0.0.1:8080 (API/command server, also serves the dashboard for backward compatibility)
--local- Force GS/CS defaults:
- GS:
127.0.0.1:9000 - CS:
127.0.0.1:8000
- GS:
- Force GS/CS defaults:
--gsip <host:port>(default127.0.0.1:9000)--csip <host:port>(default34.106.149.232:8000)--server-port <int>(default8080) — API/command HTTP server (dashboard API, SSE, exports, mapping/command endpoints)--frontend-port <int>(default8081) — dedicated frontend dashboard HTTP server--interval-seconds <float>(default20.0)--aip <host:port>(default192.168.1.3:8001)--map-idle-timeout <float>(default20, use0to disable)
Example:
python core.py --gsip 192.168.1.2:9000 --csip 10.0.0.2:8000 --server-port 8080 --frontend-port 8081 --interval-seconds 20 --aip 127.0.0.1:8001 --map-idle-timeout 20Two HTTP servers run side by side:
- API/command server (
--server-port, default 8080) —MapCommandHandlerfrom communication/intsys_gs_api.py:GET /→ dashboard HTML (backward-compatible; same content as the frontend server)GET /api/stream→ SSE streamGET /api/best→ latest metadata/results for tent/mannequin + GS pullsGET /export/<file>→ exported images and metadata JSONPOST /api/result→ cloud pushes a labeled detection payloadPOST /with command JSON:start,stop,trigger_mapping
- Frontend server (
--frontend-port, default 8081) —FrontendHandlerfrom communication/intsys_gs_api.py:GET /→ dashboard HTML only, with its API calls pointed at--server-port
- Session ingest dir: mapping/current_session
- Session CSV: mapping/current_session/metadata.csv
- Generated outputs: mapping
- Standalone mapping script: mapping/main_gps_sift.py
The worker auto-triggers mapping after configurable ingest idle time (--map-idle-timeout) when enough images are present.
Run client.py if you want a simple websocket listener + uploader utility:
python client.py --server ws://CLOUD_HOST:8001/ws --upload-url http://CLOUD_HOST:8001/upload-image --client-id my_local_id --watch-folder ./incoming- Dockerfile exists: Dockerfile
- Compose exists: docker-compose.yml
- Entrypoint runs
python core.py
Use:
docker-compose up --build- Legacy test script test.py still references old MaskRCNN/ImageNet classes and is not aligned with the current
GDDetection-first flow. - Makefile targets in Makefile are placeholders (
not implemented).
- Exported images/metadata for dashboard: export
- Runtime logs: logs
- Model files folder: model_weights
- GroundingDINO package and weights: