coralnet-toolbox 0.0.76__tar.gz → 0.0.77__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 (260) hide show
  1. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/PKG-INFO +1 -1
  2. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Common/QtGraphicsUtility.py +18 -8
  3. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/IO/QtExportMaskAnnotations.py +45 -6
  4. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/IO/QtImportImages.py +7 -15
  5. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/IO/QtOpenProject.py +15 -19
  6. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/ImportDataset/QtBase.py +33 -8
  7. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/QtAnnotationWindow.py +4 -0
  8. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/QtEventFilter.py +1 -1
  9. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/QtImageWindow.py +4 -0
  10. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Rasters/RasterManager.py +5 -2
  11. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/SeeAnything/QtDeployGenerator.py +312 -170
  12. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Tools/QtPatchTool.py +6 -2
  13. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Tools/QtPolygonTool.py +5 -3
  14. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Tools/QtRectangleTool.py +17 -9
  15. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Tools/QtSAMTool.py +4 -0
  16. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Tools/QtSeeAnythingTool.py +4 -0
  17. coralnet_toolbox-0.0.77/coralnet_toolbox/Tools/QtTool.py +156 -0
  18. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Tools/QtWorkAreaTool.py +4 -0
  19. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Transformers/Models/QtBase.py +2 -1
  20. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/__init__.py +1 -1
  21. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox.egg-info/PKG-INFO +1 -1
  22. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox.egg-info/SOURCES.txt +0 -1
  23. coralnet_toolbox-0.0.77/diagram.svg +1 -0
  24. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/pyproject.toml +2 -2
  25. coralnet_toolbox-0.0.76/coralnet_toolbox/Tools/QtTool.py +0 -80
  26. coralnet_toolbox-0.0.76/diagram.svg +0 -1
  27. coralnet_toolbox-0.0.76/uv.lock +0 -1754
  28. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/.editorconfig +0 -0
  29. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/.gitallowed +0 -0
  30. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  31. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  32. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  33. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/.github/ISSUE_TEMPLATE/general_question.md +0 -0
  34. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/.github/workflows/diagram.yml +0 -0
  35. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/.github/workflows/docs-build.yml +0 -0
  36. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/.github/workflows/docs.yml +0 -0
  37. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/.github/workflows/installation.yml +0 -0
  38. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/.github/workflows/macos.yml +0 -0
  39. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/.github/workflows/pypi.yml +0 -0
  40. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/.github/workflows/ubuntu.yml +0 -0
  41. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/.github/workflows/windows.yml +0 -0
  42. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/.gitignore +0 -0
  43. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/LICENSE.txt +0 -0
  44. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/MANIFEST.in +0 -0
  45. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/README.md +0 -0
  46. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Annotations/QtAnnotation.py +0 -0
  47. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Annotations/QtMaskAnnotation.py +0 -0
  48. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Annotations/QtMultiPolygonAnnotation.py +0 -0
  49. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Annotations/QtPatchAnnotation.py +0 -0
  50. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Annotations/QtPolygonAnnotation.py +0 -0
  51. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Annotations/QtRectangleAnnotation.py +0 -0
  52. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Annotations/__init__.py +0 -0
  53. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/BreakTime/QtBreakout.py +0 -0
  54. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/BreakTime/QtSnake.py +0 -0
  55. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/BreakTime/__init__.py +0 -0
  56. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Common/QtMarginInput.py +0 -0
  57. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Common/QtOverlapInput.py +0 -0
  58. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Common/QtTileSizeInput.py +0 -0
  59. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Common/QtUpdateImagePaths.py +0 -0
  60. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/CoralNet/QtAuthenticate.py +0 -0
  61. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/CoralNet/QtDownload.py +0 -0
  62. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/CoralNet/__init__.py +0 -0
  63. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Explorer/QtDataItem.py +0 -0
  64. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Explorer/QtExplorer.py +0 -0
  65. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Explorer/QtFeatureStore.py +0 -0
  66. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Explorer/QtSettingsWidgets.py +0 -0
  67. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Explorer/QtViewers.py +0 -0
  68. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Explorer/__init__.py +0 -0
  69. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Explorer/transformer_models.py +0 -0
  70. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Explorer/yolo_models.py +0 -0
  71. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/IO/QtExportAnnotations.py +0 -0
  72. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/IO/QtExportCoralNetAnnotations.py +0 -0
  73. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/IO/QtExportGeoJSONAnnotations.py +0 -0
  74. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/IO/QtExportLabels.py +0 -0
  75. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/IO/QtExportTagLabAnnotations.py +0 -0
  76. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/IO/QtExportTagLabLabels.py +0 -0
  77. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/IO/QtExportViscoreAnnotations.py +0 -0
  78. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/IO/QtImportAnnotations.py +0 -0
  79. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/IO/QtImportCoralNetAnnotations.py +0 -0
  80. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/IO/QtImportCoralNetLabels.py +0 -0
  81. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/IO/QtImportFrames.py +0 -0
  82. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/IO/QtImportLabels.py +0 -0
  83. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/IO/QtImportTagLabAnnotations.py +0 -0
  84. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/IO/QtImportTagLabLabels.py +0 -0
  85. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/IO/QtImportViscoreAnnotations.py +0 -0
  86. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/IO/QtSaveProject.py +0 -0
  87. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/IO/__init__.py +0 -0
  88. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/1.png +0 -0
  89. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/2.png +0 -0
  90. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/3.png +0 -0
  91. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/4.png +0 -0
  92. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/5.png +0 -0
  93. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/__init__.py +0 -0
  94. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/add.png +0 -0
  95. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/all.png +0 -0
  96. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/apple.png +0 -0
  97. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/breakout.png +0 -0
  98. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/coral.png +0 -0
  99. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/edit.png +0 -0
  100. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/eye.png +0 -0
  101. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/hide.png +0 -0
  102. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/home.png +0 -0
  103. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/lock.png +0 -0
  104. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/machine.png +0 -0
  105. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/magic.png +0 -0
  106. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/opaque.png +0 -0
  107. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/parameters.png +0 -0
  108. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/patch.png +0 -0
  109. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/polygon.png +0 -0
  110. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/rabbit.png +0 -0
  111. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/rectangle.png +0 -0
  112. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/remove.png +0 -0
  113. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/rocket.png +0 -0
  114. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/select.png +0 -0
  115. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/settings.png +0 -0
  116. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/snake.png +0 -0
  117. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/system_monitor.png +0 -0
  118. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/target.png +0 -0
  119. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/tile.png +0 -0
  120. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/transparent.png +0 -0
  121. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/turtle.png +0 -0
  122. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/unlock.png +0 -0
  123. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/user.png +0 -0
  124. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/wizard.png +0 -0
  125. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/workarea.png +0 -0
  126. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Icons/www.png +0 -0
  127. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/BatchInference/QtBase.py +0 -0
  128. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/BatchInference/QtClassify.py +0 -0
  129. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/BatchInference/QtDetect.py +0 -0
  130. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/BatchInference/QtSegment.py +0 -0
  131. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/BatchInference/__init__.py +0 -0
  132. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/Community/cfg/__init__.py +0 -0
  133. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/Community/cfg/classify/convnext_tiny.yaml +0 -0
  134. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/Community/cfg/classify/efficientnet_b0.yaml +0 -0
  135. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/Community/cfg/classify/mobilenet_v3_large.yaml +0 -0
  136. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/Community/cfg/classify/swin_t.yaml +0 -0
  137. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/Community/cfg/detect/convnext_tiny.yaml +0 -0
  138. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/Community/cfg/detect/mobilenet_v3_large-fpn.yaml +0 -0
  139. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/Community/cfg/detect/mobilenet_v3_small-fpn.yaml +0 -0
  140. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/Community/cfg/detect/resnet101.yaml +0 -0
  141. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/Community/cfg/detect/swin_t-fpn.yaml +0 -0
  142. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/Community/cfg/detect/swin_t.yaml +0 -0
  143. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/Community/cfg/detect/yolo11-p2.yaml +0 -0
  144. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/Community/cfg/detect/yolo11-p6.yaml +0 -0
  145. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/Community/cfg/segment/convnext_tiny.yaml +0 -0
  146. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/Community/cfg/segment/swin_t-fpn.yaml +0 -0
  147. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/Community/cfg/segment/swin_t.yaml +0 -0
  148. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/Community/cfg/segment/yolo11-p2.yaml +0 -0
  149. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/Community/cfg/segment/yolo11-p6.yaml +0 -0
  150. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/ConfusionMatrix.py +0 -0
  151. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/DeployModel/QtBase.py +0 -0
  152. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/DeployModel/QtClassify.py +0 -0
  153. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/DeployModel/QtDetect.py +0 -0
  154. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/DeployModel/QtSegment.py +0 -0
  155. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/DeployModel/__init__.py +0 -0
  156. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/EvaluateModel/QtBase.py +0 -0
  157. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/EvaluateModel/QtClassify.py +0 -0
  158. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/EvaluateModel/QtDetect.py +0 -0
  159. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/EvaluateModel/QtSegment.py +0 -0
  160. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/EvaluateModel/__init__.py +0 -0
  161. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/ExportDataset/QtBase.py +0 -0
  162. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/ExportDataset/QtClassify.py +0 -0
  163. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/ExportDataset/QtDetect.py +0 -0
  164. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/ExportDataset/QtSegment.py +0 -0
  165. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/ExportDataset/__init__.py +0 -0
  166. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/ImportDataset/QtDetect.py +0 -0
  167. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/ImportDataset/QtSegment.py +0 -0
  168. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/ImportDataset/__init__.py +0 -0
  169. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/MergeDatasets/QtBase.py +0 -0
  170. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/MergeDatasets/QtClassify.py +0 -0
  171. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/MergeDatasets/__init__.py +0 -0
  172. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/OptimizeModel/QtBase.py +0 -0
  173. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/OptimizeModel/__init__.py +0 -0
  174. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/TrainModel/QtBase.py +0 -0
  175. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/TrainModel/QtClassify.py +0 -0
  176. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/TrainModel/QtDetect.py +0 -0
  177. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/TrainModel/QtSegment.py +0 -0
  178. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/TrainModel/__init__.py +0 -0
  179. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/TuneModel/QtBase.py +0 -0
  180. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/TuneModel/QtClassify.py +0 -0
  181. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/TuneModel/QtDetect.py +0 -0
  182. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/TuneModel/QtSegment.py +0 -0
  183. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/TuneModel/__init__.py +0 -0
  184. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/TuneModel/tuner.py +0 -0
  185. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/VideoInference/QtBase.py +0 -0
  186. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/VideoInference/QtClassify.py +0 -0
  187. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/VideoInference/QtDetect.py +0 -0
  188. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/VideoInference/QtInference.py +0 -0
  189. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/VideoInference/QtSegment.py +0 -0
  190. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/VideoInference/QtVideoWidget.py +0 -0
  191. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/VideoInference/YOLO3D/__init__.py +0 -0
  192. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/VideoInference/YOLO3D/bbox3d_utils.py +0 -0
  193. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/VideoInference/YOLO3D/depth_model.py +0 -0
  194. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/VideoInference/YOLO3D/detection_model.py +0 -0
  195. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/VideoInference/YOLO3D/load_camera_params.py +0 -0
  196. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/VideoInference/YOLO3D/run.py +0 -0
  197. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/VideoInference/__init__.py +0 -0
  198. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/VideoInference/analytics.py +0 -0
  199. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/WeightedDataset.py +0 -0
  200. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/MachineLearning/__init__.py +0 -0
  201. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/QtConfidenceWindow.py +0 -0
  202. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/QtLabelWindow.py +0 -0
  203. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/QtMainWindow.py +0 -0
  204. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/QtPatchSampling.py +0 -0
  205. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/QtProgressBar.py +0 -0
  206. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/QtSystemMonitor.py +0 -0
  207. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/QtWorkArea.py +0 -0
  208. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Rasters/ImageFilter.py +0 -0
  209. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Rasters/QtRaster.py +0 -0
  210. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Rasters/RasterTableModel.py +0 -0
  211. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Rasters/__init__.py +0 -0
  212. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Results/CombineResults.py +0 -0
  213. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Results/ConvertResults.py +0 -0
  214. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Results/MapResults.py +0 -0
  215. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Results/Masks.py +0 -0
  216. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Results/ResultsProcessor.py +0 -0
  217. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Results/__init__.py +0 -0
  218. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/SAM/QtBatchInference.py +0 -0
  219. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/SAM/QtDeployGenerator.py +0 -0
  220. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/SAM/QtDeployPredictor.py +0 -0
  221. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/SAM/__init__.py +0 -0
  222. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/SeeAnything/QtBatchInference.py +0 -0
  223. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/SeeAnything/QtDeployPredictor.py +0 -0
  224. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/SeeAnything/QtTrainModel.py +0 -0
  225. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/SeeAnything/__init__.py +0 -0
  226. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Tile/QtTileBatchInference.py +0 -0
  227. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Tile/QtTileCreation.py +0 -0
  228. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Tile/TileDataset/QtBase.py +0 -0
  229. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Tile/TileDataset/QtClassify.py +0 -0
  230. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Tile/TileDataset/QtDetect.py +0 -0
  231. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Tile/TileDataset/QtSegment.py +0 -0
  232. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Tile/TileDataset/__init__.py +0 -0
  233. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Tile/__init__.py +0 -0
  234. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Tools/QtCutSubTool.py +0 -0
  235. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Tools/QtMoveSubTool.py +0 -0
  236. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Tools/QtPanTool.py +0 -0
  237. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Tools/QtResizeSubTool.py +0 -0
  238. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Tools/QtSelectSubTool.py +0 -0
  239. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Tools/QtSelectTool.py +0 -0
  240. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Tools/QtSubTool.py +0 -0
  241. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Tools/QtSubtractSubTool.py +0 -0
  242. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Tools/QtZoomTool.py +0 -0
  243. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Tools/__init__.py +0 -0
  244. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Transformers/Models/GroundingDINO.py +0 -0
  245. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Transformers/Models/OWLViT.py +0 -0
  246. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Transformers/Models/OmDetTurbo.py +0 -0
  247. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Transformers/Models/__init__.py +0 -0
  248. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Transformers/QtBatchInference.py +0 -0
  249. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Transformers/QtDeployModel.py +0 -0
  250. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/Transformers/__init__.py +0 -0
  251. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/main.py +0 -0
  252. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox/utilities.py +0 -0
  253. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox.egg-info/dependency_links.txt +0 -0
  254. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox.egg-info/entry_points.txt +0 -0
  255. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox.egg-info/requires.txt +0 -0
  256. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/coralnet_toolbox.egg-info/top_level.txt +0 -0
  257. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/mkdocs.yml +0 -0
  258. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/requirements.txt +0 -0
  259. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/requirements_dev.txt +0 -0
  260. {coralnet_toolbox-0.0.76 → coralnet_toolbox-0.0.77}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: coralnet-toolbox
