The Problem
The ocean is being emptied faster than it can recover. Marine wildlife populations have declined by 56% since 1970, with many commercially important fish populations seeing even steeper drops. More than one-third of global fisheries are now being pushed beyond sustainable biological limits. This is a big issue.
Illegal fishing is accelerating the crisis: up to 26 million tons of fish are caught illegally each year, accounting for nearly 1 in 5 fish caught globally and costing billions annually.
Over 3 billion people rely on seafood for essential nutrition, but illegal fishing is depleting marine life faster than ecosystems can recover. The ocean is running out of time, and the tools to protect it need to keep up.
Our Solution
What: We built an agentic AI surveillance system that detects illegal fishing in real time and autonomously alerts authorities and generates compliance reports. This is the ultimate tool for law enforcement agencies to detect and take action against illegal fishers.
Detection: At the core is an anomaly detection model trained on AIS vessel trajectories. It flags behavioral patterns associated with IUU (Illegal, Unreported, and Unregulated) fishing — including AIS spoofing, dark vessel activity, and prohibited zone incursions.
Action: On top of the detection model sits a multi-agent system that turns flags into responses. The comms agent autonomously escalates alerts to the relevant parties when a violation is detected. The document agent generates structured incident reports — complete with vessel metadata, GPS coordinates, and timestamped evidence — ready for legal or regulatory use.
How it Works
We will split this section up into two parts: the agentic pipeline and the modeling for detection.
The Agentic Pipeline
A multi-agent vessel-incursion pipeline that tries to answer one question:
Did a fishing vessel likely enter a protected or regulated region, and is there enough evidence to generate a prosecution-ready legal packet?
Trigger: "A vessel may have entered region X"
|
v
+-------------------------------+
| Turn 1: Parallel Prefetch |
| - AIS vessels near point |
| - SAR dark-target count |
| - Regional legal dossier |
| - Historical fishing events |
| - Nearest port |
+-------------------------------+
|
v
+-------------------------------+
| Fishing-Vessel Gate |
| Keep only vessels that are |
| actually fishing-capable |
+-------------------------------+
|
+------------------------------+
| |
v v
AIS fishing MMSIs found AIS silent
| |
v v
classify_vessels_iuu_batch use historical fishing MMSIs
(parallel per MMSI) then classify in parallel
| |
+--------------+---------------+
|
v
Supervisor synthesis
|
v
Render PDF + Calling only if strict
prosecution gate is met
All local
We took absolute use of the Asus XG10 and used the Gemma 3/4 to power all of our decision making process. We even took step to fine-tuning a Gemma 3 model using LoRA.
What runs in parallel
A. Turn-1 prefetch
ThreadPoolExecutor(max_workers=5)
- AIS fetch
- SAR dark-target query
- regional law lookup
- historical fishing-event lookup
- nearest-port lookup
B. Fishing-vessel filtering is parallel When AIS finds multiple nearby vessels, the code checks their fishing identity in parallel:
MMSI 1 -> GFW identity check
MMSI 2 -> GFW identity check
MMSI 3 -> GFW identity check
...
This stage decides which vessels are:
FISHINGNOT_FISHINGUNKNOWN
C. Batch IUU classification is parallel
classify_vessels_iuu_batch(...) runs per-MMSI risk classification concurrently.
Input MMSIs
|
+--> classify vessel A
+--> classify vessel B
+--> classify vessel C
+--> ...
This reduces total latency to roughly the slowest individual vessel classification rather than the sum of all of them.
Illegal Fishing Detection
We built a model that predicts risk factor based on AIS vessel data.
Sequence Modeling Pipeline
Our pipeline ingests AIS vessel event streams from a Databricks Gold-layer table (workspace.default.gold_vessel_detections_enriched) — enriched detection records keyed on MMSI. Preprocessing handles UTC normalization, one-hot encoding of categoricals (vessel_type, vessel_flag, event_type, detection_source), median imputation, and per-feature z-score normalization. Identifiers and raw timestamps are stripped from the feature vector to prevent leakage.
Sequence Construction
For each MMSI, we build sliding windows of length seq_len with configurable stride, producing [T, F] tensors (T = time steps, F = feature dim). Labels are MMSI-class IDs — the model learns behavioral fingerprints that discriminate vessels, which is exactly the signal needed to detect spoofed or anomalous AIS tracks. Splits use a temporal tail fraction per vessel so no future windows contaminate training.
Architecture: RNN vs. BiLSTM
Two architectures, head-to-head:
BoatRNNClassifier— vanillann.RNNwithpack_padded_sequenceto suppress padding gradients, masked mean pooling over valid time steps, linear projection tonum_classes.BoatBiLSTMClassifier— bidirectionalnn.LSTMwith the same packing/pooling setup; the classifier head takes concatenated forward/backward states (hidden_dim × 2), capturing context in both temporal directions.
Both train on CrossEntropyLoss + Adam, checkpointed on validation loss. We evaluate top-1/top-k accuracy, Brier score, and ECE.
Ensemble & Risk UI
Post-training, we average softmax outputs across both models — if the ensemble beats either solo model on Brier/ECE, it gets promoted as the active inference head automatically.
In the demo, this powers the risk assignment UI: a vessel track that behaviorally clusters near a known high-risk MMSI gets flagged for potential spoofing or IUU activity — no GPS ground truth or explicit illegal-fishing labels required.
Notes
Due to rate limits, we only loaded <1,000 boats. We would have love to put ~70k boats but could not due to this constraint.
Built With
- asus
- gemma
- javascript
- love
- python
Log in or sign up for Devpost to join the conversation.