coralnet-toolbox 0.0.67__tar.gz → 0.0.69__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.
Files changed (251) hide show
  1. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/.gitignore +7 -0
  2. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/PKG-INFO +14 -7
  3. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/README.md +12 -6
  4. coralnet_toolbox-0.0.69/coralnet_toolbox/Explorer/QtDataItem.py +339 -0
  5. coralnet_toolbox-0.0.69/coralnet_toolbox/Explorer/QtExplorer.py +2640 -0
  6. coralnet_toolbox-0.0.69/coralnet_toolbox/Explorer/QtFeatureStore.py +176 -0
  7. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Explorer/QtSettingsWidgets.py +212 -25
  8. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/QtEventFilter.py +24 -12
  9. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/QtLabelWindow.py +23 -11
  10. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/QtMainWindow.py +59 -7
  11. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/__init__.py +1 -1
  12. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox.egg-info/PKG-INFO +14 -7
  13. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox.egg-info/SOURCES.txt +2 -3
  14. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox.egg-info/requires.txt +1 -0
  15. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/pyproject.toml +3 -2
  16. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/requirements.txt +1 -0
  17. coralnet_toolbox-0.0.67/coralnet_toolbox/Explorer/QtAnnotationDataItem.py +0 -97
  18. coralnet_toolbox-0.0.67/coralnet_toolbox/Explorer/QtAnnotationImageWidget.py +0 -183
  19. coralnet_toolbox-0.0.67/coralnet_toolbox/Explorer/QtEmbeddingPointItem.py +0 -30
  20. coralnet_toolbox-0.0.67/coralnet_toolbox/Explorer/QtExplorer.py +0 -2067
  21. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/.editorconfig +0 -0
  22. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/.gitallowed +0 -0
  23. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  24. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  25. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  26. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/.github/ISSUE_TEMPLATE/general_question.md +0 -0
  27. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/.github/workflows/docs-build.yml +0 -0
  28. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/.github/workflows/docs.yml +0 -0
  29. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/.github/workflows/installation.yml +0 -0
  30. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/.github/workflows/macos.yml +0 -0
  31. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/.github/workflows/pypi.yml +0 -0
  32. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/.github/workflows/ubuntu.yml +0 -0
  33. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/.github/workflows/windows.yml +0 -0
  34. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/LICENSE.txt +0 -0
  35. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/MANIFEST.in +0 -0
  36. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Annotations/QtAnnotation.py +0 -0
  37. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Annotations/QtMultiPolygonAnnotation.py +0 -0
  38. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Annotations/QtPatchAnnotation.py +0 -0
  39. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Annotations/QtPolygonAnnotation.py +0 -0
  40. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Annotations/QtRectangleAnnotation.py +0 -0
  41. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Annotations/__init__.py +0 -0
  42. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/AutoDistill/Models/GroundingDINO.py +0 -0
  43. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/AutoDistill/Models/OWLViT.py +0 -0
  44. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/AutoDistill/Models/OmDetTurbo.py +0 -0
  45. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/AutoDistill/Models/QtBase.py +0 -0
  46. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/AutoDistill/Models/__init__.py +0 -0
  47. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/AutoDistill/QtBatchInference.py +0 -0
  48. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/AutoDistill/QtDeployModel.py +0 -0
  49. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/AutoDistill/__init__.py +0 -0
  50. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/BreakTime/QtBreakout.py +0 -0
  51. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/BreakTime/QtSnake.py +0 -0
  52. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/BreakTime/__init__.py +0 -0
  53. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Common/QtGraphicsUtility.py +0 -0
  54. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Common/QtMarginInput.py +0 -0
  55. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Common/QtOverlapInput.py +0 -0
  56. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Common/QtTileSizeInput.py +0 -0
  57. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Common/QtUpdateImagePaths.py +0 -0
  58. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/CoralNet/QtAuthenticate.py +0 -0
  59. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/CoralNet/QtDownload.py +0 -0
  60. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/CoralNet/__init__.py +0 -0
  61. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Explorer/__init__.py +0 -0
  62. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/IO/QtExportAnnotations.py +0 -0
  63. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/IO/QtExportCoralNetAnnotations.py +0 -0
  64. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/IO/QtExportGeoJSONAnnotations.py +0 -0
  65. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/IO/QtExportLabels.py +0 -0
  66. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/IO/QtExportMaskAnnotations.py +0 -0
  67. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/IO/QtExportTagLabAnnotations.py +0 -0
  68. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/IO/QtExportTagLabLabels.py +0 -0
  69. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/IO/QtExportViscoreAnnotations.py +0 -0
  70. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/IO/QtImportAnnotations.py +0 -0
  71. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/IO/QtImportCoralNetAnnotations.py +0 -0
  72. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/IO/QtImportCoralNetLabels.py +0 -0
  73. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/IO/QtImportFrames.py +0 -0
  74. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/IO/QtImportImages.py +0 -0
  75. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/IO/QtImportLabels.py +0 -0
  76. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/IO/QtImportTagLabAnnotations.py +0 -0
  77. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/IO/QtImportTagLabLabels.py +0 -0
  78. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/IO/QtImportViscoreAnnotations.py +0 -0
  79. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/IO/QtOpenProject.py +0 -0
  80. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/IO/QtSaveProject.py +0 -0
  81. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/IO/__init__.py +0 -0
  82. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/1.png +0 -0
  83. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/2.png +0 -0
  84. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/3.png +0 -0
  85. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/4.png +0 -0
  86. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/5.png +0 -0
  87. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/__init__.py +0 -0
  88. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/add.png +0 -0
  89. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/all.png +0 -0
  90. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/apple.png +0 -0
  91. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/breakout.png +0 -0
  92. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/coral.png +0 -0
  93. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/edit.png +0 -0
  94. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/eye.png +0 -0
  95. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/hide.png +0 -0
  96. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/home.png +0 -0
  97. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/lock.png +0 -0
  98. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/machine.png +0 -0
  99. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/magic.png +0 -0
  100. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/opaque.png +0 -0
  101. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/parameters.png +0 -0
  102. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/patch.png +0 -0
  103. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/polygon.png +0 -0
  104. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/rabbit.png +0 -0
  105. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/rectangle.png +0 -0
  106. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/remove.png +0 -0
  107. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/rocket.png +0 -0
  108. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/select.png +0 -0
  109. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/settings.png +0 -0
  110. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/snake.png +0 -0
  111. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/tile.png +0 -0
  112. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/transparent.png +0 -0
  113. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/turtle.png +0 -0
  114. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/unlock.png +0 -0
  115. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/user.png +0 -0
  116. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/wizard.png +0 -0
  117. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/workarea.png +0 -0
  118. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Icons/www.png +0 -0
  119. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/BatchInference/QtBase.py +0 -0
  120. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/BatchInference/QtClassify.py +0 -0
  121. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/BatchInference/QtDetect.py +0 -0
  122. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/BatchInference/QtSegment.py +0 -0
  123. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/BatchInference/__init__.py +0 -0
  124. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/Community/cfg/__init__.py +0 -0
  125. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/Community/cfg/classify/convnext_tiny.yaml +0 -0
  126. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/Community/cfg/classify/efficientnet_b0.yaml +0 -0
  127. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/Community/cfg/classify/mobilenet_v3_large.yaml +0 -0
  128. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/Community/cfg/classify/swin_t.yaml +0 -0
  129. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/Community/cfg/detect/convnext_tiny.yaml +0 -0
  130. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/Community/cfg/detect/mobilenet_v3_large-fpn.yaml +0 -0
  131. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/Community/cfg/detect/mobilenet_v3_small-fpn.yaml +0 -0
  132. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/Community/cfg/detect/resnet101.yaml +0 -0
  133. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/Community/cfg/detect/swin_t-fpn.yaml +0 -0
  134. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/Community/cfg/detect/swin_t.yaml +0 -0
  135. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/Community/cfg/detect/yolo11-p2.yaml +0 -0
  136. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/Community/cfg/detect/yolo11-p6.yaml +0 -0
  137. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/Community/cfg/segment/convnext_tiny.yaml +0 -0
  138. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/Community/cfg/segment/swin_t-fpn.yaml +0 -0
  139. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/Community/cfg/segment/swin_t.yaml +0 -0
  140. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/Community/cfg/segment/yolo11-p2.yaml +0 -0
  141. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/Community/cfg/segment/yolo11-p6.yaml +0 -0
  142. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/ConfusionMatrix.py +0 -0
  143. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/DeployModel/QtBase.py +0 -0
  144. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/DeployModel/QtClassify.py +0 -0
  145. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/DeployModel/QtDetect.py +0 -0
  146. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/DeployModel/QtSegment.py +0 -0
  147. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/DeployModel/__init__.py +0 -0
  148. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/EvaluateModel/QtBase.py +0 -0
  149. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/EvaluateModel/QtClassify.py +0 -0
  150. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/EvaluateModel/QtDetect.py +0 -0
  151. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/EvaluateModel/QtSegment.py +0 -0
  152. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/EvaluateModel/__init__.py +0 -0
  153. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/ExportDataset/QtBase.py +0 -0
  154. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/ExportDataset/QtClassify.py +0 -0
  155. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/ExportDataset/QtDetect.py +0 -0
  156. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/ExportDataset/QtSegment.py +0 -0
  157. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/ExportDataset/__init__.py +0 -0
  158. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/ImportDataset/QtBase.py +0 -0
  159. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/ImportDataset/QtDetect.py +0 -0
  160. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/ImportDataset/QtSegment.py +0 -0
  161. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/ImportDataset/__init__.py +0 -0
  162. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/MergeDatasets/QtBase.py +0 -0
  163. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/MergeDatasets/QtClassify.py +0 -0
  164. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/MergeDatasets/__init__.py +0 -0
  165. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/OptimizeModel/QtBase.py +0 -0
  166. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/OptimizeModel/__init__.py +0 -0
  167. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/TrainModel/QtBase.py +0 -0
  168. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/TrainModel/QtClassify.py +0 -0
  169. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/TrainModel/QtDetect.py +0 -0
  170. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/TrainModel/QtSegment.py +0 -0
  171. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/TrainModel/__init__.py +0 -0
  172. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/TuneModel/QtBase.py +0 -0
  173. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/TuneModel/QtClassify.py +0 -0
  174. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/TuneModel/QtDetect.py +0 -0
  175. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/TuneModel/QtSegment.py +0 -0
  176. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/TuneModel/__init__.py +0 -0
  177. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/TuneModel/tuner.py +0 -0
  178. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/VideoInference/QtBase.py +0 -0
  179. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/VideoInference/QtClassify.py +0 -0
  180. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/VideoInference/QtDetect.py +0 -0
  181. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/VideoInference/QtInference.py +0 -0
  182. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/VideoInference/QtSegment.py +0 -0
  183. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/VideoInference/QtVideoWidget.py +0 -0
  184. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/VideoInference/YOLO3D/__init__.py +0 -0
  185. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/VideoInference/YOLO3D/bbox3d_utils.py +0 -0
  186. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/VideoInference/YOLO3D/depth_model.py +0 -0
  187. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/VideoInference/YOLO3D/detection_model.py +0 -0
  188. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/VideoInference/YOLO3D/load_camera_params.py +0 -0
  189. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/VideoInference/YOLO3D/run.py +0 -0
  190. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/VideoInference/__init__.py +0 -0
  191. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/VideoInference/analytics.py +0 -0
  192. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/WeightedDataset.py +0 -0
  193. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/MachineLearning/__init__.py +0 -0
  194. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/QtAnnotationWindow.py +0 -0
  195. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/QtConfidenceWindow.py +0 -0
  196. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/QtImageWindow.py +0 -0
  197. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/QtPatchSampling.py +0 -0
  198. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/QtProgressBar.py +0 -0
  199. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/QtWorkArea.py +0 -0
  200. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Rasters/ImageFilter.py +0 -0
  201. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Rasters/QtRaster.py +0 -0
  202. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Rasters/RasterManager.py +0 -0
  203. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Rasters/RasterTableModel.py +0 -0
  204. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Rasters/__init__.py +0 -0
  205. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Results/CombineResults.py +0 -0
  206. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Results/ConvertResults.py +0 -0
  207. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Results/MapResults.py +0 -0
  208. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Results/Masks.py +0 -0
  209. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Results/ResultsProcessor.py +0 -0
  210. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Results/__init__.py +0 -0
  211. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/SAM/QtBatchInference.py +0 -0
  212. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/SAM/QtDeployGenerator.py +0 -0
  213. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/SAM/QtDeployPredictor.py +0 -0
  214. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/SAM/__init__.py +0 -0
  215. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/SeeAnything/QtBatchInference.py +0 -0
  216. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/SeeAnything/QtDeployPredictor.py +0 -0
  217. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/SeeAnything/QtTrainModel.py +0 -0
  218. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/SeeAnything/__init__.py +0 -0
  219. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Tile/QtTileBatchInference.py +0 -0
  220. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Tile/QtTileCreation.py +0 -0
  221. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Tile/TileDataset/QtBase.py +0 -0
  222. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Tile/TileDataset/QtClassify.py +0 -0
  223. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Tile/TileDataset/QtDetect.py +0 -0
  224. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Tile/TileDataset/QtSegment.py +0 -0
  225. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Tile/TileDataset/__init__.py +0 -0
  226. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Tile/__init__.py +0 -0
  227. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Tools/QtCutSubTool.py +0 -0
  228. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Tools/QtMoveSubTool.py +0 -0
  229. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Tools/QtPanTool.py +0 -0
  230. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Tools/QtPatchTool.py +0 -0
  231. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Tools/QtPolygonTool.py +0 -0
  232. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Tools/QtRectangleTool.py +0 -0
  233. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Tools/QtResizeSubTool.py +0 -0
  234. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Tools/QtSAMTool.py +0 -0
  235. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Tools/QtSeeAnythingTool.py +0 -0
  236. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Tools/QtSelectSubTool.py +0 -0
  237. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Tools/QtSelectTool.py +0 -0
  238. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Tools/QtSubTool.py +0 -0
  239. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Tools/QtTool.py +0 -0
  240. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Tools/QtWorkAreaTool.py +0 -0
  241. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Tools/QtZoomTool.py +0 -0
  242. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/Tools/__init__.py +0 -0
  243. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/main.py +0 -0
  244. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox/utilities.py +0 -0
  245. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox.egg-info/dependency_links.txt +0 -0
  246. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox.egg-info/entry_points.txt +0 -0
  247. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/coralnet_toolbox.egg-info/top_level.txt +0 -0
  248. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/mkdocs.yml +0 -0
  249. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/requirements_dev.txt +0 -0
  250. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/setup.cfg +0 -0
  251. {coralnet_toolbox-0.0.67 → coralnet_toolbox-0.0.69}/uv.lock +0 -0
