Changelog
Protege Model filter release notes
v0.1.32 - 2026-09-23Direct link to v0.1.32 - 2026-09-23
ChangedDirect link to Changed
- Bump the openfilter dependency to 1.4.0
v0.1.31 - 2026-08-21Direct link to v0.1.31 - 2026-08-21
AddedDirect link to Added
- ByteTrack tracking, opt-in via
enable_tracking(PLAT-1524). A pipeline that needed track ids had to usefilter-deimv2-detection, which only loads DEIMv2, so tracking and the choice between RT-DETR and DEIMv2 were the same decision. This filter serves any Protege artifact, so putting the tracker here separates them. The id is what lets a downstream filter run once per object rather than once per frame: colour and description on a car in view for 200 frames becomes one call instead of 200. Off by default, since it costs a tracker update per frame and only pays off when something downstream keys on the id. One tracker per topic rather than one global, because two camera streams share a model instance and a single tracker would match an object in one feed against an object in the other. Ids are emitted astracker_ids, parallel torois, so consumers that index intoroispositionally are unaffected. A tracker failure degrades to untracked rather than dropping the frame: a detection without an id is still a detection.
FixedDirect link to Fixed
- Clamp boxes at the frame edge instead of dropping them (PLAT-1567). This changes detection output on every pipeline, including those that never turn tracking on. A 1e-6 tolerance check sat above the existing clamp in
_validate_bboxand returned early, so a normalised box even fractionally outside[0, 1]was rejected rather than clamped. Measured on a DEIMv2 weapons model over 80 images: 71 boxes dropped against 112 delivered, 39% of the model's output, nine of themgun. It was also not architecture-neutral: over 120 frames DEIMv2 emitted 8.0% out-of-range boxes and RT-DETR 0.0%, so the reject penalised one architecture and skewed any comparison between them made through this filter. Boxes up toOUT_OF_RANGE_LIMIT(0.05, 5% of the frame) outside range are now clamped and kept; beyond that they are still dropped and logged, since the coordinates are wrong rather than imprecise. Expect detection counts to rise on DEIMv2 pipelines after this release.
v0.1.30 - 2026-08-20Direct link to v0.1.30 - 2026-08-20
FixedDirect link to Fixed
- Accept Protege's task name for object detection (FILTER-637). Protege writes
task = "object_detection"into a trained artifact'srun_config; this filter calls that task"detection"and compared the two strings without normalising, so autodetection raised on every object-detection artifact Protege produces, DEIMv2 and RT-DETR alike. That is why every detection script underscripts/passesprotege_taskexplicitly: the workaround lived in the callers. The alias is applied at all three points a task can arrive from: config,PROTEGE_TASK, and the artifact itself.
ChangedDirect link to Changed
- Bump the openfilter dependency to 1.3.0
protege-runtime~=0.33.0becomesprotege-runtime[transformers]>=0.33.15,<0.34. 0.33.15 is the first release carrying DEIMv2 support, so the old specifier could resolve to a release that cannot load these artifacts at all.transformersmoves from 4.x to 5.x, and stops being a direct dependency of this project. It wastransformers>=4.45,<5here; DEIMv2 landed intransformers5.10 and is absent from 4.57, so 4.x cannot load these artifacts. The floor now comes fromprotege-runtime[transformers], which declarestransformers>=5.10,<6, verified in the runtime'spyproject.tomlatv0.33.15, the floor of the range above, so the extra owns it across every version this project accepts. Nothing in this repository importstransformers, so a second declaration here was a pin held on a transitive's behalf and one that could drift out of step with it. This is the largest compatibility change in the release: anything downstream pinned totransformers4.x will conflict.
v0.1.29 - 2026-08-10Direct link to v0.1.29 - 2026-08-10
ChangedDirect link to Changed
- Build the image on
openfilter-base(weekly apt-upgraded python-slim) instead of a stalepython:X.Y.Z-slimpin, clearing the OS-package CVEs the pin carried. - Update the openfilter dependency to 1.2.2
v0.1.28 - 2026-08-04Direct link to v0.1.28 - 2026-08-04
AddedDirect link to Added
- Distributed OTel Tracing (FILTER-466): Fully generic, context-gated OpenTelemetry tracer spans (
model.preprocess,model.inference,model.cuda_sync, andmodel.postprocess) inside all concrete model classes (DetectionModel,ClassificationModel,OCRModel). Spans seamlessly parent and nest under the incoming ZeroMQ per-frame traceparent, enabling end-to-end distributed trace waterfalls across complex pipelines. - Temporal Batching and Batched Inference (FILTER-466): Implemented a highly optimized
process_batchmethod inFilterProtegeModelto stack individual frame tensors into a single GPU/device tensor, invoke a single batched forward pass on CUDA, and scatter results back. Yields up to 1.8x throughput gains for batched streams.
ChangedDirect link to Changed
- Update
openfilter[all]to>=1.2.1(from the compatible-release~=1.1.2, which capped at<1.2.0and rejected openfilter 1.2.0). - Replaced the exact
opencv-python-headless==4.13.0.92pin with the bounded range>=4.13.0.92,<6(floor raised to avoid the 4.13.0.90 packaging bug). The models and the filter importcv2directly, so the dependency stays declared, but opencv also arrives transitively through openfilter and an exact pin here conflicts the moment that transitive constraint moves. - Regenerated
uv.lockagainst the updated specifiers. The lock also carried pre-existing drift and now recordspytest9.0.3, matching thedevextra; it had been left at 9.0.2. - Chicago Street View geolocation dataset pipeline (FILTER-412): Added geolocation scripts and configurations to build datasets for mapillary corpus creation, processing dashcam labels, VPR classification/view-generation, regression manifests, and pipeline evaluation. Also implemented
SQRModelfor Simultaneous Quantile Regression (loaded dynamically whentask_type="sqr_regression"). - Pin the Docker base to
python:3.11.12-slim. - Refresh the
docker-compose.yaml/docker-compose-aggregation.yamlopenfilter utility image tags to1.2.1and pin the filter's own image to the release version. - Switch dev-tooling pins to
>=ranges. - Build the image from source (
COPY . .+pip install .) instead of re-installing the published GAR wheel by version. This makes the image consistent with the rest of the fleet and lets the release PR'sdry-run-publishactually validate the new version's build (previously it could only pull an already-published wheel, so a version bump had no pre-merge image validation). The customer-facing wheel is still published independently bypublish-python-wheel;protege-runtime/protegeresolve from the private GAR index via the short-livedgar_token, everything else from PyPI. Also exclude.git/tests/from the build context.
v0.1.27 - 2026-04-24Direct link to v0.1.27 - 2026-04-24
FixedDirect link to Fixed
- Restore
# Changelogas the top-level RELEASE.md header (previous release accidentally prepended a stray# v0.1.26H1).
v0.1.26 - 2026-04-23Direct link to v0.1.26 - 2026-04-23
FixedDirect link to Fixed
- Restore GAR token in filter.mk build-image for protege-runtime GAR-only dependency
v0.1.25 - 2026-04-23Direct link to v0.1.25 - 2026-04-23
ChangedDirect link to Changed
- Bump openfilter SDK to >=0.1.30
- Add source-paths release gate to CI workflow
v0.1.24 - 2026-04-21Direct link to v0.1.24 - 2026-04-21
ChangedDirect link to Changed
- Bump
protege-runtimefloor from==0.8.5to~=0.20.0(compatible-release, caps at<0.21.0). The large numerical jump reflects two things: (a) theprotege/protege-runtime/protege-pipelinestriplet was reunified from separate repos into a workspace and aligned to0.19.0for lockstep versioning, then (b) bumped to0.20.0for the layering inversion (runtime no longer depends on training code). Only two real release cycles of behavior change, not twelve. - Update
AlignCollateimport fromprotege.ocrtoprotege.model_runtime.ocrto match its post-inversion canonical location in the standalone runtime wheel.
RemovedDirect link to Removed
- Breaking: Dropped support for Python 3.10 and 3.12.
protege-runtime0.20.0 requires>=3.11, <3.12, sofilter-protege-modelnow does too. Downstream consumers on 3.10 or 3.12 must either pin an olderfilter-protege-modelor upgrade to 3.11.
v0.1.23 - 2026-04-20Direct link to v0.1.23 - 2026-04-20
ChangedDirect link to Changed
- Simplify filter.mk build-image (plain docker build, DOCKER_TAG)
v0.1.22 - 2026-04-15Direct link to v0.1.22 - 2026-04-15
ChangedDirect link to Changed
- Add create-release.yaml workflow for GAR premium publishing (push + PR + workflow_dispatch)
- Remove old ci.yaml (shared premium workflow replaces it, removes JFROG secrets)
- Switch to shared security-scan workflow with gcloud_auth
- Enable gcloud_auth_build for Docker build GAR access
v0.1.21 - 2026-04-04Direct link to v0.1.21 - 2026-04-04
FixedDirect link to Fixed
- Restore
VERSIONandVERSION_SHAmetadata files in Docker image for openfilter'sFilterContext(OpenLineage events, metrics). Lost when migrating fromfilter_basetopython:3.11-slimin v0.1.15.
v0.1.20 - 2026-04-04Direct link to v0.1.20 - 2026-04-04
FixedDirect link to Fixed
- Bump
opencv-python-headlessfrom 4.13.0.90 to 4.13.0.92 to fixImportError: libxcb.so.1in slim containers (packaging bug in 4.13.0.90) - Bump
openfilterminimum from 0.1.26 to 0.1.27 - Update docker-compose openfilter container images to 0.1.27
v0.1.19 - 2026-04-02Direct link to v0.1.19 - 2026-04-02
ChangedDirect link to Changed
- Rename
filter_runtimetoopenfilterCLI in Makefile and filter.mk - Update
protege-runtimedependency from 0.8.3 to 0.8.5 (opencv-python-headless + onnxsim pin)
v0.1.18 - 2026-04-02Direct link to v0.1.18 - 2026-04-02
FixedDirect link to Fixed
- Switch
opencv-pythontoopencv-python-headlessto fixImportError: libxcb.so.1in headless GKE containers
v0.1.17 - 2026-04-02Direct link to v0.1.17 - 2026-04-02
ChangedDirect link to Changed
- Update openfilter runtime to 0.1.26 (adds
OPENFILTER_APPEND_LD_LIBRARY_PATHandOPENFILTER_APPEND_PATHenv vars for GKE GPU driver path injection, CUDA/GPU validation at startup, standardizedFILTER_*env var support for core I/O filters) - Update docker-compose openfilter container images to 0.1.26
v0.1.16 - 2026-04-01Direct link to v0.1.16 - 2026-04-01
AddedDirect link to Added
- Enhanced documentation with comprehensive example scripts section in README
- Merged documentation files (index.md into overview.md)
v0.1.15 - 2026-04-01Direct link to v0.1.15 - 2026-04-01
ChangedDirect link to Changed
- Migrate Docker image from legacy
ocitopremium-filtersGAR registry (PLAT-715) - Migrate Dockerfile from legacy
filter_baseimage to standardpython:3.11-slimbuild (PLAT-796) - Remove unused MODEL_IMAGE infrastructure (Dockerfile.model, build/publish targets)
v0.1.14 - 2026-03-09Direct link to v0.1.14 - 2026-03-09
FixedDirect link to Fixed
- Pin onnxsim<0.5 to use pre-built wheels (avoids cmake requirement)
v0.1.13 - 2026-03-09Direct link to v0.1.13 - 2026-03-09
FixedDirect link to Fixed
- Update openfilter dependency to 0.1.21 (Monitoring updates)
ChangedDirect link to Changed
- Relax openfilter version constraint from exact pin to
~=0.1.0for cascade rebuild compatibility
v0.1.12 - 2026-01-28Direct link to v0.1.12 - 2026-01-28
FixedDirect link to Fixed
- Update openfilter dependency to 0.1.20 (fixes UnboundLocalError in filter error handling)
v0.1.11 - 2026-01-21Direct link to v0.1.11 - 2026-01-21
FixedDirect link to Fixed
- Updated dependencies to latest versions
- CVE: update
opencv-python-headlessto 4.13.0 (fixes ffmpeg security vulnerability) via OpenFilter 0.1.18
v0.1.10 - 2026-01-16Direct link to v0.1.10 - 2026-01-16
FixedDirect link to Fixed
- Fixed release notes quoting issue that broke gh release create command by replacing double quotes with single quotes in changelog text
PlannedDirect link to Planned
- Support for additional model types (segmentation)
- Enhanced visualization options
- Performance optimizations
- Additional configuration options
- Add security scan workflow
v0.1.9 - 2026-01-16Direct link to v0.1.9 - 2026-01-16
FixedDirect link to Fixed
- Fixed CUDA illegal memory access error by adding proper synchronization after inference
- Added CUDA synchronization in DetectionModel and ClassificationModel to prevent accessing GPU tensors before operations complete
- Improved bounding box validation with tolerance for floating-point precision issues
- Enhanced error handling for CUDA operations with proper cache clearing
- Added safe tensor-to-CPU conversion before accessing values to prevent memory access errors
- Optimized CUDA synchronization to occur once per frame instead of multiple times per detection
v0.1.8 - 2025-10-24Direct link to v0.1.8 - 2025-10-24
FixedDirect link to Fixed
- Updated protege-runtime dependency to latest version
v0.1.7 - 2025-10-21Direct link to v0.1.7 - 2025-10-21
AddedDirect link to Added
- Added support for object detection and bounding box visualization
v0.1.6 - 2025-10-17Direct link to v0.1.6 - 2025-10-17
AddedDirect link to Added
- Added support for multilabel classification in the filter model.
ChangedDirect link to Changed
- Refactored core module structure to better support aggregation and multilabel flows
- Extracted aggregation pipeline into
filter_protege_model/aggregation.py - Consolidated shared helpers into
filter_protege_model/utils.py - Simplified
filter_protege_model/filter.pyby modularizing model handling and reducing duplication
v0.1.5 - 2025-10-13Direct link to v0.1.5 - 2025-10-13
FixDirect link to Fix
- Adjusted classification label size to be proportionally scaled to frame dimensions in a more subtle and controlled way
v0.1.4 - 2025-10-08Direct link to v0.1.4 - 2025-10-08
AddedDirect link to Added
- Model data aggregation functionality with demo script
- Docker compose configuration for aggregation services
- Enhanced filter capabilities for combined model processing
v0.1.3 - 2025-10-07Direct link to v0.1.3 - 2025-10-07
AddedDirect link to Added
- Added
visualization_source_topicto select the image source for main visualization frames (e.g.,main,viz_chit,viz_bowl).
v0.1.2 - 2025-10-06Direct link to v0.1.2 - 2025-10-06
FixedDirect link to Fixed
- Fixed CUDA multiprocessing error by setting spawn method in filter.py
- Fixed device mismatch error by ensuring input tensors are moved to correct device
- Fixed image brightness/contrast issues in visualization by preserving original image colors
v0.1.1 - 2025-08-11Direct link to v0.1.1 - 2025-08-11
AddedDirect link to Added
- ClassificationModel concrete implementation for image classification tasks
- DetectionModel concrete implementation for object detection tasks
- Enhanced model detection with support for multiple model types
- Improved error handling and validation for model loading
- Additional configuration options for model-specific parameters
- Support for model-specific preprocessing and postprocessing
- Enhanced logging with model-specific information
- Better performance monitoring for different model types
Added (Dataset Generation)Direct link to Added (Dataset Generation)
- OCR Image Saving: Automatic image saving with OCR prediction filenames
- Dataset Generation Script:
generate_labels.pyfor creating training datasets - Environment Variables:
FILTER_OCR_SAVE_IMGSandFILTER_OCR_SAVE_DIRsupport - Smart File Management: Automatic directory creation and collision prevention
- Dataset Workflow: Complete pipeline from OCR processing to training dataset creation
Technical Improvements (Dataset Tools)Direct link to Technical Improvements (Dataset Tools)
- Intelligent Naming: Uses OCR predictions as filenames for easy dataset organization
- Sanitization: Handles special characters and enforces filename length limits
- Timestamped Organization: Creates organized folder structure for each processing run
- JSON Label Generation: Standardized format for training dataset labels
Technical DetailsDirect link to Technical Details
- Enhanced BaseModel architecture with model-specific implementations
- Improved model loading and validation mechanisms
- Better integration with Protege Runtime
- Enhanced configuration management for different model types
- Comprehensive testing framework for all model types
v0.1.0 - 2025-08-07Direct link to v0.1.0 - 2025-08-07
AddedDirect link to Added
- Initial Release: new Protege Model filter
- BaseModel abstract class for extensible model architecture
- OCRModel concrete implementation for text recognition
- Optional visualization with separate ZMQ topics
- Auto-detection of model task type and architecture
- Performance monitoring and statistics
- Comprehensive error handling and validation
- Environment variable configuration support
- Real-time video processing capabilities
- Web interface integration via Webvis filter
FeaturesDirect link to Features
- Multi-task Support: Framework for OCR, detection, classification tasks
- Real-time Processing: Processes video streams in real-time
- Configurable Models: Supports custom model artifacts
- Optional Visualization: Configurable visualization with separate output topics
- BaseModel Architecture: Abstract class for consistent model interfaces
- Performance Control: Visualization can be disabled for better performance
- Extensible Design: Easy to add new model types by inheriting from BaseModel
Technical DetailsDirect link to Technical Details
- Compatible with Protege Runtime v0.8.1
- OpenFilter pipeline integration
- Support for CPU and CUDA devices
- Configurable confidence thresholds
- OCR preprocessing with customizable dimensions
- Comprehensive logging and error reporting