Releases: OpenSportsLab/VideoAnnotationTool
v1.2.0
Improve dataset state management, undo/redo behavior, project close flows, and annotation workflows across classification, localization, description, and dense description. Add broader GUI regression coverage and polish media and editor interactions.
What's new
- Centralized dataset runtime state around the Dataset Explorer flow
- Improved undo/redo behavior for dataset and annotation mutations
- Better dataset header inspector editing and JSON preview handling
- Safer unsaved-changes workflow when closing projects
- Immediate manual-save behavior in Classification
- Autosave support in Description
- Improved Localization smart annotation, head/label management, and label color handling
- Chronological ordering guarantees for Dense Description and Localization events after add/edit/delete
- Updated media controls, including mute support
- Broader GUI regression coverage across lifecycle, explorer, media, history, and mode workflows
Fixes and polish
- Fixed dense description removal behavior
- Improved tab visibility and tab-removal behavior in editor panels
- Refined controller boundaries and signal-based coordination across modules
- Updated tests and workflow coverage for recent projects, dataset explorer behavior, and mode-specific interactions
Commits:
- Merge pull request #11 from OpenSportsLab/dev-silvio
- Fix dense description test: use on_media_position_changed instead of mocking player.position
- Copilot advise: rename question in dialog
- feat(localization): Adjust button styling and hide tab bar when only one tab remains
- feat(localization): Implement label color management and UI integration
- feat(classification): Implement head management with add, rename, and delete functionalities
- feat(classification): Hide training tab and refactor tab removal logic
- feat(localization): Enhance localization inference with head context and configuration management
- feat(localization): Enhance smart event handling and UI interactions
- Refactor Localization and Classification Controllers
- fix: dense desription removal was not working
- feat: Ensure chronological order of dense and localization events after add, modify, and delete operations
- feat: Enhance Dense Description module with improved signal handling and controller API
- feat: Enhance Description module with improved signal handling and API methods
- feat: Improve column layout handling in DenseAnnotationPanel with retry mechanism
- feat: Add mute button with icon and tooltip to MediaCenterPanel
- Refactor tests to use dataset_explorer_controller directly
- feat: Refactor media handling by removing QMediaPlayer dependencies and implementing signal-based playback control
- feat: Enhance dense description functionality with new event handling and UI updates
- feat: Enable immediate saving of manual annotations and update confirm button visibility in ClassificationAnnotationPanel
What's Changed
- Refactor dataset state management and stabilize annotation workflows across all modes by @SilvioGiancola in #11
Full Changelog: v1.1.6.1...v1.2.0
v1.1.6.1
Release Notes
Scope
This release includes all changes merged from:
Highlights
- Major UI/controller architecture simplification across all modes.
- Full migration to Qt Designer
.ui-driven panels for core app surfaces. - Dataset Explorer is now the central owner of sample lifecycle and selection routing.
- Persistent Recent Datasets in Welcome screen (QSettings-backed).
- Large pytest-qt GUI suite expansion for lifecycle and mode workflows.
New and Improved
Unified and simplified app structure
- Flattened
ui/structure (removed deep nesting andui/common). - Flattened shared controllers (removed
controllers/common). - Standardized package pattern per panel:
__init__.py+.ui+README.md.
Dataset Explorer-first workflow
- Terminology normalized from “video/clip” to sample in explorer flows/UI.
- Add/remove/filter/clear operations centralized in
DatasetExplorerController. - Selection contract now uses canonical Data ID dispatch to mode controllers.
- Multi-view media routing handled centrally through Dataset Explorer + media player.
Navigation and media routing cleanup
- Media selection is routed directly from Dataset Explorer to central media player.
- Removed dead/duplicate navigation code from mode controllers.
- Navigation controls were relocated to mode-appropriate widgets.
- Filter behavior improved: when a filter leaves no visible samples, media and annotations are cleared.
Mode panel/controller refactors
- Description and Dense Description moved to single-controller architecture with
.uipanels. - Localization moved to
.uipanel + consolidated controller architecture. - Classification panel and controller were aligned with the same architecture direction.
- Old/unused child widget files and obsolete manager patterns were removed.
Welcome and project lifecycle UX
- Welcome screen now has Recent Datasets integration with persistent storage via
QSettings. - Improved close workflow for dirty projects with explicit options:
- Save
- Save As
- Close Without Saving
- Cancel
- No unsaved-changes popup when dataset is clean.
Testing and Quality
- Expanded GUI coverage with
pytest-qtacross:- app lifecycle
- recent datasets
- dataset editing
- classification/localization/description/dense workflows
- Added deterministic test fixtures, headless defaults, and QSettings isolation.
- Added tests for routing and filter behavior (including empty-visible-list clearing behavior).
Breaking/Internal Migration Notes
- Import paths changed after UI/controllers flattening (clean-cut, no compatibility aliases).
DatasetExplorerControllernow owns add/remove/filter/clear logic; mode controllers no longer own these flows.- Selection wiring is now Data ID-based (
on_data_selected(data_id)style). - Some older media/player navigation signals and legacy dispatcher paths were removed.
- If you maintain local extensions/plugins, update imports and controller entrypoints accordingly.
Notes
- “Show Smart Labelled” remains future-ready for Description/Dense; current behavior may produce no smart matches for those modes until smart labeling is introduced there.
VideoAnnotationTool_V1.1.6
-
Data Sandbox Logic: Implemented strict data isolation between Manual and Smart annotations, featuring a dual-list UI (Predicted vs. Confirmed) for accumulated AI results.
-
OSL JSON Standard: Standardized export format by merging all events into a single array, using confidence scores to distinguish AI results and ensuring strict integer types for timestamps.
-
Robust Undo/Redo: Added comprehensive history support for Smart Annotation (Run, Confirm, Delete) with tab-aware UI refreshing to prevent view-switching bugs.
-
UX & Stability: Added an indeterminate progress bar for inference, fixed schema registration for new projects, and implemented full state resetting when switching or creating projects.
-
Fix some bugs of deployment(ci.yml and release.yml)
VideoAnnotationToolV1.1.5
- Introduced a compact dynamic label flow layout that replaces the rigid 2-column grid, with auto-sized buttons and natural wrapping for better space usage.
- Added quick timestamp editing with a Set to Current Video Time action for fast event updates.
- Improved event list navigation so newly created or modified events remain highlighted and auto-scroll into view after re-sorting.
- Refined the interface with reduced button height and a cleaner blue + Add Label style to minimize visual clutter.
- Integrated the training workflow with
soccernetprothrough a backgroundQThread, keeping the UI responsive during training. - Added real-time training monitoring with a progress bar and status updates by parsing live stdout/stderr logs.
- Fixed configuration and path issues, including missing keys and external-drive dataset support.
- Added user controls for safe training interruption and automatic checkpoint saving next to annotation files.
- Documented FFmpeg-based fixes for macOS video decoding issues with unsupported formats.
VideoAnnotationTool V1.1.4.1
- Modified apply_action_filter to make Hand Labelled and Smart Labelled filters inclusive rather than mutually exclusive.
- Added real-time filter refreshing and refactored logic for batch confirmation, undo/redo, and robust confidence parsing.
- Added logic to reset smart annotation UI components in the right panel within the _clear_workspace method.
- Inserted filter refresh calls in refresh_ui_after_undo_redo to ensure the left list syncs immediately after undo/redo.
- Fixed key mismatch in batch undo logic by changing old_batch to old_data to match the history stack.
- Corrected undo key names and updated batch results to pass rich dictionaries with confidence instead of plain strings.
- Added descriptive "Start:" and "End:" labels before the batch inference selection comboboxes in the UI.
- Fix Save/Export button state to properly recognize confirmed smart annotations in Classification mode.
VideoAnnotationTool V1.1.4
- Implemented dynamic label mapping in config.yaml to remove hardcoded class dependencies.
- Fixed cross-loading bugs; eliminated the need to start from an empty JSON; fixed task-name validation errors.
- Implemented dual-track export (Hand/Smart labels); refined schema to ensure standard action_classification output.
- Implemented "hard-root" logic; eliminated redundant dataset copying by referencing source paths directly.
- Introduced a compact tabbed interface (Hand/Smart); optimized vertical spacing and implemented dynamic font scaling.
- Developed independent Smart Annotation confirmation; added a 4-state filter (All/Hand/Smart/None).
- Expanded the Undo/Redo system to support batch operations and AI inference tasks.
Video Annotation Tool
Update from "SoccernetPro" to “Video Annotation Tool”
- Update release.yml
- Update release.yml
- Update ci.yml
- Update welcome_widget.py
- Update viewer.py
- Update README.md
- Delete .DS_Store
- Update README.md
- Update README.md
- Update README.md
- Update README.md
- Update deploy_docs.yml
- Update release.yml
- Update ci.yml
- Update README.md
- Update welcome_widget.py
- Delete test_data/invalid_json/invalid_classification_json/IMPORT04.json
- Delete test_data/invalid_json/invalid_classification_json/IMPORT03.json
- Delete test_data/invalid_json/invalid_classification_json/IMPORT02.1.json
- Delete test_data/invalid_json/invalid_classification_json/IMPORT02-2.json
V1.1.2.2
- Update app_state.py
- Update history_manager.py
- Update editor.py
- Update inference_manager.py
- Update inference_manager.py
- Update main.py
- Update release.yml
- Update ci.yml
- Update requirements.txt
- Update inference_manager.py
- Update inference_manager.py
- Update ci.yml
- Update release.yml
- Update ci.yml
- Update requirements.txt
- Update release.yml
- Update ci.yml
- Update requirements.txt
- Update config.yaml
- Update release.yml
SoccernetPro_Smart_Annotation_Tool
- Update inference_manager.py
- Update main.py
- Update release.yml
- Update ci.yml
- Update requirements.txt
- Update inference_manager.py
- Update inference_manager.py
- Update ci.yml
- Update release.yml
- Update ci.yml
- Update requirements.txt
- Update release.yml
- Update ci.yml
- Update requirements.txt
- Update config.yaml
- Update release.yml
- Update deploy_docs.yml
- Update ci.yml
- Update requirements.txt
- Update ci.yml
SoccernetPro_Annotation_Tool
- Update welcome_widget.py
- Delete test_data/invalid_json/invalid_classification_json/IMPORT04.json
- Delete test_data/invalid_json/invalid_classification_json/IMPORT03.json
- Delete test_data/invalid_json/invalid_classification_json/IMPORT02.1.json
- Delete test_data/invalid_json/invalid_classification_json/IMPORT02-2.json
- Delete test_data/invalid_json/invalid_classification_json/IMPORT01.1.json
- Delete test_data/invalid_json/invalid_classification_json/IMPORT01-2.json
- Upload invalid JSON of classification
- Update style.qss
- Update dynamic_widgets.py
- Update gui_overview.md
- Upload screenshots of main UI pages
- Create README.md
- Delete docs/assets/localization-UI.png
- Delete docs/assets/classification-UI.png
- Update loc_file_manager.py
- Update dense_file_manager.py
- Update ci.yml
- Update release.yml
- Update ci.yml