3
- Version: 0.0.76
3
+ Version: 0.0.77
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
@@ -1,18 +1,17 @@
1
1
  import warnings
2
2
 
3
- warnings.filterwarnings("ignore", category=DeprecationWarning)
4
- warnings.filterwarnings("ignore", category=UserWarning)
5
-
6
- import os
7
3
 
4
+ from PyQt5.QtCore import Qt
5
+ from PyQt5.QtGui import QPen, QColor
8
6
  from PyQt5.QtWidgets import (QVBoxLayout, QLabel, QGroupBox, QFormLayout,
9
7
  QDoubleSpinBox, QComboBox, QSpinBox, QHBoxLayout,
10
8
  QWidget, QStackedWidget, QGridLayout, QMessageBox,
11
9
  QDialog, QListWidget, QPushButton, QFileDialog,
12
- QGraphicsView)
13
- from PyQt5.QtCore import Qt
10
+ QGraphicsView, QGraphicsLineItem)
11
+
14
12
 
15
- from coralnet_toolbox.Icons import get_icon
13
+ warnings.filterwarnings("ignore", category=DeprecationWarning)
14
+ warnings.filterwarnings("ignore", category=UserWarning)
16
15
 
17
16
 
18
17
  # ----------------------------------------------------------------------------------------------------------------------
