Flow Gym: A framework for the development, benchmarking, training, and deployment of flow-field quantification methods


Abstract

Particle image velocimetry (PIV) and related optical-flow methods are widely used to quantify fluid motion, but their development and evaluation are often hindered by fragmented software, inconsistent interfaces, and limited reproducibility. To address these challenges, we present Flow Gym, a framework for developing, benchmarking, training, and deploying flow-field quantification methods, with a primary focus on PIV. Its core contribution is a standardized interface that allows classical and learning-based algorithms to be integrated, compared, and deployed within a common pipeline. The framework includes JAX implementations and wrappers for existing methods, modular pre-processing and post-processing components, and utilities for training and benchmarking. By leveraging JAX, Flow Gym supports hardware-accelerated execution while remaining interoperable with external implementations from libraries such as OpenCV and PyTorch. It can operate on both synthetic and experimental data and supports the same workflow for offline benchmarking and real-time deployment. Flow Gym is designed to improve reproducibility, reduce barriers to method development, and facilitate the translation of flow-field quantification algorithms from research to experimental settings.

Particle Image Velocimetry ,Fluid Estimation ,Deep Learning ,Reinforcement Learning ,GPU acceleration ,JAX

Code metadata↩︎

Table 1: Code metadata
Nr. Code metadata description Metadata
C1 Current code version v0.1.0
C2 Permanent link to code/repository used for this code version https://github.com/antonioterpin/flowgym
C3 Permanent link to Reproducible Capsule https://github.com/antonioterpin/flowgym/blob/main/src/main.py
C4 Legal Code License MIT License.
C5 Code versioning system used git
C6 Software code languages, tools, and services used Python
C7 Compilation requirements, operating environments & dependencies Python 3.10+, JAX 0.6.2+, tqdm 4.67.1, h5py 3.13.0+, ruamel.yaml 0.18.10+, robo-goggles 0.1.7+
C8 If available Link to developer documentation/manual https://github.com/antonioterpin/flowgym
C9 Support email for questions aterpin@ethz.ch
Figure 1: Overview of the Flow Gym pipeline centered on the Estimator abstraction. The estimator maps the current observation, the current estimator state, and the trainable state to an estimate and an updated estimator state. The estimator state stores short-term information across calls (e.g., previous estimates and auxiliary variables), while the trainable state contains long-term parameters such as model weights and optimizer state when applicable. During training, the estimate is compared with ground truth or another reference to compute an error used to update the trainable state; during deployment, the same interface applies directly to synthetic or experimental images. Resetting the state enables independent processing of image pairs, whereas carrying it forward enables consecutive estimation on temporal streams.

1 Motivation and significance↩︎

Flow-field quantification from images of tracer particles is a central task in experimental fluid mechanics, with piv and optical flow among the most widely used techniques [1]. Over the years, a broad range of methods has been developed for this purpose, including both classical approaches [2][5] and learning-based methods [6][9]. In recent years, advances in computer vision and deep learning have significantly influenced the design of new flow-field quantification methods [10], [11].

However, despite the growing methodological diversity, software support for developing, comparing, and deploying such methods remains fragmented. Implementations are often distributed across different libraries and programming frameworks, rely on incompatible interfaces, and differ in pre-processing, post-processing, and evaluation protocols. As a result, fair comparison, reproducible benchmarking, and practical deployment remain unnecessarily difficult. By contrast, progress in neighboring fields has been accelerated by shared software abstractions, standardized reference implementations, and efficient execution on modern hardware. In computer vision and reinforcement learning, common interfaces and benchmark-oriented software ecosystems have played a central role in improving reproducibility and enabling systematic comparison [12][14]. This is particularly important in settings where performance is sensitive to implementation details and experimental choices [15]. Flow-field quantification pipelines exhibit a similar sensitivity, which makes standardized and reusable software infrastructure especially valuable.

With the software package presented in this paper, we aim to bring to flow-field quantification the same emphasis on reproducibility, comparability, and practical usability that has become standard in adjacent computational fields in the past decade.

1.0.0.1 Contributions

