coralnet-toolbox 0.0.66__tar.gz → 0.0.67__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.
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/PKG-INFO +2 -1
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Annotations/QtMultiPolygonAnnotation.py +1 -1
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Annotations/QtPatchAnnotation.py +1 -1
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Annotations/QtPolygonAnnotation.py +1 -1
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Annotations/QtRectangleAnnotation.py +1 -1
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/AutoDistill/QtDeployModel.py +4 -0
- coralnet_toolbox-0.0.67/coralnet_toolbox/Explorer/QtAnnotationDataItem.py +97 -0
- coralnet_toolbox-0.0.67/coralnet_toolbox/Explorer/QtAnnotationImageWidget.py +183 -0
- coralnet_toolbox-0.0.67/coralnet_toolbox/Explorer/QtEmbeddingPointItem.py +30 -0
- coralnet_toolbox-0.0.67/coralnet_toolbox/Explorer/QtExplorer.py +2067 -0
- coralnet_toolbox-0.0.67/coralnet_toolbox/Explorer/QtSettingsWidgets.py +490 -0
- coralnet_toolbox-0.0.67/coralnet_toolbox/Explorer/__init__.py +7 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtImportViscoreAnnotations.py +2 -4
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtOpenProject.py +2 -1
- coralnet_toolbox-0.0.67/coralnet_toolbox/Icons/magic.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/DeployModel/QtDetect.py +4 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/DeployModel/QtSegment.py +4 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/TrainModel/QtClassify.py +1 -1
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/QtConfidenceWindow.py +2 -23
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/QtEventFilter.py +2 -2
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/QtLabelWindow.py +23 -8
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/QtMainWindow.py +81 -2
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/QtProgressBar.py +12 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/SAM/QtDeployGenerator.py +4 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/__init__.py +1 -1
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/utilities.py +24 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox.egg-info/PKG-INFO +2 -1
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox.egg-info/SOURCES.txt +7 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox.egg-info/requires.txt +1 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/pyproject.toml +2 -2
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/requirements.txt +1 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.editorconfig +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.gitallowed +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.github/ISSUE_TEMPLATE/general_question.md +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.github/workflows/docs-build.yml +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.github/workflows/docs.yml +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.github/workflows/installation.yml +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.github/workflows/macos.yml +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.github/workflows/pypi.yml +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.github/workflows/ubuntu.yml +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.github/workflows/windows.yml +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.gitignore +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/LICENSE.txt +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/MANIFEST.in +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/README.md +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Annotations/QtAnnotation.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Annotations/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/AutoDistill/Models/GroundingDINO.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/AutoDistill/Models/OWLViT.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/AutoDistill/Models/OmDetTurbo.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/AutoDistill/Models/QtBase.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/AutoDistill/Models/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/AutoDistill/QtBatchInference.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/AutoDistill/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/BreakTime/QtBreakout.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/BreakTime/QtSnake.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/BreakTime/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Common/QtGraphicsUtility.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Common/QtMarginInput.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Common/QtOverlapInput.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Common/QtTileSizeInput.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Common/QtUpdateImagePaths.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/CoralNet/QtAuthenticate.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/CoralNet/QtDownload.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/CoralNet/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtExportAnnotations.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtExportCoralNetAnnotations.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtExportGeoJSONAnnotations.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtExportLabels.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtExportMaskAnnotations.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtExportTagLabAnnotations.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtExportTagLabLabels.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtExportViscoreAnnotations.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtImportAnnotations.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtImportCoralNetAnnotations.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtImportCoralNetLabels.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtImportFrames.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtImportImages.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtImportLabels.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtImportTagLabAnnotations.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtImportTagLabLabels.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtSaveProject.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/1.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/2.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/3.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/4.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/5.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/add.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/all.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/apple.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/breakout.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/coral.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/edit.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/eye.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/hide.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/home.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/lock.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/machine.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/opaque.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/parameters.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/patch.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/polygon.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/rabbit.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/rectangle.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/remove.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/rocket.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/select.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/settings.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/snake.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/tile.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/transparent.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/turtle.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/unlock.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/user.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/wizard.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/workarea.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/www.png +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/BatchInference/QtBase.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/BatchInference/QtClassify.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/BatchInference/QtDetect.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/BatchInference/QtSegment.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/BatchInference/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/classify/convnext_tiny.yaml +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/classify/efficientnet_b0.yaml +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/classify/mobilenet_v3_large.yaml +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/classify/swin_t.yaml +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/detect/convnext_tiny.yaml +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/detect/mobilenet_v3_large-fpn.yaml +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/detect/mobilenet_v3_small-fpn.yaml +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/detect/resnet101.yaml +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/detect/swin_t-fpn.yaml +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/detect/swin_t.yaml +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/detect/yolo11-p2.yaml +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/detect/yolo11-p6.yaml +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/segment/convnext_tiny.yaml +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/segment/swin_t-fpn.yaml +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/segment/swin_t.yaml +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/segment/yolo11-p2.yaml +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/segment/yolo11-p6.yaml +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/ConfusionMatrix.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/DeployModel/QtBase.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/DeployModel/QtClassify.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/DeployModel/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/EvaluateModel/QtBase.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/EvaluateModel/QtClassify.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/EvaluateModel/QtDetect.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/EvaluateModel/QtSegment.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/EvaluateModel/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/ExportDataset/QtBase.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/ExportDataset/QtClassify.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/ExportDataset/QtDetect.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/ExportDataset/QtSegment.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/ExportDataset/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/ImportDataset/QtBase.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/ImportDataset/QtDetect.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/ImportDataset/QtSegment.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/ImportDataset/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/MergeDatasets/QtBase.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/MergeDatasets/QtClassify.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/MergeDatasets/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/OptimizeModel/QtBase.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/OptimizeModel/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/TrainModel/QtBase.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/TrainModel/QtDetect.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/TrainModel/QtSegment.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/TrainModel/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/TuneModel/QtBase.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/TuneModel/QtClassify.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/TuneModel/QtDetect.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/TuneModel/QtSegment.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/TuneModel/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/TuneModel/tuner.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/QtBase.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/QtClassify.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/QtDetect.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/QtInference.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/QtSegment.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/QtVideoWidget.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/YOLO3D/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/YOLO3D/bbox3d_utils.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/YOLO3D/depth_model.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/YOLO3D/detection_model.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/YOLO3D/load_camera_params.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/YOLO3D/run.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/analytics.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/WeightedDataset.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/QtAnnotationWindow.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/QtImageWindow.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/QtPatchSampling.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/QtWorkArea.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Rasters/ImageFilter.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Rasters/QtRaster.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Rasters/RasterManager.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Rasters/RasterTableModel.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Rasters/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Results/CombineResults.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Results/ConvertResults.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Results/MapResults.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Results/Masks.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Results/ResultsProcessor.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Results/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/SAM/QtBatchInference.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/SAM/QtDeployPredictor.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/SAM/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/SeeAnything/QtBatchInference.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/SeeAnything/QtDeployPredictor.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/SeeAnything/QtTrainModel.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/SeeAnything/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tile/QtTileBatchInference.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tile/QtTileCreation.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tile/TileDataset/QtBase.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tile/TileDataset/QtClassify.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tile/TileDataset/QtDetect.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tile/TileDataset/QtSegment.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tile/TileDataset/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tile/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtCutSubTool.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtMoveSubTool.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtPanTool.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtPatchTool.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtPolygonTool.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtRectangleTool.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtResizeSubTool.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtSAMTool.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtSeeAnythingTool.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtSelectSubTool.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtSelectTool.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtSubTool.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtTool.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtWorkAreaTool.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtZoomTool.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/__init__.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/main.py +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox.egg-info/dependency_links.txt +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox.egg-info/entry_points.txt +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox.egg-info/top_level.txt +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/mkdocs.yml +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/requirements_dev.txt +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/setup.cfg +0 -0
- {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/uv.lock +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: coralnet-toolbox
|
3
|
-
Version: 0.0.
|
3
|
+
Version: 0.0.67
|
4
4
|
Summary: Tools for annotating and developing ML models for benthic imagery
|
5
5
|
Author-email: Jordan Pierce <jordan.pierce@noaa.gov>
|
6
6
|
License: MIT License
|
@@ -21,6 +21,7 @@ Requires-Dist: lap>=0.5.12
|
|
21
21
|
Requires-Dist: open-clip-torch>=2.20.0
|
22
22
|
Requires-Dist: supervision>=0.24.0
|
23
23
|
Requires-Dist: scikit-learn
|
24
|
+
Requires-Dist: umap-learn
|
24
25
|
Requires-Dist: pycocotools
|
25
26
|
Requires-Dist: ujson
|
26
27
|
Requires-Dist: timm==0.9.2
|
@@ -152,7 +152,7 @@ class MultiPolygonAnnotation(Annotation):
|
|
152
152
|
result_painter.drawPixmap(0, 0, self.cropped_image)
|
153
153
|
|
154
154
|
# Draw dashed outline for each polygon
|
155
|
-
pen = QPen(
|
155
|
+
pen = QPen(Qt.black)
|
156
156
|
pen.setStyle(Qt.SolidLine) # Solid line
|
157
157
|
pen.setWidth(1) # Line width
|
158
158
|
result_painter.setPen(pen)
|
@@ -157,7 +157,7 @@ class PatchAnnotation(Annotation):
|
|
157
157
|
result_painter.drawPixmap(0, 0, self.cropped_image)
|
158
158
|
|
159
159
|
# Draw the dotted line outline on top
|
160
|
-
pen = QPen(
|
160
|
+
pen = QPen(Qt.black)
|
161
161
|
pen.setStyle(Qt.SolidLine) # Solid line
|
162
162
|
pen.setWidth(1) # Line width
|
163
163
|
result_painter.setPen(pen)
|
@@ -178,7 +178,7 @@ class PolygonAnnotation(Annotation):
|
|
178
178
|
result_painter.drawPixmap(0, 0, self.cropped_image)
|
179
179
|
|
180
180
|
# Draw the dotted line outline on top
|
181
|
-
pen = QPen(
|
181
|
+
pen = QPen(Qt.black)
|
182
182
|
pen.setStyle(Qt.SolidLine) # Solid line
|
183
183
|
pen.setWidth(1) # Line width
|
184
184
|
result_painter.setPen(pen)
|
@@ -153,7 +153,7 @@ class RectangleAnnotation(Annotation):
|
|
153
153
|
result_painter.drawPixmap(0, 0, self.cropped_image)
|
154
154
|
|
155
155
|
# Draw the dotted line outline on top
|
156
|
-
pen = QPen(
|
156
|
+
pen = QPen(Qt.black)
|
157
157
|
pen.setStyle(Qt.SolidLine) # Solid line
|
158
158
|
pen.setWidth(1) # Line width
|
159
159
|
result_painter.setPen(pen)
|
{coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/AutoDistill/QtDeployModel.py
RENAMED
@@ -555,6 +555,10 @@ class DeployModelDialog(QDialog):
|
|
555
555
|
self.update_sam_task_state()
|
556
556
|
if self.task != 'segment':
|
557
557
|
return results_list
|
558
|
+
|
559
|
+
if not self.sam_dialog or self.use_sam_dropdown.currentText() == "False":
|
560
|
+
# If SAM is not deployed or not selected, return the results as is
|
561
|
+
return results_list
|
558
562
|
|
559
563
|
if self.sam_dialog.loaded_model is None:
|
560
564
|
# If SAM is not loaded, ensure we do not use it accidentally
|
@@ -0,0 +1,97 @@
|
|
1
|
+
import warnings
|
2
|
+
|
3
|
+
import os
|
4
|
+
|
5
|
+
warnings.filterwarnings("ignore", category=DeprecationWarning)
|
6
|
+
|
7
|
+
|
8
|
+
# ----------------------------------------------------------------------------------------------------------------------
|
9
|
+
# Classes
|
10
|
+
# ----------------------------------------------------------------------------------------------------------------------
|
11
|
+
|
12
|
+
|
13
|
+
class AnnotationDataItem:
|
14
|
+
"""Holds annotation information for consistent display across viewers."""
|
15
|
+
|
16
|
+
def __init__(self, annotation, embedding_x=None, embedding_y=None, embedding_id=None):
|
17
|
+
self.annotation = annotation
|
18
|
+
self.embedding_x = embedding_x if embedding_x is not None else 0.0
|
19
|
+
self.embedding_y = embedding_y if embedding_y is not None else 0.0
|
20
|
+
self.embedding_id = embedding_id if embedding_id is not None else 0
|
21
|
+
self._is_selected = False
|
22
|
+
self._preview_label = None
|
23
|
+
self._original_label = annotation.label
|
24
|
+
self._marked_for_deletion = False # Track deletion status
|
25
|
+
|
26
|
+
@property
|
27
|
+
def effective_label(self):
|
28
|
+
"""Get the current effective label (preview if exists, otherwise original)."""
|
29
|
+
return self._preview_label if self._preview_label else self.annotation.label
|
30
|
+
|
31
|
+
@property
|
32
|
+
def effective_color(self):
|
33
|
+
"""Get the effective color for this annotation."""
|
34
|
+
return self.effective_label.color
|
35
|
+
|
36
|
+
@property
|
37
|
+
def is_selected(self):
|
38
|
+
"""Check if this annotation is selected."""
|
39
|
+
return self._is_selected
|
40
|
+
|
41
|
+
def set_selected(self, selected):
|
42
|
+
"""Set the selection state."""
|
43
|
+
self._is_selected = selected
|
44
|
+
|
45
|
+
def set_preview_label(self, label):
|
46
|
+
"""Set a preview label for this annotation."""
|
47
|
+
self._preview_label = label
|
48
|
+
|
49
|
+
def clear_preview_label(self):
|
50
|
+
"""Clear the preview label and revert to original."""
|
51
|
+
self._preview_label = None
|
52
|
+
|
53
|
+
def has_preview_changes(self):
|
54
|
+
"""Check if this annotation has preview changes."""
|
55
|
+
return self._preview_label is not None
|
56
|
+
|
57
|
+
def mark_for_deletion(self):
|
58
|
+
"""Mark this annotation for deletion."""
|
59
|
+
self._marked_for_deletion = True
|
60
|
+
|
61
|
+
def unmark_for_deletion(self):
|
62
|
+
"""Unmark this annotation for deletion."""
|
63
|
+
self._marked_for_deletion = False
|
64
|
+
|
65
|
+
def is_marked_for_deletion(self):
|
66
|
+
"""Check if this annotation is marked for deletion."""
|
67
|
+
return self._marked_for_deletion
|
68
|
+
|
69
|
+
def apply_preview_permanently(self):
|
70
|
+
"""Apply the preview label permanently to the annotation."""
|
71
|
+
if self._preview_label:
|
72
|
+
self.annotation.update_label(self._preview_label)
|
73
|
+
self.annotation.update_user_confidence(self._preview_label)
|
74
|
+
self._original_label = self._preview_label
|
75
|
+
self._preview_label = None
|
76
|
+
return True
|
77
|
+
return False
|
78
|
+
|
79
|
+
def get_display_info(self):
|
80
|
+
"""Get display information for this annotation."""
|
81
|
+
return {
|
82
|
+
'id': self.annotation.id,
|
83
|
+
'label': self.effective_label.short_label_code,
|
84
|
+
'confidence': self.get_effective_confidence(),
|
85
|
+
'type': type(self.annotation).__name__,
|
86
|
+
'image': os.path.basename(self.annotation.image_path),
|
87
|
+
'embedding_id': self.embedding_id,
|
88
|
+
'color': self.effective_color
|
89
|
+
}
|
90
|
+
|
91
|
+
def get_effective_confidence(self):
|
92
|
+
"""Get the effective confidence value."""
|
93
|
+
if self.annotation.verified and hasattr(self.annotation, 'user_confidence') and self.annotation.user_confidence:
|
94
|
+
return list(self.annotation.user_confidence.values())[0]
|
95
|
+
elif hasattr(self.annotation, 'machine_confidence') and self.annotation.machine_confidence:
|
96
|
+
return list(self.annotation.machine_confidence.values())[0]
|
97
|
+
return 0.0
|
@@ -0,0 +1,183 @@
|
|
1
|
+
import warnings
|
2
|
+
|
3
|
+
from PyQt5.QtGui import QPen, QColor, QPainter
|
4
|
+
from PyQt5.QtCore import Qt, QTimer
|
5
|
+
|
6
|
+
from PyQt5.QtWidgets import (QVBoxLayout, QLabel, QWidget)
|
7
|
+
|
8
|
+
|
9
|
+
warnings.filterwarnings("ignore", category=DeprecationWarning)
|
10
|
+
|
11
|
+
|
12
|
+
# ----------------------------------------------------------------------------------------------------------------------
|
13
|
+
# Constants
|
14
|
+
# ----------------------------------------------------------------------------------------------------------------------
|
15
|
+
|
16
|
+
ANNOTATION_WIDTH = 5
|
17
|
+
|
18
|
+
# ----------------------------------------------------------------------------------------------------------------------
|
19
|
+
# Classes
|
20
|
+
# ----------------------------------------------------------------------------------------------------------------------
|
21
|
+
|
22
|
+
|
23
|
+
class AnnotationImageWidget(QWidget):
|
24
|
+
"""Widget to display a single annotation image crop with selection support."""
|
25
|
+
|
26
|
+
def __init__(self, data_item, widget_height=96, annotation_viewer=None, parent=None):
|
27
|
+
super(AnnotationImageWidget, self).__init__(parent)
|
28
|
+
self.data_item = data_item
|
29
|
+
self.annotation = data_item.annotation
|
30
|
+
self.annotation_viewer = annotation_viewer
|
31
|
+
|
32
|
+
self.widget_height = widget_height
|
33
|
+
self.aspect_ratio = 1.0 # Default to a square aspect ratio
|
34
|
+
self.pixmap = None # Cache the original, unscaled pixmap
|
35
|
+
|
36
|
+
self.animation_offset = 0
|
37
|
+
self.animation_timer = QTimer(self)
|
38
|
+
self.animation_timer.timeout.connect(self._update_animation_frame)
|
39
|
+
self.animation_timer.setInterval(75)
|
40
|
+
|
41
|
+
self.setup_ui()
|
42
|
+
self.load_and_set_image() # Changed from load_annotation_image
|
43
|
+
|
44
|
+
def setup_ui(self):
|
45
|
+
"""Set up the basic UI with a label for the image."""
|
46
|
+
layout = QVBoxLayout(self)
|
47
|
+
layout.setContentsMargins(4, 4, 4, 4)
|
48
|
+
|
49
|
+
self.image_label = QLabel()
|
50
|
+
self.image_label.setAlignment(Qt.AlignCenter)
|
51
|
+
self.image_label.setScaledContents(True)
|
52
|
+
self.image_label.setStyleSheet("border: none;")
|
53
|
+
|
54
|
+
layout.addWidget(self.image_label)
|
55
|
+
|
56
|
+
def load_and_set_image(self):
|
57
|
+
"""Load image, calculate its aspect ratio, and set the widget's initial size."""
|
58
|
+
try:
|
59
|
+
# Use get_cropped_image_graphic() to get the QPixmap
|
60
|
+
cropped_pixmap = self.annotation.get_cropped_image_graphic()
|
61
|
+
if cropped_pixmap and not cropped_pixmap.isNull():
|
62
|
+
self.pixmap = cropped_pixmap
|
63
|
+
# Safely calculate aspect ratio
|
64
|
+
if self.pixmap.height() > 0:
|
65
|
+
self.aspect_ratio = self.pixmap.width() / self.pixmap.height()
|
66
|
+
else:
|
67
|
+
self.aspect_ratio = 1.0
|
68
|
+
else:
|
69
|
+
self.image_label.setText("No Image\nAvailable")
|
70
|
+
self.pixmap = None
|
71
|
+
self.aspect_ratio = 1.0
|
72
|
+
except Exception as e:
|
73
|
+
print(f"Error loading annotation image: {e}")
|
74
|
+
self.image_label.setText("Error\nLoading Image")
|
75
|
+
self.pixmap = None
|
76
|
+
self.aspect_ratio = 1.0
|
77
|
+
|
78
|
+
# Trigger an initial size update
|
79
|
+
self.update_height(self.widget_height)
|
80
|
+
|
81
|
+
def update_height(self, new_height):
|
82
|
+
"""Updates the widget's height and rescales its width and content accordingly."""
|
83
|
+
self.widget_height = new_height
|
84
|
+
|
85
|
+
# Calculate the new width based on the stored aspect ratio
|
86
|
+
new_width = int(self.widget_height * self.aspect_ratio)
|
87
|
+
|
88
|
+
# Set the new fixed size for the entire widget
|
89
|
+
self.setFixedSize(new_width, new_height)
|
90
|
+
|
91
|
+
if self.pixmap:
|
92
|
+
# Scale the cached pixmap to fit the new widget size, leaving room for the border
|
93
|
+
# Note: We use the widget's new dimensions directly
|
94
|
+
scaled_pixmap = self.pixmap.scaled(
|
95
|
+
new_width - 8, # Account for horizontal margins
|
96
|
+
new_height - 8, # Account for vertical margins
|
97
|
+
Qt.KeepAspectRatio,
|
98
|
+
Qt.SmoothTransformation
|
99
|
+
)
|
100
|
+
self.image_label.setPixmap(scaled_pixmap)
|
101
|
+
|
102
|
+
self.update() # Schedule a repaint if needed
|
103
|
+
|
104
|
+
# Replace update_size with update_height
|
105
|
+
def update_size(self, new_size):
|
106
|
+
"""Kept for compatibility, redirects to update_height."""
|
107
|
+
self.update_height(new_size)
|
108
|
+
|
109
|
+
def set_selected(self, selected):
|
110
|
+
"""Set the selection state and update visual appearance."""
|
111
|
+
was_selected = self.is_selected()
|
112
|
+
|
113
|
+
# Update the shared data item
|
114
|
+
self.data_item.set_selected(selected)
|
115
|
+
|
116
|
+
# Start or stop the animation timer based on the new selection state
|
117
|
+
if selected:
|
118
|
+
if not self.animation_timer.isActive():
|
119
|
+
self.animation_timer.start()
|
120
|
+
else:
|
121
|
+
if self.animation_timer.isActive():
|
122
|
+
self.animation_timer.stop()
|
123
|
+
# Reset offset when deselected to ensure a consistent starting look
|
124
|
+
self.animation_offset = 0
|
125
|
+
|
126
|
+
# A repaint is needed if the selection state changed OR if the item remains
|
127
|
+
# selected (to keep the animation running).
|
128
|
+
if was_selected != selected or selected:
|
129
|
+
self.update()
|
130
|
+
|
131
|
+
def is_selected(self):
|
132
|
+
"""Return whether this widget is selected via the data item."""
|
133
|
+
return self.data_item.is_selected
|
134
|
+
|
135
|
+
def _update_animation_frame(self):
|
136
|
+
"""Update the animation offset and schedule a repaint."""
|
137
|
+
self.animation_offset = (self.animation_offset + 1) % 20
|
138
|
+
self.update()
|
139
|
+
|
140
|
+
def paintEvent(self, event):
|
141
|
+
"""Handle custom drawing for the widget, including the border."""
|
142
|
+
super().paintEvent(event)
|
143
|
+
painter = QPainter(self)
|
144
|
+
painter.setRenderHint(QPainter.Antialiasing)
|
145
|
+
|
146
|
+
# Get the label that is currently active (which could be a preview)
|
147
|
+
effective_label = self.data_item.effective_label
|
148
|
+
|
149
|
+
# Check if the active label is the special "Review" label (id == "-1")
|
150
|
+
if effective_label and effective_label.id == "-1":
|
151
|
+
# If it is, ALWAYS use a black pen for visibility against the white background.
|
152
|
+
pen_color = QColor("black")
|
153
|
+
else:
|
154
|
+
# Otherwise, use the effective color from the data item.
|
155
|
+
pen_color = self.data_item.effective_color
|
156
|
+
|
157
|
+
if self.is_selected():
|
158
|
+
pen = QPen(pen_color, ANNOTATION_WIDTH)
|
159
|
+
pen.setStyle(Qt.CustomDashLine)
|
160
|
+
pen.setDashPattern([2, 3])
|
161
|
+
pen.setDashOffset(self.animation_offset)
|
162
|
+
else:
|
163
|
+
pen = QPen(pen_color, ANNOTATION_WIDTH)
|
164
|
+
pen.setStyle(Qt.SolidLine)
|
165
|
+
|
166
|
+
painter.setPen(pen)
|
167
|
+
painter.setBrush(Qt.NoBrush)
|
168
|
+
|
169
|
+
width = pen.width()
|
170
|
+
half_width = (width - 1) // 2
|
171
|
+
rect = self.rect().adjusted(half_width, half_width, -half_width, -half_width)
|
172
|
+
painter.drawRect(rect)
|
173
|
+
|
174
|
+
def mousePressEvent(self, event):
|
175
|
+
"""Handle mouse press events for selection."""
|
176
|
+
if event.button() == Qt.LeftButton:
|
177
|
+
if self.annotation_viewer and hasattr(self.annotation_viewer, 'handle_annotation_selection'):
|
178
|
+
self.annotation_viewer.handle_annotation_selection(self, event)
|
179
|
+
# Ignore right mouse button clicks - don't call super() to prevent any selection
|
180
|
+
elif event.button() == Qt.RightButton:
|
181
|
+
event.ignore()
|
182
|
+
return
|
183
|
+
super().mousePressEvent(event)
|
@@ -0,0 +1,30 @@
|
|
1
|
+
import warnings
|
2
|
+
|
3
|
+
from PyQt5.QtWidgets import QGraphicsEllipseItem, QStyle
|
4
|
+
|
5
|
+
warnings.filterwarnings("ignore", category=DeprecationWarning)
|
6
|
+
|
7
|
+
|
8
|
+
# ----------------------------------------------------------------------------------------------------------------------
|
9
|
+
# Classes
|
10
|
+
# ----------------------------------------------------------------------------------------------------------------------
|
11
|
+
|
12
|
+
|
13
|
+
class EmbeddingPointItem(QGraphicsEllipseItem):
|
14
|
+
"""
|
15
|
+
A custom QGraphicsEllipseItem that prevents the default selection
|
16
|
+
rectangle from being drawn, and dynamically gets its color from the
|
17
|
+
shared AnnotationDataItem.
|
18
|
+
"""
|
19
|
+
|
20
|
+
def paint(self, painter, option, widget):
|
21
|
+
# Get the shared data item, which holds the current state
|
22
|
+
data_item = self.data(0)
|
23
|
+
if data_item:
|
24
|
+
# Set the brush color based on the item's effective color
|
25
|
+
# This ensures preview colors are reflected instantly.
|
26
|
+
self.setBrush(data_item.effective_color)
|
27
|
+
|
28
|
+
# Remove the 'State_Selected' flag to prevent the default box
|
29
|
+
option.state &= ~QStyle.State_Selected
|
30
|
+
super(EmbeddingPointItem, self).paint(painter, option, widget)
|