labelimgplusplus 3.2.0__tar.gz → 3.4.0__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 (111) hide show
  1. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/HISTORY.rst +129 -0
  2. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/PKG-INFO +24 -3
  3. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/README.rst +23 -2
  4. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/labelImgPlusPlus.py +735 -98
  5. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/labelimgplusplus.egg-info/PKG-INFO +24 -3
  6. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/labelimgplusplus.egg-info/SOURCES.txt +3 -0
  7. labelimgplusplus-3.4.0/libs/__init__.py +18 -0
  8. labelimgplusplus-3.4.0/libs/core/__init__.py +33 -0
  9. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/core/commands.py +19 -1
  10. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/core/sam_controller.py +15 -11
  11. labelimgplusplus-3.4.0/libs/core/sam_types.py +21 -0
  12. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/core/video_decoder.py +2 -0
  13. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/core/video_export.py +2 -1
  14. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/core/video_model.py +276 -4
  15. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/core/video_project.py +136 -12
  16. labelimgplusplus-3.4.0/libs/core/video_propagation.py +9 -0
  17. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/core/video_session.py +14 -4
  18. labelimgplusplus-3.4.0/libs/core/video_tracking.py +628 -0
  19. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/core/video_types.py +59 -0
  20. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/integrations/mask_to_polygon.py +42 -9
  21. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/resources.py +172 -96
  22. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/utils/constants.py +1 -0
  23. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/__init__.py +2 -1
  24. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/canvas.py +96 -5
  25. labelimgplusplus-3.4.0/libs/widgets/inlineClassPicker.py +171 -0
  26. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/videoTimelineWidget.py +39 -1
  27. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/workspacePages.py +53 -2
  28. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/pyproject.toml +1 -1
  29. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/resources.qrc +1 -0
  30. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/setup.cfg +1 -1
  31. labelimgplusplus-3.2.0/libs/__init__.py +0 -11
  32. labelimgplusplus-3.2.0/libs/core/__init__.py +0 -12
  33. labelimgplusplus-3.2.0/libs/core/video_tracking.py +0 -288
  34. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/CONTRIBUTING.rst +0 -0
  35. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/LICENSE +0 -0
  36. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/MANIFEST.in +0 -0
  37. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/data/predefined_classes.txt +0 -0
  38. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/labelimgplusplus/__init__.py +0 -0
  39. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/labelimgplusplus/plugins.py +0 -0
  40. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/labelimgplusplus.egg-info/dependency_links.txt +0 -0
  41. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/labelimgplusplus.egg-info/entry_points.txt +0 -0
  42. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/labelimgplusplus.egg-info/requires.txt +0 -0
  43. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/labelimgplusplus.egg-info/top_level.txt +0 -0
  44. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/core/annotation_catalog.py +0 -0
  45. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/core/dataset.py +0 -0
  46. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/core/image_pipeline.py +0 -0
  47. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/core/keypoint_config.py +0 -0
  48. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/core/plugin_discovery.py +0 -0
  49. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/core/plugin_manager.py +0 -0
  50. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/core/plugin_registry.py +0 -0
  51. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/core/profiling.py +0 -0
  52. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/core/save_pipeline.py +0 -0
  53. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/core/settings.py +0 -0
  54. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/core/shape.py +0 -0
  55. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/core/shortcut_config.py +0 -0
  56. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/core/task_coordinator.py +0 -0
  57. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/core/ultralytics_export.py +0 -0
  58. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/core/workspace_settings.py +0 -0
  59. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/data/predefined_classes.txt +0 -0
  60. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/formats/__init__.py +0 -0
  61. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/formats/annotation_loader.py +0 -0
  62. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/formats/annotation_paths.py +0 -0
  63. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/formats/annotation_probe.py +0 -0
  64. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/formats/coco_io.py +0 -0
  65. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/formats/create_ml_io.py +0 -0
  66. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/formats/format_metadata.py +0 -0
  67. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/formats/labelFile.py +0 -0
  68. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/formats/pascal_voc_io.py +0 -0
  69. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/formats/yolo_io.py +0 -0
  70. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/formats/yolo_seg_io.py +0 -0
  71. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/integrations/__init__.py +0 -0
  72. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/integrations/image_convert.py +0 -0
  73. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/integrations/model_cache.py +0 -0
  74. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/integrations/segmentation.py +0 -0
  75. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/tools/__init__.py +0 -0
  76. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/tools/batch_verify.py +0 -0
  77. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/tools/dataset_splitter.py +0 -0
  78. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/tools/label_checker.py +0 -0
  79. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/utils/__init__.py +0 -0
  80. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/utils/dpi.py +0 -0
  81. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/utils/hashableQListWidgetItem.py +0 -0
  82. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/utils/stringBundle.py +0 -0
  83. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/utils/styles.py +0 -0
  84. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/utils/ustr.py +0 -0
  85. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/utils/utils.py +0 -0
  86. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/annotationInspector.py +0 -0
  87. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/batchVerifyDialog.py +0 -0
  88. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/colorDialog.py +0 -0
  89. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/combobox.py +0 -0
  90. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/commandBar.py +0 -0
  91. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/default_label_combobox.py +0 -0
  92. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/galleryWidget.py +0 -0
  93. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/gallery_status_controller.py +0 -0
  94. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/keypointPanel.py +0 -0
  95. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/labelCheckerDialog.py +0 -0
  96. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/labelDialog.py +0 -0
  97. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/lightWidget.py +0 -0
  98. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/pluginManagerDialog.py +0 -0
  99. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/sam_settings_dialog.py +0 -0
  100. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/shortcutsDialog.py +0 -0
  101. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/splitDialog.py +0 -0
  102. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/statsWidget.py +0 -0
  103. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/stats_controller.py +0 -0
  104. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/toolBar.py +0 -0
  105. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/toolRail.py +0 -0
  106. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/ultralyticsExportDialog.py +0 -0
  107. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/videoExportDialog.py +0 -0
  108. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/view_scaling.py +0 -0
  109. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/workspaceInspector.py +0 -0
  110. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/libs/widgets/zoomWidget.py +0 -0
  111. {labelimgplusplus-3.2.0 → labelimgplusplus-3.4.0}/resources/icons/feather/LICENSE.txt +0 -0