We present Flow Gym, a unified framework for developing, training, benchmarking, and deploying flow-field quantification methods; see 1. Our main contributions are:

  • a standardized Estimator interface for classical and learning-based flow-field quantification methods;

  • shared training and evaluation workflows that support repeatable benchmarking and facilitate deployment on real experimental setups;

  • JAX-native implementations and interoperable wrappers for representative methods, providing accelerator-friendly execution together with compatibility with external libraries such as OpenCV [16][18], PyTorch [8], and OpenPIV [19].

Flow Gym supports both consecutive (or recurrent) and independent estimation workflows for flow-field quantification. The same interface can also be used for related estimators beyond piv, such as tracer-particle density estimation.

2 Software description and illustrative examples↩︎

Flow Gym is organized as a unified software framework for developing, benchmarking, training, and deploying flow-field quantification methods. The framework is centered around the Estimator interface, which provides a common foundation for standardized baselines and for integrating new methods within the same workflow. The same interface can also be extended to related quantification tasks, such as tracer-particle density estimation1.

2.1 A unified interface↩︎

2.1.0.1 Estimator

The Estimator module defines a unified interface for algorithms that map observations (e.g., the piv image pairs) to quantities of interest. To align with JAX’s programming model, the Estimator interface is stateless and functional. Each call to the Estimator receives as input the latest observation, the state of the Estimator, and the trainable state, and returns an updated Estimator state together with a dictionary of metrics (see 1):

new_state, metrics = estimator(image, state, trainable_state)

In particular, new_state includes the rolled history and the updated PRNG key that is carried to the next iteration to ensure random draws in subsequent calls, and metrics provides task-specific logging information. The state of the Estimator captures the run-time context propagated across successive calls. For simple algorithms, this context may be limited only to the current image pair. This is the case, for example, for WIDIM-based algorithms and optical flow algorithms. More advanced flow-field quantification methods may also retain a short-term history, such as previous image pairs, previous estimates, or recurrent internal variables. As a result, the same interface supports “one-shot” estimators as well as “recurrent” estimators that exploit the temporal correlation across estimates. In the current implementation, the state also comprises a batch of PRNG keys for controlled randomness. When image pairs are processed independently (e.g., during benchmarking on a shuffled dataset), the state can simply be re-initialized before each estimation. The trainable state captures the long-term parameters of the estimator. For learning-based estimators, this typically includes the model weights, optimizer state, and optimizer transformation. Classical estimators such as cross-correlation algorithms do not have trainable parameters; in those cases, Flow Gym simply propagates an empty trainable-state container through the same interface so that classical and learning-based methods can be compared and deployed within a common pipeline. Following JAX’s functional programming style, the Estimator call is side-effect free: neither the trainable_state nor the input observation is mutated in place. An explanation of how to add a learning component to an Estimator instance is provided in “.”

In addition to the core call, the class also provides standardized hooks for image processing. On the input side, Estimator supports a configurable sequence of pre-processing steps, explained in detail in 2.2.1. Each step is applied sequentially before estimation, ensuring consistent data pre-processing across algorithms. For flow-field quantification algorithms, the FlowFieldEstimator subclass additionally provides a standardized post-processing stage; see 2.2.3. This layered design allows pre-processing, estimation, and post-processing to be specified independently.

2.1.0.2 Deployment of an estimator

Estimators can be instantiated directly from configuration files. Importantly, deployment is agnostic to the provenance of the input data: once instantiated, the same estimator can be applied to synthetic image pairs, recorded experimental datasets, or live acquisitions from a real setup. The deployment pipeline in [lst:example-make] has already been adopted in several projects, including real-time fluid control [20].

Listing lst:example-make: {Example usage of \texttt{make\_estimator} for deployment.}

# Define the config (or load from YAML)
estimator_config = {
    "estimator": "dis_jax",
    "estimate_type": "flow",
    "config": {"jit": True, ..., },
}

# Create the estimator and associated functions
(
    trainable_state, 
    create_state_fn, 
    compute_estimate_fn,
    estimator
) = make_estimator(
    estimator_config, image_shape
)

