dustrack 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,166 @@
1
+ .vscode/*
2
+
3
+ # Byte-compiled / optimized / DLL files
4
+ __pycache__/
5
+ *.py[cod]
6
+ *$py.class
7
+
8
+ # C extensions
9
+ *.so
10
+
11
+ # Distribution / packaging
12
+ .Python
13
+ build/
14
+ develop-eggs/
15
+ dist/
16
+ downloads/
17
+ eggs/
18
+ .eggs/
19
+ lib/
20
+ lib64/
21
+ parts/
22
+ sdist/
23
+ var/
24
+ wheels/
25
+ share/python-wheels/
26
+ *.egg-info/
27
+ .installed.cfg
28
+ *.egg
29
+ MANIFEST
30
+
31
+ # PyInstaller
32
+ # Usually these files are written by a python script from a template
33
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
34
+ *.manifest
35
+ *.spec
36
+
37
+ # Installer logs
38
+ pip-log.txt
39
+ pip-delete-this-directory.txt
40
+
41
+ # Unit test / coverage reports
42
+ htmlcov/
43
+ .tox/
44
+ .nox/
45
+ .coverage
46
+ .coverage.*
47
+ .cache
48
+ nosetests.xml
49
+ coverage.xml
50
+ *.cover
51
+ *.py,cover
52
+ .hypothesis/
53
+ .pytest_cache/
54
+ cover/
55
+
56
+ # Translations
57
+ *.mo
58
+ *.pot
59
+
60
+ # Django stuff:
61
+ *.log
62
+ local_settings.py
63
+ db.sqlite3
64
+ db.sqlite3-journal
65
+
66
+ # Flask stuff:
67
+ instance/
68
+ .webassets-cache
69
+
70
+ # Scrapy stuff:
71
+ .scrapy
72
+
73
+ # Sphinx documentation
74
+ docs/_build/
75
+
76
+ # PyBuilder
77
+ .pybuilder/
78
+ target/
79
+
80
+ # Jupyter Notebook
81
+ .ipynb_checkpoints
82
+
83
+ # IPython
84
+ profile_default/
85
+ ipython_config.py
86
+
87
+ # pyenv
88
+ # For a library or package, you might want to ignore these files since the code is
89
+ # intended to run in multiple environments; otherwise, check them in:
90
+ # .python-version
91
+
92
+ # pipenv
93
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
94
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
95
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
96
+ # install all needed dependencies.
97
+ #Pipfile.lock
98
+
99
+ # poetry
100
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
101
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
102
+ # commonly ignored for libraries.
103
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
104
+ #poetry.lock
105
+
106
+ # pdm
107
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
108
+ #pdm.lock
109
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
110
+ # in version control.
111
+ # https://pdm.fming.dev/#use-with-ide
112
+ .pdm.toml
113
+
114
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
115
+ __pypackages__/
116
+
117
+ # Celery stuff
118
+ celerybeat-schedule
119
+ celerybeat.pid
120
+
121
+ # SageMath parsed files
122
+ *.sage.py
123
+
124
+ # Environments
125
+ .env
126
+ .venv
127
+ .venv-dev
128
+ env/
129
+ venv/
130
+ ENV/
131
+ env.bak/
132
+ venv.bak/
133
+
134
+ # Spyder project settings
135
+ .spyderproject
136
+ .spyproject
137
+
138
+ # Rope project settings
139
+ .ropeproject
140
+
141
+ # mkdocs documentation
142
+ /site
143
+
144
+ # mypy
145
+ .mypy_cache/
146
+ .dmypy.json
147
+ dmypy.json
148
+
149
+ # Pyre type checker
150
+ .pyre/
151
+
152
+ # pytype static type analyzer
153
+ .pytype/
154
+
155
+ # Cython debug symbols
156
+ cython_debug/
157
+
158
+ # PyCharm
159
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
160
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
161
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
162
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
163
+ #.idea/
164
+
165
+ # AI workflow context (auto-loaded by Claude Code; kept local to avoid exposing private repo refs)
166
+ CLAUDE.md
@@ -0,0 +1,8 @@
1
+ # Default ignored files
2
+ /shelf/
3
+ /workspace.xml
4
+ # Editor-based HTTP Client requests
5
+ /httpRequests/
6
+ # Datasource local storage ignored files
7
+ /dataSources/
8
+ /dataSources.local.xml
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module version="4">
3
+ <component name="PyDocumentationSettings">
4
+ <option name="format" value="GOOGLE" />
5
+ <option name="myDocStringFormat" value="Google" />
6
+ </component>
7
+ </module>
@@ -0,0 +1,6 @@
1
+ <component name="InspectionProjectProfileManager">
2
+ <settings>
3
+ <option name="USE_PROJECT_PROFILE" value="false" />
4
+ <version value="1.0" />
5
+ </settings>
6
+ </component>
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="Black">
4
+ <option name="sdkName" value=".deeplabcut3venv" />
5
+ </component>
6
+ <component name="ProjectRootManager" version="2" project-jdk-name="deeplabcut3.13" project-jdk-type="Python SDK" />
7
+ </project>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="VcsDirectoryMappings">
4
+ <mapping directory="" vcs="Git" />
5
+ </component>
6
+ </project>
@@ -0,0 +1,29 @@
1
+ # Read the Docs configuration file for Sphinx projects
2
+ # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
3
+
4
+ # Required
5
+ version: 2
6
+
7
+ # Set the OS, Python version and other tools you might need
8
+ build:
9
+ os: ubuntu-22.04
10
+ tools:
11
+ python: "3.12"
12
+
13
+ # Build documentation in the "docs/" directory with Sphinx
14
+ sphinx:
15
+ configuration: docs/conf.py
16
+
17
+ # Optionally build your docs in additional formats such as PDF and ePub
18
+ formats:
19
+ - pdf
20
+ - epub
21
+
22
+ # Optional but recommended, declare the Python requirements required
23
+ # to build your documentation
24
+ # See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
25
+ python:
26
+ install:
27
+ - requirements: docs/requirements.txt
28
+ - method: pip
29
+ path: .
@@ -0,0 +1,110 @@
1
+ # Change Log
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ ## [1.0.0] - 2026-05-17
5
+
6
+ Audit-and-polish release. No public API changes. Drops the alpha tag,
7
+ re-points the README + bibtex from the arXiv preprint to the published
8
+ *Scientific Reports* paper (Namburi et al., 2026,
9
+ [doi:10.1038/s41598-026-42795-3](https://doi.org/10.1038/s41598-026-42795-3),
10
+ accepted 2026-02-27), and folds in mechanical cleanup along the lines
11
+ of datanavigator 1.2.0. The `numpy<2` pin and `<=3.13` upper bound stay
12
+ in place — both are slated for relaxation in a CI-gated follow-up.
13
+
14
+ ### Fixed
15
+ - `dustrack/dlcinterface.py`: removed a duplicate
16
+ `from skimage import io, img_as_ubyte` that was masked by the first
17
+ import a few lines up.
18
+ - `dustrack/dlcinterface.py`: the ImportError path for missing
19
+ `deeplabcut` now calls `warnings.warn(...)` instead of `print(...)`,
20
+ so library import no longer writes unsolicited text to stdout when
21
+ `HAS_DLC=False`.
22
+ - `dustrack/dlcinterface.py`: `process_dlc_project` had an
23
+ `assert self._dlcproject is not None` immediately followed by an
24
+ `if self._dlcproject is None: raise ValueError(...)`; the assert was
25
+ unreachable and has been dropped. The `ValueError` branch is now also
26
+ evaluated *before* `plt.close(self.figure)` so a stale-state caller
27
+ doesn't lose its figure.
28
+ - `dustrack/dlcinterface.py`: removed four leftover developer-debug
29
+ `print` calls (`from_video` h5 path, `copy_annotations` filename,
30
+ `process` iteration counters, `annotate` video name). User-facing
31
+ status prints in extraction / training / merge paths are unchanged.
32
+ - `dustrack/postprocess.py`: `lk_moving_average_filter` docstring no
33
+ longer contradicts the signature — `video_name` is documented as
34
+ optional with the path-argument requirement asserted at call time.
35
+
36
+ ### Changed
37
+ - `dustrack/dlcinterface.py`: import-alias hygiene per the portfolio
38
+ convention settled 2026-05-13/14 — `from pyfilemanager import
39
+ FileManager` → `import pyfilemanager`; `import datanavigator` →
40
+ `import datanavigator as dnav`. Stdlib imports (`re`, `warnings`,
41
+ `PureWindowsPath`, `PurePosixPath`) are now grouped with the other
42
+ stdlib imports at the top of the module instead of trailing the
43
+ `try/except ImportError` block. No external API surface change.
44
+ - `pyproject.toml`: dropped `Python :: 3.7` and `Python :: 3.8` from
45
+ the classifier list. The dependency stack (DLC3 + datanavigator
46
+ 1.3.x + scientific Python) does not actually support either, and the
47
+ classifiers were misleading on PyPI. `requires-python = ">=3.7,
48
+ <=3.13"` is unchanged for this release (CI matrix + bound relaxation
49
+ is the next-band item).
50
+ - `README.md`: citation paragraph and bibtex block now point at the
51
+ Nature *Scientific Reports* article rather than the arXiv preprint.
52
+ - `docs/conf.py`: `release` bumped to `1.0.0`; stale `# pyfilemanager`
53
+ comment dropped.
54
+ - `docs/index.md`: master-file comment header switched from
55
+ `pyfilemanager` (boilerplate copy-paste) to `dustrack`.
56
+
57
+ ## [1.0.0a2] - 2026-05-17
58
+
59
+ Maintenance release. Fixes a packaging bug in 1.0.0a1 that silently
60
+ disabled DeepLabCut integration on every fresh install from PyPI,
61
+ swaps the video-reading backend from `decord` to
62
+ `datanavigator.VideoReader` (PyAV+TOC), and ships the GUI / workflow
63
+ additions accumulated since 1.0.0a1 (ultrasound image enhancement,
64
+ dark theme, source-model wiring). No API breakage; the Qt rework
65
+ slated for the next release lives on the `1.4.0-qt` branch and is
66
+ not part of this release.
67
+
68
+ ### Fixed
69
+ - `dustrack/dlcinterface.py`: removed the stale
70
+ `from . import imagesimilarity` import that landed inside the
71
+ `try`-import-`deeplabcut` block in 1.0.0a1. The `imagesimilarity`
72
+ module was never shipped to PyPI — it lives only on the
73
+ `wip/labeled-data-nudging` branch — so the import fell into
74
+ `except ImportError`, silently setting `HAS_DLC=False`, hiding
75
+ `DLCProject`, and disabling the `Create DLC Project` /
76
+ `Train DLC model` / `Reduce jitter` GUI buttons. Fresh PyPI installs
77
+ of 1.0.0a1 could not exercise the DLC pipeline at all.
78
+
79
+ ### Changed
80
+ - Video reading now flows through `datanavigator.VideoReader`
81
+ (PyAV+TOC backend) instead of `decord`. The change rides
82
+ datanavigator 1.3.0's decord→PyAV+TOC swap; public reader API is
83
+ preserved (decord-shaped indexing, `get_batch([...]).asnumpy()`,
84
+ `len()`, iteration, `get_avg_fps()`). See the datanavigator 1.3.0
85
+ changelog for the parity-test motivation.
86
+ - `datanavigator` pin: `>=1.3.0` → `>=1.3.0,<1.4.0`. Floor matches
87
+ the PyAV+TOC reader requirement; ceiling locks out the upcoming
88
+ datanavigator 1.4.0 Qt API, which the `1.4.0-qt` branch in this
89
+ repo targets as a separate forthcoming release.
90
+ - Retired references to the internal NAS IP / hard-coded paths in
91
+ the dustrack module.
92
+
93
+ ### Added
94
+ - `enhance_ultrasound_image()` helper in `dustrack/dlcinterface.py`
95
+ (CLAHE + gamma + brightness adjustments for B-mode ultrasound).
96
+ - `DUSTrack` GUI: optional dark theme; gamma-correction toggle;
97
+ source-model path support for DLC project creation.
98
+ - Documentation expansions in `dustrack/__init__.py` and the GUI
99
+ docstrings; Sphinx now picks up docstrings of optional components.
100
+
101
+ ### Removed
102
+ - The `pia02_workflow/` directory has been moved off the `main`
103
+ branch into the `pia02-sandbox` branch (`git subtree split`, 63
104
+ commits of history preserved). The sandbox is technician-led
105
+ piano-study scratch (see `specs/dustrack.md` Open questions in the
106
+ pn-portfolio repo) and was not intended to live on `main`. It will
107
+ eventually graduate to `pn-projects/projects/mithic/pia02/`. This
108
+ is a repository-layout change only — the PyPI wheel never included
109
+ `pia02_workflow/` (flit scopes packaging to the `dustrack/` import
110
+ package), so installed-user behavior is unaffected.
dustrack-1.0.0/LICENSE ADDED
@@ -0,0 +1,9 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024-present Praneeth Namburi <praneeth.namburi@gmail.com>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
+
7
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,152 @@
1
+ Metadata-Version: 2.4
2
+ Name: dustrack
3
+ Version: 1.0.0
4
+ Summary: DUSTrack: Semi-automated point tracking in ultrasound videos.
5
+ Keywords: video,tracking,computer-vision,motion-analysis,point-tracking
6
+ Author-email: Praneeth Namburi <praneeth.namburi@gmail.com>
7
+ Requires-Python: >=3.7,<=3.13
8
+ Description-Content-Type: text/markdown
9
+ Classifier: Development Status :: 5 - Production/Stable
10
+ Classifier: License :: OSI Approved :: MIT License
11
+ Classifier: Topic :: Scientific/Engineering
12
+ Classifier: Programming Language :: Python
13
+ Classifier: Programming Language :: Python :: 3.9
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Programming Language :: Python :: Implementation :: CPython
19
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
20
+ License-File: LICENSE
21
+ Requires-Dist: numpy<2
22
+ Requires-Dist: pandas
23
+ Requires-Dist: matplotlib
24
+ Requires-Dist: portion
25
+ Requires-Dist: ffmpeg-python
26
+ Requires-Dist: tables
27
+ Requires-Dist: dill
28
+ Requires-Dist: tqdm
29
+ Requires-Dist: scikit-image
30
+ Requires-Dist: opencv-python
31
+ Requires-Dist: pysampled
32
+ Requires-Dist: pyfilemanager
33
+ Requires-Dist: datanavigator>=1.3.0,<1.4.0
34
+ Requires-Dist: sphinx==6.2.1 ; extra == "docs"
35
+ Requires-Dist: sphinx-rtd-theme==2.0.0 ; extra == "docs"
36
+ Requires-Dist: myst-parser==1.0.0 ; extra == "docs"
37
+ Requires-Dist: sphinxcontrib-youtube==1.4.1 ; extra == "docs"
38
+ Project-URL: Home, https://github.com/praneethnamburi/DUSTrack
39
+ Provides-Extra: docs
40
+
41
+ # DUSTrack
42
+
43
+ [![src](https://img.shields.io/badge/src-github-blue)](https://github.com/praneethnamburi/DUSTrack)
44
+ [![PyPI - Version](https://img.shields.io/pypi/v/DUSTrack.svg?logo=pypi&label=PyPI&logoColor=gold)](https://pypi.org/project/DUSTrack/)
45
+ [![Documentation Status](https://readthedocs.org/projects/DUSTrack/badge/?version=latest)](https://DUSTrack.readthedocs.io)
46
+ [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/praneethnamburi/DUSTrack/main/LICENSE)
47
+
48
+ *Semi-automated point tracking in videos. Designed for ultrasound videos, but works with natural videos as well.*
49
+
50
+ `DUSTrack` (Deep learning and optical flow-based toolkit for UltraSound Tracking) is a semi-automated framework for tracking arbitrary points in B-mode ultrasound videos. It combines deep learning with optical flow to deliver high-quality, robust tracking across diverse anatomical structures and motion patterns. The toolkit includes a graphical user interface that streamlines the generation of high-quality training data and supports iterative model refinement. It also implements a novel optical-flow-based filtering technique that reduces high-frequency frame-to-frame noise while preserving rapid tissue motion.
51
+
52
+ ## Features
53
+
54
+ - **Hybrid approach**: Combines deep learning with optical flow for accurate tracking
55
+ - **User-friendly GUI**: Streamlines training data generation and model refinement
56
+ - **Noise reduction**: Novel optical-flow-based filtering preserves rapid motion while reducing frame-to-frame noise
57
+ - **Versatile**: Works with ultrasound and other video types
58
+ - **Flexible installation**: Use GUI + optical flow only, or add deep learning capabilities
59
+
60
+ Learn more about DUSTrack in our [paper in *Scientific Reports*](https://doi.org/10.1038/s41598-026-42795-3).
61
+
62
+ ## Installation
63
+
64
+ ### Option 1: GUI + Optical Flow Only (Recommended for Short Videos)
65
+
66
+ For tracking points in videos with a few hundred frames, this lightweight installation is sufficient:
67
+
68
+ ```sh
69
+ pip install DUSTrack
70
+ ```
71
+
72
+ **Troubleshooting dependencies**: If you encounter dependency issues, use conda with the provided `requirements.yml` file:
73
+
74
+ ```sh
75
+ conda env create -n env-dustrack -f https://github.com/praneethnamburi/DUSTrack/raw/main/requirements.yml
76
+ conda activate env-dustrack
77
+ pip install DUSTrack
78
+ ```
79
+
80
+ ### Option 2: Full Installation (Including Deep Learning)
81
+
82
+ For longer videos or ultrasound videos with repetitive motions, deep learning significantly reduces manual effort and improves tracking quality:
83
+
84
+ 1. Create a conda environment and install DeepLabCut by following [these instructions](https://deeplabcut.github.io/DeepLabCut/docs/installation.html)
85
+ 2. Activate your DeepLabCut environment and install DUSTrack:
86
+ ```sh
87
+ conda activate <your-dlc-env>
88
+ pip install DUSTrack
89
+ ```
90
+
91
+ ## Quick Start
92
+
93
+ ```python
94
+ from dustrack import DUSTrack
95
+ import datanavigator
96
+
97
+ # Launch the GUI with an example video
98
+ video_path = datanavigator.get_example_video() # or use your own video path
99
+ d = DUSTrack(video_path, "pn")
100
+ # The second argument is the name of the "layer" for storing tracking annotations
101
+ ```
102
+
103
+ **Next steps:**
104
+ - Use the GUI to mark points of interest in your video (see [Keyboard shortcuts](https://github.com/praneethnamburi/DUSTrack/raw/main/docs/source/resources/keyboard_shortcuts.png))
105
+ - Track points using optical flow and/or train a deep learning model
106
+ - Export tracking results as a `.json` file for further analysis
107
+
108
+ For detailed tutorials and examples, see the [documentation](https://DUSTrack.readthedocs.io).
109
+
110
+ ## Documentation
111
+
112
+ Full documentation is available at [DUSTrack.readthedocs.io](https://DUSTrack.readthedocs.io).
113
+
114
+ ## Citation
115
+
116
+ If you use DUSTrack in your research, please cite our paper:
117
+
118
+ ```bibtex
119
+ @article{namburi2026dustrack,
120
+ title={DUSTrack: Semi-automated point tracking in ultrasound videos},
121
+ author={Namburi, Praneeth and Pallar{\`e}s-L{\'o}pez, Roger and Rosendorf, Jessica and Folgado, Duarte and Anthony, Brian W},
122
+ journal={Scientific Reports},
123
+ volume={16},
124
+ pages={13340},
125
+ year={2026},
126
+ doi={10.1038/s41598-026-42795-3}
127
+ }
128
+ ```
129
+
130
+ ## Contributing
131
+
132
+ Contributions are welcome! Please feel free to:
133
+ - Submit a Pull Request with improvements or bug fixes
134
+ - Share your use cases and feedback ([contact](https://praneethnamburi.com/contact/))
135
+
136
+ ## License
137
+
138
+ This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.
139
+
140
+ ## Contact
141
+
142
+ [Praneeth Namburi](https://praneethnamburi.com)
143
+
144
+ Project Link: [https://github.com/praneethnamburi/DUSTrack](https://github.com/praneethnamburi/DUSTrack)
145
+
146
+
147
+ ## Acknowledgments
148
+
149
+ [MIT.nano Immersion Lab](https://immersion.mit.edu)
150
+
151
+ [NCSOFT](https://nc.com)
152
+
@@ -0,0 +1,111 @@
1
+ # DUSTrack
2
+
3
+ [![src](https://img.shields.io/badge/src-github-blue)](https://github.com/praneethnamburi/DUSTrack)
4
+ [![PyPI - Version](https://img.shields.io/pypi/v/DUSTrack.svg?logo=pypi&label=PyPI&logoColor=gold)](https://pypi.org/project/DUSTrack/)
5
+ [![Documentation Status](https://readthedocs.org/projects/DUSTrack/badge/?version=latest)](https://DUSTrack.readthedocs.io)
6
+ [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/praneethnamburi/DUSTrack/main/LICENSE)
7
+
8
+ *Semi-automated point tracking in videos. Designed for ultrasound videos, but works with natural videos as well.*
9
+
10
+ `DUSTrack` (Deep learning and optical flow-based toolkit for UltraSound Tracking) is a semi-automated framework for tracking arbitrary points in B-mode ultrasound videos. It combines deep learning with optical flow to deliver high-quality, robust tracking across diverse anatomical structures and motion patterns. The toolkit includes a graphical user interface that streamlines the generation of high-quality training data and supports iterative model refinement. It also implements a novel optical-flow-based filtering technique that reduces high-frequency frame-to-frame noise while preserving rapid tissue motion.
11
+
12
+ ## Features
13
+
14
+ - **Hybrid approach**: Combines deep learning with optical flow for accurate tracking
15
+ - **User-friendly GUI**: Streamlines training data generation and model refinement
16
+ - **Noise reduction**: Novel optical-flow-based filtering preserves rapid motion while reducing frame-to-frame noise
17
+ - **Versatile**: Works with ultrasound and other video types
18
+ - **Flexible installation**: Use GUI + optical flow only, or add deep learning capabilities
19
+
20
+ Learn more about DUSTrack in our [paper in *Scientific Reports*](https://doi.org/10.1038/s41598-026-42795-3).
21
+
22
+ ## Installation
23
+
24
+ ### Option 1: GUI + Optical Flow Only (Recommended for Short Videos)
25
+
26
+ For tracking points in videos with a few hundred frames, this lightweight installation is sufficient:
27
+
28
+ ```sh
29
+ pip install DUSTrack
30
+ ```
31
+
32
+ **Troubleshooting dependencies**: If you encounter dependency issues, use conda with the provided `requirements.yml` file:
33
+
34
+ ```sh
35
+ conda env create -n env-dustrack -f https://github.com/praneethnamburi/DUSTrack/raw/main/requirements.yml
36
+ conda activate env-dustrack
37
+ pip install DUSTrack
38
+ ```
39
+
40
+ ### Option 2: Full Installation (Including Deep Learning)
41
+
42
+ For longer videos or ultrasound videos with repetitive motions, deep learning significantly reduces manual effort and improves tracking quality:
43
+
44
+ 1. Create a conda environment and install DeepLabCut by following [these instructions](https://deeplabcut.github.io/DeepLabCut/docs/installation.html)
45
+ 2. Activate your DeepLabCut environment and install DUSTrack:
46
+ ```sh
47
+ conda activate <your-dlc-env>
48
+ pip install DUSTrack
49
+ ```
50
+
51
+ ## Quick Start
52
+
53
+ ```python
54
+ from dustrack import DUSTrack
55
+ import datanavigator
56
+
57
+ # Launch the GUI with an example video
58
+ video_path = datanavigator.get_example_video() # or use your own video path
59
+ d = DUSTrack(video_path, "pn")
60
+ # The second argument is the name of the "layer" for storing tracking annotations
61
+ ```
62
+
63
+ **Next steps:**
64
+ - Use the GUI to mark points of interest in your video (see [Keyboard shortcuts](https://github.com/praneethnamburi/DUSTrack/raw/main/docs/source/resources/keyboard_shortcuts.png))
65
+ - Track points using optical flow and/or train a deep learning model
66
+ - Export tracking results as a `.json` file for further analysis
67
+
68
+ For detailed tutorials and examples, see the [documentation](https://DUSTrack.readthedocs.io).
69
+
70
+ ## Documentation
71
+
72
+ Full documentation is available at [DUSTrack.readthedocs.io](https://DUSTrack.readthedocs.io).
73
+
74
+ ## Citation
75
+
76
+ If you use DUSTrack in your research, please cite our paper:
77
+
78
+ ```bibtex
79
+ @article{namburi2026dustrack,
80
+ title={DUSTrack: Semi-automated point tracking in ultrasound videos},
81
+ author={Namburi, Praneeth and Pallar{\`e}s-L{\'o}pez, Roger and Rosendorf, Jessica and Folgado, Duarte and Anthony, Brian W},
82
+ journal={Scientific Reports},
83
+ volume={16},
84
+ pages={13340},
85
+ year={2026},
86
+ doi={10.1038/s41598-026-42795-3}
87
+ }
88
+ ```
89
+
90
+ ## Contributing
91
+
92
+ Contributions are welcome! Please feel free to:
93
+ - Submit a Pull Request with improvements or bug fixes
94
+ - Share your use cases and feedback ([contact](https://praneethnamburi.com/contact/))
95
+
96
+ ## License
97
+
98
+ This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.
99
+
100
+ ## Contact
101
+
102
+ [Praneeth Namburi](https://praneethnamburi.com)
103
+
104
+ Project Link: [https://github.com/praneethnamburi/DUSTrack](https://github.com/praneethnamburi/DUSTrack)
105
+
106
+
107
+ ## Acknowledgments
108
+
109
+ [MIT.nano Immersion Lab](https://immersion.mit.edu)
110
+
111
+ [NCSOFT](https://nc.com)
@@ -0,0 +1,20 @@
1
+ # Minimal makefile for Sphinx documentation
2
+ #
3
+
4
+ # You can set these variables from the command line, and also
5
+ # from the environment for the first two.
6
+ SPHINXOPTS ?=
7
+ SPHINXBUILD ?= sphinx-build
8
+ SOURCEDIR = .
9
+ BUILDDIR = _build
10
+
11
+ # Put it first so that "make" without argument is like "make help".
12
+ help:
13
+ @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
14
+
15
+ .PHONY: help Makefile
16
+
17
+ # Catch-all target: route all unknown targets to Sphinx using the new
18
+ # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
19
+ %: Makefile
20
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)