lannotex 0.1.0__tar.gz → 0.2.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 (65) hide show
  1. {lannotex-0.1.0 → lannotex-0.2.0}/CHANGELOG.md +58 -0
  2. {lannotex-0.1.0 → lannotex-0.2.0}/PKG-INFO +6 -5
  3. {lannotex-0.1.0 → lannotex-0.2.0}/README.md +4 -3
  4. {lannotex-0.1.0 → lannotex-0.2.0}/docs/guide/annotating.md +34 -7
  5. {lannotex-0.1.0 → lannotex-0.2.0}/docs/guide/import-export.md +28 -8
  6. {lannotex-0.1.0 → lannotex-0.2.0}/docs/migrate-from-labelme.md +10 -6
  7. {lannotex-0.1.0 → lannotex-0.2.0}/pyproject.toml +3 -1
  8. {lannotex-0.1.0 → lannotex-0.2.0}/src/lannotex/__init__.py +1 -1
  9. {lannotex-0.1.0 → lannotex-0.2.0}/src/lannotex/app.py +181 -37
  10. {lannotex-0.1.0 → lannotex-0.2.0}/src/lannotex/canvas.py +165 -15
  11. {lannotex-0.1.0 → lannotex-0.2.0}/src/lannotex/exporters.py +77 -22
  12. {lannotex-0.1.0 → lannotex-0.2.0}/src/lannotex/home.py +15 -7
  13. lannotex-0.2.0/src/lannotex/icons.py +55 -0
  14. {lannotex-0.1.0 → lannotex-0.2.0}/src/lannotex/models.py +20 -2
  15. lannotex-0.2.0/src/lannotex/palette.py +72 -0
  16. {lannotex-0.1.0 → lannotex-0.2.0}/src/lannotex/theme.py +9 -0
  17. lannotex-0.2.0/src/lannotex/thumbnails.py +101 -0
  18. {lannotex-0.1.0 → lannotex-0.2.0}/src/lannotex/workers.py +84 -22
  19. {lannotex-0.1.0 → lannotex-0.2.0}/src/lannotex.egg-info/PKG-INFO +6 -5
  20. {lannotex-0.1.0 → lannotex-0.2.0}/src/lannotex.egg-info/SOURCES.txt +3 -0
  21. {lannotex-0.1.0 → lannotex-0.2.0}/src/lannotex.egg-info/requires.txt +1 -1
  22. lannotex-0.2.0/tests/test_exporters.py +107 -0
  23. lannotex-0.2.0/tests/test_ui.py +283 -0
  24. {lannotex-0.1.0 → lannotex-0.2.0}/tests/test_workflows.py +17 -0
  25. lannotex-0.1.0/tests/test_exporters.py +0 -63
  26. lannotex-0.1.0/tests/test_ui.py +0 -148
  27. {lannotex-0.1.0 → lannotex-0.2.0}/LICENSE +0 -0
  28. {lannotex-0.1.0 → lannotex-0.2.0}/LICENSES/GPL-3.0-only.txt +0 -0
  29. {lannotex-0.1.0 → lannotex-0.2.0}/LICENSES/LGPL-3.0-only.txt +0 -0
  30. {lannotex-0.1.0 → lannotex-0.2.0}/LICENSES/Qt-GPL-exception-1.0.txt +0 -0
  31. {lannotex-0.1.0 → lannotex-0.2.0}/LICENSES/THIRD_PARTY_NOTICES.md +0 -0
  32. {lannotex-0.1.0 → lannotex-0.2.0}/Lannotex.spec +0 -0
  33. {lannotex-0.1.0 → lannotex-0.2.0}/MANIFEST.in +0 -0
  34. {lannotex-0.1.0 → lannotex-0.2.0}/docs/MICROSOFT_STORE.md +0 -0
  35. {lannotex-0.1.0 → lannotex-0.2.0}/docs/PERFORMANCE.md +0 -0
  36. {lannotex-0.1.0 → lannotex-0.2.0}/docs/ROADMAP.md +0 -0
  37. {lannotex-0.1.0 → lannotex-0.2.0}/docs/TEAM.md +0 -0
  38. {lannotex-0.1.0 → lannotex-0.2.0}/docs/VERIFICATION.md +0 -0
  39. {lannotex-0.1.0 → lannotex-0.2.0}/docs/cli.md +0 -0
  40. {lannotex-0.1.0 → lannotex-0.2.0}/docs/getting-started/installation.md +0 -0
  41. {lannotex-0.1.0 → lannotex-0.2.0}/docs/getting-started/quickstart.md +0 -0
  42. {lannotex-0.1.0 → lannotex-0.2.0}/docs/guide/projects.md +0 -0
  43. {lannotex-0.1.0 → lannotex-0.2.0}/docs/index.md +0 -0
  44. {lannotex-0.1.0 → lannotex-0.2.0}/requirements-windows-build.txt +0 -0
  45. {lannotex-0.1.0 → lannotex-0.2.0}/run_lannotex.py +0 -0
  46. {lannotex-0.1.0 → lannotex-0.2.0}/scripts/benchmark.py +0 -0
  47. {lannotex-0.1.0 → lannotex-0.2.0}/scripts/build_linux.sh +0 -0
  48. {lannotex-0.1.0 → lannotex-0.2.0}/scripts/build_macos.sh +0 -0
  49. {lannotex-0.1.0 → lannotex-0.2.0}/scripts/build_windows.ps1 +0 -0
  50. {lannotex-0.1.0 → lannotex-0.2.0}/scripts/collect_notices.py +0 -0
  51. {lannotex-0.1.0 → lannotex-0.2.0}/scripts/verify_executable.py +0 -0
  52. {lannotex-0.1.0 → lannotex-0.2.0}/setup.cfg +0 -0
  53. {lannotex-0.1.0 → lannotex-0.2.0}/src/lannotex/__main__.py +0 -0
  54. {lannotex-0.1.0 → lannotex-0.2.0}/src/lannotex/cli.py +0 -0
  55. {lannotex-0.1.0 → lannotex-0.2.0}/src/lannotex/domain.py +0 -0
  56. {lannotex-0.1.0 → lannotex-0.2.0}/src/lannotex/py.typed +0 -0
  57. {lannotex-0.1.0 → lannotex-0.2.0}/src/lannotex/storage.py +0 -0
  58. {lannotex-0.1.0 → lannotex-0.2.0}/src/lannotex/team.py +0 -0
  59. {lannotex-0.1.0 → lannotex-0.2.0}/src/lannotex.egg-info/dependency_links.txt +0 -0
  60. {lannotex-0.1.0 → lannotex-0.2.0}/src/lannotex.egg-info/entry_points.txt +0 -0
  61. {lannotex-0.1.0 → lannotex-0.2.0}/src/lannotex.egg-info/top_level.txt +0 -0
  62. {lannotex-0.1.0 → lannotex-0.2.0}/tests/test_cli.py +0 -0
  63. {lannotex-0.1.0 → lannotex-0.2.0}/tests/test_domain.py +0 -0
  64. {lannotex-0.1.0 → lannotex-0.2.0}/tests/test_storage.py +0 -0
  65. {lannotex-0.1.0 → lannotex-0.2.0}/tests/test_team.py +0 -0