# Choose an image pair of interest (synthetic or experimental)
image_0, image_1 = input_images

# Compute an estimate for an image pair
est_state_0 = create_state_fn(image_0, key0)
est_state_1, metrics = compute_estimate_fn(
    image_1, est_state, trainable_state
)

# If this is a stream of images, rather than an image pair, 
# one can use the estimator recurrently given a new image, image_2
est_state_2, metrics = compute_estimate_fn(
    image_2, est_state_1, trainable_state
)

2.1.0.3 Implementing a custom estimator

Within this interface, implementing a new estimator reduces to defining a single method: _estimate. This method specifies how a pre-processed observation, together with the current estimator state and trainable state, is mapped to a new state and a set of metrics. The base Estimator class automatically handles auxiliary tasks such as pre-processing, PRNG-key management, and state-history updates. This allows developers to focus on the algorithm-specific logic of their estimator.

In particular, contributors adding a new algorithm to Flow Gym can follow one of two approaches:

  • Implement the algorithm natively in JAX. This consists in writing the algorithm logic directly in _estimate using JAX, thereby maximizing performance and integration, for example through compatibility with jit and vmap. For instance, we implemented DIS [21] and RAFT32-PIV [8] natively in JAX.

  • Wrap an existing external implementation. This consists in using _estimate as a wrapper around an external library (e.g., OpenCV or OpenPIV) or around a model implemented in another framework (e.g., PyTorch). Examples include the OpenCV-based DeepFlow estimator [17], included through the OpenCV API, and RAFT32-PIV [8], whose PyTorch code was ported while providing appropriate attribution and respecting the upstream license. This approach enables benchmarking and deployment in Flow Gym even when the original method is not implemented natively in JAX.

2.1.0.4 Training an estimator

When an estimator contains trainable weights or tunable parameters, Flow Gym provides a common training interface built on top of the Estimator abstraction. In particular, a trainable estimator should implement two methods:

  • create_trainable_state, which initializes the trainable_state object; by default, this is an empty pytree. This method is called automatically within make_estimator.

  • create_train_step, which returns a function specifying one optimization step. For example, for a neural-network-based estimator, this typically corresponds to one stochastic-gradient-descent step.

[lst:example-train] shows a simplified supervised training loop based on the functional interface of Estimator together with a standard data loader. [lst:example-train-consecutive] shows a simplified sequential training loop for a learnable estimator that exploits the history of observations across multiple steps. For this purpose, Flow Gym provides FluidEnv, a lightweight wrapper around SynthPix [22] that exposes temporally consecutive observations through a minimal reset/step interface. Flow Gym also provides more structured versions of this boilerplate code in train.py and train_supervised.py.

Training is not restricted to synthetic data: the same interface can also be used with experimental image pairs, whether processed independently or as part of a temporal sequence; see also 2.3. In such cases, when ground-truth flow is unavailable, one can consider a different method as reference or an unsupervised loss defined directly from the images. For example, by warping one image with the estimated flow and measuring its consistency with the other. Sequential training relies on precomputed or externally generated time-resolved flows, which are often available from offline simulations and public datasets such as [23][26].

Not all estimators integrated in Flow Gym are trainable. Classical methods such as OpenPIV are included as standardized reference implementations for benchmarking and deployment under the same interface as learning-based methods, but are not trained with Flow Gym.

Listing lst:example-train: {Example of training loop with \texttt{Estimator} and a data loader.}

# Initialize trainable state and training step
train_step_fn = estimator.create_train_step()

# Iterate through the dataloader
for imgs1, imgs2, ground_truth in data_loader:

    # Create a new state for each batch
    est_state = create_state_fn(imgs1, key)

    # Functionally update the trainable state
    (
        loss, 
        est_state_new, 
        trainable_state_new, 
        metrics
    ) = train_step_fn(
        trainable_state, est_state, imgs2, ground_truth
    )

Listing lst:example-train-consecutive: {Example of training loop with \texttt{FluidEnv} and \texttt{Estimator}.}

# Instantiate the environment
env = FluidEnv.make(env_config)

# Create the training step function
train_step_fn = estimator.create_train_step()