@@ -130,3 +130,10 @@ launch.json
130
130
 
131
131
  # Local
132
132
  data/
133
+
134
+ # Faiss index files
135
+ *.faiss
136
+ *.db
137
+
138
+ # Copilot
139
+ .github/copilot-instructions.md
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: coralnet-toolbox
3
- Version: 0.0.67
3
+ Version: 0.0.69
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
@@ -22,6 +22,7 @@ Requires-Dist: open-clip-torch>=2.20.0
22
22
  Requires-Dist: supervision>=0.24.0
23
23
  Requires-Dist: scikit-learn
24
24
  Requires-Dist: umap-learn
25
+ Requires-Dist: faiss-cpu
25
26
  Requires-Dist: pycocotools
26
27
  Requires-Dist: ujson
27
28
  Requires-Dist: timm==0.9.2
@@ -136,12 +137,17 @@ These models enable fast, accurate, and flexible annotation workflows for a wide
136
137
 
137
138
  <div align="center">
138
139
 
139
- | ![Patch Annotation Tool](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Patches.gif)<br><sub>**Patch Annotation**</sub> | ![Rectangle Annotation Tool](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Rectangles.gif)<br><sub>**Rectangle Annotation**</sub> | ![Polygon Annotation Tool](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Polygons.gif)<br><sub>**(Multi) Polygon Annotation**</sub> |
140
+ | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Patches.gif" alt="Patch Annotation Tool" width="256" height="256"/><br><sub>**Patch Annotation**</sub> | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Rectangles.gif" alt="Rectangle Annotation Tool" width="256" height="256"/><br><sub>**Rectangle Annotation**</sub> | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Polygons.gif" alt="Polygon Annotation Tool" width="256" height="256"/><br><sub>**(Multi) Polygon Annotation**</sub> |
140
141
  |:--:|:--:|:--:|
