Skip to main content

Computes CT contrast phase and GI tract contrast using TotalSegmentator and ML

Project description

BOA-Contrast

DOI Python License: MIT Checks

Package to compute contrast information from a CT image, part of the BOA. The package uses the open-source software TotalSegmentator to compute segmentations of important anatomical landmarks, which are then used to create features for a machine learning model to predict the contrast information.

Citation

If you use this package, please cite the following paper:

Baldini G, Hosch R, Schmidt CS, et al. Addressing the Contrast Media Recognition
Challenge: A Fully Automated Machine Learning Approach for Predicting Contrast
Phases in CT Imaging. Invest Radiol. Published online March 4, 2024. doi:10.1097/RLI.0000000000001071

Install

With pip:

pip install boa-contrast

With uv:

uv add boa-contrast

These commands install only the basic package without TotalSegmentator. If you also want to install TotalSegmentator as an optional dependency, use:

pip install "boa-contrast[totalsegmentator]"
uv add "boa-contrast[totalsegmentator]"

[!NOTE] The current optional dependency targets totalsegmentator==1.5.7. Support for TotalSegmentator 2.12.0 will be available soon.

However, the TotalSegmentator can also be used together with docker, and in such case it is not needed to install it.

[!WARNING] The TotalSegmentator Docker image for version 1.5.7 is no longer available. As a result, the Docker-based TotalSegmentator functionality currently does not work with that version.

Command Line

contrast-recognition --help

Once a CT and a folder where to store the TotalSegmentator segmentations is given, you can run it using the following command

contrast-recognition [-h] \
  --ct-path CT_PATH \
  --segmentation-folder SEGMENTATION_FOLDER \
  [--docker] \
  [--user-id USER_ID] \
  [--device-id DEVICE_ID] \
  [-v]

You can run it using docker by using the --docker flag. If you are using docker, you need to specify your user ID using the --user-id flag, otherwise you will have to change the ownership of the segmentations afterwards.

[!WARNING] The Docker-based TotalSegmentator workflow is currently affected by the missing 1.5.7 Docker image, so this option will not work until the package is updated to the newer TotalSegmentator release.

If you are using a GPU, you can specify the device ID using the --device-id flag.

You can enable verbosity with the -v flag.

To not download the TotalSegmentator weights all the time, you can specify their location using the TOTALSEG_WEIGHTS_PATH environment variable.

A sample output looks as follows:

IV Phase: NON_CONTRAST
Contrast in GIT: NO_CONTRAST_IN_GI_TRACT

From Python

If you want to compute the segmentations first, call compute_segmentation:

from boa_contrast import compute_segmentation

compute_segmentation(
    ct_path=...,  # The path to the CT
    segmentation_folder=...,  # The root where the segmentation should be stored
    device_id=...,  # The ID of the GPU device or -1
    user_id=...,  # Your user ID for docker to run in user mode
    compute_with_docker=False,  # Whether to use docker or not
)

Once the segmentation is available, call predict:

from boa_contrast import predict

result_dict = predict(
    ct_path=...,  # path to the CT
    segmentation_folder=...,  # path to this CT's segmentation
)

Output:

{
    "phase_ensemble_prediction": 0,
    "phase_ensemble_predicted_class": "NON_CONTRAST",
    "phase_ensemble_probas": array(
        [
            9.89733540e-01,
            3.60637282e-04,
            4.79974664e-04,
            5.55973168e-04,
            8.86987492e-03,
        ]
    ),
    "git_ensemble_prediction": 0,
    "git_ensemble_predicted_class": "NO_CONTRAST_IN_GI_TRACT",
    "git_ensemble_probas": array(
        [
            9.99951577e-01,
            4.84187825e-05,
        ]
    ),
}

To serialize the result to JSON, use boa_contrast.default:

import json
from boa_contrast import default

with open("prediction.json", "w", encoding="utf-8") as f:
    json.dump(result_dict, f, indent=2, default=default)

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

boa_contrast-0.1.5.tar.gz (78.6 MB view details)

Uploaded Source

Built Distribution

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

boa_contrast-0.1.5-py3-none-any.whl (78.4 MB view details)

Uploaded Python 3

File details

Details for the file boa_contrast-0.1.5.tar.gz.

File metadata

  • Download URL: boa_contrast-0.1.5.tar.gz
  • Upload date:
  • Size: 78.6 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for boa_contrast-0.1.5.tar.gz
Algorithm Hash digest
SHA256 052dbb51a9c55a288b4d55ba4a0a6b4da4d9a4796760ee32837e9e022fd76bee
MD5 e81c588e1c0d44b1247b5119a3c3ad11
BLAKE2b-256 638d979b532fd674577ea662c3cc5d39203071230391d8d5aa9dd615f688ea33

See more details on using hashes here.

File details

Details for the file boa_contrast-0.1.5-py3-none-any.whl.

File metadata

  • Download URL: boa_contrast-0.1.5-py3-none-any.whl
  • Upload date:
  • Size: 78.4 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for boa_contrast-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 15e5d233880414d991064cb5d38435fab8a4ac41f44eaea416961ac5ace4016f
MD5 2fcc2a66b331c698e574e45c04198ae3
BLAKE2b-256 4d9768d24f5c772855499f56f27c3c773bf16a61d7aa28ac50c3b305b8bda99f

See more details on using hashes here.

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