@@ -1,6 +1,135 @@
1
1
  History
2
2
  =======
3
3
 
4
+ 3.4.0 (2026-08-12)
5
+ ------------------
6
+
7
+ Portable whole-video propagation release adding multi-object OpenCV tracking,
8
+ durable gap records, atomic preview and commit, and bounded correction
9
+ regeneration while preserving legacy pending observations, annotation formats,
10
+ filenames, command-line entry points, plugin APIs, shortcut identifiers, and
11
+ Python 3.8 through 3.13 support. Optional SAM 2 propagation remains deferred to
12
+ 3.5 and is not bundled or downloaded by this release.
13
+
14
+ Propagation and Gap Contracts
15
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
16
+
17
+ * Add frozen, Qt-free propagation requests, batches, results, and gap records,
18
+ plus a stateless backend interface. Workers exchange immutable plain data;
19
+ Qt widgets, canvas shapes, model mutation, and undo commands stay on the GUI
20
+ thread.
21
+ * Upgrade video projects transactionally from schema v1 to v2 with inclusive,
22
+ revisioned ``track_gaps``. Writable migration failure rolls back and reopens
23
+ read-only with an actionable warning, while read-only v1 projects retain an
24
+ empty gap projection.
25
+ * Preserve accepted, pending, and rejected legacy observations and extend
26
+ snapshots and save deltas for gap insertion, replacement, deletion, undo,
27
+ restoration, export, and revision conflicts.
28
+
29
+ Portable Whole-Video Propagation
30
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
31
+
32
+ * Add **Propagate across video** and **Propagate selected object** beside the
33
+ integrated timeline. Existing directional commands now use the same accepted
34
+ atomic result path rather than creating new pending suggestions.
35
+ * Decode each requested direction once and update all active tracks together
36
+ with bounded Lucas-Kanade flow and affine estimation. Rectangles transform
37
+ their corners, polygons transform every vertex, and associated keypoints use
38
+ the same affine transform.
39
+ * Protect every accepted manual anchor. Reaching another manual anchor retains
40
+ and reseeds it; a failed track records a stable ``low_confidence``,
41
+ ``occluded``, ``out_of_frame``, or ``scene_cut`` gap while other tracks
42
+ continue.
43
+ * Stream generated observations into a preview-only canvas layer excluded from
44
+ canonical shapes, dirty state, saves, exports, plugins, inspectors, and undo.
45
+ Frame navigation remains available while geometry and class mutation, save,
46
+ export, undo, and redo are disabled.
47
+ * Validate document generation and revision, media fingerprint, stream and time
48
+ base, and every track revision before applying accepted tracker observations
49
+ and gaps in one model revision and one undo command. Cancellation, stale
50
+ state, source replacement, shutdown, or decoder failure clears preview state
51
+ without changing the model or durable project.
52
+
53
+ Correction Regeneration
54
+ ~~~~~~~~~~~~~~~~~~~~~~~
55
+
56
+ * Editing tracker or interpolated geometry immediately creates an accepted
57
+ manual anchor as its own undoable correction.
58
+ * Regenerate only frames strictly between that correction and the nearest
59
+ manual anchor on each side, using media bounds where an anchor is absent.
60
+ Successful replacement affects only generated observations and overlapping
61
+ gap portions for that track and those intervals, and is recorded as a second
62
+ undo entry.
63
+ * Cancel superseded regeneration and discard results after correction undo,
64
+ intervening document or track revision, document replacement, or shutdown.
65
+ Failures preserve the correction, all manual anchors, other tracks, and prior
66
+ generated data.
67
+
68
+ Qualification
69
+ ~~~~~~~~~~~~~
70
+
71
+ * Cover CFR and VFR media, forward and backward propagation, rectangles,
72
+ polygons, keypoints, multiple tracks, manual-anchor reseeding, scene cuts,
73
+ occlusion, out-of-frame loss, corrupted media, read-only and legacy projects,
74
+ cancellation, stale revisions, atomic undo, gap persistence, save/export
75
+ blocking, navigation during work, document close, and repeated teardown.
76
+ * Qualify Python 3.8 through 3.13, plugin, SAM, video, and combined extras while
77
+ keeping PyAV, NumPy, OpenCV, ONNX Runtime, Torch, and SAM 2 lazy or absent from
78
+ the base import path as applicable.
79
+ * Review the integrated propagation preview at fixed Linux 1366x768 and
80
+ 1440x900 approval sizes with no clipped primary controls, docks, or detached
81
+ windows.
82
+
83
+ 3.3.0 (2026-08-12)
84
+ ------------------
85
+
86
+ Faster-annotation release adding non-modal class confirmation and selectable
87
+ Smart Select geometry while preserving the 3.2 workspace, annotation formats,
88
+ filenames, command-line entry points, plugin APIs, shortcut identifiers, and
89
+ Python 3.8 through 3.13 support.
90
+
91
+ Inline Class Confirmation
92
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
93
+
94
+ * Keep completed Box, Polygon, Smart Select, and video geometry in a transient
95
+ provisional layer until its class is confirmed. Provisional geometry is
96
+ excluded from canonical canvas shapes, the Objects inspector, dirty state,
97
+ saves, plugin snapshots, and undo history.
98
+ * Open a non-modal, screen-clamped class picker beside new geometry with
99
+ filtering, arrow-key navigation, valid new-class entry, Enter confirmation,
100
+ and Escape cancellation. Confirmation preserves the active tool and canvas
101
+ focus so repeated annotation remains uninterrupted.
102
+ * Commit confirmed image or video geometry through one ``CreateShapeCommand``.
103
+ Video confirmation creates an accepted manual anchor; cancellation leaves
104
+ both the in-memory model and durable project unchanged.
105
+ * Retain session-only last-class memory. Default-label mode bypasses the picker,
106
+ while single-class mode bypasses it only after the first class is confirmed
107
+ in the current session.
108
+
109
+ Smart Select Output Modes
110
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
111
+
112
+ * Add the frozen plain-data ``SamResult(polygon, bounds)`` contract. SAM workers
113
+ return a simplified polygon and tight, non-zero, half-open bounds for the
114
+ same largest mask component without mutating Qt or document state.
115
+ * Add a contextual Box/Polygon selector that appears only while Smart Select is
116
+ active. Its validated ``sam/outputMode`` setting defaults to ``polygon`` and
117
+ persists independently of model settings.
118
+ * Route both output types through the provisional picker and the same image and
119
+ video undo path. Existing stale-generation and cancellation guards remain in
120
+ place, and ONNX Runtime, NumPy, OpenCV, and model loading stay lazy.
121
+
122
+ Qualification
123
+ ~~~~~~~~~~~~~
124
+
125
+ * Cover image and video confirmation, cancellation, focus, filtering, repeated
126
+ annotation, bypass modes, output bounds, simplification, persistence, stale
127
+ SAM results, manual video anchors, and one-step undo.
128
+ * Qualify the picker and Smart Select selector in light and dark themes at 1x
129
+ and true 2x DPI using 1366x768 and 1440x900 logical approval sizes.
130
+ * Make queued Gallery and annotation-catalog refreshes inert after window
131
+ shutdown so late Qt callbacks cannot submit work to a stopped coordinator.
132
+
4
133
  3.2.0 (2026-08-11)
