cecile_supercool_tracker/
lib.rs

1//!
2//! # Similari
3//!
4//! The purpose of the crate is to provide tools to config.toml in-memory vector (feature) similarity engines.
5//! Similarity calculation is an important resource demanding task broadly used in machine learning and AI systems.
6//! Read more about it at GitHub [README](https://github.com/insight-platform/Similari/blob/main/README.md)
7//!
8
9/// Holds auxiliary functions that calculate distances between two features.
10///
11pub mod distance;
12
13/// Various auxiliary testing and example components
14///
15pub mod examples;
16
17/// Frequently used components
18///
19pub mod prelude;
20
21/// Holds basic abstractions for tracking - [Track](track::Track), auxiliary structures, traits, and functions.
22///
23/// It defines the track's look and feel, provides `Track` structure that holds track attributes and features,
24/// can accumulate track features and calculate feature distances between pair of tracks.
25///
26pub mod track;
27
28/// Ready-to-use trackers - IoU SORT, Mahalanobis SORT, Hybrid Visual/Positional Sort
29///
30pub mod trackers;
31
32/// Utility objects - bounding boxes, kalman_2d_box filter, polygon clipping, nms
33///
34pub mod utils;
35
36pub use track::store;
37pub use track::voting;
38
39use thiserror::Error;
40
41/// Package errors
42///
43#[derive(Error, Debug, Clone)]
44pub enum Errors {
45    /// Compared tracks have incompatible attributes, so cannot be used in calculations.
46    #[error("Attributes are incompatible between tracks and cannot be used in calculations.")]
47    IncompatibleAttributes,
48    /// One of tracks doesn't have features for specified class
49    ///
50    #[error("Requested observations for class={2} are missing in track={0} or track={1} - distance cannot be calculated.")]
51    ObservationForClassNotFound(u64, u64, u64),
52    /// Requested track is not found in the store
53    ///
54    #[error("Missing track={0}.")]
55    TrackNotFound(u64),
56
57    #[error("Missing requested tracks.")]
58    TracksNotFound,
59
60    /// The distance is calculated against self. Ignore it.
61    ///
62    #[error("Calculation with self id={0} not permitted")]
63    SameTrackCalculation(u64),
64
65    /// Track ID is duplicate
66    ///
67    #[error("Duplicate track id={0}")]
68    DuplicateTrackId(u64),
69
70    /// Object cannot be converted
71    ///
72    #[error("Generic BBox cannot be converted to a requested type")]
73    GenericBBoxConversionError,
74
75    /// Index is out of range
76    #[error("The index is out of range")]
77    OutOfRange,
78}
79
80pub const EPS: f32 = 0.00001;
81
82#[cfg(feature = "python")]
83mod python {
84    use crate::trackers::batch::python::PyPredictionBatchResult;
85    use crate::trackers::sort::batch_api::python::{PyBatchSort, PySortPredictionBatchRequest};
86    use crate::trackers::sort::python::{PyPositionalMetricType, PySortTrack, PyWastedSortTrack};
87    use crate::trackers::sort::simple_api::python::PySort;
88    use crate::trackers::spatio_temporal_constraints::python::PySpatioTemporalConstraints;
89    use crate::trackers::visual_sort::batch_api::python::{
90        PyBatchVisualSort, PyVisualSortPredictionBatchRequest,
91    };
92    use crate::trackers::visual_sort::metric::python::PyVisualSortMetricType;
93    use crate::trackers::visual_sort::options::python::PyVisualSortOptions;
94    use crate::trackers::visual_sort::python::{
95        PyVisualSortObservation, PyVisualSortObservationSet, PyWastedVisualSortTrack,
96    };
97    use crate::trackers::visual_sort::simple_api::python::PyVisualSort;
98    use crate::utils::bbox::python::{PyBoundingBox, PyUniversal2DBox};
99    use crate::utils::clipping::clipping_py::{
100        intersection_area_py, sutherland_hodgman_clip_py, PyPolygon,
101    };
102    use crate::utils::kalman::kalman_2d_box::python::{
103        PyUniversal2DBoxKalmanFilter, PyUniversal2DBoxKalmanFilterState,
104    };
105    use crate::utils::kalman::kalman_2d_point::python::{
106        PyPoint2DKalmanFilter, PyPoint2DKalmanFilterState,
107    };
108    use crate::utils::kalman::kalman_2d_point_vec::python::PyVec2DKalmanFilter;
109    use crate::utils::nms::nms_py::nms_py;
110    use pyo3::prelude::*;
111
112    #[pyfunction]
113    pub fn version() -> String {
114        env!("CARGO_PKG_VERSION").to_string()
115    }
116
117    #[pymodule]
118    #[pyo3(name = "similari")]
119    fn similari(_py: Python, m: &PyModule) -> PyResult<()> {
120        pyo3_log::init();
121
122        m.add_class::<PyBoundingBox>()?;
123        m.add_class::<PyUniversal2DBox>()?;
124        m.add_class::<PyPolygon>()?;
125        m.add_class::<PySortTrack>()?;
126        m.add_class::<PyWastedSortTrack>()?;
127
128        m.add_class::<PyUniversal2DBoxKalmanFilterState>()?;
129        m.add_class::<PyUniversal2DBoxKalmanFilter>()?;
130
131        m.add_class::<PyPoint2DKalmanFilterState>()?;
132        m.add_class::<PyPoint2DKalmanFilter>()?;
133
134        m.add_class::<PyVec2DKalmanFilter>()?;
135
136        m.add_class::<PySortPredictionBatchRequest>()?;
137        m.add_class::<PySpatioTemporalConstraints>()?;
138        m.add_class::<PySort>()?;
139
140        m.add_class::<PyPositionalMetricType>()?;
141        m.add_class::<PyVisualSortMetricType>()?;
142        m.add_class::<PyVisualSortOptions>()?;
143        m.add_class::<PyVisualSortObservation>()?;
144        m.add_class::<PyVisualSortObservationSet>()?;
145        m.add_class::<PyVisualSortPredictionBatchRequest>()?;
146        m.add_class::<PyWastedVisualSortTrack>()?;
147        m.add_class::<PyVisualSort>()?;
148
149        m.add_class::<PyPredictionBatchResult>()?;
150
151        m.add_class::<PySortPredictionBatchRequest>()?;
152        m.add_class::<PyBatchSort>()?;
153
154        m.add_class::<PyBatchVisualSort>()?;
155
156        m.add_function(wrap_pyfunction!(version, m)?)?;
157        m.add_function(wrap_pyfunction!(nms_py, m)?)?;
158        m.add_function(wrap_pyfunction!(sutherland_hodgman_clip_py, m)?)?;
159        m.add_function(wrap_pyfunction!(intersection_area_py, m)?)?;
160        Ok(())
161    }
162}