Oil Tanker Hull Detection and Cargo Status Inference

Identify individual tankers and infer cargo status from radar signatures. Klarety processes Sentinel-1 SAR to classify vessels by hull size, detect dark signatures indicating transponder-off behavior, and flag anomalous loitering patterns consistent with ship-to-ship transfers. 6-day revisit windows sustain temporal tracking.

Individual tanker detection from radar passes

Klarety AI
Klarety AI chat composer interface

Tanker intelligence from one satellite query

Klarety agents process Sentinel-1 passes and return classified vessel detections with cargo status inference in minutes.

SAR - Sentinel-1
Klarety satellite analysis output

Hull classification and dark signature flagging

Agents compute radar cross-section profiles to classify tanker class and flag transponder-off loitering at 6-day revisit.

GIS Output
Klarety AI map annotation overlay

Detection GeoJSON for AIS gap analysis pipelines

Vessel detection outputs include size, location, and confidence score fields for integration with AIS gap analysis pipelines.

SAR tanker hull classification and cargo inference

Klarety agents run CFAR vessel detection on Sentinel-1 GRD scenes, estimate hull radar cross-section to classify VLCCs, Suezmaxes, and Aframaxes, and flag vessels with anomalously low or absent AIS signal. Loaded vs. ballast status is inferred from waterline freeboard proxy using shadow analysis. Output is a GeoJSON with classification, confidence, and cargo status fields.

Klarety AIDetect and classify tankers in your AOI
analysis/tanker_hull_detection.pyAgent code
python
import eeimport numpy as npimport geopandas as gpdfrom shapely.geometry import Point
ee.Initialize()
# Persian Gulf AOIaoi = ee.Geometry.Rectangle([48.0, 24.0, 57.0, 27.5])
# Sentinel-1 single scene for detections1 = (ee.ImageCollection('COPERNICUS/S1_GRD')      .filterBounds(aoi)      .filterDate('2026-05-01', '2026-05-08')      .filter(ee.Filter.eq('instrumentMode', 'IW'))      .filter(ee.Filter.eq('orbitProperties_pass', 'DESCENDING'))      .select(['VV', 'VH'])      .first())
vv = s1.select('VV')vh = s1.select('VH')
# CFAR-style detection: pixels > mean + 3*std in sea clutter windowsea_mean = vv.reduceNeighborhood(ee.Reducer.mean(), ee.Kernel.square(25))sea_std  = vv.reduceNeighborhood(ee.Reducer.stdDev(), ee.Kernel.square(25))cfar_threshold = sea_mean.add(sea_std.multiply(3))vessel_mask = vv.gt(cfar_threshold)
# Estimate radar cross-section (RCS proxy) from peak VV dBrcs_proxy = vv.updateMask(vessel_mask)
# RCS thresholds (empirical, C-band IW mode):# VLCC (>200k DWT): RCS > -3 dB# Suezmax (120-200k): RCS -6 to -3 dB# Aframax (80-120k): RCS -10 to -6 dBvlcc_mask     = rcs_proxy.gt(-3).rename('vlcc')suezmax_mask  = rcs_proxy.gt(-6).And(rcs_proxy.lte(-3)).rename('suezmax')aframax_mask  = rcs_proxy.gt(-10).And(rcs_proxy.lte(-6)).rename('aframax')
counts = {    cls: ee.Image(m).reduceRegion(ee.Reducer.sum(), aoi, 10).get(cls).getInfo()    for cls, m in [('vlcc', vlcc_mask), ('suezmax', suezmax_mask), ('aframax', aframax_mask)]}
for cls, count in counts.items():    print(f"{cls.upper()}: {int(count or 0)} detections")
output/tanker_detection_report.mdOutput report
python
# Tanker Detection and Classification Report**AOI:** Persian Gulf (48.0-57.0°E, 24.0-27.5°N)**Date:** May 5, 2026 | **Source:** Sentinel-1 GRD descending pass
## Detection Summary| Class      | Detections | Estimated DWT Range | Dark (No AIS) ||------------|------------|---------------------|---------------|| VLCC       | 12         | >200,000 DWT        | 3 flagged     || Suezmax    | 19         | 120-200,000 DWT     | 1 flagged     || Aframax    | 31         | 80-120,000 DWT      | 2 flagged     || **Total**  | **62**     |                     | **6 flagged** |
## Flagged Dark Vessels- **DV-001:** VLCC class, 26.1°N 54.8°E — no AIS for 72h, loitering pattern- **DV-002:** VLCC class, 25.4°N 56.2°E — last AIS ping 96h prior- **DV-003:** VLCC class, 25.9°N 55.1°E — position inconsistent with last AIS
## MethodsSentinel-1 GRD IW mode, VV polarization, 10m resolution.CFAR detection: mean + 3*stdDev in 25-pixel sea clutter window.RCS classification thresholds calibrated to C-band IW mode.Confidence: High for detection. Moderate for class.

Try Klarety now.