Skip to main content

A Python Ocean Particle Image Analysis toolbox.

Project description

PyOPIA

A Python Ocean Particle Image Analysis toolbox

Quick tryout of PyOPIA

  1. Install uv
  2. Initialize PyOPIA project with a small example image dataset and run processing
uvx --python 3.12 --from pyopia[classification] pyopia init-project pyopiatest --example-data
cd pyopiatest
uvx --python 3.12 --from pyopia[classification] pyopia process config.toml
  1. Inspect the processed particle statistics in the processed/ folder
  2. Merge the individual processed image STATS files into a single STATS.nc file, then create a montage of the processed STATS.nc
uvx --python 3.12 --from pyopia[classification] pyopia merge-mfdata processed
uvx --python 3.12 --from pyopia[classification] pyopia make-montage processed\pyopiatest-STATS.nc
  1. Visualise the monatge of all processed singular particle images in one
montage.png

Will show you a montage of all the processed particle images in one.

See the documentation for more information on how to install and use PyOPIA.

Running with Docker

A prebuilt container image is published to GitHub Container Registry on every release, for users who prefer not to install PyOPIA's dependencies directly.

One-off invocation

From any directory that contains a config.toml:

docker run --rm \
    --user $(id -u):$(id -g) \
    -v "$PWD:$PWD" -w "$PWD" \
    ghcr.io/sintef/pyopia:latest \
    process config.toml

The 1:1 volume mount (-v "$PWD:$PWD") makes the container see your current directory at the same path as the host, so an existing config.toml with absolute paths under $PWD works unchanged.

If your config references paths outside $PWD — most commonly a classifier weights file — add a matching bind mount for each of them. The target (right of the colon) must equal the source (left) so the path in the config resolves unchanged. For a config like

[steps.classifier]
pipeline_class = "pyopia.classify_torch.Classify"
model_path = "/home/you/models/classifier.pt"

the invocation becomes

docker run --rm \
    --user $(id -u):$(id -g) \
    -v "$PWD:$PWD" -w "$PWD" \
    -v /home/you/models:/home/you/models:ro \
    ghcr.io/sintef/pyopia:latest \
    process config.toml

Any PyOPIA CLI command works, e.g. docker run --rm ghcr.io/sintef/pyopia:latest --help.

Using docker compose

Each GitHub release attaches a compose.yaml as an asset. Download it once per project:

curl -LO https://github.com/SINTEF/pyopia/releases/latest/download/compose.yaml
docker compose run --rm pyopia                       # runs `pyopia process config.toml`
docker compose run --rm pyopia --help                # or any other CLI argument

The compose file has commented-out stubs for paths that live outside $PWD — in particular the classifier weights file. Edit compose.yaml to uncomment the line and point it at your actual host path, e.g.

    volumes:
      - ${PWD}:${PWD}
      - /home/you/models:/home/you/models:ro    # classifier weights

The target must match the source so the config-referenced path resolves unchanged. Override the default config filename with PYOPIA_CONFIG:

PYOPIA_CONFIG=my_run.toml docker compose run --rm pyopia

Documentation:

Jupyter Book Badge Documentation

pyopia.readthedocs.io

Current status:

  • Under development. See/regester issues, here

Development targets for PyOpia:

  1. Allow nonfamiliar users to install and use PyOpia, and to contribute & commit code changes
  2. Not hardware specific
  3. Smaller dependency list than PySilCam -Eventual optional dependencies (e.g. for classification)
  4. Can be imported by pysilcam or other hardware-specific tools
  5. Work on a single-image basis (...primarily, with options for multiprocess to be considered later)
  6. No use of settings/config files within the core code - pass arguments directly. Eventual use of settings/config files should be handled by high-level wrappers that provide arguments to functions.
  7. Github workflows
  8. Tests

Normal functions within PyOpia should:

  1. take inputs
  2. return new outputs
  3. don't modify state of input
  4. minimum possible disc IO during processing