@@ -6,6 +6,64 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.2.0] — 2026-10-14
10
+
11
+ Viewing, speed and layout: sharp zoom on large images, instant navigation, and a
12
+ workspace you can arrange yourself.
13
+
14
+ ### Added
15
+
16
+ - **Full-resolution viewing.** Zooming in past the preview loads the original pixels in the
17
+ background, so large images stay sharp at any zoom. Only the visible region is drawn.
18
+ Detail decoding is capped at 64 MP to protect memory.
19
+ - **Instant next/previous.** Neighbouring images are decoded ahead of time.
20
+ - **Minimap** (`M`) for orientation and click-to-jump, and a **pixel grid** (`G`) from
21
+ 1200% zoom upwards.
22
+ - **Zoom controls:** actual pixels (`Ctrl+1`), zoom in/out (`Ctrl+=` / `Ctrl+-`) up to
23
+ 6400%. The zoom readout now shows true pixel scale, so 100% means actual pixels.
24
+ - **Image adjustments:** brightness, contrast and gamma in a new **Image view** panel. They
25
+ change the display only, never your files, and are applied just to the visible region, so
26
+ they stay fast on large images.
27
+ - **Dockable panels:** Dataset, Inspector and Image view can be moved, tabbed, floated onto
28
+ another monitor, or closed. Your layout is remembered between sessions. Use
29
+ **View → Panels** to bring a panel back or apply a preset (default, or all panels on the
30
+ right). Focus mode hides every panel and restores your exact layout afterwards.
31
+ - **Thumbnails in the image list**, generated in the background with the rows you can see
32
+ first. They're cached on disk in your user cache folder, not the project, so reopening a
33
+ project is instant. The cache is capped at 512 MB. Toggle them under **View → Show
34
+ thumbnails in image list**.
35
+ - **Icons:** a consistent line-icon set for the toolbar, navigation and Home screen,
36
+ redrawn for light and dark themes, plus the Lannotex logo as the window icon. Icon-only
37
+ buttons have tooltips and screen-reader names.
38
+ - **Command palette** (`Ctrl+K`): type part of any menu command, for example "zoom",
39
+ "export" or "layout", and press Enter to run it.
40
+ - **Number keys 1–9** choose the drawing label, which relabels the selected shape, or
41
+ toggle classes in classification projects.
42
+ - **Project → Import LabelMe folder…** imports a whole folder, including subfolders.
43
+
44
+ ### Changed
45
+
46
+ - **LabelMe import keeps going.**
47
+ - Circles and rotated rectangles are converted to polygons.
48
+ - Points, lines and masks, which Lannotex can't draw yet, are skipped and counted in the
49
+ import summary instead of rejecting the whole file.
50
+ - Invalid shapes are dropped one at a time.
51
+ - A malformed JSON file no longer stops the rest of the folder.
52
+
53
+ ### Fixed
54
+
55
+ - PySide6 6.12.0 is excluded. On Linux with Python 3.11 it over-releases references on every
56
+ background job, which made Lannotex abort on exit. Versions 6.8.3–6.11 are unaffected.
57
+
58
+ ## [0.1.1] — 2026-10-14
59
+
60
+ ### Changed
61
+
62
+ - **YOLO export is ready to train with Ultralytics:** `images/` (hard-linked when
63
+ possible, otherwise copied), matching `labels/`, and a `data.yaml` with class names.
64
+ Images that haven't been annotated yet are left out, so they don't become false
65
+ negatives.
66
+
9
67
  ## [0.1.0] — 2026-10-14
