Close
0%
0%

OpenUSCT: full-waveform ultrasound imaging

Open ultrasound computed tomography: full-waveform imaging across FPGA hardware, GPU software, and verified simulation.

Similar projects worth following
0 followers
OpenUSCT reconstructs the interior of a specimen from full-matrix capture on a ring or cylinder array by full waveform inversion - fitting recorded waveforms against a wave-equation solve, rather than beamforming.

Three pillars, built as one system:

Hardware:
array + acquisition front-end; the FPGA datapath is SystemVerilog, co-simulated bit-exact against physics

Software:
one stack from Python, C++ or MATLAB, OpenMP + CUDA, a plugin API and a full GUI

Simulation:
acoustic, elastic and fully anisotropic solvers, 2D/3D

All three share one HDF5 Dataset and one pipeline, so a simulated acquisition and a real one are interchangeable. The simulator is a digital twin of the instrument, not a separate codebase that drifts.

Status: software and simulation run today. The hardware is a complete open design package - designed, not yet fabricated.

Try it in your browser, on your GPU via WebGPU:
https://jeromegraves.com/openUSCT/

What it does

OpenUSCT reconstructs the interior of a specimen from full-matrix capture on a ring or cylinder array by full waveform inversion — fitting the recorded waveforms against a wave-equation solve — rather than beamforming. It recovers material properties directly, not a brightness image.

The technique is powerful and almost entirely locked inside expensive proprietary scanners and closed toolboxes. OpenUSCT is an attempt at a complete, inspectable, extensible alternative that covers the whole chain.

Three pillars, one system

   +-------------+      +-------------+
   |  HARDWARE   |      | SIMULATION  |
   | array + PCB |      | wave solver |
   +------+------+      +------+------+
          |   same Dataset     |
          |   (HDF5 schema)    |
          +---------+----------+
                    v
          +--------------------+   Python / C++ / MATLAB / GPU
          |  SOFTWARE  (core)  |<-> user algorithms (plugins)
          | imaging, FWI,      |
          | misfits, optimisers|
          +---------+----------+
                    v
                  image

The pillars share a single on-disk format and processing pipeline. A simulated acquisition and a real acquisition both produce the same Dataset — array geometry plus full-matrix-capture channel data in a portable HDF5 file — and the same imaging, FWI and user code runs on either.

That design decision underpins the whole project: the simulator is a digital twin of the instrument, not a parallel codebase that drifts away from it.

>>> INSERT IMAGE HERE: docs/gallery/pipeline-sq.jpg — the three-pillar pipeline. Use the editor's image button, then delete this line.

Run it in your browser

The whole application runs client-side as Python compiled to WebAssembly. On Chrome or Edge, the acoustic acquisition executes on your own GPU through WebGPU, with a live parity check against the CPU reference so you can watch the two agree rather than take my word for it.

jeromegraves.com/openUSCT — no install, nothing to sign up for.

The GUI drives the complete workflow: array and transducer geometry in interactive 3D, the FPGA excitation chain, sample definition (uniform, or a 3D Voronoi polycrystal of anisotropic grains), acquisition with an automatic FPGA RTL capture stage, TFM imaging, and FWI reconstruction with six misfit functionals and two optimisers.

Everything is verified, and here is the evidence

Every physics kernel and gradient carries an explicit check, most to machine precision:

  • Acoustic FWI gradient is the exact discrete adjoint (2D and 3D) — finite-difference check, relative error ~0
  • C++ and GPU backends match the Python reference — ~1e-15 (C++), ~1e-6 (FP32 GPU)
  • Elastic solvers propagate correct P and S speeds — measured against theory, <5%, dispersion-limited and convergent
  • Anisotropic solvers (2D, and full 21-component 3D) — measured qP against the analytical Christoffel equation, <1% in 2D
  • Six misfit functionals (L2, GCN, envelope, envelope-GCN, traveltime, graph-space optimal transport) — each adjoint source passes a finite-difference gradient check
  • Gauss-Newton FWI (matrix-free Born + adjoint) — Hessian-vector product matches FD of the gradient to 1e-7; 4 iterations reach 0.03% misfit where gradient descent reaches 8.5%
  • FPGA acquisition datapath — RTL streamed capture bit-exact against the simulated acquisition (Icarus Verilog)

What that buys: grain orientation from one acquisition

With known grain geometry and material, OpenUSCT recovers the 3D c-axis of every grain in a simulated ice polycrystal from a single elastic full-matrix capture — mean axis error 2.0 degrees, worst 3.2 degrees, including a grain started 90 degrees away from truth.

Crystal-orientation fabric is conventionally inferred from bulk sonic velocities. This is a full-waveform approach to the same question.

Status — please read before you ask for photos

The software and simulation pillars run today. The hardware is a complete open design package that has not been fabricated yet.

The acquisition front-end (high-voltage pulser, T/R switch, integrated AFE, Zynq SoC) is designed in KiCad, and the FPGA datapath is written...

Read more »

  • 1
    Demo

    1. Try it in your browser, nothing to install: 

       https://jeromegraves.com/openUSCT/

    2. Locally, at full speed: 

        pip install -r requirements.txt streamlit run software/gui/app.py

    3. Run every verification available on your machine

       (skips MATLAB, C++ and CUDA cleanly if absent):
       python run_tests.py

    4. The physics and gradient checks alone:   

        cd simulation && python -m pytest tests/ -s

    Full docs: https://github.com/Jerome-Graves/openUSCT

View all instructions

Enjoy this project?

Share

Discussions

Does this project spark your interest?

Become a member to follow this project and never miss any updates