Skip to main content

Flask-based QA tool for reviewing and annotating medical images.

Project description

masi-qa

A Flask-based web application for reviewing and annotating medical QA images (PNG files). It provides a keyboard-driven interface for rapid quality assurance review of imaging data.

Supports both Standard and BIDS-compliant modes.

If you use this for your research, please cite the following papers:

Kim ME, Gao C, Newlin NR, Rudravaram G, Krishnan AR, Ramadass K, et al. (2025) Scalable quality control on processing of large diffusion-weighted and structural magnetic resonance imaging datasets. PLoS One 20(8): e0327388. https://doi.org/10.1371/journal.pone.0327388

Features

  • Web-based image viewer for PNG files
  • Keyboard-driven workflow for fast QA review
  • Configurable QA status options (2–8 labels, default: Yes, No, Maybe)
  • Optional reason field for documenting QA decisions
  • Reviewer name tracking for multi-user workflows
  • BIDS compliance mode via separate masi-bids-qa command
  • Automatic tracking of review timestamps and duration
  • Persistent storage via JSON with CSV export
  • Autoplay mode with adjustable speed (50–500 ms per image)
  • Quick navigation: jump to specific image or next unreviewed
  • Completion notification when all images have been reviewed

Installation

From PyPI

pip install masi-qa

From Source

git clone https://github.com/MASILab/masi-qa.git
cd masi-qa
pip install .

Quick Start

  1. Run the application:

    masi-qa           # Standard mode (any PNG filename)
    masi-bids-qa      # BIDS mode (requires BIDS-compliant filenames)
    
  2. Open the URL shown in the terminal (port is automatically selected)

  3. Select a root directory, dataset, and pipeline

  4. Enter your reviewer name in the QA Settings section

  5. Click "Continue to QA" to begin review

Keyboard Shortcuts

Key Action
/ Navigate between images
Q / W / E ... Set QA status (first 8 options mapped to Q, W, E, R, A, S, D, F)
N Jump to next unreviewed image
Space Toggle autoplay mode
Enter Focus/unfocus reason input field

Quick Navigation

  • Go to specific image: Use the "Go to #" input field next to the image counter and press Enter
  • Next unreviewed: Press N to skip already-reviewed images and jump to the next one that hasn't been reviewed yet
  • Completion notification: A green toast notification appears when all images have been reviewed. This triggers automatically when you review the last unreviewed image, when you press N with no unreviewed images remaining, or when you open a dataset where all images were already reviewed

Autoplay

Press Space to start/stop autoplay. Use the Speed slider in the toolbar to set the delay per image (50–500 ms, default 250 ms).

Configurable QA Options

On the dataset selection page, expand QA Options to customize the status labels shown during review. You can:

  • Rename any option (e.g. change "maybe" to "exclude")
  • Add options (up to 8 total)
  • Remove options (minimum 2 required)

Keyboard shortcuts are assigned automatically in order: Q, W, E, R, A, S, D, F. The first option is the default status assigned to new images.

The default options are yes, no, maybe.

Expected Directory Structure

/your/qa/directory/
├── dataset1/
│   └── pipeline1/
│       ├── image1.png
│       ├── image2.png
│       ├── QA.json    (auto-created)
│       └── QA.csv     (auto-created)
├── dataset2/
│   └── pipeline2/
│       ├── image1.png
│       └── ...

Each pipeline directory should contain PNG files only.

Modes

Standard Mode (masi-qa)

Works with any PNG filename. This is the default mode for general use.

BIDS Mode (masi-bids-qa)

Validates that all PNG filenames follow the BIDS naming convention:

sub-<subject>_ses-<session>_<pipeline>.png
sub-<subject>_<pipeline>.png  (if no session)

Required: sub-* (subject identifier) Optional: ses-* (session), acq-* (acquisition), run-* (run number)

If any files are non-compliant, an error page will list them. You can rename the files or use masi-qa instead.

Switching Between Modes

If you open a dataset that has existing QA data in a different format, the application will detect this and offer options to either restart with the matching command or convert the existing data. Converting creates a backup (QA.json.backup) before modifying.

