labelimgplusplus 2.3.1__tar.gz → 2.3.3__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 (66) hide show
  1. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/HISTORY.rst +84 -0
  2. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/PKG-INFO +4 -5
  3. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/README.rst +1 -1
  4. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/labelImgPlusPlus.py +214 -631
  5. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/labelimgplusplus.egg-info/PKG-INFO +4 -5
  6. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/labelimgplusplus.egg-info/SOURCES.txt +7 -0
  7. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/__init__.py +2 -2
  8. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/core/commands.py +7 -3
  9. labelimgplusplus-2.3.3/libs/core/settings.py +119 -0
  10. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/core/shape.py +2 -2
  11. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/core/shortcut_config.py +21 -6
  12. labelimgplusplus-2.3.3/libs/data/predefined_classes.txt +15 -0
  13. labelimgplusplus-2.3.3/libs/formats/annotation_loader.py +87 -0
  14. labelimgplusplus-2.3.3/libs/formats/annotation_probe.py +197 -0
  15. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/formats/coco_io.py +22 -12
  16. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/formats/create_ml_io.py +21 -9
  17. labelimgplusplus-2.3.3/libs/formats/format_metadata.py +80 -0
  18. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/formats/labelFile.py +9 -8
  19. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/formats/pascal_voc_io.py +16 -7
  20. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/formats/yolo_io.py +21 -3
  21. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/formats/yolo_seg_io.py +20 -8
  22. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/resources.py +43 -43
  23. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/tools/dataset_splitter.py +83 -27
  24. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/tools/label_checker.py +0 -2
  25. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/utils/stringBundle.py +3 -2
  26. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/utils/styles.py +3 -1
  27. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/utils/utils.py +3 -3
  28. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/widgets/canvas.py +104 -18
  29. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/widgets/galleryWidget.py +5 -3
  30. labelimgplusplus-2.3.3/libs/widgets/gallery_status_controller.py +91 -0
  31. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/widgets/keypointPanel.py +18 -8
  32. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/widgets/shortcutsDialog.py +23 -10
  33. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/widgets/splitDialog.py +11 -1
  34. labelimgplusplus-2.3.3/libs/widgets/stats_controller.py +89 -0
  35. labelimgplusplus-2.3.3/libs/widgets/view_scaling.py +39 -0
  36. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/pyproject.toml +3 -4
  37. labelimgplusplus-2.3.1/libs/core/settings.py +0 -50
  38. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/CONTRIBUTING.rst +0 -0
  39. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/LICENSE +0 -0
  40. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/MANIFEST.in +0 -0
  41. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/data/predefined_classes.txt +0 -0
  42. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/labelimgplusplus.egg-info/dependency_links.txt +0 -0
  43. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/labelimgplusplus.egg-info/entry_points.txt +0 -0
  44. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/labelimgplusplus.egg-info/requires.txt +0 -0
  45. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/labelimgplusplus.egg-info/top_level.txt +0 -0
  46. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/core/__init__.py +0 -0
  47. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/core/keypoint_config.py +0 -0
  48. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/formats/__init__.py +0 -0
  49. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/tools/__init__.py +0 -0
  50. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/utils/__init__.py +0 -0
  51. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/utils/constants.py +0 -0
  52. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/utils/hashableQListWidgetItem.py +0 -0
  53. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/utils/ustr.py +0 -0
  54. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/widgets/__init__.py +0 -0
  55. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/widgets/batchVerifyDialog.py +0 -0
  56. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/widgets/colorDialog.py +0 -0
  57. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/widgets/combobox.py +0 -0
  58. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/widgets/default_label_combobox.py +0 -0
  59. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/widgets/labelCheckerDialog.py +0 -0
  60. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/widgets/labelDialog.py +0 -0
  61. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/widgets/lightWidget.py +0 -0
  62. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/widgets/statsWidget.py +0 -0
  63. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/widgets/toolBar.py +0 -0
  64. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/libs/widgets/zoomWidget.py +0 -0
  65. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/resources.qrc +0 -0
  66. {labelimgplusplus-2.3.1 → labelimgplusplus-2.3.3}/setup.cfg +0 -0
@@ -1,6 +1,90 @@
1
1
  History
2
2
  =======
3
3
 