# Iterate through the episodes
for episode in range(num_episodes):

    # Reset the environment for every new episode
    observations, env_state, done = env.reset(env_state)
    est_state = create_state_fn(observations.images, key)

    while not done.any():
        # Estimator forward pass
        est_state, metrics = compute_estimate_fn(
            observations, est_state, trainable_state)

        # Extract the action (the last estimate)
        action = est_state["estimates"][:, -1]
        # Environment step
        observations, env_state_new, reward, done = env.step(
            env_state,
            action
        )

        # Optimization step
        (
            loss, 
            trainable_state_new, 
            est_state_new, 
            metrics
        ) = train_step_fn(
            est_state, 
            trainable_state, 
            reward
        )

2.2 Stable baselines↩︎

We organize the baseline implementations and comparisons into three categories: pre-processing, processing, and post-processing [27]. Although not exhaustive, this collection covers several of the most commonly used components in the piv image-analysis pipeline. By providing common implementations to build upon, Flow Gym facilitates the development, benchmarking, training, and deployment of new algorithms.

2.2.1 Pre-processing↩︎

We implement in JAX several image pre-processing techniques commonly used in flow-field quantification pipelines [27], including:

  • Histogram equalization [27][29]. For every tile, the pixel intensities are adjusted to span the full range, so that low- and high-exposure regions are processed independently to maximize contrast.

  • Intensity high-pass [27], [30]. A high-pass filter removes low-frequency components associated with inhomogeneous lighting while preserving the high-frequency components associated with tracer particles [27].

  • Intensity capping (clipping) [27], [29]. Many piv algorithms are affected by non-uniform particle brightness. To mitigate this effect, the maximum (and optionally minimum) intensity in an image can be clipped.

We also implement other standard operations, including Otsu thresholding, Gaussian blurring, and normalization [14], [30]. We illustrate in 2 the effects of the different pre-processing techniques.

2.2.1.1 Pre-processing configuration and customization

The pre-processing pipeline in Flow Gym is configured through a list of dictionaries, each specifying a pre-processing function and its parameters. To introduce a new pre-processing step, it suffices to define a function with signature

images, state, trainable_state = my_step(
    images, state, trainable_state, param1, ...)

The parameters “param1, ...” are automatically extracted from the configuration file when the pipeline is loaded. This modular design allows flexible composition of transformations such as normalization, filtering, or denoising. Each pre-processing step receives the input image and the estimator’s state and trainable_state, which also makes it possible to implement dynamic or learning-based pre-processing. For example, one may include adaptive normalization or diffusion-based refinement [31].

None

Figure 2: Effects of the pre-processing techniques when applied to images from the real setup in [20] (\(1064\times904\)). Zoomed insets are provided to highlight the relevant details..

2.2.2 Processing↩︎

2.2.2.1 JAX implementations

We re-implement several optical flow and piv methods in JAX, including DIS [21], OpenPIV [19], and RAFT32-PIV [8]. These implementations provide accelerator-friendly baselines under the same interface used throughout Flow Gym.

2.2.2.2 Integration of existing implementations

Complementarily, Flow Gym provides wrappers around several existing implementations (e.g., OpenCV algorithms [16][18], [21], OpenPIV [19], and PyTorch implementations [8]). This allows users to compare external implementations and JAX-native estimators under the same conditions, including methods that are not trained within Flow Gym and methods that do not support end-to-end JAX differentiation.

Table 2: Algorithms currently available in Flow Gym. “Integrated” denotes wrapped external implementations; “Implemented in JAX” denotes JAX-native implementations. *: JAX native only.
Method Integrated Implemented in JAX
DIS [21]
Farneback [16]
DeepFlow [17]
Horn-Schunck [18]
OpenPIV [19]
RAFT32-PIV [8]
PIV-ADMM [32]

2.2.3 Post-Processing↩︎

Following [27], we implement data validation, data interpolation, and data smoothing, introducing minor variations to these techniques. The parameters of the post-processing steps are specified analogously to the pre-processing steps, and we similarly allow the integration of (possibly learning-based) custom methods; see 2.2.1.

