spacr 0.3.42__tar.gz → 0.3.45__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.
- {spacr-0.3.42/spacr.egg-info → spacr-0.3.45}/PKG-INFO +1 -1
- {spacr-0.3.42 → spacr-0.3.45}/setup.py +1 -1
- {spacr-0.3.42 → spacr-0.3.45}/spacr/cellpose.py +63 -73
- {spacr-0.3.42 → spacr-0.3.45}/spacr/gui_core.py +5 -5
- {spacr-0.3.42 → spacr-0.3.45}/spacr/gui_utils.py +1 -1
- {spacr-0.3.42 → spacr-0.3.45}/spacr/io.py +76 -63
- {spacr-0.3.42 → spacr-0.3.45}/spacr/ml.py +4 -3
- {spacr-0.3.42 → spacr-0.3.45}/spacr/plot.py +265 -11
- {spacr-0.3.42 → spacr-0.3.45}/spacr/settings.py +29 -8
- {spacr-0.3.42 → spacr-0.3.45}/spacr/submodules.py +214 -10
- {spacr-0.3.42 → spacr-0.3.45}/spacr/toxo.py +5 -116
- {spacr-0.3.42 → spacr-0.3.45}/spacr/utils.py +103 -6
- {spacr-0.3.42 → spacr-0.3.45/spacr.egg-info}/PKG-INFO +1 -1
- {spacr-0.3.42 → spacr-0.3.45}/.readthedocs.yaml +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/LICENSE +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/MANIFEST.in +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/README.rst +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/deploy_docs.sh +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/requirements.txt +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/Makefile +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/doctrees/environment.pickle +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/index.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/app_annotate.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/app_classify.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/app_make_masks.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/app_mask.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/app_measure.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/app_sequencing.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/app_umap.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/core.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/deep_spacr.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/graph_learning.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/gui.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/gui_core.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/gui_elements.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/gui_utils.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/io.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/logger.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/measure.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/plot.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/sequencing.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/settings.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/sim.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/timelapse.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/utils.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_sources/index.rst.txt +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_sources/modules.rst.txt +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_sources/spacr.rst.txt +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/_sphinx_javascript_frameworks_compat.js +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/basic.css +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/badge_only.css +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.svg +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/lato-bold.woff +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/lato-bold.woff2 +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/lato-normal.woff +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/lato-normal.woff2 +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/theme.css +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/doctools.js +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/documentation_options.js +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/file.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/jquery.js +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/js/badge_only.js +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/js/html5shiv-printshiv.min.js +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/js/html5shiv.min.js +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/js/theme.js +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/language_data.js +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/minus.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/plus.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/pygments.css +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/searchtools.js +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/sphinx_highlight.js +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/genindex.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/index.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/modules.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/objects.inv +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/py-modindex.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/search.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/searchindex.js +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/spacr.html +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/conf.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/index.rst +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/make.bat +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/modules.rst +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/docs/source/spacr.rst +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/environment.yaml +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/fonts/OpenSans-Regular.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/notebooks/cv_scoring_nb.ipynb +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/notebooks/deep_learning_spacr.ipynb +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/notebooks/machine_learning_spacr_nb.ipynb +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/notebooks/spacr_0.1_all_settings_git.ipynb +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/notebooks/spacr_0.1_minimal.ipynb +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/path/home/carruthers/datasets/plate1/measurements/measurements.db +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/path/home/carruthers/datasets/plate1/settings/measure_crop_settings.csv +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/path/settings/preprocess_generate_masks_settings.csv +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/requirements.txt +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/settings/measure_crop_settings.csv +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/setup.cfg +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/setup_docs.sh +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/source/conf.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/source/index.rst +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/source/modules.rst +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/source/setup.rst +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/source/spacr.rst +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/__init__.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/__main__.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/app_annotate.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/app_classify.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/app_make_masks.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/app_mask.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/app_measure.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/app_sequencing.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/app_umap.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/core.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/deep_spacr.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/gui.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/gui_elements.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/logger.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/measure.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/mediar.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/openai.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/.gitignore +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/LICENSE +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/README.md +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/SetupDict.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/config/baseline.json +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/config/mediar_example.json +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/config/pred/pred_mediar.json +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/config/step1_pretraining/phase1.json +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/config/step1_pretraining/phase2.json +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/config/step2_finetuning/finetuning1.json +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/config/step2_finetuning/finetuning2.json +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/config/step3_prediction/base_prediction.json +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/config/step3_prediction/ensemble_tta.json +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/core/BasePredictor.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/core/BaseTrainer.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/core/Baseline/Predictor.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/core/Baseline/Trainer.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/core/Baseline/__init__.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/core/Baseline/utils.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/core/MEDIAR/EnsemblePredictor.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/core/MEDIAR/Predictor.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/core/MEDIAR/Trainer.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/core/MEDIAR/__init__.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/core/MEDIAR/utils.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/core/__init__.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/core/utils.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/evaluate.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/generate_mapping.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/image/examples/img1.tiff +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/image/examples/img2.tif +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/image/failure_cases.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/image/mediar_framework.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/image/mediar_model.PNG +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/image/mediar_results.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/main.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/predict.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/requirements.txt +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/__init__.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/data_utils/__init__.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/data_utils/custom/CellAware.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/data_utils/custom/LoadImage.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/data_utils/custom/NormalizeImage.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/data_utils/custom/__init__.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/data_utils/custom/modalities.pkl +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/data_utils/datasetter.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/data_utils/transforms.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/data_utils/utils.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/measures.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/models/MEDIARFormer.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/models/__init__.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/utils.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/data/lopit.csv +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/data/toxoplasma_metadata.csv +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/OFL.txt +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/OpenSans-Italic-VariableFont_wdth,wght.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/OpenSans-VariableFont_wdth,wght.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/README.txt +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans-Bold.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans-BoldItalic.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans-ExtraBold.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans-ExtraBoldItalic.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans-Italic.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans-Light.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans-LightItalic.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans-Medium.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans-MediumItalic.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans-Regular.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans-SemiBold.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans-SemiBoldItalic.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Bold.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_Condensed-BoldItalic.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_Condensed-ExtraBold.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_Condensed-ExtraBoldItalic.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Italic.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Light.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_Condensed-LightItalic.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Medium.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_Condensed-MediumItalic.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Regular.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_Condensed-SemiBold.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_Condensed-SemiBoldItalic.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Bold.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-BoldItalic.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-ExtraBold.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-ExtraBoldItalic.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Italic.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Light.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-LightItalic.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Medium.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-MediumItalic.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Regular.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-SemiBold.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-SemiBoldItalic.ttf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/abort.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/annotate.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/cellpose_all.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/cellpose_masks.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/classify.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/convert.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/default.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/dna_matrix.mp4 +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/download.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/logo.pdf +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/logo_spacr.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/logo_spacr_1.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/make_masks.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/map_barcodes.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/mask.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/measure.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/ml_analyze.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/plaque.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/recruitment.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/regression.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/run.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/sequencing.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/settings.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/train_cellpose.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/umap.png +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/images/plate1_E01_T0001F001L01A01Z01C02.tif +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/images/plate1_E01_T0001F001L01A02Z01C01.tif +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/images/plate1_E01_T0001F001L01A03Z01C03.tif +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/sequencing.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/sim.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/timelapse.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr/version.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr.egg-info/SOURCES.txt +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr.egg-info/dependency_links.txt +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr.egg-info/entry_points.txt +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr.egg-info/requires.txt +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/spacr.egg-info/top_level.txt +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/tests/test_annotate_app.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/tests/test_core.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/tests/test_gui_classify_app.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/tests/test_gui_mask_app.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/tests/test_gui_measure_app.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/tests/test_gui_sim_app.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/tests/test_gui_utils.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/tests/test_io.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/tests/test_mask_app.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/tests/test_measure.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/tests/test_plot.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/tests/test_sim.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/tests/test_timelapse.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/tests/test_train.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/tests/test_umap.py +0 -0
- {spacr-0.3.42 → spacr-0.3.45}/tests/test_utils.py +0 -0
@@ -5,50 +5,23 @@ from cellpose import models as cp_models
|
|
5
5
|
from IPython.display import display
|
6
6
|
from multiprocessing import Pool
|
7
7
|
from skimage.transform import resize as resizescikit
|
8
|
+
from scipy.ndimage import binary_fill_holes
|
8
9
|
|
9
10
|
def identify_masks_finetune(settings):
|
10
11
|
|
11
12
|
from .plot import print_mask_and_flows
|
12
|
-
from .utils import resize_images_and_labels, print_progress
|
13
|
+
from .utils import resize_images_and_labels, print_progress, save_settings, fill_holes_in_mask
|
13
14
|
from .io import _load_normalized_images_and_labels, _load_images_and_labels
|
14
15
|
from .settings import get_identify_masks_finetune_default_settings
|
15
16
|
|
16
17
|
settings = get_identify_masks_finetune_default_settings(settings)
|
17
|
-
|
18
|
-
dst=settings['
|
19
|
-
model_name=settings['model_name']
|
20
|
-
custom_model=settings['custom_model']
|
21
|
-
channels = settings['channels']
|
22
|
-
background = settings['background']
|
23
|
-
remove_background=settings['remove_background']
|
24
|
-
Signal_to_noise = settings['Signal_to_noise']
|
25
|
-
CP_prob = settings['CP_prob']
|
26
|
-
diameter=settings['diameter']
|
27
|
-
batch_size=settings['batch_size']
|
28
|
-
flow_threshold=settings['flow_threshold']
|
29
|
-
save=settings['save']
|
30
|
-
verbose=settings['verbose']
|
31
|
-
|
32
|
-
# static settings
|
33
|
-
normalize = settings['normalize']
|
34
|
-
percentiles = settings['percentiles']
|
35
|
-
circular = settings['circular']
|
36
|
-
invert = settings['invert']
|
37
|
-
resize = settings['resize']
|
38
|
-
|
39
|
-
if resize:
|
40
|
-
target_height = settings['target_height']
|
41
|
-
target_width = settings['target_width']
|
42
|
-
|
43
|
-
rescale = settings['rescale']
|
44
|
-
resample = settings['resample']
|
45
|
-
grayscale = settings['grayscale']
|
46
|
-
|
18
|
+
save_settings(settings, name='generate_cellpose_masks', show=True)
|
19
|
+
dst = os.path.join(settings['src'], 'masks')
|
47
20
|
os.makedirs(dst, exist_ok=True)
|
48
21
|
|
49
|
-
if not custom_model is None:
|
50
|
-
if not os.path.exists(custom_model):
|
51
|
-
print(f
|
22
|
+
if not settings['custom_model'] is None:
|
23
|
+
if not os.path.exists(settings['custom_model']):
|
24
|
+
print(f"Custom model not found: {settings['custom_model']}")
|
52
25
|
return
|
53
26
|
|
54
27
|
if not torch.cuda.is_available():
|
@@ -56,43 +29,60 @@ def identify_masks_finetune(settings):
|
|
56
29
|
|
57
30
|
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
|
58
31
|
|
59
|
-
if custom_model == None:
|
60
|
-
model = cp_models.CellposeModel(gpu=True, model_type=model_name, device=device)
|
61
|
-
print(f
|
32
|
+
if settings['custom_model'] == None:
|
33
|
+
model = cp_models.CellposeModel(gpu=True, model_type=settings['model_name'], device=device)
|
34
|
+
print(f"Loaded model: {settings['model_name']}")
|
62
35
|
else:
|
63
|
-
model = cp_models.CellposeModel(gpu=torch.cuda.is_available(), model_type=None, pretrained_model=custom_model, diam_mean=diameter, device=device)
|
36
|
+
model = cp_models.CellposeModel(gpu=torch.cuda.is_available(), model_type=None, pretrained_model=settings['custom_model'], diam_mean=settings['diameter'], device=device)
|
64
37
|
print("Pretrained Model Loaded:", model.pretrained_model)
|
65
38
|
|
66
|
-
chans = [2, 1] if model_name == 'cyto2' else [0,0] if model_name == 'nucleus' else [1,0] if model_name == 'cyto' else [2, 0]
|
39
|
+
chans = [2, 1] if settings['model_name'] == 'cyto2' else [0,0] if settings['model_name'] == 'nucleus' else [1,0] if settings['model_name'] == 'cyto' else [2, 0]
|
67
40
|
|
68
|
-
if grayscale:
|
41
|
+
if settings['grayscale']:
|
69
42
|
chans=[0, 0]
|
70
43
|
|
71
|
-
print(f
|
44
|
+
print(f"Using channels: {chans} for model of type {settings['model_name']}")
|
72
45
|
|
73
|
-
if verbose == True:
|
74
|
-
print(f
|
46
|
+
if settings['verbose'] == True:
|
47
|
+
print(f"Cellpose settings: Model: {settings['model_name']}, channels: {settings['channels']}, cellpose_chans: {chans}, diameter:{settings['diameter']}, flow_threshold:{settings['flow_threshold']}, cellprob_threshold:{settings['CP_prob']}")
|
75
48
|
|
76
|
-
|
77
|
-
mask_files = set(os.listdir(os.path.join(src, 'masks')))
|
78
|
-
all_image_files = [f for f in
|
49
|
+
image_files = [os.path.join(settings['src'], f) for f in os.listdir(settings['src']) if f.endswith('.tif')]
|
50
|
+
mask_files = set(os.listdir(os.path.join(settings['src'], 'masks')))
|
51
|
+
all_image_files = [f for f in image_files if os.path.basename(f) not in mask_files]
|
79
52
|
random.shuffle(all_image_files)
|
53
|
+
|
54
|
+
print(f"Found {len(image_files)} Images with {len(mask_files)} masks. Generating masks for {len(all_image_files)} images")
|
55
|
+
|
56
|
+
if len(all_image_files) == 0:
|
57
|
+
print(f"Either no images were found in {settings['src']} or all images have masks in {settings['dst']}")
|
58
|
+
return
|
59
|
+
|
80
60
|
|
81
61
|
time_ls = []
|
82
|
-
for i in range(0, len(all_image_files), batch_size):
|
62
|
+
for i in range(0, len(all_image_files), settings['batch_size']):
|
83
63
|
gc.collect()
|
84
|
-
image_files = all_image_files[i:i+batch_size]
|
64
|
+
image_files = all_image_files[i:i+settings['batch_size']]
|
85
65
|
|
86
|
-
if normalize:
|
87
|
-
images, _, image_names, _, orig_dims = _load_normalized_images_and_labels(image_files=image_files,
|
66
|
+
if settings['normalize']:
|
67
|
+
images, _, image_names, _, orig_dims = _load_normalized_images_and_labels(image_files=image_files,
|
68
|
+
label_files=None,
|
69
|
+
channels=settings['channels'],
|
70
|
+
percentiles=settings['percentiles'],
|
71
|
+
invert=settings['invert'],
|
72
|
+
visualize=settings['verbose'],
|
73
|
+
remove_background=settings['remove_background'],
|
74
|
+
background=settings['background'],
|
75
|
+
Signal_to_noise=settings['Signal_to_noise'],
|
76
|
+
target_height=settings['target_height'],
|
77
|
+
target_width=settings['target_width'])
|
78
|
+
|
88
79
|
images = [np.squeeze(img) if img.shape[-1] == 1 else img for img in images]
|
89
|
-
#orig_dims = [(image.shape[0], image.shape[1]) for image in images]
|
90
80
|
else:
|
91
|
-
images, _, image_names, _ = _load_images_and_labels(image_files=image_files, label_files=None,
|
81
|
+
images, _, image_names, _ = _load_images_and_labels(image_files=image_files, label_files=None, invert=settings['invert'])
|
92
82
|
images = [np.squeeze(img) if img.shape[-1] == 1 else img for img in images]
|
93
83
|
orig_dims = [(image.shape[0], image.shape[1]) for image in images]
|
94
|
-
if resize:
|
95
|
-
images, _ = resize_images_and_labels(images, None, target_height, target_width, True)
|
84
|
+
if settings['resize']:
|
85
|
+
images, _ = resize_images_and_labels(images, None, settings['target_height'], settings['target_width'], True)
|
96
86
|
|
97
87
|
for file_index, stack in enumerate(images):
|
98
88
|
start = time.time()
|
@@ -100,11 +90,11 @@ def identify_masks_finetune(settings):
|
|
100
90
|
normalize=False,
|
101
91
|
channels=chans,
|
102
92
|
channel_axis=3,
|
103
|
-
diameter=diameter,
|
104
|
-
flow_threshold=flow_threshold,
|
105
|
-
cellprob_threshold=CP_prob,
|
106
|
-
rescale=rescale,
|
107
|
-
resample=resample,
|
93
|
+
diameter=settings['diameter'],
|
94
|
+
flow_threshold=settings['flow_threshold'],
|
95
|
+
cellprob_threshold=settings['CP_prob'],
|
96
|
+
rescale=settings['rescale'],
|
97
|
+
resample=settings['resample'],
|
108
98
|
progress=True)
|
109
99
|
|
110
100
|
if len(output) == 4:
|
@@ -113,8 +103,11 @@ def identify_masks_finetune(settings):
|
|
113
103
|
mask, flows, _ = output
|
114
104
|
else:
|
115
105
|
raise ValueError("Unexpected number of return values from model.eval()")
|
106
|
+
|
107
|
+
if settings['fill_in']:
|
108
|
+
mask = fill_holes_in_mask(mask).astype(mask.dtype)
|
116
109
|
|
117
|
-
if resize:
|
110
|
+
if settings['resize']:
|
118
111
|
dims = orig_dims[file_index]
|
119
112
|
mask = resizescikit(mask, dims, order=0, preserve_range=True, anti_aliasing=False).astype(mask.dtype)
|
120
113
|
|
@@ -123,15 +116,13 @@ def identify_masks_finetune(settings):
|
|
123
116
|
time_ls.append(duration)
|
124
117
|
files_processed = len(images)
|
125
118
|
files_to_process = file_index+1
|
126
|
-
print_progress(files_processed, files_to_process, n_jobs=1, time_ls=time_ls)
|
127
|
-
print_progress(files_processed, files_to_process, n_jobs=1, time_ls=time_ls, batch_size=None, operation_type="")
|
128
|
-
|
119
|
+
print_progress(files_processed, files_to_process, n_jobs=1, time_ls=time_ls, batch_size=None, operation_type="generate cellpose masks")
|
129
120
|
|
130
|
-
if verbose:
|
131
|
-
if resize:
|
121
|
+
if settings['verbose']:
|
122
|
+
if settings['resize']:
|
132
123
|
stack = resizescikit(stack, dims, preserve_range=True, anti_aliasing=False).astype(stack.dtype)
|
133
|
-
print_mask_and_flows(stack, mask, flows
|
134
|
-
if save:
|
124
|
+
print_mask_and_flows(stack, mask, flows)
|
125
|
+
if settings['save']:
|
135
126
|
os.makedirs(dst, exist_ok=True)
|
136
127
|
output_filename = os.path.join(dst, image_names[file_index])
|
137
128
|
cv2.imwrite(output_filename, mask)
|
@@ -139,7 +130,7 @@ def identify_masks_finetune(settings):
|
|
139
130
|
gc.collect()
|
140
131
|
return
|
141
132
|
|
142
|
-
def generate_masks_from_imgs(src, model, model_name, batch_size, diameter, cellprob_threshold, flow_threshold, grayscale, save, normalize, channels, percentiles,
|
133
|
+
def generate_masks_from_imgs(src, model, model_name, batch_size, diameter, cellprob_threshold, flow_threshold, grayscale, save, normalize, channels, percentiles, invert, plot, resize, target_height, target_width, remove_background, background, Signal_to_noise, verbose):
|
143
134
|
|
144
135
|
from .io import _load_images_and_labels, _load_normalized_images_and_labels
|
145
136
|
from .utils import resize_images_and_labels, resizescikit, print_progress
|
@@ -164,11 +155,11 @@ def generate_masks_from_imgs(src, model, model_name, batch_size, diameter, cellp
|
|
164
155
|
image_files = all_image_files[i:i+batch_size]
|
165
156
|
|
166
157
|
if normalize:
|
167
|
-
images, _, image_names, _, orig_dims = _load_normalized_images_and_labels(image_files, None, channels, percentiles,
|
158
|
+
images, _, image_names, _, orig_dims = _load_normalized_images_and_labels(image_files, None, channels, percentiles, invert, plot, remove_background, background, Signal_to_noise, target_height, target_width)
|
168
159
|
images = [np.squeeze(img) if img.shape[-1] == 1 else img for img in images]
|
169
160
|
orig_dims = [(image.shape[0], image.shape[1]) for image in images]
|
170
161
|
else:
|
171
|
-
images, _, image_names, _ = _load_images_and_labels(image_files, None,
|
162
|
+
images, _, image_names, _ = _load_images_and_labels(image_files, None, invert)
|
172
163
|
images = [np.squeeze(img) if img.shape[-1] == 1 else img for img in images]
|
173
164
|
orig_dims = [(image.shape[0], image.shape[1]) for image in images]
|
174
165
|
if resize:
|
@@ -209,12 +200,11 @@ def generate_masks_from_imgs(src, model, model_name, batch_size, diameter, cellp
|
|
209
200
|
if plot:
|
210
201
|
if resize:
|
211
202
|
stack = resizescikit(stack, dims, preserve_range=True, anti_aliasing=False).astype(stack.dtype)
|
212
|
-
print_mask_and_flows(stack, mask, flows
|
203
|
+
print_mask_and_flows(stack, mask, flows)
|
213
204
|
if save:
|
214
205
|
output_filename = os.path.join(dst, image_names[file_index])
|
215
206
|
cv2.imwrite(output_filename, mask)
|
216
207
|
|
217
|
-
|
218
208
|
def check_cellpose_models(settings):
|
219
209
|
|
220
210
|
from .settings import get_check_cellpose_models_default_settings
|
@@ -233,7 +223,7 @@ def check_cellpose_models(settings):
|
|
233
223
|
|
234
224
|
model = cp_models.CellposeModel(gpu=True, model_type=model_name, device=device)
|
235
225
|
print(f'Using {model_name}')
|
236
|
-
generate_masks_from_imgs(src, model, model_name, settings['batch_size'], settings['diameter'], settings['CP_prob'], settings['flow_threshold'], settings['grayscale'], settings['save'], settings['normalize'], settings['channels'], settings['percentiles'], settings['
|
226
|
+
generate_masks_from_imgs(src, model, model_name, settings['batch_size'], settings['diameter'], settings['CP_prob'], settings['flow_threshold'], settings['grayscale'], settings['save'], settings['normalize'], settings['channels'], settings['percentiles'], settings['invert'], settings['plot'], settings['resize'], settings['target_height'], settings['target_width'], settings['remove_background'], settings['background'], settings['Signal_to_noise'], settings['verbose'])
|
237
227
|
|
238
228
|
return
|
239
229
|
|
@@ -384,8 +384,8 @@ def import_settings(settings_type='mask'):
|
|
384
384
|
from .gui_utils import convert_settings_dict_for_gui, hide_all_settings
|
385
385
|
from .settings import generate_fields, set_default_settings_preprocess_generate_masks, get_measure_crop_settings, set_default_train_test_model
|
386
386
|
from .settings import set_default_generate_barecode_mapping, set_default_umap_image_settings, get_analyze_recruitment_default_settings
|
387
|
-
from .settings import get_default_generate_activation_map_settings
|
388
|
-
|
387
|
+
from .settings import get_default_generate_activation_map_settings, get_analyze_plaque_settings
|
388
|
+
|
389
389
|
def read_settings_from_csv(csv_file_path):
|
390
390
|
settings = {}
|
391
391
|
with open(csv_file_path, newline='') as csvfile:
|
@@ -428,7 +428,7 @@ def import_settings(settings_type='mask'):
|
|
428
428
|
elif settings_type == 'activation':
|
429
429
|
settings = get_default_generate_activation_map_settings(settings={})
|
430
430
|
elif settings_type == 'analyze_plaques':
|
431
|
-
settings = {}
|
431
|
+
settings = get_analyze_plaque_settings(settings={})
|
432
432
|
elif settings_type == 'convert':
|
433
433
|
settings = {}
|
434
434
|
else:
|
@@ -443,7 +443,7 @@ def setup_settings_panel(vertical_container, settings_type='mask'):
|
|
443
443
|
global vars_dict, scrollable_frame
|
444
444
|
from .settings import get_identify_masks_finetune_default_settings, set_default_analyze_screen, set_default_settings_preprocess_generate_masks
|
445
445
|
from .settings import get_measure_crop_settings, deep_spacr_defaults, set_default_generate_barecode_mapping, set_default_umap_image_settings
|
446
|
-
from .settings import get_map_barcodes_default_settings, get_analyze_recruitment_default_settings, get_check_cellpose_models_default_settings
|
446
|
+
from .settings import get_map_barcodes_default_settings, get_analyze_recruitment_default_settings, get_check_cellpose_models_default_settings, get_analyze_plaque_settings
|
447
447
|
from .settings import generate_fields, get_perform_regression_default_settings, get_train_cellpose_default_settings, get_default_generate_activation_map_settings
|
448
448
|
from .gui_utils import convert_settings_dict_for_gui
|
449
449
|
from .gui_elements import set_element_size
|
@@ -490,7 +490,7 @@ def setup_settings_panel(vertical_container, settings_type='mask'):
|
|
490
490
|
elif settings_type == 'activation':
|
491
491
|
settings = get_default_generate_activation_map_settings(settings={})
|
492
492
|
elif settings_type == 'analyze_plaques':
|
493
|
-
settings = {
|
493
|
+
settings = get_analyze_plaque_settings(settings={})
|
494
494
|
elif settings_type == 'convert':
|
495
495
|
settings = {'src':'path to images'}
|
496
496
|
else:
|
@@ -380,7 +380,7 @@ def convert_settings_dict_for_gui(settings):
|
|
380
380
|
variables = {}
|
381
381
|
special_cases = {
|
382
382
|
'metadata_type': ('combo', ['cellvoyager', 'cq1', 'nikon', 'zeis', 'custom'], 'cellvoyager'),
|
383
|
-
'channels': ('combo', ['[0,1,2,3]', '[0,1,2]', '[0,1]', '[0]'], '[0,1,2,3]'),
|
383
|
+
'channels': ('combo', ['[0,1,2,3]', '[0,1,2]', '[0,1]', '[0]', '[0,0]'], '[0,1,2,3]'),
|
384
384
|
'train_channels': ('combo', ["['r','g','b']", "['r','g']", "['r','b']", "['g','b']", "['r']", "['g']", "['b']"], "['r','g','b']"),
|
385
385
|
'channel_dims': ('combo', ['[0,1,2,3]', '[0,1,2]', '[0,1]', '[0]'], '[0,1,2,3]'),
|
386
386
|
'dataset_mode': ('combo', ['annotation', 'metadata', 'recruitment'], 'metadata'),
|
@@ -129,7 +129,7 @@ def process_non_tif_non_2D_images(folder):
|
|
129
129
|
except Exception as e:
|
130
130
|
print(f"Error processing {filename}: {str(e)}")
|
131
131
|
|
132
|
-
def _load_images_and_labels(image_files, label_files,
|
132
|
+
def _load_images_and_labels(image_files, label_files, invert=False):
|
133
133
|
|
134
134
|
from .utils import invert_image, apply_mask
|
135
135
|
|
@@ -151,8 +151,6 @@ def _load_images_and_labels(image_files, label_files, circular=False, invert=Fal
|
|
151
151
|
image = cellpose.io.imread(img_file)
|
152
152
|
if invert:
|
153
153
|
image = invert_image(image)
|
154
|
-
if circular:
|
155
|
-
image = apply_mask(image, output_value=0)
|
156
154
|
label = cellpose.io.imread(lbl_file)
|
157
155
|
if image.max() > 1:
|
158
156
|
image = image / image.max()
|
@@ -163,16 +161,12 @@ def _load_images_and_labels(image_files, label_files, circular=False, invert=Fal
|
|
163
161
|
image = cellpose.io.imread(img_file)
|
164
162
|
if invert:
|
165
163
|
image = invert_image(image)
|
166
|
-
if circular:
|
167
|
-
image = apply_mask(image, output_value=0)
|
168
164
|
if image.max() > 1:
|
169
165
|
image = image / image.max()
|
170
166
|
images.append(image)
|
171
167
|
elif not image_files is None:
|
172
168
|
for lbl_file in label_files:
|
173
169
|
label = cellpose.io.imread(lbl_file)
|
174
|
-
if circular:
|
175
|
-
label = apply_mask(label, output_value=0)
|
176
170
|
labels.append(label)
|
177
171
|
|
178
172
|
if not image_files is None:
|
@@ -191,107 +185,127 @@ def _load_images_and_labels(image_files, label_files, circular=False, invert=Fal
|
|
191
185
|
print(f'image shape: {images[0].shape}, image type: images[0].shape mask shape: {labels[0].shape}, image type: labels[0].shape')
|
192
186
|
return images, labels, image_names, label_names
|
193
187
|
|
194
|
-
def
|
188
|
+
def _load_normalized_images_and_labels(image_files, label_files, channels=None, percentiles=None,
|
189
|
+
invert=False, visualize=False, remove_background=False,
|
190
|
+
background=0, Signal_to_noise=10, target_height=None, target_width=None):
|
195
191
|
|
196
|
-
from .plot import normalize_and_visualize
|
192
|
+
from .plot import normalize_and_visualize, plot_resize
|
197
193
|
from .utils import invert_image, apply_mask
|
194
|
+
from skimage.transform import resize as resizescikit
|
195
|
+
|
196
|
+
# Ensure percentiles are valid
|
197
|
+
if isinstance(percentiles, list) and len(percentiles) == 2:
|
198
|
+
try:
|
199
|
+
percentiles = [int(percentiles[0]), int(percentiles[1])]
|
200
|
+
except ValueError:
|
201
|
+
percentiles = None
|
202
|
+
else:
|
203
|
+
percentiles = None
|
198
204
|
|
199
|
-
signal_thresholds = background*Signal_to_noise
|
205
|
+
signal_thresholds = float(background) * float(Signal_to_noise)
|
200
206
|
lower_percentile = 2
|
201
207
|
|
202
|
-
images = []
|
203
|
-
labels = []
|
204
|
-
|
208
|
+
images, labels, orig_dims = [], [], []
|
205
209
|
num_channels = 4
|
206
210
|
percentiles_1 = [[] for _ in range(num_channels)]
|
207
211
|
percentiles_99 = [[] for _ in range(num_channels)]
|
208
212
|
|
209
213
|
image_names = [os.path.basename(f) for f in image_files]
|
210
|
-
|
214
|
+
image_dir = os.path.dirname(image_files[0])
|
215
|
+
|
211
216
|
if label_files is not None:
|
212
217
|
label_names = [os.path.basename(f) for f in label_files]
|
213
218
|
label_dir = os.path.dirname(label_files[0])
|
219
|
+
else:
|
220
|
+
label_names, label_dir = [], None
|
214
221
|
|
215
|
-
# Load
|
216
|
-
for i,img_file in enumerate(image_files):
|
222
|
+
# Load, normalize, and resize images
|
223
|
+
for i, img_file in enumerate(image_files):
|
217
224
|
image = cellpose.io.imread(img_file)
|
225
|
+
orig_dims.append((image.shape[0], image.shape[1]))
|
226
|
+
|
218
227
|
if invert:
|
219
228
|
image = invert_image(image)
|
220
|
-
if circular:
|
221
|
-
image = apply_mask(image, output_value=0)
|
222
229
|
|
223
|
-
#
|
230
|
+
# Select specific channels if needed
|
224
231
|
if channels is not None and image.ndim == 3:
|
225
232
|
image = image[..., channels]
|
226
233
|
|
227
234
|
if remove_background:
|
228
|
-
image
|
229
|
-
|
235
|
+
image = np.where(image < background, 0, image)
|
236
|
+
|
230
237
|
if image.ndim < 3:
|
231
238
|
image = np.expand_dims(image, axis=-1)
|
232
|
-
|
233
|
-
|
239
|
+
|
240
|
+
# Calculate percentiles if not provided
|
234
241
|
if percentiles is None:
|
235
242
|
for c in range(image.shape[-1]):
|
236
243
|
p1 = np.percentile(image[..., c], lower_percentile)
|
237
244
|
percentiles_1[c].append(p1)
|
245
|
+
|
246
|
+
# Ensure `signal_thresholds` and `p` are floats for comparison
|
238
247
|
for percentile in [98, 99, 99.9, 99.99, 99.999]:
|
239
248
|
p = np.percentile(image[..., c], percentile)
|
240
|
-
if p > signal_thresholds:
|
249
|
+
if float(p) > signal_thresholds:
|
241
250
|
percentiles_99[c].append(p)
|
242
251
|
break
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
normalized_images.append(normalized_image)
|
253
|
-
if visualize:
|
254
|
-
normalize_and_visualize(image, normalized_image, title=f"Channel {c+1} Normalized")
|
255
|
-
|
252
|
+
|
253
|
+
# Resize image if required
|
254
|
+
if target_height and target_width:
|
255
|
+
image_shape = (target_height, target_width) if image.ndim == 2 else (target_height, target_width, image.shape[-1])
|
256
|
+
image = resizescikit(image, image_shape, preserve_range=True, anti_aliasing=True).astype(image.dtype)
|
257
|
+
|
258
|
+
images.append(image)
|
259
|
+
|
260
|
+
# Calculate average percentiles if needed
|
256
261
|
if percentiles is None:
|
257
|
-
# Calculate average percentiles for normalization
|
258
262
|
avg_p1 = [np.mean(p) for p in percentiles_1]
|
259
|
-
avg_p99 = [np.mean(p) if
|
263
|
+
avg_p99 = [np.mean(p) if p else avg_p1[i] for i, p in enumerate(percentiles_99)]
|
260
264
|
|
261
265
|
print(f'Average 1st percentiles: {avg_p1}, Average 99th percentiles: {avg_p99}')
|
262
266
|
|
263
|
-
normalized_images = [
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
normalized_image[..., c] = rescale_intensity(image[..., c], in_range=(avg_p1[c], avg_p99[c]), out_range=(0, 1))
|
268
|
-
normalized_images.append(normalized_image)
|
269
|
-
if visualize:
|
270
|
-
normalize_and_visualize(image, normalized_image, title=f"Channel {c+1} Normalized")
|
271
|
-
|
272
|
-
if not image_files is None:
|
273
|
-
image_dir = os.path.dirname(image_files[0])
|
267
|
+
normalized_images = [
|
268
|
+
np.stack([rescale_intensity(img[..., c], in_range=(avg_p1[c], avg_p99[c]), out_range=(0, 1))
|
269
|
+
for c in range(img.shape[-1])], axis=-1) for img in images
|
270
|
+
]
|
274
271
|
|
275
272
|
else:
|
276
|
-
|
277
|
-
|
273
|
+
normalized_images = [
|
274
|
+
np.stack([rescale_intensity(img[..., c],
|
275
|
+
in_range=(np.percentile(img[..., c], percentiles[0]),
|
276
|
+
np.percentile(img[..., c], percentiles[1])),
|
277
|
+
out_range=(0, 1)) for c in range(img.shape[-1])], axis=-1)
|
278
|
+
for img in images
|
279
|
+
]
|
280
|
+
|
281
|
+
# Load and resize labels if provided
|
278
282
|
if label_files is not None:
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
label_dir = None
|
283
|
+
labels = [resizescikit(cellpose.io.imread(lbl_file),
|
284
|
+
(target_height, target_width) if target_height and target_width else orig_dims[i],
|
285
|
+
order=0, preserve_range=True, anti_aliasing=False).astype(np.uint8)
|
286
|
+
for i, lbl_file in enumerate(label_files)]
|
284
287
|
|
285
288
|
print(f'Loaded and normalized {len(normalized_images)} images and {len(labels)} labels from {image_dir} and {label_dir}')
|
286
|
-
|
287
|
-
return normalized_images, labels, image_names, label_names
|
288
289
|
|
289
|
-
|
290
|
+
if visualize and images and labels:
|
291
|
+
plot_resize(images, normalized_images, labels, labels)
|
292
|
+
|
293
|
+
return normalized_images, labels, image_names, label_names, orig_dims
|
294
|
+
|
295
|
+
def _load_normalized_images_and_labels_v1(image_files, label_files, channels=None, percentiles=None, invert=False, visualize=False, remove_background=False, background=0, Signal_to_noise=10, target_height=None, target_width=None):
|
290
296
|
|
291
297
|
from .plot import normalize_and_visualize, plot_resize
|
292
298
|
from .utils import invert_image, apply_mask
|
293
299
|
from skimage.transform import resize as resizescikit
|
294
300
|
|
301
|
+
if isinstance(percentiles, list):
|
302
|
+
if len(percentiles) !=2:
|
303
|
+
percentiles = None
|
304
|
+
if not percentiles[0] is int:
|
305
|
+
percentiles = None
|
306
|
+
if not percentiles[1] is int:
|
307
|
+
percentiles = None
|
308
|
+
|
295
309
|
signal_thresholds = background * Signal_to_noise
|
296
310
|
lower_percentile = 2
|
297
311
|
|
@@ -316,8 +330,6 @@ def _load_normalized_images_and_labels(image_files, label_files, channels=None,
|
|
316
330
|
orig_dims.append((image.shape[0], image.shape[1]))
|
317
331
|
if invert:
|
318
332
|
image = invert_image(image)
|
319
|
-
if circular:
|
320
|
-
image = apply_mask(image, output_value=0)
|
321
333
|
|
322
334
|
# If specific channels are specified, select them
|
323
335
|
if channels is not None and image.ndim == 3:
|
@@ -2123,7 +2135,8 @@ def _load_and_concatenate_arrays(src, channels, cell_chann_dim, nucleus_chann_di
|
|
2123
2135
|
# For each of the other folders, load the array and add it to 'stack_ls'
|
2124
2136
|
for folder in folder_paths[1:]:
|
2125
2137
|
array_path = os.path.join(folder, filename)
|
2126
|
-
array = np.load(array_path)
|
2138
|
+
#array = np.load(array_path)
|
2139
|
+
array = np.load(array_path, allow_pickle=True)
|
2127
2140
|
if array.ndim == 2:
|
2128
2141
|
array = np.expand_dims(array, axis=-1) # Add an extra dimension if the array is 2D
|
2129
2142
|
stack_ls.append(array)
|
@@ -450,13 +450,14 @@ def perform_regression(settings):
|
|
450
450
|
else:
|
451
451
|
return df
|
452
452
|
|
453
|
-
|
454
|
-
|
455
453
|
settings = get_perform_regression_default_settings(settings)
|
456
454
|
count_data_df, score_data_df = _perform_regression_read_data(settings)
|
457
455
|
results_path, results_path_gene, results_path_grna, hits_path, res_folder, csv_path = _perform_regression_set_paths(settings)
|
458
456
|
save_settings(settings, name='regression', show=True)
|
459
457
|
|
458
|
+
count_source = os.path.dirname(settings['count_data'][0])
|
459
|
+
volcano_path = os.path.join(count_source, 'volcano_plot.pdf')
|
460
|
+
|
460
461
|
if isinstance(settings['filter_value'], list):
|
461
462
|
filter_value = settings['filter_value']
|
462
463
|
else:
|
@@ -548,7 +549,7 @@ def perform_regression(settings):
|
|
548
549
|
base_dir = os.path.dirname(os.path.abspath(__file__))
|
549
550
|
metadata_path = os.path.join(base_dir, 'resources', 'data', 'lopit.csv')
|
550
551
|
|
551
|
-
custom_volcano_plot(data_path, metadata_path, metadata_column='tagm_location', point_size=200, figsize=20, threshold=reg_threshold, split_axis_lims=settings['split_axis_lims'])
|
552
|
+
custom_volcano_plot(data_path, metadata_path, metadata_column='tagm_location', point_size=200, figsize=20, threshold=reg_threshold, split_axis_lims=settings['split_axis_lims'], save_path=volcano_path)
|
552
553
|
#custom_volcano_plot(data_path_gene, metadata_path, metadata_column='tagm_location', point_size=50, figsize=20, threshold=reg_threshold)
|
553
554
|
#custom_volcano_plot(data_path_grna, metadata_path, metadata_column='tagm_location', point_size=50, figsize=20, threshold=reg_threshold)
|
554
555
|
|