Contributions

We welcome additions and improvements to the code! We request that you follow a few guidelines. These are in place to make sure the code improves over time.

  1. All code changes must be submitted as pull requests, either from a branch or a fork.
  2. Good documentation of the code is needed for PyOpia to succeed and so please include up-to-date docstrings as you make changes, so that the auto-build on readthedocs is complete and useful for users. (A version of the new docs will complie when you make a pull request and a link to this can be found in the pull request checks)
  3. All pull requests are required to pass all tests before merging. Please do not disable or remove tests just to make your branch pass the pull request.
  4. All pull requests must be reviewed by a person. The benefits from code review are plenty, but we like to emphasise that code reviews help spreading the awarenes of code changes. Please note that code reviews should be a pleasant experience, so be plesant, polite and remember that there is a human being with good intentions on the other side of the screen.
  5. All contributions are linted with flake8. We recommend that you run flake8 on your code while developing to fix any issues as you go. We recommend using autopep8 to autoformat your Python code (but please check the code behaviour is not affected by autoformatting before pushing). This makes flake8 happy, and makes it easier for us all to maintain a consistent and readable code base.

Docstrings

Use the NumPy style in docstrings. See style guide here

Installing

For users

Users are expected to be familiar with Python. Please refer to the recommended installation instructions provided on the documentation pages, here

For developers from source

Install (uv)[https://docs.astral.sh/uv/getting-started/installation/]

  1. Navigate to the folder where you want to install pyopia using the 'cd' command.

If you use git: Download repository from github, and move into the new directory:

git clone https://github.com/SINTEF/pyopia.git
cd pyopia

For the next steps, you need to be located in the PyOPIA root directory that contains the file 'pyproject.toml'.

  1. Install all requirements with
uv sync --all-extras
  1. (optional) Run local tests:
uv run pytest

Version numbering

The version number of PyOPIA is split into three sections: MAJOR.MINOR.PATCH

  • MAJOR: Changes in high-level pipeline use and/or data output that are not backwards-compatible.
  • MINOR: New features that are backwards-compatible.
  • PATCH: Backwards-compatible bug fixes or enhancements to existing functionality

Build docs locally

sphinx-apidoc -f -o docs/source docs/build --separate

sphinx-build -b html ./docs/ ./docs/build

License

PyOpia is licensed under the BSD3 license. See LICENSE. All contributors should be recognised & aknowledged.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyopia-2.16.3.tar.gz (75.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pyopia-2.16.3-py3-none-any.whl (89.0 kB view details)

Uploaded Python 3

File details

Details for the file pyopia-2.16.3.tar.gz.

File metadata

  • Download URL: pyopia-2.16.3.tar.gz
  • Upload date:
  • Size: 75.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pyopia-2.16.3.tar.gz
Algorithm Hash digest
SHA256 9c3bee6bbe0c1b2f160ad6679c73a09342e4d5dd01305a11ad4fe407c035171f
MD5 06e26579ff91890489e8d0c0488327d8
BLAKE2b-256 ba1daba77524b7735a147f3e8aba1b85559746358709e413026280347aa62fc7

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopia-2.16.3.tar.gz:

Publisher: pypi.yml on SINTEF/pyopia

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyopia-2.16.3-py3-none-any.whl.

File metadata

  • Download URL: pyopia-2.16.3-py3-none-any.whl
  • Upload date:
  • Size: 89.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pyopia-2.16.3-py3-none-any.whl
Algorithm Hash digest
SHA256 a3f10ebdc322ae51234c224cfcc96d44cc4dddbf1d1b3568aeb64c63494e7a4d
MD5 0c4e8f4e7dd131d7f6f7b31fcd9b38c4
BLAKE2b-256 ba3b5aad4381c30029f5518bee311588d59fc545a8146a1c221bc5139648bee0

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopia-2.16.3-py3-none-any.whl:

Publisher: pypi.yml on SINTEF/pyopia

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page