How to estimate vessel size class from satellite imagery

A detection report that just says "vessel present" at a lat/long isn't much use to a watch desk. What a duty officer needs to know is whether that's a six-metre skiff or an eighty-metre longliner, because that one number decides whether it's worth a radio call to the patrol boat or just a line in the log.

What "size class" means on a detection report

Size class is a bucket, not a measurement to the centimetre. Most MCS workflows run something close to three bins: small craft (under roughly 10-15 m, your skiffs, pangas, gillnetters), medium vessels (15-40 m, coastal trawlers and longliners), and large vessels (40 m plus, reefers, factory ships, foreign-flagged distant-water fleets). The exact cutoffs vary by fleet and by the regulations a given RFMO or national authority enforces, but the logic is the same everywhere: bin first, measure precisely later if it matters.

The math behind a length estimate

Optical satellite imagery gives you a ground sample distance, the real-world size one pixel covers. At 0.5 m GSD, a vessel that's 40 pixels long bow to stern is roughly 20 m. At 2 m GSD, that same hull might only be 10-15 pixels across, and your error bars widen fast.

The actual measurement is a pixel count along the hull's long axis, corrected for the vessel's heading relative to the sensor's look angle. A boat running broadside to the pass measures clean. A boat quartering away from the sensor measures short, because you're seeing a foreshortened hull, not its true length. Analysts who've done this by hand on raw scenes know the drill: find bow, find stern, count the pixels between them, convert to metres, then sanity-check against known hull shapes for that fishery.

Where length estimation breaks down

A few things reliably wreck a length estimate, and it's worth knowing them before you trust a number:

Wake confusion is the big one. A fast-moving skiff throws a wake that can read as 10-15 extra metres of "hull" if the detection logic isn't trained to separate wash from structure. Sun glint does something similar on calm water, washing out the stern or bow edge so the hull looks shorter than it is.

Resolution floor matters too. Below a certain GSD, a small open boat starts to near the size of a single pixel cluster, and at that point you're not measuring length anymore, you're guessing from a blob. This is exactly why small-boat detection in dark-fleet work leans on GSD in the 0.5-1 m range rather than coarser imagery. Anything coarser and your "small vs large" call starts failing on the small end specifically, which is usually the end you care about most, since small unregistered craft are the ones most likely to be fishing without a transponder running.

Cloud cover and partial occlusion are the third failure mode, and there's no clever workaround for them. A vessel half-hidden under a cloud edge measures whatever's visible, not what's actually there.

Why size class beats exact length for a watch desk

For enforcement purposes, the bin usually matters more than the metre. A detection that comes back "large vessel, no matching AIS broadcast in the area at that time" is a very different alert than "small craft, no AIS match." Large unregistered vessels operating dark are rarer and usually more consequential: foreign-flagged, likely transshipment-adjacent, worth escalating. Small craft without AIS are common (plenty of small-scale fleets never carry a transponder at all) and the size class tells the duty officer that fast, without anyone opening the raw image to measure a hull by eye.

That's the real point of running size class alongside the match-to-AIS step rather than as a separate exercise: a daily list of unmatched detections is only actionable if each line already tells you roughly what kind of boat you're dealing with. Illegal Fishing Detection builds size class into the same daily pass that flags the AIS gap, so a watch desk gets position, size bin and timestamp on one line rather than a raw scene to measure by hand.

If your team is still eyeballing hull lengths on raw scenes before deciding whether a detection is worth a patrol asset, it's worth seeing what a daily unmatched-detection list looks like with size class already sorted.

← Back to the blog