141
- | ![Patch-based Image Classification](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Classification.gif)<br><sub>**Image Classification**</sub> | ![Object Detection](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Object_Detection.gif)<br><sub>**Object Detection**</sub> | ![Instance Segmentation](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Instance_Segmentation.gif)<br><sub>**Instance Segmentation**</sub> |
142
- | ![Segment Anything Model (SAM)](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Segment_Anything.gif)<br><sub>**Segment Anything (SAM)**</sub> | ![Polygon Classification](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Classifying_Polygons.gif)<br><sub>**Polygon Classification**</sub> | ![Region-based Detection](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Work_Areas.gif)<br><sub>**Region-based Detection**</sub> |
143
- | ![Cut](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Cut.gif)<br><sub>**Cut**</sub> | ![Combine](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Combine.gif)<br><sub>**Combine**</sub> | ![Simplify](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Simplify.gif)<br><sub>**Simplify**</sub> |
144
- | ![See Anything (YOLOE)](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/See_Anything.gif)<br><sub>**See Anything (YOLOE)**</sub> | ![Patch-based LAI Classification](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Classifying_Orthomosaics.gif)<br><sub>**Patch-based LAI Classification**</sub> | ![Video Inference](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Analytics.gif)<br><sub>**Video Inference**</sub> |
142
+ | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Classification.gif" alt="Patch-based Image Classification" width="256" height="256"/><br><sub>**Image Classification**</sub> | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Object_Detection.gif" alt="Object Detection" width="256" height="256"/><br><sub>**Object Detection**</sub> | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Instance_Segmentation.gif" alt="Instance Segmentation" width="256" height="256"/><br><sub>**Instance Segmentation**</sub> |
143
+ | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Segment_Anything.gif" alt="Segment Anything Model (SAM)" width="256" height="256"/><br><sub>**Segment Anything (SAM)**</sub> | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Classifying_Polygons.gif" alt="Polygon Classification" width="256" height="256"/><br><sub>**Polygon Classification**</sub> | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Work_Areas.gif" alt="Region-based Detection" width="256" height="256"/><br><sub>**Region-based Detection**</sub> |
144
+ | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Cut.gif" alt="Cut" width="256" height="256"/><br><sub>**Cut**</sub> | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Combine.gif" alt="Combine" width="256" height="256"/><br><sub>**Combine**</sub> | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Simplify.gif" alt="Simplify" width="256" height="256"/><br><sub>**Simplify**</sub> |
145
+ | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/See_Anything.gif" alt="See Anything (YOLOE)" width="256" height="256"/><br><sub>**See Anything (YOLOE)**</sub> | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Classifying_Orthomosaics.gif" alt="Patch-based LAI Classification" width="256" height="256"/><br><sub>**LAI Classification**</sub> | |
146
+
147
+ <br>
148
+
149
+ | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Analytics.gif" alt="Video Inference" width="450"/><br><sub>**Video Inference**</sub> | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Explorer.gif" alt="Explorer" width="450"/><br><sub>**Explorer**</sub> |
150
+ |:--:|:--:|
145
151
 