2.2.3.1 Data validation

We implement the following outlier-detection schemes:

  • Constant thresholding velocity filter. All entries with a velocity magnitude outside a constant range \([u_{\min}, u_{\max}]\) are marked as outliers.

  • Adaptive thresholding velocity filter (local/global). The entries with a velocity magnitude outside \([\bar{u} - n\sigma_u, \bar{u} + n\sigma_u]\) are marked as outliers, where \(\bar{u}\) and \(\sigma_u\) are computed either globally over the full field or locally within a square neighborhood of size \(N\times N\) centered on each interrogation point. In the results of 3, we use \(N=3\), corresponding to a \(3\times 3\) neighborhood.

  • Universal outlier detection based on the median test [33]. We implement the algorithm presented in [33]. By making use of comparator networks [34] we achieve sub-ms performance on megapixel images.

In 3, we illustrate the effects of the different outlier detection schemes on an estimated flow from synthetic images.

Figure 3: Effects of a selection of the data validation techniques implemented in Flow Gym, when applied to a flow estimated with our implementation in JAX of RAFT32-PIV from a pair of images generated with SynthPix [22]. The colormap shows the vorticity of the flow. The RAFT32-PIV neural-network parameters are loaded from the CodeOcean capsule of the original paper [8].

2.2.3.2 Data interpolation

As in [27], we implement in JAX standard interpolation techniques to reconstruct the flow field in regions where data have been marked as invalid by the validation step, including:

  • Tile-based averaging, where each missing vector is replaced by the mean of its valid neighbors within a predefined stencil; this approach is computationally efficient and well suited for isolated outliers, but may oversmooth sharp gradients.

  • Boundary-value solver, where the inpainting problem is formulated as solving Laplace’s equation with boundary conditions set by the valid neighboring vectors; this approach is computationally more expensive, but provides more globally consistent reconstructions.

Importantly, custom data-interpolation steps, possibly learning-based, such as diffusion-model-based data interpolation [31], can be easily integrated.

2.2.3.3 Data smoothing

To attenuate residual noise and improve local consistency of the estimate, we provide efficient JAX implementations of several smoothing operators, including average filtering, median filtering, and normalized least-squares smoothing [27].

2.3 Data sources↩︎

A key design choice in Flow Gym is that the Estimator interface is agnostic to the provenance of the input data. In particular, estimators and the shared training and benchmarking utilities operate on a standardized batch interface rather than assuming a specific flow solver, renderer, or acquisition pipeline. In the flow-field quantification setting considered in this paper, this interface consists of image pairs and, when available, the associated two-dimensional flow fields (or a two-dimensional slice of a three-dimensional field). In our current implementation, this standardized batch interface is provided by SynthPix, which can either (i) generate piv image pairs from prescribed flow fields or (ii) load existing datasets; see [22]. Consequently, the same estimator can be developed and benchmarked on synthetic data, offline simulation outputs, or recorded experimental datasets without changing its interface. Through a custom adapter, SynthPix can also be coupled to an external physics simulator that computes the flow online, enabling closed-loop setups such as active fluid control. Importantly, deployment of an Estimator is decoupled from SynthPix: once instantiated, the same estimator can be applied directly to experimental image pairs acquired online, including live streams from real piv setups such as water channels, and can therefore be used in real-time physical fluid-control loops [20]. As a result, the same estimator interface can be used with a wide range of data sources, including (a) snapshots exported from physics-based solvers, (b) experimental piv datasets with pre-recorded image pairs, (c) analytically specified vector fields, and (d) flows from other scientific domains or non-physical synthetic fields. This also makes it possible to interface Flow Gym with broader simulation collections such as The Well dataset [26] and the Johns Hopkins Turbulence Database [23].

3 Impact↩︎