4
+ 2.3.3 (2026-06-09)
5
+ ------------------
6
+
7
+ Security, correctness, and reliability release. Hardens settings storage and
8
+ annotation parsing against untrusted input, closes several undo/redo gaps, and
9
+ decomposes the monolithic main window into focused, unit-tested modules. No new
10
+ features and no breaking changes.
11
+
12
+ Security
13
+ ~~~~~~~~
14
+
15
+ * Store user settings as JSON instead of a Python pickle, removing an
16
+ arbitrary-code-execution vector (the old ``~/.labelImgSettings.pkl`` is no
17
+ longer read; settings start fresh on upgrade)
18
+ * Harden the PASCAL VOC XML reader against entity-expansion (billion-laughs)
19
+ and external-entity / network (XXE) attacks
20
+
21
+ Bug fixes
22
+ ~~~~~~~~~
23
+
24
+ * Make whole-shape moves, rectangle resizes, arrow-key nudges, the
25
+ context-menu "Move here", and in-mode keypoint Ctrl-Z all undoable — these
26
+ mutations previously bypassed the undo stack (#68)
27
+ * Defer the annotation-format switch until the reader succeeds for the YOLO and
28
+ PASCAL VOC loaders, so a malformed file no longer flips the saved format;
29
+ PASCAL VOC now reports parse errors gracefully instead of crashing (#69)
30
+ * Stop PASCAL VOC bounding-box coordinate data loss on save (round rather than
31
+ truncate), and round polygon coordinates likewise
32
+ * Harden the COCO, YOLO-seg, and CreateML readers against malformed input
33
+ * Report a clear error instead of crashing when an annotation file is opened
34
+ as an image
35
+ * Restore label-list ordering on delete and refresh the label combo on edit so
36
+ undo/redo stays consistent
37
+ * Surface batch-verify failures instead of silently swallowing them
38
+ * Validate imported shortcut configurations instead of crashing on bad input
39
+ * Deep-copy points in ``Shape.copy()`` and preserve a ``None`` label
40
+ * Correct the label-fix status message and make "Reset All" relaunch through
41
+ the Python interpreter so installed entry points restart correctly
42
+ * Theme the gallery regardless of the thumbnail-size slider, and source the
43
+ keypoint-panel and shortcuts-dialog colors from the active palette
44
+ * Zoom-scale the keypoint hit-test and cache the canvas overlay composite
45
+
46
+ Packaging
47
+ ~~~~~~~~~
48
+
49
+ * Ship the default class list inside the installed wheel
50
+ * Require Python >= 3.8 and drop dead Py2 / Qt4 shims
51
+
52
+ Internal
53
+ ~~~~~~~~
54
+
55
+ * Decompose the ~3,700-line ``MainWindow``: extract annotation loading,
56
+ fit-to-window scaling, the statistics controller, the gallery
57
+ status-refresh controller, and the format-metadata registry into focused,
58
+ unit-tested modules
59
+ * Unify annotation status / label probing across the gallery and stats views
60
+ * Run the CI test matrix on the ``dev`` branch and cache pip
61
+ * Add a real mouse-event polygon insert/drag/undo integration test (#70);
62
+ the full suite now runs 592 tests (up from 471)
63
+
64
+ 2.3.2 (2026-05-20)
65
+ ------------------
66
+
67
+ Patch release hardening the annotation format loaders against malformed
68
+ input. Slightly corrupt or hand-edited label files previously crashed the
69
+ load or silently dropped valid annotations.
70
+
71
+ * Skip individual malformed YOLO lines instead of discarding the whole
72
+ file — a line with non-numeric values no longer raises an error that
73
+ drops every annotation in that file
74
+ * Report corrupt CreateML JSON through an error dialog instead of
75
+ silently loading zero annotations, and defer the format switch until
76
+ the reader succeeds so a bad file no longer flips the saved format
77
+ * Fix the CreateML branch of label extraction, which passed the wrong
78
+ number of constructor arguments and could never return labels
79
+ * Replace a mutable default argument in the YOLO writer that could leak
80
+ class names across files and corrupt class indices in ``classes.txt``
81
+ * Guard ``load_predefined_classes`` against a missing class-file path
82
+
83
+ Internal: tolerate a PyQt5/coverage shutdown segfault in CI, ignore
84
+ coverage and local working-directory artifacts, and add 8 regression
85
+ tests (full suite now 471 passing).
86
+
87
+
4
88
  2.3.1 (2026-05-14)
5
89
  ------------------
6
90
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: labelimgplusplus
3
- Version: 2.3.1
3
+ Version: 2.3.3
4
4
  Summary: labelImg++ is an enhanced graphical image annotation tool with Gallery Mode for browsing and labeling images
5
5
  Author-email: Abhik Sarkar <abhiksark@gmail.com>
6
6
  License: Copyright (c) <2015-Present> Tzutalin
@@ -21,15 +21,14 @@ Classifier: Intended Audience :: Developers
21
21
  Classifier: Intended Audience :: Science/Research
22
22
  Classifier: Natural Language :: English
23
23
  Classifier: Programming Language :: Python :: 3
24
- Classifier: Programming Language :: Python :: 3.6
25
- Classifier: Programming Language :: Python :: 3.7
26
24
  Classifier: Programming Language :: Python :: 3.8
27
25
  Classifier: Programming Language :: Python :: 3.9
28
26
  Classifier: Programming Language :: Python :: 3.10
29
27
  Classifier: Programming Language :: Python :: 3.11
28
+ Classifier: Programming Language :: Python :: 3.12
30
29
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
31
30
  Classifier: Topic :: Scientific/Engineering :: Image Recognition
32
- Requires-Python: >=3.6
31
+ Requires-Python: >=3.8
33
32
  Description-Content-Type: text/x-rst
34
33
  License-File: LICENSE
35
34
  Requires-Dist: pyqt5
@@ -276,7 +275,7 @@ If you encounter issues, reset the settings:
276
275
 
277
276
  .. code:: shell
278
277
 
279
- rm ~/.labelImgSettings.pkl
278
+ rm ~/.labelImgSettings.json
280
279
 
281
280
  Or use **Menu > File > Reset All**
282
281
 
@@ -239,7 +239,7 @@ If you encounter issues, reset the settings:
239
239
 
240
240
  .. code:: shell
241
241
 
242
- rm ~/.labelImgSettings.pkl
242
+ rm ~/.labelImgSettings.json
243
243
 
244
244
  Or use **Menu > File > Reset All**
245
245