146
152
  </div>
147
153
 
@@ -166,11 +172,12 @@ Enhance your CoralNet experience with these tools:
166
172
  - Uses `Grounding DINO`, `OWLViT`, `OmDetTurbo`
167
173
  - 📻 Tune: Tune hyperparameters to identify ideal training conditions
168
174
  - 🧠 Train: Build local patch-based classifiers, object detection, and instance segmentation models
169
- - 🔮 Deploy: Use trained models for predictions
175
+ - 🧙‍♂️ Deploy: Use trained models for predictions
170
176
  - 📊 Evaluation: Evaluate model performance
171
177
  - 🚀 Optimize: Productionize models for faster inferencing
172
178
  - ⚙️ Batch Inference: Perform predictions on multiple images, automatically
173
179
  - 🎞️ Video Inference: Perform predictions on a video in real-time, record the output and analytics
180
+ - 🔮 Explorer: Cluster, view, and re-label annotations using embeddings, mapped from feature-space
174
181
  - ↔️ I/O: Import and Export annotations from / to CoralNet, Viscore, and TagLab
175
182
  - Export annotations as [GeoJSONs](https://datatracker.ietf.org/doc/html/rfc7946), segmentation masks
176
183
  - 📸 YOLO: Import and Export YOLO datasets for machine learning
@@ -93,12 +93,17 @@ These models enable fast, accurate, and flexible annotation workflows for a wide
93
93
 
94
94
  <div align="center">
95
95
 
96
- | ![Patch Annotation Tool](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Patches.gif)<br><sub>**Patch Annotation**</sub> | ![Rectangle Annotation Tool](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Rectangles.gif)<br><sub>**Rectangle Annotation**</sub> | ![Polygon Annotation Tool](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Polygons.gif)<br><sub>**(Multi) Polygon Annotation**</sub> |
96
+ | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Patches.gif" alt="Patch Annotation Tool" width="256" height="256"/><br><sub>**Patch Annotation**</sub> | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Rectangles.gif" alt="Rectangle Annotation Tool" width="256" height="256"/><br><sub>**Rectangle Annotation**</sub> | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Polygons.gif" alt="Polygon Annotation Tool" width="256" height="256"/><br><sub>**(Multi) Polygon Annotation**</sub> |
97
97
  |:--:|:--:|:--:|
98
- | ![Patch-based Image Classification](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Classification.gif)<br><sub>**Image Classification**</sub> | ![Object Detection](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Object_Detection.gif)<br><sub>**Object Detection**</sub> | ![Instance Segmentation](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Instance_Segmentation.gif)<br><sub>**Instance Segmentation**</sub> |
99
- | ![Segment Anything Model (SAM)](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Segment_Anything.gif)<br><sub>**Segment Anything (SAM)**</sub> | ![Polygon Classification](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Classifying_Polygons.gif)<br><sub>**Polygon Classification**</sub> | ![Region-based Detection](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Work_Areas.gif)<br><sub>**Region-based Detection**</sub> |
100
- | ![Cut](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Cut.gif)<br><sub>**Cut**</sub> | ![Combine](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Combine.gif)<br><sub>**Combine**</sub> | ![Simplify](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Simplify.gif)<br><sub>**Simplify**</sub> |
101
- | ![See Anything (YOLOE)](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/See_Anything.gif)<br><sub>**See Anything (YOLOE)**</sub> | ![Patch-based LAI Classification](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Classifying_Orthomosaics.gif)<br><sub>**Patch-based LAI Classification**</sub> | ![Video Inference](https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Analytics.gif)<br><sub>**Video Inference**</sub> |
98
+ | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Classification.gif" alt="Patch-based Image Classification" width="256" height="256"/><br><sub>**Image Classification**</sub> | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Object_Detection.gif" alt="Object Detection" width="256" height="256"/><br><sub>**Object Detection**</sub> | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Instance_Segmentation.gif" alt="Instance Segmentation" width="256" height="256"/><br><sub>**Instance Segmentation**</sub> |
99
+ | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Segment_Anything.gif" alt="Segment Anything Model (SAM)" width="256" height="256"/><br><sub>**Segment Anything (SAM)**</sub> | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Classifying_Polygons.gif" alt="Polygon Classification" width="256" height="256"/><br><sub>**Polygon Classification**</sub> | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Work_Areas.gif" alt="Region-based Detection" width="256" height="256"/><br><sub>**Region-based Detection**</sub> |
100
+ | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Cut.gif" alt="Cut" width="256" height="256"/><br><sub>**Cut**</sub> | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Combine.gif" alt="Combine" width="256" height="256"/><br><sub>**Combine**</sub> | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Simplify.gif" alt="Simplify" width="256" height="256"/><br><sub>**Simplify**</sub> |
101
+ | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/See_Anything.gif" alt="See Anything (YOLOE)" width="256" height="256"/><br><sub>**See Anything (YOLOE)**</sub> | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Classifying_Orthomosaics.gif" alt="Patch-based LAI Classification" width="256" height="256"/><br><sub>**LAI Classification**</sub> | |
102
+
103
+ <br>
104
+
105
+ | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Analytics.gif" alt="Video Inference" width="450"/><br><sub>**Video Inference**</sub> | <img src="https://raw.githubusercontent.com/Jordan-Pierce/CoralNet-Toolbox/refs/heads/main/figures/tools/Explorer.gif" alt="Explorer" width="450"/><br><sub>**Explorer**</sub> |
106
+ |:--:|:--:|
102
107
 
103
108
  </div>
104
109
 
@@ -123,11 +128,12 @@ Enhance your CoralNet experience with these tools:
123
128
  - Uses `Grounding DINO`, `OWLViT`, `OmDetTurbo`
124
129
  - 📻 Tune: Tune hyperparameters to identify ideal training conditions
125
130
  - 🧠 Train: Build local patch-based classifiers, object detection, and instance segmentation models
126
- - 🔮 Deploy: Use trained models for predictions
131
+ - 🧙‍♂️ Deploy: Use trained models for predictions
127
132
  - 📊 Evaluation: Evaluate model performance
128
133
  - 🚀 Optimize: Productionize models for faster inferencing
129
134
  - ⚙️ Batch Inference: Perform predictions on multiple images, automatically
130
135
  - 🎞️ Video Inference: Perform predictions on a video in real-time, record the output and analytics
136
+ - 🔮 Explorer: Cluster, view, and re-label annotations using embeddings, mapped from feature-space
131
137
  - ↔️ I/O: Import and Export annotations from / to CoralNet, Viscore, and TagLab
132
138
  - Export annotations as [GeoJSONs](https://datatracker.ietf.org/doc/html/rfc7946), segmentation masks
133
139
  - 📸 YOLO: Import and Export YOLO datasets for machine learning
@@ -0,0 +1,339 @@
1
+ import warnings
2
+
3
+ import os
4
+
5
+ import numpy as np
6
+
7
+ from PyQt5.QtCore import Qt, QTimer
8
+ from PyQt5.QtGui import QPen, QColor, QPainter
9
+ from PyQt5.QtWidgets import QGraphicsEllipseItem, QStyle, QVBoxLayout, QLabel, QWidget, QGraphicsItem
10
+
11
+ warnings.filterwarnings("ignore", category=DeprecationWarning)
12
+
13
+
14
+ # ----------------------------------------------------------------------------------------------------------------------
15
+ # Constants
16
+ # ----------------------------------------------------------------------------------------------------------------------
17
+
18
+ POINT_SIZE = 15
19
+ POINT_WIDTH = 3
20
+
21
+ ANNOTATION_WIDTH = 5
22
+
23
+
24
+ # ----------------------------------------------------------------------------------------------------------------------
25
+ # Classes
26
+ # ----------------------------------------------------------------------------------------------------------------------
27
+
28
+
29
+ class EmbeddingPointItem(QGraphicsEllipseItem):
30
+ """
31
+ A custom QGraphicsEllipseItem that gets its state and appearance
32
+ directly from an associated AnnotationDataItem.
33
+ """
34
+
35
+ def __init__(self, data_item):
36
+ """
37
+ Initializes the point item.
38
+
39
+ Args:
40
+ data_item (AnnotationDataItem): The data item that holds the state
41
+ for this point.
42
+ """
43
+ # Initialize the ellipse with a placeholder rectangle; its position will be set later.
44
+ super(EmbeddingPointItem, self).__init__(0, 0, POINT_SIZE, POINT_SIZE)
45
+
46
+ # Store a direct reference to the data item
47
+ self.data_item = data_item
48
+
49
+ # Set the item's flags
50
+ self.setFlag(QGraphicsItem.ItemIsSelectable, True)
51
+ self.setFlag(QGraphicsItem.ItemIgnoresTransformations, True)
52
+
53
+ # Set initial appearance from the data_item
54
+ self.setPen(QPen(QColor("black"), POINT_WIDTH))
55
+ self.setBrush(self.data_item.effective_color)
56
+
57
+ # Set the position of the point based on the data item's embedding coordinates
58
+ self.setPos(self.data_item.embedding_x, self.data_item.embedding_y)
59
+ # Set the tooltip with detailed information
60
+ self.setToolTip(self.data_item.get_tooltip_text())
61
+
62
+ def update_tooltip(self):
63
+ """Updates the tooltip by fetching the latest text from the data item."""
64
+ self.setToolTip(self.data_item.get_tooltip_text())
65
+
66
+ def paint(self, painter, option, widget):
67
+ """
68
+ Custom paint method to ensure the point's color is always in sync with
69
+ the AnnotationDataItem and to prevent the default selection box from
70
+ being drawn.
71
+ """
72
+ # Dynamically get the latest color from the central data item.
73
+ # This ensures that preview color changes are reflected instantly.
74
+ self.setBrush(self.data_item.effective_color)
75
+
76
+ # Remove the 'State_Selected' flag from the style options before painting.
77
+ # This is the key to preventing Qt from drawing the default dotted
78
+ # selection rectangle around the item.
79
+ option.state &= ~QStyle.State_Selected
80
+
81
+ # Call the base class's paint method to draw the ellipse
82
+ super(EmbeddingPointItem, self).paint(painter, option, widget)
83
+
84
+
85
+ class AnnotationImageWidget(QWidget):
86
+ """Widget to display a single annotation image crop with selection support."""
87
+
88
+ def __init__(self, data_item, widget_height=96, annotation_viewer=None, parent=None):
89
+ super(AnnotationImageWidget, self).__init__(parent)
90
+ self.data_item = data_item # The single source of truth for state
91
+ self.annotation = data_item.annotation
92
+ self.annotation_viewer = annotation_viewer
93
+
94
+ self.widget_height = widget_height
95
+ self.aspect_ratio = 1.0
96
+ self.pixmap = None
97
+
98
+ self.animation_offset = 0
99
+ self.animation_timer = QTimer(self)
100
+ self.animation_timer.timeout.connect(self._update_animation_frame)
101
+ self.animation_timer.setInterval(75)
102
+
103
+ self.setup_ui()
104
+ self.load_and_set_image()
105
+
106
+ def setup_ui(self):
107
+ """Set up the basic UI with a label for the image."""
108
+ layout = QVBoxLayout(self)
109
+ layout.setContentsMargins(4, 4, 4, 4)
110
+ self.image_label = QLabel()
111
+ self.image_label.setAlignment(Qt.AlignCenter)
112
+ self.image_label.setScaledContents(True)
113
+ self.image_label.setStyleSheet("border: none;")
114
+ layout.addWidget(self.image_label)
115
+
116
+ def update_tooltip(self):
117
+ """Updates the tooltip by fetching the latest text from the data item."""
118
+ self.setToolTip(self.data_item.get_tooltip_text())
119
+
120
+ def load_and_set_image(self):
121
+ """Load image, calculate its aspect ratio, and set the widget's initial size."""
122
+ try:
123
+ cropped_pixmap = self.annotation.get_cropped_image_graphic()
124
+ if cropped_pixmap and not cropped_pixmap.isNull():
125
+ self.pixmap = cropped_pixmap
126
+ if self.pixmap.height() > 0:
127
+ self.aspect_ratio = self.pixmap.width() / self.pixmap.height()
128
+ else:
129
+ self.aspect_ratio = 1.0
130
+ else:
131
+ self.image_label.setText("No Image\nAvailable")
132
+ self.pixmap = None
133
+ self.aspect_ratio = 1.0
134
+ except Exception as e:
135
+ print(f"Error loading annotation image: {e}")
136
+ self.image_label.setText("Error\nLoading Image")
137
+ self.pixmap = None
138
+ self.aspect_ratio = 1.0
139
+
140
+ self.update_height(self.widget_height)
141
+ # Set the initial tooltip
142
+ self.update_tooltip()
143
+
144
+ def update_height(self, new_height):
145
+ """Updates the widget's height and rescales its width and content accordingly."""
146
+ self.widget_height = new_height
147
+ new_width = int(self.widget_height * self.aspect_ratio)
148
+ self.setFixedSize(new_width, new_height)
149
+ if self.pixmap:
150
+ scaled_pixmap = self.pixmap.scaled(
151
+ new_width - 8,
152
+ new_height - 8,
153
+ Qt.KeepAspectRatio,
154
+ Qt.SmoothTransformation
155
+ )
156
+ self.image_label.setPixmap(scaled_pixmap)
157
+ self.update()
158
+
159
+ def update_selection_visuals(self):
160
+ """
161
+ Updates the widget's visual state based on the data_item's selection
162
+ status. This should be called by the controlling viewer.
163
+ """
164
+ is_selected = self.data_item.is_selected
165
+
166
+ if is_selected:
167
+ if not self.animation_timer.isActive():
168
+ self.animation_timer.start()
169
+ else:
170
+ if self.animation_timer.isActive():
171
+ self.animation_timer.stop()
172
+ self.animation_offset = 0
173
+
174
+ # Trigger a repaint to show the new selection state (border, etc.)
175
+ self.update()
176
+
177
+ def is_selected(self):
178
+ """Return whether this widget is selected via the data item."""
179
+ return self.data_item.is_selected
180
+
181
+ def _update_animation_frame(self):
182
+ """Update the animation offset and schedule a repaint."""
183
+ self.animation_offset = (self.animation_offset + 1) % 20
184
+ self.update()
185
+
186
+ def paintEvent(self, event):
187
+ """Handle custom drawing for the widget, including the selection border."""
188
+ super().paintEvent(event)
189
+ painter = QPainter(self)
190
+ painter.setRenderHint(QPainter.Antialiasing)
191
+
192
+ effective_label = self.data_item.effective_label
193
+ pen_color = self.data_item.effective_color
194
+ if effective_label and effective_label.id == "-1":
195
+ # If the label is a temporary one (e.g., "-1", Review), use black for the pen color
196
+ pen_color = QColor("black")
197
+
198
+ if self.is_selected():
199
+ pen = QPen(pen_color, ANNOTATION_WIDTH)
200
+ pen.setStyle(Qt.CustomDashLine)
201
+ pen.setDashPattern([2, 3])
202
+ pen.setDashOffset(self.animation_offset)
203
+ else:
204
+ pen = QPen(pen_color, ANNOTATION_WIDTH)
205
+ pen.setStyle(Qt.SolidLine)
206
+
207
+ painter.setPen(pen)
208
+ painter.setBrush(Qt.NoBrush)
209
+
210
+ width = pen.width()
211
+ half_width = (width - 1) // 2
212
+ rect = self.rect().adjusted(half_width, half_width, -half_width, -half_width)
213
+ painter.drawRect(rect)
214
+
215
+ def mousePressEvent(self, event):
216
+ """Handle mouse press events for selection, delegating logic to the viewer."""
217
+ if event.button() == Qt.LeftButton:
218
+ if self.annotation_viewer and hasattr(self.annotation_viewer, 'handle_annotation_selection'):
219
+ # The viewer is the controller and will decide how to change the selection state
220
+ self.annotation_viewer.handle_annotation_selection(self, event)
221
+ elif event.button() == Qt.RightButton:
222
+ if self.annotation_viewer and hasattr(self.annotation_viewer, 'handle_annotation_context_menu'):
223
+ self.annotation_viewer.handle_annotation_context_menu(self, event)
224
+ event.accept()
225
+ return
226
+ else:
227
+ event.ignore()
228
+ super().mousePressEvent(event)
229
+
230
+
231
+ class AnnotationDataItem:
232
+ """
233
+ Holds all annotation state information for consistent display across viewers.
234
+ This acts as the "ViewModel" for a single annotation, serving as the single
235
+ source of truth for its state in the UI.
236
+ """
237
+
238
+ def __init__(self, annotation, embedding_x=None, embedding_y=None, embedding_id=None):
239
+ self.annotation = annotation
240
+
241
+ self.embedding_x = embedding_x if embedding_x is not None else 0.0
242
+ self.embedding_y = embedding_y if embedding_y is not None else 0.0
243
+ self.embedding_id = embedding_id if embedding_id is not None else 0
244
+
245
+ self._is_selected = False
246
+ self._preview_label = None
247
+ self._original_label = annotation.label
248
+
249
+ # To store pre-formatted top-k prediction details
250
+ self.prediction_details = None
251
+ # To store prediction probabilities for sorting
252
+ self.prediction_probabilities = None
253
+
254
+ @property
255
+ def effective_label(self):
256
+ """Get the current effective label (preview if it exists, otherwise original)."""
257
+ return self._preview_label if self._preview_label else self.annotation.label
258
+
259
+ @property
260
+ def effective_color(self):
261
+ """Get the effective color for this annotation based on the effective label."""
262
+ return self.effective_label.color
263
+
264
+ @property
265
+ def is_selected(self):
266
+ """Check if this annotation is selected."""
267
+ return self._is_selected
268
+
269
+ def set_selected(self, selected):
270
+ """Set the selection state. This is the single point of control."""
271
+ self._is_selected = selected
272
+
273
+ def set_preview_label(self, label):
274
+ """Set a preview label for this annotation."""
275
+ self._preview_label = label
276
+
277
+ def clear_preview_label(self):
278
+ """Clear the preview label and revert to the original."""
279
+ self._preview_label = None
280
+
281
+ def has_preview_changes(self):
282
+ """Check if this annotation has a temporary preview label assigned."""
283
+ return self._preview_label is not None
284
+
285
+ def apply_preview_permanently(self):
286
+ """Apply the preview label permanently to the underlying annotation object."""
287
+ if self._preview_label:
288
+ self.annotation.update_label(self._preview_label)
289
+ self.annotation.update_user_confidence(self._preview_label)
290
+ self._original_label = self._preview_label
291
+ self._preview_label = None
292
+ return True
293
+ return False
294
+
295
+ def get_display_info(self):
296
+ """Get display information for this annotation."""
297
+ return {
298
+ 'id': self.annotation.id,
299
+ 'label': self.effective_label.short_label_code,
300
+ 'confidence': self.get_effective_confidence(),
301
+ 'type': type(self.annotation).__name__,
302
+ 'image': os.path.basename(self.annotation.image_path),
303
+ 'embedding_id': self.embedding_id,
304
+ 'color': self.effective_color
305
+ }
306
+
307
+ def get_tooltip_text(self):
308
+ """
309
+ Generates a rich HTML-formatted tooltip with all relevant information.
310
+ """
311
+ info = self.get_display_info()
312
+
313
+ tooltip_parts = [
314
+ f"<b>ID:</b> {info['id']}",
315
+ f"<b>Image:</b> {info['image']}",
316
+ f"<b>Label:</b> {info['label']}",
317
+ f"<b>Type:</b> {info['type']}"
318
+ ]
319
+
320
+ # Add prediction details if they exist
321
+ if self.prediction_details:
322
+ tooltip_parts.append(f"<hr>{self.prediction_details}")
323
+
324
+ return "<br>".join(tooltip_parts)
325
+
326
+ def get_effective_confidence(self):
327
+ """Get the effective confidence value."""
328
+ # First check if prediction probabilities are available from model predictions
329
+ if hasattr(self, 'prediction_probabilities') and self.prediction_probabilities is not None:
330
+ if len(self.prediction_probabilities) > 0:
331
+ # Use the maximum probability for confidence sorting
332
+ return float(np.max(self.prediction_probabilities))
333
+
334
+ # Fallback to existing confidence values
335
+ if self.annotation.verified and hasattr(self.annotation, 'user_confidence') and self.annotation.user_confidence:
336
+ return list(self.annotation.user_confidence.values())[0]
337
+ elif hasattr(self.annotation, 'machine_confidence') and self.annotation.machine_confidence:
338
+ return list(self.annotation.machine_confidence.values())[0]
339
+ return 0.0