5
134
  ------------------
6
135
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: labelimgplusplus
3
- Version: 3.2.0
3
+ Version: 3.4.0
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
@@ -78,7 +78,7 @@ polygons, and keypoints, designed for machine learning and computer vision
78
78
  projects. It is forked from the original LabelImg with significant
79
79
  enhancements.
80
80
 
81
- **Version 3.2.0 (stable).** Install with
81
+ **Version 3.4.0 (stable).** Install with
82
82
  ``pip install labelimgplusplus``.
83
83
 
84
84
  .. image:: https://raw.githubusercontent.com/abhiksark/labelImg-plus-plus/c7fbd5fc08a561206b210706143a50023c82a782/resources/demo/demo.gif
@@ -132,6 +132,27 @@ Workflow and Interface
132
132
  annotation-status filter close at hand, and the inspector can be collapsed
133
133
  when maximum canvas space is needed.
134
134
 
135
+ **Faster Class Confirmation**
136
+ New boxes, polygons, Smart Select results, and video geometry remain
137
+ provisional while a non-modal class picker opens beside the annotation.
138
+ Filter or enter a class, press **Enter** to commit one undoable annotation,
139
+ or press **Escape** to discard it without changing the document. Default
140
+ labels and established single-class sessions bypass the picker.
141
+
142
+ **Smart Select Output Modes**
143
+ While Smart Select is active, choose **Box** or **Polygon** from the compact
144
+ canvas control. The choice persists between sessions, and either result
145
+ follows the same provisional class-confirmation and undo workflow.
146
+
147
+ **Portable Whole-Video Propagation**
148
+ From the integrated timeline, propagate every accepted manual anchor on
149
+ the current frame or only the selected object. The portable OpenCV backend
150
+ processes rectangles, polygons, and associated keypoints together, shows
151
+ preview-only progress, protects later manual anchors, and commits accepted
152
+ observations and explicit gap records atomically in one undo step. Editing
153
+ generated geometry creates a manual correction first, then regenerates only
154
+ the bounded neighboring segments as a separate undoable change.
155
+
135
156
  **Direct Ultralytics Dataset Export**