@@ -161,4 +160,15 @@ class GraphicsUtility:
161
160
 
162
161
  view_width = round(extent.width())
163
162
  view_height = round(extent.height())
164
- return max(2, min(5, max(view_width, view_height) // 1000))
163
+ return max(2, min(5, max(view_width, view_height) // 1000))
164
+
165
+ @staticmethod
166
+ def create_guide_line(start_point, end_point):
167
+ """Create a semi-transparent guide line for crosshairs."""
168
+ line = QGraphicsLineItem(start_point.x(), start_point.y(), end_point.x(), end_point.y())
169
+ pen = QPen(QColor(255, 255, 255, 180)) # Semi-transparent white
170
+ pen.setWidth(1)
171
+ pen.setStyle(Qt.DashLine)
172
+ line.setPen(pen)
173
+ line.setZValue(1000) # Ensure it's drawn on top of other elements
174
+ return line
@@ -585,14 +585,53 @@ class ExportMaskAnnotations(QDialog):
585
585
  if not has_annotations and not self.include_negative_samples_checkbox.isChecked():
586
586
  return
587
587
 
588
- # Always save as PNG
589
- filename = f"{os.path.splitext(os.path.basename(image_path))[0]}.png"
588
+ # Use the selected file format
589
+ filename = f"{os.path.splitext(os.path.basename(image_path))[0]}{self.file_format}"
590
590
  mask_path = os.path.join(output_path, filename)
591
591
 
592
- if self.mask_mode == 'rgb':
593
- # OpenCV expects BGR, so convert from RGB
594
- mask = cv2.cvtColor(mask, cv2.COLOR_RGB2BGR)
595
- cv2.imwrite(mask_path, mask)
592
+ # Check if we need to preserve georeferencing
593
+ use_georef = has_georef and self.preserve_georef_checkbox.isChecked() and self.file_format.lower() == '.tif'
594
+
595
+ if use_georef:
596
+ # Save with georeferencing using rasterio
597
+ if self.mask_mode == 'rgb':
598
+ # For RGB, we need to convert to the expected channel order for rasterio
599
+ # rasterio expects (bands, height, width) with R,G,B channel order
600
+ mask_transposed = np.transpose(mask, (2, 0, 1))
601
+ with rasterio.open(
602
+ mask_path,
603
+ 'w',
604
+ driver='GTiff',
605
+ height=height,
606
+ width=width,
607
+ count=3,
608
+ dtype=mask.dtype,
609
+ crs=crs,
610
+ transform=transform
611
+ ) as dst:
612
+ dst.write(mask_transposed)
613
+ else:
614
+ # For single-channel masks
615
+ with rasterio.open(
616
+ mask_path,
617
+ 'w',
618
+ driver='GTiff',
619
+ height=height,
620
+ width=width,
621
+ count=1,
622
+ dtype=mask.dtype,
623
+ crs=crs,
624
+ transform=transform
625
+ ) as dst:
626
+ dst.write(mask, 1)
627
+ else:
628
+ # Use cv2 for non-georeferenced output
629
+ if self.mask_mode == 'rgb':
630
+ # OpenCV expects BGR, so convert from RGB
631
+ mask = cv2.cvtColor(mask, cv2.COLOR_RGB2BGR)
632
+
633
+ # Save using the appropriate format
634
+ cv2.imwrite(mask_path, mask)
596
635
 
597
636
  def export_metadata(self, output_path):
598
637
  if self.mask_mode == 'semantic':
@@ -50,7 +50,6 @@ class ImportImages:
50
50
 
51
51
  def _process_image_files(self, file_names):
52
52
  """Helper method to process a list of image files with progress tracking."""
53
- # Make the cursor busy
54
53
  QApplication.setOverrideCursor(Qt.WaitCursor)
55
54
 
56
55
  progress_bar = ProgressBar(self.image_window, title="Importing Images")
@@ -58,30 +57,24 @@ class ImportImages:
58
57
  progress_bar.start_progress(len(file_names))
59
58
 
60
59
  try:
61
- # Keep track of successfully imported images
62
60
  imported_paths = []
63
61
 
64
- # Add images to the image window's raster manager
62
+ # Add images directly to the manager without emitting signals
65
63
  for file_name in file_names:
66
- # Check if the image is already in the raster manager
67
64
  if file_name not in self.image_window.raster_manager.image_paths:
68
- try:
69
- # Use the image window's add_image method which handles the raster manager
70
- if self.image_window.add_image(file_name):
71
- imported_paths.append(file_name)
72
- except Exception as e:
73
- print(f"Warning: Could not import image {file_name}. Error: {e}")
65
+ # Call the manager directly to add the raster silently,
66
+ # bypassing ImageWindow.add_image and its signal handlers.
67
+ if self.image_window.raster_manager.add_raster(file_name, emit_signal=False):
68
+ imported_paths.append(file_name)
74
69
  else:
75
- # Image already exists
76
70
  imported_paths.append(file_name)
77
71
 
78
- # Update the progress bar
79
72
  progress_bar.update_progress()
80
73
 
81
- # Apply filtering to update the view
74
+ # After the silent loop, manually update the UI exactly once.
75
+ self.image_window.update_search_bars()
82
76
  self.image_window.filter_images()
83
77
 
84
- # Show the last imported image if any were imported
85
78
  if imported_paths:
86
79
  self.image_window.load_image_by_path(imported_paths[-1])
87
80
 
@@ -89,7 +82,6 @@ class ImportImages:
89
82
  except Exception as e:
90
83
  self._show_error_message(str(e))
91
84
  finally:
92
- # Restore the cursor to the default cursor
93
85
  QApplication.restoreOverrideCursor()
94
86
  progress_bar.stop_progress()
95
87
  progress_bar.close()
@@ -163,46 +163,42 @@ class OpenProject(QDialog):
163
163
  # Exit
164
164
  self.accept()
165
165
 
166
+ # In: QtOpenProject.py
167
+
166
168
  def import_images(self, images_data, legacy_workareas=None):
167
169
  """Import images, states, and work areas from the given data."""
168
170
  if not images_data:
169
171
  return
170
172
 
171
- # Determine if the format is old (list of strings) or new (list of dicts)
172
173
  is_new_format = isinstance(images_data[0], dict)
173
-
174
174
  image_paths = [img['path'] for img in images_data] if is_new_format else images_data
175
175
 
176
176
  if not all([os.path.exists(path) for path in image_paths]):
177
177
  image_paths, self.updated_paths = UpdateImagePaths.update_paths(image_paths)
178
178
 
179
- # Start progress bar
180
179
  total_images = len(image_paths)
181
180
  progress_bar = ProgressBar(self.image_window, title="Importing Images")
182
181
  progress_bar.show()
183
182
  progress_bar.start_progress(total_images)
184
183
 
185
184
  try:
186
- # Create a map for quick data lookup if using the new format
187
185
  image_data_map = {img['path']: img for img in images_data} if is_new_format else {}
188
186
 
189
- # Add images to the image window's raster manager one by one
187
+ # Add images directly to the manager without emitting signals
190
188
  for path in image_paths:
191
- self.image_window.add_image(path)
189
+ # Call the manager directly to add the raster silently
190
+ self.image_window.raster_manager.add_raster(path, emit_signal=False)
191
+
192
192
  raster = self.image_window.raster_manager.get_raster(path)
193
193
  if not raster:
194
+ progress_bar.update_progress()
194
195
  continue
195
196
 
196
- # If using the new format, apply saved state and work areas
197
197
  if is_new_format and path in image_data_map:
198
198
  data = image_data_map[path]
199
199
  state = data.get('state', {})
200
200
  work_areas_list = data.get('work_areas', [])
201
-
202
- # Apply raster state
203
201
  raster.checkbox_state = state.get('checkbox_state', False)
204
-
205
- # Import work areas for this image
206
202
  for work_area_data in work_areas_list:
207
203
  try:
208
204
  work_area = WorkArea.from_dict(work_area_data, path)
@@ -210,10 +206,8 @@ class OpenProject(QDialog):
210
206
  except Exception as e:
211
207
  print(f"Warning: Could not import work area {work_area_data}: {str(e)}")
212
208
 
213
- # Update the progress bar
214
209
  progress_bar.update_progress()
215
-
216
- # Handle backward compatibility for old, top-level work areas
210
+
217
211
  if legacy_workareas:
218
212
  for image_path, work_areas_list in legacy_workareas.items():
219
213
  current_path = self.updated_paths.get(image_path, image_path)
@@ -223,16 +217,18 @@ class OpenProject(QDialog):
223
217
  work_area = WorkArea.from_dict(work_area_data, current_path)
224
218
  raster.add_work_area(work_area)
225
219
 
226
- # Show the last image if any were imported
227
- if self.image_window.raster_manager.image_paths:
228
- self.image_window.load_image_by_path(self.image_window.raster_manager.image_paths[-1])
229
-
230
220
  except Exception as e:
231
221
  QMessageBox.warning(self.annotation_window,
232
222
  "Error Importing Image(s)",
233
223
  f"An error occurred while importing image(s): {str(e)}")
234
224
  finally:
235
- # Close progress bar
225
+ # Manually perform the UI updates ONCE for all imported images
226
+ self.image_window.update_search_bars()
227
+ self.image_window.filter_images()
228
+
229
+ if self.image_window.raster_manager.image_paths:
230
+ self.image_window.load_image_by_path(self.image_window.raster_manager.image_paths[-1])
231
+
236
232
  progress_bar.stop_progress()
237
233
  progress_bar.close()
238
234
 
@@ -346,6 +346,8 @@ class Base(QDialog):
346
346
  self.button_box.rejected.connect(self.reject)
347
347
  self.layout.addWidget(self.button_box)
348
348
 
349
+ # In: QtBase.py
350
+
349
351
  def browse_data_yaml(self):
350
352
  """Open a file dialog to select the data YAML file and populate advanced options."""
351
353
  options = QFileDialog.Options()
@@ -358,22 +360,40 @@ class Base(QDialog):
358
360
  try:
359
361
  with open(file_path, 'r') as file:
360
362
  data = yaml.safe_load(file)
361
- class_names = data.get('names', [])
362
- if not class_names:
363
- QMessageBox.warning(self, "Warning", "Could not find a 'names' list in the selected YAML file.")
363
+
364
+ names_data = data.get('names')
365
+ if not names_data:
366
+ QMessageBox.warning(self, "Warning", "Could not find a 'names' entry in the selected YAML file.")
364
367
  return
365
368
 
369
+ # Handle both dictionary and list formats for class names
370
+ names_to_display = []
371
+ if isinstance(names_data, dict):
372
+ # If it's a dictionary (e.g., {0: 'coral'}), extract the values, sorting by key
373
+ # to preserve the intended class order.
374
+ names_to_display = [str(names_data[key]) for key in sorted(names_data.keys())]
375
+ elif isinstance(names_data, list):
376
+ # If it's already a list, use it directly.
377
+ names_to_display = [str(name) for name in names_data]
378
+ else:
379
+ # Handle any other unexpected format.
380
+ QMessageBox.warning(self, "Format Error",
381
+ f"The 'names' entry in the YAML has an unexpected format: {type(names_data)}.")
382
+ return
383
+
366
384
  self.yaml_path_label.setText(file_path)
367
385
  yaml_dir = os.path.dirname(file_path)
368
386
  self.output_dir_label.setText(yaml_dir)
369
387
  self.output_folder_name.setText("data")
370
388
 
389
+ # Clear any existing checkboxes before adding new ones
371
390
  for checkbox in self.class_checkboxes:
372
391
  self.class_layout.removeWidget(checkbox)
373
392
  checkbox.deleteLater()
374
393
  self.class_checkboxes.clear()
375
394
 
376
- for name in class_names:
395
+ # Create checkboxes using the processed list of names
396
+ for name in names_to_display:
377
397
  checkbox = QCheckBox(name)
378
398
  checkbox.setChecked(True)
379
399
  self.class_layout.addWidget(checkbox)
@@ -504,8 +524,11 @@ class Base(QDialog):
504
524
  added_paths = []
505
525
  progress_bar.set_title(f"Adding {len(image_paths)} images...")
506
526
  progress_bar.start_progress(len(image_paths))
527
+
507
528
  for path in image_paths:
508
- if self.image_window.add_image(path):
529
+ # Call the manager directly to add the raster silently,
530
+ # bypassing ImageWindow.add_image and its signal handlers.
531
+ if self.image_window.raster_manager.add_raster(path, emit_signal=False):
509
532
  added_paths.append(path)
510
533
  progress_bar.update_progress()
511
534
 
@@ -535,19 +558,21 @@ class Base(QDialog):
535
558
  self.main_window.get_transparency_value())
536
559
 
537
560
  self.annotation_window.add_annotation_to_dict(annotation)
538
- newly_created_annotations.append(annotation) # Collect created objects
561
+ newly_created_annotations.append(annotation)
539
562
 
540
563
  progress_bar.update_progress()
541
564
 
542
- # --- Call the restored, correct export function ---
543
565
  progress_bar.set_title("Exporting annotations.json...")
544
566
  self._export_annotations_to_json(newly_created_annotations, self.output_folder)
545
567
 
546
568
  progress_bar.finish_progress()
547
569
  progress_bar.stop_progress()
548
570
  progress_bar.close()
549
-
571
+
572
+ # Manually perform a full UI update exactly once.
573
+ self.image_window.update_search_bars()
550
574
  self.image_window.filter_images()
575
+
551
576
  if added_paths:
552
577
  self.image_window.load_image_by_path(added_paths[-1])
553
578
  self.image_window.update_image_annotations(added_paths[-1])
@@ -401,6 +401,10 @@ class AnnotationWindow(QGraphicsView):
401
401
  self.current_image_path = image_path
402
402
  self.active_image = True
403
403
 
404
+ # Automatically mark this image as checked when viewed
405
+ raster.checkbox_state = True
406
+ self.main_window.image_window.table_model.update_raster_data(image_path)
407
+
404
408
  self.tools["zoom"].reset_zoom()
405
409
  self.scene.addItem(QGraphicsPixmapItem(self.pixmap_image))
406
410
  self.fitInView(self.scene.sceneRect(), Qt.KeepAspectRatio)
@@ -13,7 +13,7 @@ warnings.filterwarnings("ignore", category=DeprecationWarning)
13
13
 
14
14
  class GlobalEventFilter(QObject):
15
15
  def __init__(self, main_window):
16
- super().__init__()
16
+ super().__init__(main_window)
17
17
  self.main_window = main_window
18
18
  self.label_window = main_window.label_window
19
19
  self.annotation_window = main_window.annotation_window
@@ -667,6 +667,10 @@ class ImageWindow(QWidget):
667
667
  # Get the raster
668
668
  raster = self.raster_manager.get_raster(image_path)
669
669
 
670
+ # Mark as checked when viewed
671
+ raster.checkbox_state = True
672
+ self.table_model.update_raster_data(image_path)
673
+
670
674
  # Update selection
671
675
  self.selected_image_path = image_path
672
676
  self.table_model.set_selected_path(image_path)
@@ -31,7 +31,7 @@ class RasterManager(QObject):
31
31
  self.rasters: Dict[str, Raster] = {}
32
32
  self.image_paths: List[str] = []
33
33
 
34
- def add_raster(self, image_path: str) -> bool:
34
+ def add_raster(self, image_path: str, emit_signal: bool = True) -> bool:
35
35
  """
36
36
  Add a new raster to the manager.
37
37
 
@@ -51,7 +51,10 @@ class RasterManager(QObject):
51
51
 
52
52
  self.rasters[image_path] = raster
53
53
  self.image_paths.append(image_path)
54
- self.rasterAdded.emit(image_path)
54
+
55
+ if emit_signal:
56
+ self.rasterAdded.emit(image_path)
57
+
55
58
  return True
56
59
 
57
60
  except Exception as e: