Inspiration

Between 2011 and 2018, 1,030 US workers died in confined spaces, 205 of them in tanks, bins and vats (US Bureau of Labor Statistics). Inspecting a steel storage tank still means a person with a lamp and a probe standing inside it. No one should die inside a tank to prove it is safe, so we built the crawler that goes in first

What it does

The crawler drives along the weld seams inside a storage tank with two instruments, because neither can do the other's job:

  • A camera and a vision model judge the weld surface. DeepSeek V4.1 Flash on Nebius Token Factory makes the right walk-in call on 23 of 24 frames.
  • An ultrasonic probe measures the steel left behind the surface. Our physics-simulated pulse-echo gauge reads all 168 probe places within 0.05 mm and finds all 28 below the 60% wall limit, 20 of them behind frames that look perfectly clean to the camera.

How we built it

  • A digital twin of the tank with weld faults and wall loss in known places, and an answer key computed from the scene geometry, never from a model's answer. Its camera model matches the renderer's projection to within 0.02 px.
  • A physics-based ultrasonic gauge: a finite-difference simulation of a 5 MHz pulse through couplant into steel, read echo to echo and calibrated on reference blocks like a real gauge. It holds through a 0.5 mm epoxy lining, where a conventional first-echo gauge would pass 15 of the 28 failing places.
  • NVIDIA Nemotron on Nebius Token Factory. On the welding cell this loop was first built on, Nemotron 3 Nano makes every go/no-go decision on a measurement, 88 of 89 right against ground truth, and Nemotron 3.5 Lightning runs the supervisor agent and writes the corrective action briefs. In the tank we benchmarked Nemotron 3 Nano as the probe planner against a deterministic coverage rule, and shipped what the evidence supports.
  • Replayable end to end. A dashboard shows every recorded run, and all 393 tests pass with no API key, no GPU and no download.

Challenges we ran into

  • A lining that fooled the gauge. Tanks are often lined, and the lining sits between the probe and the steel. In our simulation, a 0.5 mm epoxy lining's own echo came back nearly four times stronger than the back-wall echo, and an autocorrelation over the whole trace locked onto its ringing: 1.42 mm, whatever the wall. We derived the read window from the impedance steps at the lining's two faces. Each round trip keeps about 0.3 of the pressure, so after four the ringing is under the 1% noise. With that window, the gauge reads all 168 probe places within 0.05 mm and fails the same 28. A conventional first-echo gauge would have passed 15 of them.
  • Numerical error that looked like physics. The staggered finite-difference grid puts the free back face half a cell off, so a 10 mm wall read 21.2, 11.3 and 5.4 µm long on 40, 20 and 10 µm grids. Once we recognised it as a fixed length, not a velocity error, the two-block calibration removed it, the same way a real gauge sets its zero.
  • No NVIDIA model on Token Factory reads images. Of the 23 models we could reach, 15 refused an image, all four NVIDIA models among them. So we split the work by what each model can actually do: a vision model judges the pixels, Nemotron makes the reasoning decisions, and every assignment is benchmarked against ground truth.
  • An answer key that has to be right to the pixel. Projecting faults at the top of the weld put a crack that sits 2.4 mm lower just outside frame 12, at pixels 16 to 33 of 1280. We rebuilt the key from the rendered geometry, matched our camera model to the renderer's projection on 630 points (worst 0.02 px), measured each fault's share of the picture with 64 × 36 rays, and hash-locked the frames, so the key cannot drift from what the camera saw.
  • Separating skill from luck. In one ordering, a coverage rule found 16 of the 28 failing points. Before choosing a planner, we scored all 5,040 tie-break orders and ran paired exact tests against Nemotron 3 Nano. We shipped the deterministic rule: level with the model on the evidence, free, and it adds no hours to a tank.
  • Latency is physical. Each probe plan needs the previous station's readings, so planning can't run in parallel. A model at a median 7.1 s a station would add 5.3 hours to a real tank, and 4.0 even overlapped with driving.

Accomplishments that we're proud of

  • A complete inspection loop, camera, probe and planner, measured end to end against ground truth.
  • A physics-based gauge that agrees with the thickness model at every one of 168 probe places, even with each plate at its own sound velocity and under a lining.
  • Every number in the video replays from the public repository with one command.
  • On the welding cell, the seam is found to under a millimetre on parts arriving centimetres out of position.

What we learned

  • The camera and the probe answer different questions: 20 of the 28 failing places sit behind frames that look clean.
  • Put the model where there is something to see, and arithmetic where the evidence says it is just as good.
  • A benchmark is only as strong as its answer key, so ours is computed from geometry, checked to the pixel and pinned by tests.

What's next for Tank Inspection Crawler

  • Sim to real on steel. Build the bench crawler from its designed parts list and run it on a real plate with machined hidden wall loss, putting a real 5 MHz probe's A-scans next to the simulated ones.
  • A full elastic wave model. Add shear waves, mode conversion, attenuation and pitted back walls to the gauge, and grow single readings into a corrosion map of the shell.
  • Smarter probing. Gaussian-process thickness mapping, so the crawler probes next wherever the wall map is least certain.
  • Scale on Nebius AI Cloud. Generate thousands of randomised tank scenes, with new fault layouts, coatings and lighting, as a held-out benchmark and as training data for sharper weld-toe undercut calls.
  • From readings to decisions. Turn the thickness map into the numbers an API 653 inspector signs off: minimum thickness by shell course, corrosion rate and remaining life.

Built With

Share this project:

Updates

Submission history