Aerial Change Detection & Military Object Recognition
A field-ready intelligence platform that turns hours of drone footage into a short, verifiable list of what changed and what is on the ground β with coordinates, confidence, and briefing-ready imagery. Built to run on the unit's own hardware, offline.
01 Executive summary
A single drone sortie produces tens of minutes to hours of high-resolution video. The bottleneck is no longer flying β it is the analyst who must watch every frame to find the one thing that matters. Drone Intelligence automates that work with two complementary capabilities running on a shared imaging pipeline:
- Change Detection β compare two flights over the same route, flown days, weeks or months apart, and surface what changed: new construction, demolitions, encampments, damaged structures, new vessels.
- Military Object Detection β inventory every object of interest in a single clip β personnel, vehicles, vessels, aircraft β with per-object tracking so each is counted once.
Both modules are deployed and operational today on a password-protected HTTPS console, GPU-accelerated, with an automatic CPU fallback. The system is designed to be installed and run entirely on the unit's own machines β no data leaves the building.
02 The operational problem
Finding "what changed" or "what to watch" in raw footage still depends on an experienced operator comparing imagery by eye. In practice this means:
A single video pair can take hours of one analyst's time.
Highly trained personnel spend their day on repetitive review.
Eye fatigue causes small but significant changes to be missed.
Results depend on individual judgement; hard to audit later.
The opportunity is to convert "watch the whole tape" into "review a short, ranked list of what the AI found" β moving the analyst from searcher to decision-maker.
03 System overview
Both capabilities sit on one shared, five-stage imaging pipeline, so investment in one improves the other.
| Stage | Role | Core technique |
|---|---|---|
| 1 Β· Ingest | Extract frames + GPS/heading telemetry | DJI .SRT sidecar, fixed-rate sampling, ffmpeg |
| 2 Β· Pair | Match frame AβB at the same place | GPS nearest-neighbour or DTW on visual descriptors |
| 3 Β· Register | Align the two images to pixel level | SIFT + robust similarity/affine fit with geometric, overlap & photometric validation (mis-paired frames rejected, no-data margins masked); identity+ECC for pre-aligned imagery |
| 4 Β· Detect | Locate changed / detected regions | ChangeFormer (deep) or CIELAB baseline Β· YOLO + ByteTrack |
| 5 Β· Report | Rank, de-noise, render outputs | JSON Β· overlay MP4 Β· annotated MP4 Β· ranked gallery |
04 Change detection
Feed two clips of the same route at different times; the system aligns them and reports the meaningful differences, ranked by confidence and tagged with GPS coordinates pulled from telemetry.
Capabilities
Buildings, piers, checkpoints, encampments that appeared.
Demolished, collapsed, shelled or bombed structures.
Shifts in shoreline, earthworks, land use.
Vessels, vehicles or materiel introduced into a watched area.
Object-level change attribution
Beyond where something changed, the system identifies what changed. Every change region is cross-examined with the aerial object detector (Section 05) on both the before and after frame and classified:
An object present in the later flight but not the earlier one β a vehicle, vessel or aircraft that arrived.
An object present earlier but gone later β materiel that departed or was destroyed.
A recognised object present in both flights inside a changed region β it moved, was repositioned or replaced.
A real change with no recognised object β terrain, vegetation, structures or lighting.
The final report leads with a tally of added / removed / modified / unknown changes and the identity of each changed object (e.g. "2Γ added car, 1Γ removed van"), so an analyst sees the operational meaning of a flight-to-flight comparison at a glance.
Robustness β engineered to suppress false alarms
- Histogram matching (CIELAB) neutralises seasonal and lighting differences between flights.
- Shadow masking ignores dark low-information regions that otherwise trip naΓ―ve diffs.
- Robust two-flight alignment β SIFT features fit a stable similarity model (not an over-fitting homography); pairs are kept only if the alignment is geometrically valid, overlaps β₯70%, and the imagery actually correlates, so mis-paired frames from two separate real flights are rejected instead of producing false changes (typical residual 1β2 px).
- Area & morphology filtering plus a dynamic floor scaled by alignment error removes speckle.
- Per-frame detection cap + probability-map blur keep noisy frames from flooding the report.
Detection models
| Backend | What it is | When used |
|---|---|---|
| ChangeFormer | Transformer change-detector, pretrained on LEVIR-CD | Default when weights are present (GPU) β highest quality |
| TinyCD | Lightweight CD network | CPU-only sites |
| Classical (CIELAB ΞE) | Colour-space difference, no weights | Always-available fallback β guarantees the system runs out of the box |
The fallback design means the platform always produces a result; quality scales up the moment a deep model's weights are dropped in β no code change.
Deliverables
Thumbnails of each detected change, ordered by confidence, click-through before/after.
A | B | aligned-A | change heatmap β built for the briefing room.
changes.jsonMachine-readable: bbox, area, confidence, change type (added/removed/modified/unknown), identified object class & category, GPS, timestamp.
Each change carries the coordinate read straight from drone telemetry.
05 Object detection
Point the system at a single clip and it inventories every object of interest, frame by frame, then tracks each object across frames so it is counted exactly once.
How it works
- Aerial-trained detector: the default model is trained on VisDrone (low-altitude drone imagery), so it recognises top-down vehicles, vans, buses and people that generic ground-level (COCO) and satellite (DOTA) models miss entirely. The detector is a drop-in β a fine-tuned military model (tanks, naval classes, etc.) loads via a single environment variable with no other change.
- Tiled (sliced) inference: each frame is split into overlapping tiles that are each analysed at near-native resolution, so a car that is only ~80 px in a 4K frame becomes large enough to detect reliably. This is the single biggest driver of small-object recall in nadir footage.
- Per-category confidence floors: the vehicles/vessels/aircraft that matter most are kept at a sensitive threshold, while the noisiest class (aerial "pedestrian" over textured ground) must clear a high bar β turning a noisy raw output into a clean inventory.
- Tracking: a persistent ID is assigned to each object across frames, so "9 detections of one truck across 9 frames" is reported as one truck, not nine; objects seen only once are discarded as flicker.
- Taxonomy: raw classes are mapped into a military taxonomy β personnel Β· vehicle Β· vessel Β· aircraft β see Section 06.
- Compute: runs on GPU when available, falls back to CPU automatically.
Deliverables
Every object boxed and labelled, colour-coded by category, with track IDs.
Unique object counts by category and by class, plus peak objects-in-frame.
Per object: ID, category, class, best confidence, first/last-seen time, frame count.
objects.jsonFull machine-readable inventory + per-detection records for downstream tools.
06 Supported object types
The shipped aerial detector (VisDrone-trained) recognises the following drone-view classes and maps them to military categories. Colours match the annotated video output.
| Category | Detected classes (default aerial model) | Mission relevance |
|---|---|---|
| β Personnel | pedestrian, people | Dismounted troops, crowds, individuals |
| β Vehicle | car, van, truck, bus, motor(cycle), bicycle, tricycle | Ground movement, convoys, logistics |
| β Vessel | boat (+ ship/vessel via military model) | Surface craft, small boats, shipping |
| β Aircraft | airplane (+ helicopter/UAV via military model) | Fixed-wing & rotary air activity |
Extending to dedicated military classes
The taxonomy layer already understands military terminology, so a specialised model trained on military classes is bucketed automatically. Recognised keywords include:
soldier Β· infantry Β· pedestriantank Β· APC Β· artillery Β· jeep Β· truck Β· busship Β· frigate Β· warship Β· submarine Β· ferry Β· navaljet Β· helicopter Β· drone Β· UAVDrop a fine-tuned .pt model in and set DRONE_OBJDET_MODEL; the
inventory, tracking, annotation and API all work unchanged. iApp's synthetic-data generator (Section 11)
produces the labelled aerial training data to build exactly these models for the Thai context.
07 Accuracy & how we evaluate
We measure against ground truth, not impressions. A 19-scenario benchmark spanning naval
harbours, the ThaiβCambodia border, deep-south towns and riverine Bangkok β 42 ground-truth
changes in all β ships with the system, each with a machine-authored solution.json.
In addition, three real DJI passes over one route (real_footage/) validate the
pipeline on genuine flight imagery.
Evaluation method
Detections are reported in clip-frame coordinates (after oblique warp, camera shake and crop), while ground truth is in base-map coordinates. Our harness projects the ground-truth label map through the identical render functions used to synthesise each clip, so detections and truth land in one coordinate space β no hand-derived geometry that could flatter the score. Because each change's ground-truth box is the actual set of pixels that changed (from the AI-graft step), the labels are exact by construction. For every change we record the frames it is visible in, the frames it was detected in, and we tally false positives per frame.
Measured results β 19-scenario benchmark, baseline backend
Figures below are the always-available classical baseline (no deep weights on the box) on the high-oblique clips β the system's floor, not its ceiling β aggregated over all 42 changes.
| Metric | Result |
|---|---|
| Scenarios Β· change instances | 19 Β· 42 |
| Structural-change recall (buildings, encampments, checkpoints, piersβ¦) | 0.84 (16/19) |
| Small-object recall (vessel / vehicle clusters) | 0.22 (5/23) |
| Overall recall | 0.50 (21/42) |
| Mean false alarms / frame | 0.49 |
Reference benchmarks of the underlying models
| Model | Public benchmark | Score |
|---|---|---|
| ChangeFormer (deep CD) | LEVIR-CD F1 (Bandara & Patel, 2022) | β 0.904 |
| YOLOv8s (object detection) | COCO val mAP50-95 (Ultralytics) | β 44.9 |
These are published, third-party-verifiable figures for the model architectures we deploy. Fine-tuning on the unit's own footage is expected to raise field accuracy further.
08 Security & deployment
Runs fully on-premise; imagery never leaves the unit's network. No cloud dependency at inference time.
Password-gated, signed-cookie sessions over HTTPS (Let's Encrypt). Sessions survive restarts.
Consumes the MP4 + .SRT telemetry the unit's drones already produce.
Uses available GPUs for deep models and YOLO; degrades gracefully to CPU.
The current reference deployment runs as a managed system service behind nginx with automatic TLS renewal, isolated from other services on the host. Uploaded footage and results stay in a per-job directory on the unit's machine.
09 API reference
Every capability is available over a documented HTTP API, so the platform can be driven from the unit's
own tooling. All endpoints are under https://drone.iapp.co.th; authentication is a signed
session cookie obtained from /api/login. Examples use curl.
/api/login β authenticate, receive session cookiecurl -c cookies.txt -X POST \
-F username=iapp -F password=β’β’β’β’ \
https://drone.iapp.co.th/api/login
# β {"ok": true} (cookie stored in cookies.txt)
/api/scenarios β list bundled benchmark scenarioscurl -b cookies.txt https://drone.iapp.co.th/api/scenarios
# β {"scenarios":[{"name":"bangkok_chaophraya","variants":["flylow","flyhigh"], ...}]}
/api/run/change β start a change-detection job# A) on a bundled scenario
curl -b cookies.txt -X POST \
-F scenario=new_construction -F variant=flylow \
https://drone.iapp.co.th/api/run/change
# B) on your own footage (before/after)
curl -b cookies.txt -X POST \
-F video_a=@flight_A.mp4 -F video_b=@flight_B.mp4 \
https://drone.iapp.co.th/api/run/change
# β {"job_id":"f0787d067de3"}
/api/run/objects β start an object-detection jobcurl -b cookies.txt -X POST \
-F video=@patrol.mp4 \
-F sample_fps=4 -F conf=0.30 -F include_other=false \
https://drone.iapp.co.th/api/run/objects
# β {"job_id":"81c579396c8a"}
# fields: video | odclip=<id> | scenario=<name> (+variant, clip), sample_fps, conf, include_other
/api/jobs/{id} β poll job status & progresscurl -b cookies.txt https://drone.iapp.co.th/api/jobs/81c579396c8a
# β {"status":"running","progress":0.61,"message":"Scanning 22.0s / 29s β 7 objects so far"}
# status: queued | running | done | error
/api/jobs/{id}/result β fetch results when donecurl -b cookies.txt https://drone.iapp.co.th/api/jobs/81c579396c8a/result
# objects β {"result":{"summary":{"n_objects":10,"by_category":{"vehicle":9,"vessel":1},
# "by_class":{"car":6,"train":2,"truck":1,"boat":1},"device":"GPU"},
# "tracks":[...], "annotated_video":"od/annotated.mp4"}}
# change β {"result":{"n_changes":56,"changes":[{"bbox":[x,y,w,h],"confidence":0.97,
# "polarity":"new","t_seconds_b":...}], "overlay_video":"cd/overlay.mp4"}}
/api/jobs/{id}/file?path=β¦ β download an output artefactcurl -b cookies.txt -o annotated.mp4 \ "https://drone.iapp.co.th/api/jobs/81c579396c8a/file?path=od/annotated.mp4" # change-detection artefacts: cd/overlay.mp4 Β· cd/report.html Β· cd/overlays/pair_XXXX.jpg
/api/jobs β list recent jobs Β· GET /healthz β livenessJobs run asynchronously: submit, then poll /api/jobs/{id} until
status:"done", then read /result and pull artefacts via /file.
The same flow powers the web console.
10 Use cases
| Mission | Application |
|---|---|
| Patrol-route surveillance | Detect new construction, vehicles or anomalous activity along a repeated route. |
| Post-disaster damage assessment | Before/after comparison after storms or surges to map damage fast. |
| Base & harbour monitoring | Inventory what was added or removed over time. |
| Maritime watch | Count and track vessels, vehicles or personnel in a watched area. |
11 Roadmap
| Phase | Work | Status |
|---|---|---|
| Now | Change detection + object detection deployed end-to-end on the unit console | Done |
| Next | Fine-tuned military object model from synthetic data; deep ChangeFormer weights on the GPU box | In progress |
| + weeks | Fine-tune on the unit's own drone footage (β30 min, two flights same route) | Needs unit footage |
| + 1β2 months | Semantic change classification + analyst console | Planned |
| Future | On-board / live detection during flight | Planned |
12 Honest disclosure
We state status plainly β that is how trust is earned for real missions.
- The default change-detection backend on the current box is the classical baseline (no deep weights installed). It catches large structural changes reliably with near-zero false alarms, but misses small clustered objects. Installing ChangeFormer weights is a drop-in upgrade.
- The shipped object detector is a VisDrone-trained aerial model with tiled inference β it reliably finds top-down vehicles on real low/medium-altitude footage that generic (COCO) models miss. It has no naval/aircraft-specific classes yet and can over-trigger "pedestrian" on textured ground (held back by a high per-category confidence floor); a military-fine-tuned model (Section 06/11) is the intended production path.
- The benchmark scenarios are synthetic, generated from real geography for repeatable, perfectly-labelled evaluation. Field accuracy is confirmed by fine-tuning on the unit's real footage.
13 Contact
iApp Technology Co., Ltd.
Kobkrit Viriyayudhakorn β Founder & CEO
kobkrit@iapp.co.th
Prepared for the Royal Thai Navy Drone Unit. Confidential β for authorised partners and customers. Β© iApp Technology.
β Back to the platform