Flow Gym has already been adopted as a shared software infrastructure across multiple research efforts in flow-field quantification and control. Since its initial development, it has enabled the rapid deployment and iteration of real-time flow-field quantification pipelines in experimental settings with hardware in the loop, as demonstrated in [20]. The framework also supported the development and evaluation of new estimation methodologies. For instance, Flow Gym was used to implement, test, and benchmark the consensus ADMM-based flow refinement approach introduced in [32]. In addition, Flow Gym was used to study learning-based estimators subject to hard constraints. The experimental validation of hard-constrained neural networks for flow estimation in [35] relied on Flow Gym to evaluate constrained and unconstrained models within the same pipeline. Flow Gym currently supports ongoing research at ETH Zürich on adaptive PIV tuning and active fluid control.

4 Conclusions↩︎

Flow Gym is a unified framework for developing, training, benchmarking, and deploying flow-field quantification methods, with a primary focus on piv. Its core contribution is a standardized estimator interface that enables seamless integration, fair comparison, and practical deployment across both classical and learning-based methods. Implemented in JAX and interoperable with OpenCV and PyTorch, Flow Gym supports accelerator-friendly execution while remaining compatible with existing software stacks. We believe the following represent meaningful directions for future work:

  • More algorithms. The most important axis of improvement and future work is to increase the number of algorithms integrated into Flow Gym and their implementation in JAX.

  • Volumetric flow-field quantification. Flow Gym currently targets only two-dimensional flow-field quantification, and extending it to volumetric setups is a key next step [36]. Concretely, we plan to introduce an explicit configuration modality that selects the appropriate data interface and estimator pipeline and extend the data container from pairwise image batches (e.g., images1, images2) to multi-camera grouped batches for volumetric quantification, where each sample aggregates per-camera image pairs together with camera calibration and pose (intrinsics/extrinsics). Enabling this functionality requires extending the underlying synthetic generator (SynthPix [22]) to synthesize piv images in a volumetric setting.

  • Real-world integration. A promising direction is to connect Flow Gym directly to physical water channels—following efforts such as [20]—potentially via an Internet-accessible interface, enabling algorithms to be evaluated under real-world operating conditions.

References↩︎