136
157
  Choose **Tools → Export Ultralytics Dataset…** to create a ready-to-train
137
158
  YOLO detection dataset with ``images/{train,val,test}``, matching
@@ -401,7 +422,7 @@ Or use **Menu > File > Reset All**
401
422
  Release History
402
423
  ---------------
403
424
 
404
- This source tree identifies itself as **3.2.0**, the stable 3.2 release. See
425
+ This source tree identifies itself as **3.4.0**, the stable 3.4 release. See
405
426
  the `release history
406
427
  <https://github.com/abhiksark/labelImg-plus-plus/blob/master/HISTORY.rst>`__ for
407
428
  version-by-version changes and `GitHub Releases
@@ -26,7 +26,7 @@ polygons, and keypoints, designed for machine learning and computer vision
26
26
  projects. It is forked from the original LabelImg with significant
27
27
  enhancements.
28
28
 
29
- **Version 3.2.0 (stable).** Install with
29
+ **Version 3.4.0 (stable).** Install with
30
30
  ``pip install labelimgplusplus``.
31
31
 
32
32
  .. image:: https://raw.githubusercontent.com/abhiksark/labelImg-plus-plus/c7fbd5fc08a561206b210706143a50023c82a782/resources/demo/demo.gif
@@ -80,6 +80,27 @@ Workflow and Interface
80
80
  annotation-status filter close at hand, and the inspector can be collapsed
81
81
  when maximum canvas space is needed.
82
82
 
83
+ **Faster Class Confirmation**
84
+ New boxes, polygons, Smart Select results, and video geometry remain
85
+ provisional while a non-modal class picker opens beside the annotation.
86
+ Filter or enter a class, press **Enter** to commit one undoable annotation,
87
+ or press **Escape** to discard it without changing the document. Default
88
+ labels and established single-class sessions bypass the picker.
89
+
90
+ **Smart Select Output Modes**
91
+ While Smart Select is active, choose **Box** or **Polygon** from the compact
92
+ canvas control. The choice persists between sessions, and either result
93
+ follows the same provisional class-confirmation and undo workflow.
94
+
95
+ **Portable Whole-Video Propagation**
96
+ From the integrated timeline, propagate every accepted manual anchor on
97
+ the current frame or only the selected object. The portable OpenCV backend
98
+ processes rectangles, polygons, and associated keypoints together, shows
99
+ preview-only progress, protects later manual anchors, and commits accepted
100
+ observations and explicit gap records atomically in one undo step. Editing
101
+ generated geometry creates a manual correction first, then regenerates only
102
+ the bounded neighboring segments as a separate undoable change.
103
+
83
104
  **Direct Ultralytics Dataset Export**
84
105
  Choose **Tools → Export Ultralytics Dataset…** to create a ready-to-train
85
106
  YOLO detection dataset with ``images/{train,val,test}``, matching
@@ -349,7 +370,7 @@ Or use **Menu > File > Reset All**
349
370
  Release History
350
371
  ---------------
351
372
 
352
- This source tree identifies itself as **3.2.0**, the stable 3.2 release. See
373
+ This source tree identifies itself as **3.4.0**, the stable 3.4 release. See
353
374
  the `release history
354
375
  <https://github.com/abhiksark/labelImg-plus-plus/blob/master/HISTORY.rst>`__ for
355
376
  version-by-version changes and `GitHub Releases