Procedural seafloors and scene authoring

Each seafloor in ApertureLab is a procedural recipe rather than a stored asset: it is built from published seabed morphology, evaluated at simulation resolution, and regenerated exactly from a seed. Re-seeding the recipe gives each scene a different seafloor, which matters for training data because a model trained on scenes that share one seafloor learns that seafloor.

Scene

YAML scene description

A scene names the seafloor, the objects on it, the vehicle's motion, the sonar, and the products to write. Scenes inherit from each other, so a variation is a short file rather than a copy. A profile bundle can carry two imaging configurations at once, so the same seabed can be rendered as both a synthetic-aperture collection and a real-aperture side-scan line without a second scene.

Six bottom types are built in (sand, rippled sand, mud, rock, gravel, silt), each calibrated to a measured backscattering strength, and a scene can define its own. Objects come from a catalog of 69 placeable models, plus procedural rock and biota generators.

Realism

Zone boundaries without rectangular footprints

Straight lines are a common artifact of synthetic seabeds: a ripple field that stops abruptly on a grid boundary, a sediment patch with corners, a roughness change along a raster edge. A model trained on such scenes learns the artifact.

Seafloor zones are painted as a raster and then blended with a warped, feathered boundary, so a bottom-type change follows an irregular line and the roughness crossfades across it. The feather runs inward from the boundary rather than outward, which is what keeps a ripple patch from bleeding into its neighbor. Seam quality is scored in the test suite across all fifteen pairs of bottom types.

The features themselves follow published morphology: ripple geometry after Tang et al. 2009, pockmarks after Hovland and Judd, and seabed roughness after Goff and Jordan. Burial and scour follow Shields-criterion sediment mechanics, so a partially buried object sits at the depth the sediment and current would produce.

27 mm → 2 mm
ripple-boundary step before and after the boundary correction, against a 2 to 3 mm sand-to-sand baseline; seams are scored across all fifteen bottom-type pairs

Texture

Domain randomization with a texture node graph

Seafloor texture is authored the way a Blender artist builds a material: as a graph of nodes. Seventeen node types are available (e.g., fractal noise, multifractal, Voronoi in several modes, the Tang ripple model, power-law roughness, pockmark and rock scatter, math and mixing operators). Together they drive four channels at once: the bathymetry, the bottom-type map, a per-cell backscatter gain, and rock placement.

The noise is a pure integer hash, so a graph evaluates identically at any resolution, on CPU or GPU, from the same seed. A graph therefore defines a reproducible distribution of seafloors rather than a single asset, which is the property that matters for training data. One graph reseeds into thousands of statistically distinct seafloors, and a scene that produced an unexpected result can be regenerated exactly.

A node-graph editor with noise, Voronoi and ripple nodes wired into a seafloor material output, and a live grayscale heightfield preview
The texture editor, with nodes on the left and the evaluated heightfield on the right, previewed at the resolution the simulator traces.

Ground truth

Authored heightfields and their sonar images

Each pair below shows one seafloor twice at matched framing: the heightfield the scene defines and the sonar image the simulator produces from it. Every downstream label is computed from this authored geometry, so the labels are exact rather than estimated.

Grayscale heightfield of a fine ripple field The same fine ripple field imaged as synthetic aperture sonar
Fine ripple: authored relief, then its sonar image.
Grayscale heightfield of a rocky bottom The same rocky bottom imaged as synthetic aperture sonar
Rocky bottom: the same relationship, a different bottom type.

The heightfield preview takes 30 seconds and can be approved before any GPU time is spent on the image; the simulator traces exactly the approved geometry.

Next: the labels this geometry produces, or what the results look like.