[1]
C. E. Willert, M. Gharib, Digital particle image velocimetry, Experiments in Fluids 10 (4) (1991) 181–193. https://doi.org/10.1007/BF00190388.
[2]
F. Scarano, Iterative image deformation methods in PIV, Measurement Science and Technology 13 (1) (2002) R1–R19. https://doi.org/10.1088/0957-0233/13/1/201.
[3]
T. Corpetti, D. Heitz, G. Arroyo, E. Mémin, A. Santa-Cruz, Fluid experimental flow estimation based on an optical-flow scheme, Experiments in Fluids 40 (1) (2006) 80–97. https://doi.org/10.1007/s00348-005-0048-y.
[4]
J. Westerweel, G. E. Elsinga, R. J. Adrian, Particle ImageVelocimetry for Complex and TurbulentFlows, Annual Review of Fluid Mechanics 45 (1) (2013) 409–436. https://doi.org/10.1146/annurev-fluid-120710-101204.
[5]
T. Astarita, Analysis of weighting windows for image deformation methods in PIV, Experiments in Fluids 43 (6) (2007) 859–872. https://doi.org/10.1007/s00348-007-0314-2.
[6]
S. Cai, S. Zhou, C. Xu, Q. Gao, Dense motion estimation of particle images via a convolutional neural network, Experiments in Fluids 60 (4) (2019) 73. https://doi.org/10.1007/s00348-019-2717-2.
[7]
L. Manickathan, C. Mucignat, I. Lunati, Kinematic training of convolutional neural networks for particle image velocimetry, Measurement Science and Technology 33 (12) (2022) 124006. https://doi.org/10.1088/1361-6501/ac8fae.
[8]
C. Lagemann, K. Lagemann, S. Mukherjee, W. Schröder, Deep recurrent optical flow learning for particle image velocimetry data, Nature Machine Intelligence 3 (7) (2021) 641–651. https://doi.org/10.1038/s42256-021-00369-0.
[9]
Y. Lee, H. Yang, Z. Yin, PIV-DCNN: cascaded deep convolutional neural networks for particle image velocimetry, Experiments in Fluids 58 (12) (2017) 171. https://doi.org/10.1007/s00348-017-2456-1.
[10]
Q. Zhu, J. Wang, J. Hu, J. Ai, Y. Lee, PIV-FlowDiffuser: Transfer-Learning-BasedDenoisingDiffusionModels for ParticleImageVelocimetry, Sensors 25 (19) (2025) 6077. https://doi.org/10.3390/s25196077.
[11]
Z. Huang, X. Shi, C. Zhang, Q. Wang, K. C. Cheung, H. Qin, J. Dai, H. Li, FlowFormer: ATransformerArchitecture for OpticalFlow, in: Computer VisionECCV 2022, Vol. 13677, Springer Nature Switzerland, 2022, pp. 668–685. https://doi.org/10.1007/978-3-031-19790-1_40.
[12]
G. Brockman, V. Cheung, L. Pettersson, J. Schneider, J. Schulman, J. Tang, W. Zaremba, OpenAIGym, arXiv preprint arXiv:1606.01540 (2016). https://doi.org/10.48550/arXiv.1606.01540.
[13]
A. Raffin, A. Hill, A. Gleave, A. Kanervisto, M. Ernestus, N. Dormann, Stable-Baselines3: ReliableReinforcementLearningImplementations, Journal of Machine Learning Research 22 (268) (2021) 1–8. https://doi.org/10.5555/3546258.3546526.
[14]
G. Bradski, The OpenCV Library, Dr. Dobb’s Journal of Software Tools 25 (11) (2000) 120–125.
[15]
P. Henderson, R. Islam, P. Bachman, J. Pineau, D. Precup, D. Meger, Deep ReinforcementLearningThatMatters, Proceedings of the AAAI Conference on Artificial Intelligence 32 (1) (2018). https://doi.org/10.1609/aaai.v32i1.11694.
[16]
G. Farnebäck, Two-FrameMotionEstimationBased on PolynomialExpansion, in: Image Analysis, Vol. 2749, Springer Berlin Heidelberg, 2003, pp. 363–370. https://doi.org/10.1007/3-540-45103-X_50.
[17]
P. Weinzaepfel, J. Revaud, Z. Harchaoui, C. Schmid, DeepFlow: LargeDisplacementOpticalFlow with DeepMatching, in: 2013 IEEEInternationalConference on ComputerVision, IEEE, 2013, pp. 1385–1392. https://doi.org/10.1109/ICCV.2013.175.
[18]
B. K. Horn, B. G. Schunck, Determining optical flow, Artificial Intelligence 17 (1-3) (1981) 185–203. https://doi.org/10.1016/0004-3702(81)90024-2.
[19]
A. Liberzon, T. Käufer, A. Bauer, P. Vennemann, E. Zimmer, OpenPIV/openpiv-python: OpenPIV-Python v0.23.4 (2021). https://doi.org/10.5281/ZENODO.4409178.
[20]
A. Terpin, R. D’Andrea, Using reinforcement learning to probe the role of feedback in skill acquisition, arXiv preprint arXiv:2512.08463 (2025). https://doi.org/10.48550/arXiv.2512.08463.
[21]
T. Kroeger, R. Timofte, D. Dai, L. Van Gool, Fast OpticalFlowUsingDenseInverseSearch, in: Computer VisionECCV 2016, Vol. 9908, Springer International Publishing, 2016, pp. 471–488. https://doi.org/10.1007/978-3-319-46493-0_29.
[22]
A. Terpin, A. Bonomi, F. Banelli, R. D’Andrea, SynthPix: A lightspeed PIV images generator, arXiv preprint arXiv:2512.09664 (2025). https://doi.org/10.48550/arXiv.2512.09664.
[23]
E. Perlman, R. Burns, Y. Li, C. Meneveau, Data exploration of turbulence simulations using a database cluster, in: Proceedings of the 2007 ACM/IEEE conference on Supercomputing, ACM, 2007, pp. 1–11. https://doi.org/10.1145/1362622.1362654.
[24]
J. Graham, K. Kanov, X. I. A. Yang, M. Lee, N. Malaya, C. C. Lalescu, R. Burns, G. Eyink, A. Szalay, R. D. Moser, C. Meneveau, A Web services accessible database of turbulent channel flow and its use for testing a new integral wall model for LES, Journal of Turbulence 17 (2) (2016) 181–215. https://doi.org/10.1080/14685248.2015.1088656.
[25]
Y. Li, E. Perlman, M. Wan, Y. Yang, C. Meneveau, R. Burns, S. Chen, A. Szalay, G. Eyink, A public turbulence database cluster and applications to study Lagrangian evolution of velocity increments in turbulence, Journal of Turbulence 9 (2008) N31. https://doi.org/10.1080/14685240802376389.
[26]
F. Agocs, M. Beneitez, M. Berger, B. Blancard, B. Burkhart, M. Cranmer, S. Dalziel, D. Fielding, D. Fortunato, J. Goldberg, K. Hirashima, S. Ho, Y.-F. Jiang, R. Kerswell, S. Maddu, M. McCabe, L. Meyer, J. Miller, R. Morel, P. Mukhopadhyay, S. Nixon, R. Ohana, L. Parker, F. Rozet, J. Shen, R. Watteaux, The Well: a Large-ScaleCollection of DiversePhysicsSimulations for MachineLearning, in: Advances in NeuralInformationProcessingSystems 37, 2024, pp. 44989–45037. https://doi.org/10.52202/079017-1430.
[27]
W. Thielicke, E. J. Stamhuis, PIVlabTowardsUser-friendly, Affordable and AccurateDigitalParticleImageVelocimetry in MATLAB, Journal of Open Research Software 2 (2014). https://doi.org/10.5334/jors.bl.
[28]
S. M. Pizer, E. P. Amburn, J. D. Austin, R. Cromartie, A. Geselowitz, T. Greer, B. Ter Haar Romeny, J. B. Zimmerman, K. Zuiderveld, Adaptive histogram equalization and its variations, Computer Vision, Graphics, and Image Processing 39 (3) (1987) 355–368. https://doi.org/10.1016/S0734-189X(87)80186-X.
[29]
U. Shavit, R. J. Lowe, J. V. Steinbuck, Intensity Capping: a simple method to improve cross-correlation PIV results, Experiments in Fluids 42 (2) (2007) 225–240. https://doi.org/10.1007/s00348-006-0233-7.
[30]
B. Jähne, http://link.springer.com/10.1007/3-540-27563-0, Springer-Verlag, 2005. https://doi.org/10.1007/3-540-27563-0. ://link.springer.com/10.1007/3-540-27563-0.
[31]
D. Shu, Z. Li, A. Barati Farimani, A physics-informed diffusion model for high-fidelity flow field reconstruction, Journal of Computational Physics 478 (2023) 111972. https://doi.org/10.1016/j.jcp.2023.111972.
[32]
A. Bonomi, F. Banelli, A. Terpin, Particle ImageVelocimetryRefinement via ConsensusADMM, arXiv preprint arXiv:2512.11695 (2025). https://doi.org/10.48550/arXiv.2512.11695.
[33]
J. Westerweel, F. Scarano, Universal outlier detection for PIV data, Experiments in Fluids 39 (6) (2005) 1096–1100. https://doi.org/10.1007/s00348-005-0016-6.
[34]
D. E. Knuth, The art of computer programming, volume 3: (2nd ed.) sorting and searching, Addison Wesley Longman Publishing Co., Inc., 1998. https://doi.org/10.5555/280635.
[35]
P. D. Grontas, A. Terpin, E. C. Balta, R. D’Andrea, J. Lygeros, Pinet: Optimizing hard-constrained neural networks with orthogonal projection layers, arXiv preprint arXiv:2508.10480 (2025). https://doi.org/10.48550/arXiv.2508.10480.
[36]
A. Schröder, D. Schanz, 3DLagrangianParticleTracking in FluidMechanics, Annual Review of Fluid Mechanics 55 (1) (2023) 511–540. https://doi.org/10.1146/annurev-fluid-031822-041721.

  1. In this paper, for the sake of clarity, we focus on the flow-field quantification instance of the software package because it is the most widely studied in the literature.↩︎