Task-based evaluation toolkit for Metal Artifact Reduction (MAR) in CT imaging (Annex GG Framework)
Project description
mar-eval
Task-based evaluation toolkit for Metal Artifact Reduction (MAR) in CT imaging, aligned with the Annex GG framework.
What is this?
mar-eval implements a pragmatic, reproducible pipeline for MAR performance assessment using a Channelized Hotelling Observer (CHO), AUC computation (with bootstrap CI), one‑tailed paired t‑tests, and ΔAUC bias assessment. It supports:
- Simulator-driven inputs (e.g., DukeSim) via a YAML config + loader that organizes the (dose, contrast, realization, recon, class) grid prescribed in Annex GG.
- ROI‑based CHO with PCA-derived channels and pooled covariance (with small Tikhonov regularization).
- Clean reporting helpers (CSV tables) and matplotlib visualizations (AUC and ΔAUC heatmaps).
- A runnable unified notebook that mirrors Annex GG end‑to‑end for the adult chest with titanium spinal rod example.
The toolkit focuses on the type test use case, i.e., premarket evaluation on representative systems and validated phantoms or realistic simulation outputs.
Install
pip install mar-eval
# for notebook demo & plots you may also want:
pip install matplotlib jupyterlab pyyaml
Python ≥ 3.9 is supported.
Quick start (synthetic)
import numpy as np
from mareval import (
generate_synthetic_study, extract_roi, batch_extract_rois,
build_pca_channels, cho_template, cho_decision_values,
compute_auc_ci
)
cfg = dict(image_shape=(64,64), doses=3, contrasts=3, realizations=4, rng_seed=0)
study = generate_synthetic_study(cfg)
images = study["images"]
centers = [(32, 24)]
roi_size = (17,17)
# simple training set for channels
train_imgs = [images[(0,0,0,'FBP','absent')], images[(2,2,0,'MAR','present')]]
train_rois = batch_extract_rois(train_imgs, centers, roi_size)
U = build_pca_channels(train_rois, n_channels=8)
# one cell AUC (FBP)
pos = []; neg = []
for r in range(cfg['realizations']):
pos.append(extract_roi(images[(0,0,r,'FBP','present')], centers[0], roi_size).ravel())
neg.append(extract_roi(images[(0,0,r,'FBP','absent')], centers[0], roi_size).ravel())
import numpy as np
pos = np.asarray(pos); neg = np.asarray(neg)
ch_pos = (pos - pos.mean(0)) @ U
ch_neg = (neg - neg.mean(0)) @ U
w = cho_template(ch_pos, ch_neg, lambda_reg=1e-3)
s = np.concatenate([ch_pos @ w, ch_neg @ w])
y = np.array([1]*len(ch_pos) + [0]*len(ch_neg))
res = compute_auc_ci(s, y, n_bootstrap=1000)
print(res) # {'auc': ..., 'ci': (..., ...), 'n_bootstrap': 1000}
Annex GG “adult chest / spinal rod” example
- Config:
configs/adult_chest_spinal_rod.yaml - Notebook:
notebooks/annex_gg_full_demo.ipynb
The notebook executes the full flow:
- Load config and generate synthetic images approximating an adult chest with a 6 mm titanium rod and a 5 mm lesion adjacent to the rod centerline.
- Preview grid counts and an example slice.
- ROI extraction and channel learning (PCA).
- CHO template + AUC per (dose, contrast) for both FBP and MAR.
- Paired one‑tailed t‑test and ΔAUC bias assessment.
- Heatmaps for AUC and ΔAUC.
- CSV tables (Annex‑GG‑style) in
outputs/.
The synthetic generator produces realistic streak‑like artifacts and dose‑dependent noise; MAR reduces streak amplitude and introduces mild smoothing.
API Highlights
from mareval import (
build_pca_channels, cho_template, cho_decision_values,
compute_auc, compute_auc_ci, paired_ttest_one_tailed, delta_auc_bias_assessment,
generate_synthetic_study, extract_roi, batch_extract_rois,
make_parameter_grid, save_auc_table_csv, save_delta_auc_table_csv
)
- CHO
build_pca_channels(rois, n_channels=16, whiten=True)cho_template(ch_pos, ch_neg, lambda_reg=1e-3)cho_decision_values(ch_samples, w)
- AUC & Stats
compute_auc(values, labels) -> floatcompute_auc_ci(values, labels, n_bootstrap=2000) -> dictpaired_ttest_one_tailed(a, b) -> (delta_mean, p_one)delta_auc_bias_assessment(auc_fb, auc_mar) -> dict
- Simulator flow
generate_synthetic_study(cfg_dict)extract_roi(img, center, size)/batch_extract_rois([...], centers, size)make_parameter_grid(...)save_auc_table_csv(...),save_delta_auc_table_csv(...)
Tests / CI
A light smoke test covers the end‑to‑end pipeline on a tiny synthetic set:
pytest -q
GitHub Actions runs the tests across 3.9–3.12.
Versioning
- This update introduces v0.3.0 with simulator workflow, unified Annex‑GG notebook, and reporting/visualization helpers.
- Version tags are used to align releases with document snapshots (e.g., Annex‑GG draft refs).
License
MIT
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mar_eval-0.2.0.tar.gz.
File metadata
- Download URL: mar_eval-0.2.0.tar.gz
- Upload date:
- Size: 9.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
42f24e53d30f1fe8f4b7480eaf98d29445f2e1e3438ca8d092a46607ad06bbfe
|
|
| MD5 |
c874d34ef71c112a936ad3b43bd1fd5c
|
|
| BLAKE2b-256 |
a9767110bf46c5dcafc0b35c83843a2cf80f039e3ef9086e08bd1797bb6a7682
|
File details
Details for the file mar_eval-0.2.0-py3-none-any.whl.
File metadata
- Download URL: mar_eval-0.2.0-py3-none-any.whl
- Upload date:
- Size: 10.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
95e7ffbf0f4edbc2a07c6ead56464cb73024e0ec7ee9160a938f6819146a005a
|
|
| MD5 |
3c14b3edfeb5859f8a9eacb27122b91c
|
|
| BLAKE2b-256 |
f0429ff9d2db5d9190a07a624e678d63b58dea49256c11468648f33dc51333df
|