QA Data Format

QA results are stored in QA.json and exported to QA.csv. The format depends on the mode.

Standard Mode

{
  "filename.png": {
    "filename": "filename.png",
    "QA_status": "yes",
    "reason": "",
    "user": "reviewer_name",
    "date": "2024-07-10 00:09:13",
    "duration": 45
  }
}

CSV columns: filename, QA_status, reason, user, date, duration

BIDS Mode

{
  "sub-001": {
    "ses-01": {
      "QA_status": "yes",
      "reason": "",
      "user": "reviewer_name",
      "date": "2024-07-10 00:09:13",
      "sub": "sub-001",
      "ses": "ses-01",
      "acq": "",
      "run": ""
    }
  }
}

CSV columns: sub, ses, acq, run, QA_status, reason, user, date

Field Descriptions

Field Description
filename Name of the image file (Standard mode only)
sub/ses/acq/run BIDS identifiers (BIDS mode only)
QA_status Review status; one of the configured QA options (default: yes, no, maybe)
reason Optional text explaining the QA decision
user Name of the reviewer (empty until reviewed)
date Timestamp of the last review (empty until reviewed)
duration Total seconds spent viewing the image (Standard mode only)

Advanced Options

Debug Mode

Enable Flask debug mode with hot reload for development:

masi-qa --debug

Custom Port

Specify a port manually (default: auto-detect from 5000-5009):

masi-qa --port 8080

Important Notes

  • PNG only: PDF files are not supported; use PNG images only.

  • Use Chrome: The application runs significantly faster in Chrome. Firefox may experience slowness and jittery behavior.

  • Single user per dataset: Do not have multiple people QAing the same dataset/pipeline simultaneously. The data is only loaded at startup; concurrent edits will not be synchronized.

  • Large directories: Directories with many images take time to preload. Be patient during initial loading.

  • Default status: New images are assigned QA_status: "yes" by default. Changes are saved when navigating to the next image.

Citation

If you use this software in your research, please cite:

@article{kim2025scalable, title={Scalable quality control on processing of large diffusion-weighted and structural magnetic resonance imaging datasets}, author={Kim, Michael E and Gao, Chenyu and Newlin, Nancy R and Rudravaram, Gaurav and Krishnan, Aravind R and Ramadass, Karthik and Kanakaraj, Praitayini and Schilling, Kurt G and Dewey, Blake E and Bennett, David A and others}, journal={PloS one}, volume={20}, number={8}, pages={e0327388}, year={2025}, publisher={Public Library of Science San Francisco, CA USA} }

Authors

License

MIT License - Copyright (c) 2024-2026 MASI Lab @ Vanderbilt

See LICENSE for details.

Related Projects

  • ADSP_AutoQA - BIDS-specific version with enforced BIDS compliance

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

masi_qa-0.1.0.tar.gz (51.7 kB view details)

Uploaded Source

Built Distribution

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

masi_qa-0.1.0-py3-none-any.whl (49.2 kB view details)

Uploaded Python 3

File details

Details for the file masi_qa-0.1.0.tar.gz.

File metadata

  • Download URL: masi_qa-0.1.0.tar.gz
  • Upload date:
  • Size: 51.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.4

File hashes

Hashes for masi_qa-0.1.0.tar.gz
Algorithm Hash digest
SHA256 f1a79e653fe6b799addf073f3f54412e282d738201a844022699c978e2e86926
MD5 c23935c631a0e4ab10061be32134f7c0
BLAKE2b-256 9f3b61b495a036861018d521fa71dea8156e729204ea2e578a45ff1a8bf0af35

See more details on using hashes here.

File details

Details for the file masi_qa-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: masi_qa-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 49.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.4

File hashes

Hashes for masi_qa-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a81eac2bb4db9728cd9d5e41b6a3f5d24a2050a39062d8768612891ae1ea38b3
MD5 1e4ad549d08f1c829a4bfd30b519d300
BLAKE2b-256 f0558251d3d157087cecd6faf1738d70b82b874b8b970bfa7975d995184d8204

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