10
68
 
11
69
  First public release on PyPI: `pip install lannotex` or `uv tool install lannotex`.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lannotex
3
- Version: 0.1.0
3
+ Version: 0.2.0
4
4
  Summary: Fast, offline-first image annotation for classifications, boxes, and polygons.
5
5
  Author: Lourdhu Raju
6
6
  Maintainer: Lourdhu Raju
@@ -30,7 +30,7 @@ Requires-Python: >=3.11
30
30
  Description-Content-Type: text/markdown
31
31
  License-File: LICENSE
32
32
  License-File: LICENSES/THIRD_PARTY_NOTICES.md
33
- Requires-Dist: PySide6-Essentials<7,>=6.8.3
33
+ Requires-Dist: PySide6-Essentials!=6.12.0,<7,>=6.8.3
34
34
  Requires-Dist: Pillow>=11.1
35
35
  Provides-Extra: dev
36
36
  Requires-Dist: pytest>=8.3; extra == "dev"
@@ -131,9 +131,10 @@ Every shortcut can be remapped. See the [annotating guide](https://lourdhu02.git
131
131
  | | |
132
132
  | --- | --- |
133
133
  | **Annotate** | Bounding boxes · polygons with vertex drag, insert, and delete · multi-label image classes · "no target" negatives · 100-step undo/redo · zoom under the pointer, pan, arrow-key nudging · focus mode · light and dark themes |
134
+ | **View** | Sharp full-resolution zoom up to 6400% · next/previous images decoded ahead · minimap · pixel grid · brightness, contrast and gamma · thumbnails · dockable panels you can float onto a second monitor, with saved layouts · `Ctrl+K` command palette |
134
135
  | **Stay safe** | SQLite projects with versioned migrations · recovery drafts and 700 ms autosave · transactional saves · geometry validation · backup and restore · relinking for moved images · EXIF orientation handled |
135
136
  | **Scale** | Virtualized image list (at most 1,024 records in memory) · background import and decoding · 96 MB preview cache · coordinates normalized to the original resolution |
136
- | **Export** | Labelme JSON · YOLO · COCO JSON · classification CSV · lossless native JSONL · each export reports anything it skipped |
137
+ | **Export** | Labelme JSON · ready-to-train YOLO (`images/`, `labels/`, `data.yaml`) · COCO JSON · classification CSV · lossless native JSONL · each export reports anything it skipped |
137
138
  | **Automate** | `lannotex export` and `lannotex analyze` run headless in CI, with no display needed |
138
139
  | **Collaborate** | Optional LAN host with per-reviewer tokens, background sync, revision conflicts you resolve explicitly, revocation, and an audit history |
139
140
 
@@ -181,8 +182,8 @@ hashes. There is no telemetry, no external AI service, and no automatic upload.
181
182
 
182
183
  ## Roadmap
183
184
 
184
- Next up: a ready-to-train YOLO layout (`images/`, `labels/`, `data.yaml`), more LabelMe
185
- shape types, VOC and YOLO-seg export, and number-key label selection. See the
185
+ Next up: point, line, rotated-box, keypoint and brush-mask tools, per-object attributes,
186
+ and VOC, YOLO-seg and YOLO-OBB export. See the
186
187
  [roadmap](https://lourdhu02.github.io/Lannotex/ROADMAP/) and the
187
188
  [measured performance](https://lourdhu02.github.io/Lannotex/PERFORMANCE/).
188
189
 
@@ -89,9 +89,10 @@ Every shortcut can be remapped. See the [annotating guide](https://lourdhu02.git
89
89
  | | |
90
90
  | --- | --- |
91
91
  | **Annotate** | Bounding boxes · polygons with vertex drag, insert, and delete · multi-label image classes · "no target" negatives · 100-step undo/redo · zoom under the pointer, pan, arrow-key nudging · focus mode · light and dark themes |
92
+ | **View** | Sharp full-resolution zoom up to 6400% · next/previous images decoded ahead · minimap · pixel grid · brightness, contrast and gamma · thumbnails · dockable panels you can float onto a second monitor, with saved layouts · `Ctrl+K` command palette |
92
93
  | **Stay safe** | SQLite projects with versioned migrations · recovery drafts and 700 ms autosave · transactional saves · geometry validation · backup and restore · relinking for moved images · EXIF orientation handled |
93
94
  | **Scale** | Virtualized image list (at most 1,024 records in memory) · background import and decoding · 96 MB preview cache · coordinates normalized to the original resolution |
94
- | **Export** | Labelme JSON · YOLO · COCO JSON · classification CSV · lossless native JSONL · each export reports anything it skipped |
95
+ | **Export** | Labelme JSON · ready-to-train YOLO (`images/`, `labels/`, `data.yaml`) · COCO JSON · classification CSV · lossless native JSONL · each export reports anything it skipped |
95
96
  | **Automate** | `lannotex export` and `lannotex analyze` run headless in CI, with no display needed |
96
97
  | **Collaborate** | Optional LAN host with per-reviewer tokens, background sync, revision conflicts you resolve explicitly, revocation, and an audit history |
97
98
 
@@ -139,8 +140,8 @@ hashes. There is no telemetry, no external AI service, and no automatic upload.
139
140
 
140
141
  ## Roadmap
141
142
 
142
- Next up: a ready-to-train YOLO layout (`images/`, `labels/`, `data.yaml`), more LabelMe
143
- shape types, VOC and YOLO-seg export, and number-key label selection. See the
143
+ Next up: point, line, rotated-box, keypoint and brush-mask tools, per-object attributes,
144
+ and VOC, YOLO-seg and YOLO-OBB export. See the
144
145
  [roadmap](https://lourdhu02.github.io/Lannotex/ROADMAP/) and the
145
146
  [measured performance](https://lourdhu02.github.io/Lannotex/PERFORMANCE/).
146
147
 
@@ -8,7 +8,10 @@
8
8
  | Box | ++b++ | Drag from one corner to the opposite corner. |
9
9
  | Polygon | ++p++ | Click to add vertices; ++enter++ finishes, ++escape++ cancels. |
10
10
 
11
- The label selected in the **Labels & annotations** panel is applied to new shapes.
11
+ The label selected in the **Labels & annotations** panel is applied to new shapes. Press
12
+ ++1++–++9++ to choose the first nine labels, in alphabetical order. If a shape is selected,
13
+ it is relabelled. In classification projects, the number keys toggle classes on the
14
+ current image instead.
12
15
 
13
16
  ### Editing polygons
14
17
 
@@ -22,16 +25,38 @@ The label selected in the **Labels & annotations** panel is applied to new shape
22
25
 
23
26
  | Action | Control |
24
27
  | --- | --- |
25
- | Zoom | Mouse wheel (zooms under the pointer) |
26
- | Pan | Hold ++space++ and drag |
28
+ | Zoom | Mouse wheel (zooms under the pointer), ++ctrl+equal++ / ++ctrl+minus++ |
29
+ | Actual pixels (100%) | ++ctrl+1++ |
30
+ | Pan | Hold ++space++ and drag, or click and drag in the minimap |
27
31
  | Fit to window | ++f++ |
32
+ | Minimap on/off | ++m++ |
33
+ | Pixel grid on/off (from 1200%) | ++g++ |
28
34
  | Nudge selection | Arrow keys (hold ++shift++ for a 10× step) |
29
35
  | Focus mode (hide panels) | ++ctrl+shift+f++ |
30
36
 
37
+ ## Image adjustments
38
+
39
+ The **Image view** panel has brightness, contrast and gamma sliders for dark, washed-out or
40
+ low-contrast images. They change only what you see, never your files or the exported data.
41
+ **Reset adjustments**, or **View → Reset image adjustments**, returns to the original.
42
+
43
+ ## Arranging the workspace
44
+
45
+ The **Dataset**, **Inspector** and **Image view** panels are dockable:
46
+
47
+ - Drag a panel's title bar to move it to another side, or onto another panel to tab them.
48
+ - Use the float button to detach a panel, for example onto a second monitor.
49
+ - Close panels you don't need. **View → Panels** lists them all so you can bring them back.
50
+ - **View → Panels → Default layout** and **All panels on the right** are one-click presets.
51
+ - **Focus mode** (++ctrl+shift+f++) hides every panel. Press it again to restore your layout.
52
+
53
+ Your layout is saved when you close Lannotex.
54
+
31
55
  ## Keyboard reference
32
56
 
33
57
  | Action | Default |
34
58
  | --- | --- |
59
+ | Command palette: search and run any command | ++ctrl+k++ |
35
60
  | Save | ++ctrl+s++ |
36
61
  | Save & next | ++ctrl+enter++ |
37
62
  | Previous / next image | ++alt+left++ / ++alt+right++ |
@@ -57,9 +82,11 @@ dataset:
57
82
 
58
83
  ## Coordinates
59
84
 
60
- Geometry is stored **normalized** (0–1) relative to the original image size. Large
61
- images are displayed as a preview capped at 2,560 px on the longest side, but stored
62
- coordinates and exports always use the original resolution. EXIF orientation is
63
- respected.
85
+ Geometry is stored **normalized** (0–1) relative to the original image size. Images open
86
+ as a fast preview (up to 2,560 px). When you zoom in past that, Lannotex loads the
87
+ original pixels in the background, so the image stays sharp up to 6400%. The zoom
88
+ readout shows true scale: 100% means one image pixel per screen pixel. Full-resolution
89
+ detail is available for images up to 64 megapixels; larger images stay on the preview.
90
+ EXIF orientation is respected.
64
91
 
65
92
  Undo history keeps the last 100 changes for the image you're working on.
@@ -5,7 +5,7 @@
5
5
  | Format | Contains | Use it for |
6
6
  | --- | --- | --- |
7
7
  | **Labelme JSON** | One JSON per image: boxes as `rectangle`, polygons, classes as `flags` | LabelMe and tools that read its format |
8
- | **YOLO boxes** | One `.txt` per image: `class cx cy w h`, normalized | YOLO detection training |
8
+ | **YOLO boxes** | Ready-to-train Ultralytics dataset: `images/`, `labels/`, `data.yaml` | YOLO detection training |
9
9
  | **COCO JSON** | One `coco.json` with boxes, polygon segmentations, and areas | Detection and instance segmentation |
10
10
  | **Classification CSV** | One row per image, one 0/1 column per class | Image classification |
11
11
  | **Native JSONL** | Every annotation with its ID and status | Lossless backup and round-trips |
@@ -24,10 +24,11 @@ Lannotex-export-1a2b3c4d/
24
24
  ├── classification.csv
25
25
  ├── images.jsonl
26
26
  ├── annotations.jsonl
27
- └── 00000001_street.json # per-image files (Labelme JSON / YOLO .txt)
27
+ └── 00000001_street.json # per-image files (Labelme JSON)
28
28
  ```
29
29
 
30
- Images are **referenced, not copied**: exported records point to the original files.
30
+ Images are **referenced, not copied**: exported records point to the original files. YOLO
31
+ is the exception, described below.
31
32
 
32
33
  ### What gets skipped
33
34
 
@@ -39,11 +40,30 @@ An image is left out of the export, and listed in `manifest.json`, if:
39
40
 
40
41
  Run **View → Analysis** or `lannotex analyze` beforehand to find these images.
41
42
 
42
- !!! note "Training with Ultralytics YOLO"
43
- The YOLO export writes label files named `<id>_<image name>.txt` plus `classes.json`.
44
- Ultralytics expects `images/` and `labels/` folders with matching file names and a
45
- `data.yaml`, so you currently have to arrange those yourself. A ready-to-train layout is
46
- planned.
43
+ ### YOLO: ready to train
44
+
45
+ The YOLO export is a complete [Ultralytics](https://docs.ultralytics.com/datasets/detect/)
46
+ dataset:
47
+
48
+ ```text
49
+ Lannotex-export-1a2b3c4d/
50
+ ├── data.yaml # path, train/val, class names
51
+ ├── images/00000001_street.jpg
52
+ └── labels/00000001_street.txt # class cx cy w h, normalized
53
+ ```
54
+
55
+ ```bash
56
+ yolo detect train data=Lannotex-export-1a2b3c4d/data.yaml model=yolo11n.pt
57
+ ```
58
+
59
+ - Images are **hard-linked** into `images/` when the export is on the same drive, so they
60
+ take no extra space. Otherwise they're copied. Your originals are never modified.
61
+ - Images marked **No target objects** get an empty label file, so YOLO learns them as
62
+ background.
63
+ - Images you haven't annotated yet are **left out**. If they were included, YOLO would
64
+ treat them as "nothing here".
65
+ - `train` and `val` point at the same images. Split them yourself for a real evaluation.
66
+ - If you move the export folder, update `path:` in `data.yaml`.
47
67
 
48
68
  ## Importing annotations
49
69
 
@@ -6,8 +6,9 @@ and still hand files back to LabelMe users.
6
6
  ## Import a LabelMe folder
7
7
 
8
8
  1. Create a project (**Combined pipeline** enables every tool).
9
- 2. Choose **Project → Import annotations…** and select the folder that contains your
10
- LabelMe `.json` files.
9
+ 2. Choose **Project → Import LabelMe folder…** and select the folder that contains your
10
+ LabelMe `.json` files. Subfolders are included. Use **Import annotations…** for a single
11
+ file.
11
12
  3. Lannotex reads each file, finds the image through its `imagePath`, checks that the
12
13
  dimensions match, and creates any missing labels.
13
14
 
@@ -19,16 +20,19 @@ Your LabelMe JSON files and images are left untouched.
19
20
  | --- | --- |
20
21
  | `rectangle` shapes | Bounding boxes |
21
22
  | `polygon` shapes | Polygons |
23
+ | `circle` shapes | Polygons (32 points around the circle) |
24
+ | `rotation` (rotated rectangle) shapes | Polygons with the four corners |
22
25
  | `flags` set to `true` | Image classes |
23
26
  | Image files via `imagePath` | Referenced in place, not copied |
24
27
 
25
28
  !!! warning "Current limitations"
26
- - Files containing `circle`, `line`, `linestrip`, `point`, or `mask` shapes are
27
- rejected **as a whole file**, and the error list names them. Support for these
28
- shapes is planned.
29
+ - `point`, `line`, `linestrip` and `mask` shapes are **skipped**. The rest of each file
30
+ still imports, and the import summary lists how many of each were skipped. Support
31
+ for these shapes is planned.
32
+ - Shapes with invalid geometry, such as a polygon with fewer than 3 points, are skipped
33
+ and listed the same way.
29
34
  - `imageData` embedded in the JSON isn't used. The image file must exist on disk.
30
35
  - `group_id`, `description`, and per-shape `flags` aren't imported.
31
- - Only JSON files directly inside the chosen folder are read, not subfolders.
32
36
 
33
37
  ## Export back to LabelMe
34
38
 
@@ -32,7 +32,9 @@ classifiers = [
32
32
  ]
33
33
  # Ranges, not pins: exact pins break installs on newer Pythons. Release binaries pin
34
34
  # their full set in requirements-windows-build.txt.
35
- dependencies = ["PySide6-Essentials>=6.8.3,<7", "Pillow>=11.1"]
35
+ # PySide6 6.12.0 over-releases None/True on every QThreadPool job and worker-thread signal,
36
+ # which aborts Python 3.11 on Linux at exit ("bool_dealloc"); 6.8.3-6.11.0 are unaffected.
37
+ dependencies = ["PySide6-Essentials>=6.8.3,<7,!=6.12.0", "Pillow>=11.1"]
36
38
 
37
39
  [project.optional-dependencies]
38
40
  dev = [
@@ -1,2 +1,2 @@
1
1
  """Lannotex: offline-first image annotation."""
2
- __version__ = "0.1.0"
2
+ __version__ = "0.2.0"