kinematic-tracker 15.0.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 (256) hide show
  1. kinematic_tracker-15.0.0/.bumpversion.toml +32 -0
  2. kinematic_tracker-15.0.0/.coveragerc +13 -0
  3. kinematic_tracker-15.0.0/.gitignore +12 -0
  4. kinematic_tracker-15.0.0/.gitlab-ci.yml +34 -0
  5. kinematic_tracker-15.0.0/CHANGELOG.md +111 -0
  6. kinematic_tracker-15.0.0/PKG-INFO +35 -0
  7. kinematic_tracker-15.0.0/README.md +21 -0
  8. kinematic_tracker-15.0.0/assets/reshot-icon-tracking-services-TWK37ZBV68.svg +32 -0
  9. kinematic_tracker-15.0.0/maintainers/README.md +38 -0
  10. kinematic_tracker-15.0.0/pyproject.toml +32 -0
  11. kinematic_tracker-15.0.0/ruff.toml +89 -0
  12. kinematic_tracker-15.0.0/src/kinematic_tracker/__init__.py +3 -0
  13. kinematic_tracker-15.0.0/src/kinematic_tracker/association/__init__.py +0 -0
  14. kinematic_tracker-15.0.0/src/kinematic_tracker/association/association.py +124 -0
  15. kinematic_tracker-15.0.0/src/kinematic_tracker/association/association_method.py +11 -0
  16. kinematic_tracker-15.0.0/src/kinematic_tracker/association/association_metric.py +11 -0
  17. kinematic_tracker-15.0.0/src/kinematic_tracker/association/g_iou_scores_aligned.py +108 -0
  18. kinematic_tracker-15.0.0/src/kinematic_tracker/association/match_driver_base.py +62 -0
  19. kinematic_tracker-15.0.0/src/kinematic_tracker/association/match_greedy.py +58 -0
  20. kinematic_tracker-15.0.0/src/kinematic_tracker/association/match_hungarian.py +72 -0
  21. kinematic_tracker-15.0.0/src/kinematic_tracker/association/metric_driver_base.py +70 -0
  22. kinematic_tracker-15.0.0/src/kinematic_tracker/association/metric_giou_aligned.py +89 -0
  23. kinematic_tracker-15.0.0/src/kinematic_tracker/association/metric_mahalanobis.py +97 -0
  24. kinematic_tracker-15.0.0/src/kinematic_tracker/core/__init__.py +0 -0
  25. kinematic_tracker-15.0.0/src/kinematic_tracker/core/creation_id.py +14 -0
  26. kinematic_tracker-15.0.0/src/kinematic_tracker/core/derivative_mixer.py +89 -0
  27. kinematic_tracker-15.0.0/src/kinematic_tracker/core/free_id.py +21 -0
  28. kinematic_tracker-15.0.0/src/kinematic_tracker/core/kalman_cv2_copy.py +19 -0
  29. kinematic_tracker-15.0.0/src/kinematic_tracker/core/loose_items.py +20 -0
  30. kinematic_tracker-15.0.0/src/kinematic_tracker/core/track_free_id.py +10 -0
  31. kinematic_tracker-15.0.0/src/kinematic_tracker/matrices/__init__.py +0 -0
  32. kinematic_tracker-15.0.0/src/kinematic_tracker/matrices/const_acc/__init__.py +0 -0
  33. kinematic_tracker-15.0.0/src/kinematic_tracker/matrices/const_acc/fundamental.py +18 -0
  34. kinematic_tracker-15.0.0/src/kinematic_tracker/matrices/const_acc/proc_cov.py +26 -0
  35. kinematic_tracker-15.0.0/src/kinematic_tracker/matrices/const_jerk/__init__.py +0 -0
  36. kinematic_tracker-15.0.0/src/kinematic_tracker/matrices/const_jerk/fundamental.py +23 -0
  37. kinematic_tracker-15.0.0/src/kinematic_tracker/matrices/const_jerk/proc_cov.py +41 -0
  38. kinematic_tracker-15.0.0/src/kinematic_tracker/matrices/const_pos/__init__.py +0 -0
  39. kinematic_tracker-15.0.0/src/kinematic_tracker/matrices/const_pos/fundamental.py +14 -0
  40. kinematic_tracker-15.0.0/src/kinematic_tracker/matrices/const_pos/proc_cov.py +20 -0
  41. kinematic_tracker-15.0.0/src/kinematic_tracker/matrices/const_vel/__init__.py +0 -0
  42. kinematic_tracker-15.0.0/src/kinematic_tracker/matrices/const_vel/fundamental.py +15 -0
  43. kinematic_tracker-15.0.0/src/kinematic_tracker/matrices/const_vel/proc_cov.py +34 -0
  44. kinematic_tracker-15.0.0/src/kinematic_tracker/matrices/factory.py +91 -0
  45. kinematic_tracker-15.0.0/src/kinematic_tracker/nd/__init__.py +0 -0
  46. kinematic_tracker-15.0.0/src/kinematic_tracker/nd/derivative_sorted.py +79 -0
  47. kinematic_tracker-15.0.0/src/kinematic_tracker/nd/gen_kf.py +99 -0
  48. kinematic_tracker-15.0.0/src/kinematic_tracker/nd/gen_x.py +139 -0
  49. kinematic_tracker-15.0.0/src/kinematic_tracker/nd/gen_xz.py +106 -0
  50. kinematic_tracker-15.0.0/src/kinematic_tracker/nd/precursors.py +54 -0
  51. kinematic_tracker-15.0.0/src/kinematic_tracker/nd/shape.py +64 -0
  52. kinematic_tracker-15.0.0/src/kinematic_tracker/proc_noise/__init__.py +0 -0
  53. kinematic_tracker-15.0.0/src/kinematic_tracker/proc_noise/kind.py +23 -0
  54. kinematic_tracker-15.0.0/src/kinematic_tracker/proc_noise/meta.py +63 -0
  55. kinematic_tracker-15.0.0/src/kinematic_tracker/proc_noise/nd_kkf_dia_noise.py +29 -0
  56. kinematic_tracker-15.0.0/src/kinematic_tracker/proc_noise/nd_kkf_proc_noise_factory.py +27 -0
  57. kinematic_tracker-15.0.0/src/kinematic_tracker/proc_noise/nd_kkf_white_noise_const.py +32 -0
  58. kinematic_tracker-15.0.0/src/kinematic_tracker/proc_noise/nd_kkf_white_noise_fd.py +134 -0
  59. kinematic_tracker-15.0.0/src/kinematic_tracker/tracker/__init__.py +0 -0
  60. kinematic_tracker-15.0.0/src/kinematic_tracker/tracker/kkf.py +90 -0
  61. kinematic_tracker-15.0.0/src/kinematic_tracker/tracker/track.py +77 -0
  62. kinematic_tracker-15.0.0/src/kinematic_tracker/tracker/tracker.py +357 -0
  63. kinematic_tracker-15.0.0/test/__init__.py +0 -0
  64. kinematic_tracker-15.0.0/test/association/__init__.py +0 -0
  65. kinematic_tracker-15.0.0/test/association/association/__init__.py +0 -0
  66. kinematic_tracker-15.0.0/test/association/association/test_get_match_driver.py +17 -0
  67. kinematic_tracker-15.0.0/test/association/association/test_get_metric_driver.py +21 -0
  68. kinematic_tracker-15.0.0/test/association/association/test_repr.py +9 -0
  69. kinematic_tracker-15.0.0/test/association/association/test_set_ind_pos_size.py +16 -0
  70. kinematic_tracker-15.0.0/test/association/conftest.py +34 -0
  71. kinematic_tracker-15.0.0/test/association/g_iou_scores_aligned/__init__.py +0 -0
  72. kinematic_tracker-15.0.0/test/association/g_iou_scores_aligned/conftest.py +48 -0
  73. kinematic_tracker-15.0.0/test/association/g_iou_scores_aligned/test_fixtures.py +22 -0
  74. kinematic_tracker-15.0.0/test/association/g_iou_scores_aligned/test_get_enclosing.py +22 -0
  75. kinematic_tracker-15.0.0/test/association/g_iou_scores_aligned/test_get_giou.py +22 -0
  76. kinematic_tracker-15.0.0/test/association/g_iou_scores_aligned/test_get_giou_diff.py +22 -0
  77. kinematic_tracker-15.0.0/test/association/g_iou_scores_aligned/test_get_intersection.py +21 -0
  78. kinematic_tracker-15.0.0/test/association/metric_driver_giou_aligned/__init__.py +0 -0
  79. kinematic_tracker-15.0.0/test/association/metric_driver_giou_aligned/test_giou_aligned_dim_end.py +61 -0
  80. kinematic_tracker-15.0.0/test/association/metric_driver_giou_aligned/test_giou_aligned_minimum.py +41 -0
  81. kinematic_tracker-15.0.0/test/association/metric_driver_mahalanobis/__init__.py +0 -0
  82. kinematic_tracker-15.0.0/test/association/metric_driver_mahalanobis/conftest.py +32 -0
  83. kinematic_tracker-15.0.0/test/association/metric_driver_mahalanobis/test_mahalanobis_driver.py +31 -0
  84. kinematic_tracker-15.0.0/test/association/test_match_driver_base.py +36 -0
  85. kinematic_tracker-15.0.0/test/association/test_match_driver_greedy.py +43 -0
  86. kinematic_tracker-15.0.0/test/association/test_match_driver_hungarian.py +43 -0
  87. kinematic_tracker-15.0.0/test/association/test_metric_driver_base.py +37 -0
  88. kinematic_tracker-15.0.0/test/association/test_metric_driver_greedy.py +37 -0
  89. kinematic_tracker-15.0.0/test/conftest.py +10 -0
  90. kinematic_tracker-15.0.0/test/core/__init__.py +0 -0
  91. kinematic_tracker-15.0.0/test/core/derivative_mixer/__init__.py +0 -0
  92. kinematic_tracker-15.0.0/test/core/derivative_mixer/conftest.py +11 -0
  93. kinematic_tracker-15.0.0/test/core/derivative_mixer/test_derivative_mixer.py +18 -0
  94. kinematic_tracker-15.0.0/test/core/derivative_mixer/test_dynamic.py +26 -0
  95. kinematic_tracker-15.0.0/test/core/derivative_mixer/test_exceptions.py +14 -0
  96. kinematic_tracker-15.0.0/test/core/test_creation_id.py +11 -0
  97. kinematic_tracker-15.0.0/test/core/test_free_id.py +12 -0
  98. kinematic_tracker-15.0.0/test/core/test_kalman_cv2_copy.py +15 -0
  99. kinematic_tracker-15.0.0/test/core/test_loose_items.py +18 -0
  100. kinematic_tracker-15.0.0/test/core/test_track_free_id.py +17 -0
  101. kinematic_tracker-15.0.0/test/matrices/__init__.py +0 -0
  102. kinematic_tracker-15.0.0/test/matrices/const_acc/__init__.py +0 -0
  103. kinematic_tracker-15.0.0/test/matrices/const_acc/test_fundamental.py +15 -0
  104. kinematic_tracker-15.0.0/test/matrices/const_acc/test_proc_cov.py +34 -0
  105. kinematic_tracker-15.0.0/test/matrices/const_jerk/__init__.py +0 -0
  106. kinematic_tracker-15.0.0/test/matrices/const_jerk/test_fundamental.py +15 -0
  107. kinematic_tracker-15.0.0/test/matrices/const_jerk/test_proc_cov.py +37 -0
  108. kinematic_tracker-15.0.0/test/matrices/const_pos/__init__.py +0 -0
  109. kinematic_tracker-15.0.0/test/matrices/const_pos/test_fundamental.py +13 -0
  110. kinematic_tracker-15.0.0/test/matrices/const_pos/test_proc_cov.py +29 -0
  111. kinematic_tracker-15.0.0/test/matrices/const_vel/__init__.py +0 -0
  112. kinematic_tracker-15.0.0/test/matrices/const_vel/test_fundamental.py +13 -0
  113. kinematic_tracker-15.0.0/test/matrices/const_vel/test_proc_cov.py +30 -0
  114. kinematic_tracker-15.0.0/test/matrices/factory/__init__.py +0 -0
  115. kinematic_tracker-15.0.0/test/matrices/factory/conftest.py +6 -0
  116. kinematic_tracker-15.0.0/test/matrices/factory/test_compute_f_mat_and_q_mat.py +29 -0
  117. kinematic_tracker-15.0.0/test/matrices/factory/test_different_models.py +45 -0
  118. kinematic_tracker-15.0.0/test/nd/__init__.py +0 -0
  119. kinematic_tracker-15.0.0/test/nd/derivative_sorted/__init__.py +0 -0
  120. kinematic_tracker-15.0.0/test/nd/derivative_sorted/cuboid_31/__init__.py +0 -0
  121. kinematic_tracker-15.0.0/test/nd/derivative_sorted/cuboid_31/conftest.py +17 -0
  122. kinematic_tracker-15.0.0/test/nd/derivative_sorted/cuboid_31/test_der_sorted_31.py +58 -0
  123. kinematic_tracker-15.0.0/test/nd/derivative_sorted/cuboid_4/__init__.py +0 -0
  124. kinematic_tracker-15.0.0/test/nd/derivative_sorted/cuboid_4/conftest.py +17 -0
  125. kinematic_tracker-15.0.0/test/nd/derivative_sorted/cuboid_4/test_der_sorted_4.py +55 -0
  126. kinematic_tracker-15.0.0/test/nd/derivative_sorted/test_derivative_sorted_basics.py +11 -0
  127. kinematic_tracker-15.0.0/test/nd/gen_kf/__init__.py +0 -0
  128. kinematic_tracker-15.0.0/test/nd/gen_kf/conftest.py +54 -0
  129. kinematic_tracker-15.0.0/test/nd/gen_kf/test_get_kf.py +36 -0
  130. kinematic_tracker-15.0.0/test/nd/gen_kf/test_kalman_filter_correct.py +46 -0
  131. kinematic_tracker-15.0.0/test/nd/gen_kf/test_kalman_filter_predict.py +25 -0
  132. kinematic_tracker-15.0.0/test/nd/gen_x/__init__.py +0 -0
  133. kinematic_tracker-15.0.0/test/nd/gen_x/conftest.py +16 -0
  134. kinematic_tracker-15.0.0/test/nd/gen_x/test_nd_kkf_get_f_mat.py +32 -0
  135. kinematic_tracker-15.0.0/test/nd/gen_x/test_nd_kkf_get_q_mat.py +42 -0
  136. kinematic_tracker-15.0.0/test/nd/gen_x/test_nd_kkf_mat_gen_x.py +25 -0
  137. kinematic_tracker-15.0.0/test/nd/gen_x/test_nd_kkf_mat_gen_x_set_orders.py +23 -0
  138. kinematic_tracker-15.0.0/test/nd/gen_z/__init__.py +0 -0
  139. kinematic_tracker-15.0.0/test/nd/gen_z/conftest.py +16 -0
  140. kinematic_tracker-15.0.0/test/nd/gen_z/test_nd_kkf_mat_gen_xz.py +41 -0
  141. kinematic_tracker-15.0.0/test/nd/gen_z/test_nd_kkf_mat_gen_xz_fill_mat_xx.py +52 -0
  142. kinematic_tracker-15.0.0/test/nd/gen_z/test_nd_kkf_mat_gen_xz_fill_vec_x.py +26 -0
  143. kinematic_tracker-15.0.0/test/nd/precursors/__init__.py +0 -0
  144. kinematic_tracker-15.0.0/test/nd/precursors/conftest.py +10 -0
  145. kinematic_tracker-15.0.0/test/nd/precursors/test_nd_kkf_pre_compute.py +23 -0
  146. kinematic_tracker-15.0.0/test/nd/precursors/test_nd_kkf_pre_set_orders.py +23 -0
  147. kinematic_tracker-15.0.0/test/nd/precursors/test_nd_kkf_precursors.py +23 -0
  148. kinematic_tracker-15.0.0/test/nd/shape/__init__.py +0 -0
  149. kinematic_tracker-15.0.0/test/nd/shape/conftest.py +11 -0
  150. kinematic_tracker-15.0.0/test/nd/shape/test_nd_kkf_shape_get_kf.py +54 -0
  151. kinematic_tracker-15.0.0/test/nd/shape/test_nd_kkf_shape_getters.py +17 -0
  152. kinematic_tracker-15.0.0/test/nd/shape/test_nd_kkf_shape_init.py +21 -0
  153. kinematic_tracker-15.0.0/test/proc_noise/__init__.py +0 -0
  154. kinematic_tracker-15.0.0/test/proc_noise/dia_noise/__init__.py +0 -0
  155. kinematic_tracker-15.0.0/test/proc_noise/dia_noise/conftest.py +17 -0
  156. kinematic_tracker-15.0.0/test/proc_noise/dia_noise/test_fill_proc_cov_dia_noise.py +15 -0
  157. kinematic_tracker-15.0.0/test/proc_noise/dia_noise/test_nd_kkf_dia_noise_repr.py +8 -0
  158. kinematic_tracker-15.0.0/test/proc_noise/dia_noise/test_save_values_dia_noise.py +10 -0
  159. kinematic_tracker-15.0.0/test/proc_noise/nd_kkf_proc_noise_factory/__init__.py +0 -0
  160. kinematic_tracker-15.0.0/test/proc_noise/nd_kkf_proc_noise_factory/conftest.py +18 -0
  161. kinematic_tracker-15.0.0/test/proc_noise/nd_kkf_proc_noise_factory/test_nd_kkf_proc_noise_factory.py +31 -0
  162. kinematic_tracker-15.0.0/test/proc_noise/nd_kkf_proc_noise_factory/test_nd_kkf_proc_noise_factory_const.py +17 -0
  163. kinematic_tracker-15.0.0/test/proc_noise/nd_kkf_white_noise_const/__init__.py +0 -0
  164. kinematic_tracker-15.0.0/test/proc_noise/nd_kkf_white_noise_const/conftest.py +23 -0
  165. kinematic_tracker-15.0.0/test/proc_noise/nd_kkf_white_noise_const/test_fill_proc_cov_const.py +27 -0
  166. kinematic_tracker-15.0.0/test/proc_noise/nd_kkf_white_noise_const/test_nd_kkf_white_noise_const_repr.py +8 -0
  167. kinematic_tracker-15.0.0/test/proc_noise/nd_kkf_white_noise_const/test_save_values_const.py +10 -0
  168. kinematic_tracker-15.0.0/test/proc_noise/nd_kkf_white_noise_fd/__init__.py +0 -0
  169. kinematic_tracker-15.0.0/test/proc_noise/nd_kkf_white_noise_fd/conftest.py +26 -0
  170. kinematic_tracker-15.0.0/test/proc_noise/nd_kkf_white_noise_fd/test_compute_dyn_factors.py +29 -0
  171. kinematic_tracker-15.0.0/test/proc_noise/nd_kkf_white_noise_fd/test_fill_white_noise.py +32 -0
  172. kinematic_tracker-15.0.0/test/proc_noise/nd_kkf_white_noise_fd/test_gather_last_vars.py +14 -0
  173. kinematic_tracker-15.0.0/test/proc_noise/nd_kkf_white_noise_fd/test_nd_kkf_proc_noise_repr.py +16 -0
  174. kinematic_tracker-15.0.0/test/proc_noise/nd_kkf_white_noise_fd/test_white_noise_fd_save_values.py +13 -0
  175. kinematic_tracker-15.0.0/test/proc_noise/test_proc_noise_meta.py +13 -0
  176. kinematic_tracker-15.0.0/test/proc_noise/test_proc_noise_meta_factory.py +12 -0
  177. kinematic_tracker-15.0.0/test/tracker/__init__.py +0 -0
  178. kinematic_tracker-15.0.0/test/tracker/kkf/__init__.py +0 -0
  179. kinematic_tracker-15.0.0/test/tracker/kkf/conftest.py +47 -0
  180. kinematic_tracker-15.0.0/test/tracker/kkf/test_deepcopy.py +14 -0
  181. kinematic_tracker-15.0.0/test/tracker/kkf/test_nd_kkf_correct.py +31 -0
  182. kinematic_tracker-15.0.0/test/tracker/kkf/test_nd_kkf_predict.py +64 -0
  183. kinematic_tracker-15.0.0/test/tracker/kkf/test_nd_kkf_repr.py +13 -0
  184. kinematic_tracker-15.0.0/test/tracker/track/__init__.py +0 -0
  185. kinematic_tracker-15.0.0/test/tracker/track/conftest.py +54 -0
  186. kinematic_tracker-15.0.0/test/tracker/track/test_nd_kkf_track_bumps.py +25 -0
  187. kinematic_tracker-15.0.0/test/tracker/track/test_nd_kkf_track_repr.py +16 -0
  188. kinematic_tracker-15.0.0/test/tracker/tracker/__init__.py +0 -0
  189. kinematic_tracker-15.0.0/test/tracker/tracker/conftest.py +28 -0
  190. kinematic_tracker-15.0.0/test/tracker/tracker/test_nd_kkf_tracker_init_repr.py +32 -0
  191. kinematic_tracker-15.0.0/test/tracker/tracker/test_nd_kkf_tracker_internal_check.py +20 -0
  192. kinematic_tracker-15.0.0/test/tracker/tracker/test_set_association_metric.py +26 -0
  193. kinematic_tracker-15.0.0/test/tracker/tracker/test_set_association_threshold.py +15 -0
  194. kinematic_tracker-15.0.0/test/tracker/tracker/test_set_ind_pos_size.py +15 -0
  195. kinematic_tracker-15.0.0/test/tracker/tracker/test_set_measurement_cov.py +25 -0
  196. kinematic_tracker-15.0.0/test/tracker/tracker/test_set_measurement_std_dev.py +86 -0
  197. kinematic_tracker-15.0.0/test/tracker/tracker/test_tracker_advance.py +18 -0
  198. kinematic_tracker-15.0.0/test/tracker/tracker/test_tracker_correct_associated.py +14 -0
  199. kinematic_tracker-15.0.0/test/tracker/tracker/test_tracker_correct_associated1.py +45 -0
  200. kinematic_tracker-15.0.0/test/tracker/tracker/test_tracker_get_filters.py +9 -0
  201. kinematic_tracker-15.0.0/test/tracker/tracker/test_tracker_get_match.py +25 -0
  202. kinematic_tracker-15.0.0/test/tracker/tracker/test_tracker_get_track.py +20 -0
  203. kinematic_tracker-15.0.0/test/tracker/tracker/test_tracker_predict_all.py +11 -0
  204. kinematic_tracker-15.0.0/test/tracker/tracker/test_tracker_predict_all1.py +48 -0
  205. kinematic_tracker-15.0.0/test/tracker/tracker/test_tracker_promote_clutter.py +9 -0
  206. kinematic_tracker-15.0.0/test/tracker/tracker/test_tracker_promote_clutter1.py +10 -0
  207. kinematic_tracker-15.0.0/test/tracker/tracker/test_tracker_upd_for_loose_reports.py +44 -0
  208. kinematic_tracker-15.0.0/test/tracker/tracker/test_tracker_upd_for_loose_reports1.py +13 -0
  209. kinematic_tracker-15.0.0/test/tracker/tracker/test_tracker_upd_for_loose_tracks.py +9 -0
  210. kinematic_tracker-15.0.0/test/tracker/tracker/test_tracker_upd_for_loose_tracks1.py +10 -0
  211. kinematic_tracker-15.0.0/test/tracker/tracker/test_tracker_upd_for_loose_tracks2.py +21 -0
  212. kinematic_tracker-15.0.0/test/tutorials/__init__.py +0 -0
  213. kinematic_tracker-15.0.0/test/tutorials/axes_aligned/__init__.py +0 -0
  214. kinematic_tracker-15.0.0/test/tutorials/axes_aligned/detections.csv +505 -0
  215. kinematic_tracker-15.0.0/test/tutorials/axes_aligned/test_axes_aligned.py +34 -0
  216. kinematic_tracker-15.0.0/test/tutorials/cuboid_with_yaw/__init__.py +0 -0
  217. kinematic_tracker-15.0.0/test/tutorials/cuboid_with_yaw/annotation_task_1_757.csv +505 -0
  218. kinematic_tracker-15.0.0/test/tutorials/cuboid_with_yaw/test_cuboids_with_yaw.py +60 -0
  219. kinematic_tracker-15.0.0/test/tutorials/quality_of_association_aligned/__init__.py +0 -0
  220. kinematic_tracker-15.0.0/test/tutorials/quality_of_association_aligned/detections.csv +505 -0
  221. kinematic_tracker-15.0.0/test/tutorials/quality_of_association_aligned/test_association_quality_aligned.py +40 -0
  222. kinematic_tracker-15.0.0/test/tutorials/quality_of_association_yaw/__init__.py +0 -0
  223. kinematic_tracker-15.0.0/test/tutorials/quality_of_association_yaw/annotation_task_1_757.csv +505 -0
  224. kinematic_tracker-15.0.0/test/tutorials/quality_of_association_yaw/test_association_quality_yaw.py +63 -0
  225. kinematic_tracker-15.0.0/test/with_ext_data/__init__.py +0 -0
  226. kinematic_tracker-15.0.0/test/with_ext_data/conftest.py +94 -0
  227. kinematic_tracker-15.0.0/test/with_ext_data/fusion_lab/__init__.py +0 -0
  228. kinematic_tracker-15.0.0/test/with_ext_data/fusion_lab/all_detections/__init__.py +0 -0
  229. kinematic_tracker-15.0.0/test/with_ext_data/fusion_lab/all_detections/almost_collision/__init__.py +0 -0
  230. kinematic_tracker-15.0.0/test/with_ext_data/fusion_lab/all_detections/almost_collision/conftest.py +17 -0
  231. kinematic_tracker-15.0.0/test/with_ext_data/fusion_lab/all_detections/almost_collision/share/config_pipeline.yaml +22 -0
  232. kinematic_tracker-15.0.0/test/with_ext_data/fusion_lab/all_detections/almost_collision/share/fusion-lab-detections-args-sensor-1.json +19 -0
  233. kinematic_tracker-15.0.0/test/with_ext_data/fusion_lab/all_detections/almost_collision/share/fusion-lab-detections-sensor-1.csv +61 -0
  234. kinematic_tracker-15.0.0/test/with_ext_data/fusion_lab/all_detections/almost_collision/share/fusion-lab-motion-args-sensor-1.json +15 -0
  235. kinematic_tracker-15.0.0/test/with_ext_data/fusion_lab/all_detections/almost_collision/share/fusion-lab-motion-sensor-1.csv +61 -0
  236. kinematic_tracker-15.0.0/test/with_ext_data/fusion_lab/all_detections/almost_collision/share/fusion-lab-reference.json +27 -0
  237. kinematic_tracker-15.0.0/test/with_ext_data/fusion_lab/all_detections/almost_collision/test_almost_collision_matching_std_dev.py +24 -0
  238. kinematic_tracker-15.0.0/test/with_ext_data/fusion_lab/all_detections/almost_collision/test_almost_collision_wrong_std_dev.py +25 -0
  239. kinematic_tracker-15.0.0/test/with_ext_data/fusion_lab/all_detections/static_object/__init__.py +0 -0
  240. kinematic_tracker-15.0.0/test/with_ext_data/fusion_lab/all_detections/static_object/conftest.py +40 -0
  241. kinematic_tracker-15.0.0/test/with_ext_data/fusion_lab/all_detections/static_object/share/config_pipeline.yaml +21 -0
  242. kinematic_tracker-15.0.0/test/with_ext_data/fusion_lab/all_detections/static_object/share/fusion-lab-detections-args-sensor-1.json +19 -0
  243. kinematic_tracker-15.0.0/test/with_ext_data/fusion_lab/all_detections/static_object/share/fusion-lab-detections-sensor-1.csv +31 -0
  244. kinematic_tracker-15.0.0/test/with_ext_data/fusion_lab/all_detections/static_object/share/fusion-lab-motion-args-sensor-1.json +15 -0
  245. kinematic_tracker-15.0.0/test/with_ext_data/fusion_lab/all_detections/static_object/share/fusion-lab-motion-sensor-1.csv +31 -0
  246. kinematic_tracker-15.0.0/test/with_ext_data/fusion_lab/all_detections/static_object/share/fusion-lab-reference.json +17 -0
  247. kinematic_tracker-15.0.0/test/with_ext_data/fusion_lab/all_detections/static_object/test_static_object.py +17 -0
  248. kinematic_tracker-15.0.0/test/with_ext_data/nu_scenes/__init__.py +0 -0
  249. kinematic_tracker-15.0.0/test/with_ext_data/nu_scenes/conftest.py +18 -0
  250. kinematic_tracker-15.0.0/test/with_ext_data/nu_scenes/nu_1_757/__init__.py +0 -0
  251. kinematic_tracker-15.0.0/test/with_ext_data/nu_scenes/nu_1_757/share/annotation_task_1_757.csv +505 -0
  252. kinematic_tracker-15.0.0/test/with_ext_data/nu_scenes/nu_1_757/share/config_pipeline.yaml +21 -0
  253. kinematic_tracker-15.0.0/test/with_ext_data/nu_scenes/nu_1_757/share/fusion-lab-detections-sensor-1.csv +505 -0
  254. kinematic_tracker-15.0.0/test/with_ext_data/nu_scenes/nu_1_757/test_nu_scenes_coo3_greedy.py +21 -0
  255. kinematic_tracker-15.0.0/test/with_ext_data/nu_scenes/nu_1_757/test_nu_scenes_coo3_hungarian.py +21 -0
  256. kinematic_tracker-15.0.0/uv.lock +1072 -0
@@ -0,0 +1,32 @@
1
+ [tool.bumpversion]
2
+ current_version = "15.0.0"
3
+ parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
4
+ serialize = ["{major}.{minor}.{patch}"]
5
+ search = "{current_version}"
6
+ replace = "{new_version}"
7
+ regex = false
8
+ ignore_missing_version = false
9
+ ignore_missing_files = false
10
+ tag = false
11
+ sign_tags = false
12
+ tag_name = "{new_version}"
13
+ tag_message = "Bump version: {current_version} → {new_version}"
14
+ allow_dirty = false
15
+ commit = true
16
+ message = "Bump version: {current_version} → {new_version}"
17
+ moveable_tags = []
18
+ commit_args = "--no-verify"
19
+ setup_hooks = []
20
+ pre_commit_hooks = ["uv lock --native-tls", "git add uv.lock"]
21
+ post_commit_hooks = []
22
+
23
+ [[tool.bumpversion.files]]
24
+ filename = "pyproject.toml"
25
+ search = "version = \"{current_version}\""
26
+ replace = "version = \"{new_version}\""
27
+
28
+ [[tool.bumpversion.files]]
29
+ filename = "src/kinematic_tracker/__init__.py"
30
+ search = "__version__ = '{current_version}'"
31
+ replace = "__version__ = '{new_version}'"
32
+
@@ -0,0 +1,13 @@
1
+ [run]
2
+ omit = test/*
3
+ source = src/
4
+
5
+ [report]
6
+ show_missing = true
7
+ skip_empty = true
8
+ skip_covered = true
9
+ sort = Miss
10
+
11
+
12
+ ignore_errors = True
13
+
@@ -0,0 +1,12 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+ .coverage
9
+ .python-version
10
+ # Virtual environments
11
+ .venv
12
+ .idea
@@ -0,0 +1,34 @@
1
+ # GitLab configuration script to run two jobs: unit test and lint check
2
+ # for projects using *opencv-python* and managed by *uv* package manager.
3
+
4
+ default:
5
+ image: python:3.10
6
+
7
+
8
+ stages: # List of stages for jobs, and their order of execution
9
+ - test
10
+
11
+ unit-test-job: # This job runs in the test stage.
12
+ stage: test # It only starts when the job in the build stage completes successfully.
13
+ script:
14
+ - apt update
15
+ - apt install -y libgl1 xvfb
16
+ - pip install uv
17
+ - export UV_INDEX_GITLAB_USERNAME=gitlab-ci-token
18
+ - export UV_INDEX_GITLAB_PASSWORD=${CI_JOB_TOKEN}
19
+ - uv sync
20
+ - uv pip install -e .
21
+ - uv run pytest -s test --cov --junitxml=report.xml
22
+ artifacts:
23
+ when: always
24
+ reports:
25
+ junit: report.xml
26
+ coverage: '/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/'
27
+
28
+
29
+ lint-test-job: # This job also runs in the test stage.
30
+ stage: test # It can run at the same time as unit-test-job (in parallel).
31
+ script:
32
+ - pip install ruff
33
+ - ruff check
34
+
@@ -0,0 +1,111 @@
1
+ # 14.2.0
2
+
3
+ - Using the package `binary-classification-ratios`.
4
+
5
+ # 14.1.2
6
+
7
+ - Compatibility with nuScenes @ `evaluation-against-nuscenes` (Python >=3.10 & NumPy >=1.26.4).
8
+
9
+ # 14.1.0
10
+
11
+ - Added an association-threshold setter in `NdKkfTracker`.
12
+
13
+ # 14.0.1
14
+
15
+ - Corrected the example of tracking with yaw angle affected by the version 14.
16
+ - Made the example of tracking association quality more robust.
17
+
18
+ # 14.0.0
19
+
20
+ This version bump is major because it breaks a silent convention on the distribution
21
+ of variables in the measurement vector. In previous versions, the measurement vector
22
+ has been distributed as follows:
23
+
24
+ $$z^T = (p_x, p_y, p_z, s_x, s_y, s_z, ...)$$
25
+
26
+ In this version, the distribution of variables in the measurement vector is as follows:
27
+
28
+ $$z^T = (p_x, p_y, p_z, ..., s_x, s_y, s_z)$$
29
+
30
+ where the position variables are listed first, followed by the size variables.
31
+ This change makes the tracker more convenient to use with ASAM OpenLabel frames.
32
+
33
+ - Possibility to adjust the distribution of variables in the measurement vector.
34
+ - Added setter `NdKkfTracker.set_ind_pos_size`.
35
+
36
+ # 13.0.1
37
+
38
+ - Proofread the README file.
39
+ - Renamed `gen_z` --> `gen_xz` in tracker.
40
+
41
+ # 12.1.0
42
+
43
+ - Remove the unfinished `GIoUWithYaw` class.
44
+ - Add all non-trivial docstrings.
45
+ - Eliminate the flip in Greedy matching.
46
+ - Eliminate unused buffer in the Mahalanobis metric driver.
47
+ - Remove the obsolete method `NdKkfTrack.get_det_cov()`.
48
+
49
+ # 12.0.0
50
+
51
+ - All dependencies are public from PyPI.
52
+
53
+ # 11.1.2
54
+
55
+ - Add docstrings in `nd` modules
56
+ - Use documented version of the kinematic-matrix package (viulib-kinematic-matrices>=0.3.0)
57
+
58
+
59
+ # 11.1.0
60
+
61
+ - Allow both `int` and `np.int64` to be used as time stamps in the `Tracker.advance` method.
62
+ - Add three tutorial examples:
63
+ - tracking of cuboids aligned with Cartesian axes
64
+ - tracking of cuboids with yaw angle
65
+ - tracking and classifying the association quality
66
+
67
+ # 11.0.0
68
+
69
+ - Introduced the (bipartite) matching drivers:
70
+ - Maximal shape of the metric is rectangular
71
+ - The returned match is in fixed-size numpy arrays which stay the same across time stamps
72
+ - Auxiliary buffers are used instead of temporary (scrap) RAM
73
+ - Remove the calculation of threshold from the association probability
74
+
75
+ # 10.4.0
76
+
77
+ - Added nuScenes example
78
+ - Refactored the metric drivers:
79
+ - Maximal shape of the metric is rectangular
80
+ - Metric is computed in a chunk of memory at the beginning of the rectangular buffer
81
+ - The returned matrix is rectangular, local and shares memory with the buffer
82
+ - Removed O(N) buffers for $Hx$ and $HPH^T$
83
+ - The order of indices is (reports, targets) resulting in wide matrices most of the time
84
+ - Auxiliary buffers are used instead of temporary (scrap) RAM
85
+
86
+ # 10.3.0
87
+
88
+ - Add ClassificationRatios helper class
89
+ - Add fusion-lab example of two almost colliding cuboids
90
+ - Add padding to the Hungarian matching
91
+ - Association-quality- and Cartesian-quality helper classes in unit tests
92
+
93
+ # 10.2.0
94
+
95
+ - Add AssociationQuality classifier
96
+ - Change default association threshold from 0.9 --> 0.25
97
+ - Fix finite-diff adaptive noise to multiply with the variance factor
98
+ - Add setter NdKkfTracker.set_measurement_std_dev(...)
99
+
100
+ # 10.0.0
101
+
102
+ - Removed GatherAtStart in favor of DerivativeSorted
103
+
104
+ # 2.0.2
105
+
106
+ - Started GIoU with yaw
107
+
108
+ # 1.1.2
109
+
110
+ - Initial release
111
+
@@ -0,0 +1,35 @@
1
+ Metadata-Version: 2.4
2
+ Name: kinematic-tracker
3
+ Version: 15.0.0
4
+ Summary: Tracker using kinematic Kalman filters.
5
+ Author-email: Peter Koval <pkoval@vicomtech.org>
6
+ License-Expression: MIT
7
+ Requires-Python: >=3.10
8
+ Requires-Dist: association-quality-clavia>=0.1.0
9
+ Requires-Dist: binary-classification-ratios>=0.3.0
10
+ Requires-Dist: numpy>=1.26.4
11
+ Requires-Dist: opencv-python>=4.11.0.86
12
+ Requires-Dist: scipy>=1.15.3
13
+ Description-Content-Type: text/markdown
14
+
15
+ # Kinematic Tracker
16
+
17
+ This tracker is based on kinematic Kalman filters. The system state can consist of multiple components,
18
+ each defined by its kinematic order and dimensionality. The tracker supports various process noise models,
19
+ including a custom adaptive process noise model based on a white-noise assumption.
20
+
21
+ ## Tutorial Examples
22
+
23
+ Simple, reusable examples are available in the `test/tutorials` folder.
24
+
25
+ ## Installation
26
+
27
+ After installing the `uv` package manager, run:
28
+
29
+ ```shell
30
+ uv sync --no-dev
31
+ ```
32
+
33
+ ## Development Installation
34
+
35
+ For development setup instructions, please refer to the maintainers' README.
@@ -0,0 +1,21 @@
1
+ # Kinematic Tracker
2
+
3
+ This tracker is based on kinematic Kalman filters. The system state can consist of multiple components,
4
+ each defined by its kinematic order and dimensionality. The tracker supports various process noise models,
5
+ including a custom adaptive process noise model based on a white-noise assumption.
6
+
7
+ ## Tutorial Examples
8
+
9
+ Simple, reusable examples are available in the `test/tutorials` folder.
10
+
11
+ ## Installation
12
+
13
+ After installing the `uv` package manager, run:
14
+
15
+ ```shell
16
+ uv sync --no-dev
17
+ ```
18
+
19
+ ## Development Installation
20
+
21
+ For development setup instructions, please refer to the maintainers' README.
@@ -0,0 +1,32 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3
+ <!-- Creator: CorelDRAW -->
4
+ <svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="2048px" height="2048px" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"
5
+ viewBox="0 0 2048 2048"
6
+ xmlns:xlink="http://www.w3.org/1999/xlink">
7
+ <defs>
8
+ <style type="text/css">
9
+ <![CDATA[
10
+ .fil2 {fill:none}
11
+ .fil0 {fill:#424242}
12
+ .fil1 {fill:#424242;fill-rule:nonzero}
13
+ ]]>
14
+ </style>
15
+ </defs>
16
+ <g id="Layer_x0020_1">
17
+ <metadata id="CorelCorpID_0Corel-Layer"/>
18
+ <g id="_324608240">
19
+ <g>
20
+ <path id="_324608792" class="fil0" d="M1094.26 1026.38l132.912 132.912c18.7394,18.7382 18.7394,49.1374 0,67.8756 -18.7382,18.7394 -49.1374,18.7394 -67.8756,0l-132.912 -132.912c-18.7394,-18.7382 -18.7394,-49.1374 0,-67.8756 18.7382,-18.7394 49.1374,-18.7394 67.8756,0z"/>
21
+ <path id="_324608168" class="fil1" d="M1130.76 1210.45l82.6619 -82.6619c14.1662,-14.1638 32.8004,-21.248 51.4087,-21.248 18.6095,0 37.2425,7.08426 51.4063,21.248l454.513 454.513c14.1638,14.1638 21.248,32.7992 21.248,51.4075 0,18.6071 -7.08426,37.2425 -21.248,51.4063l-85.6394 85.6394c-14.165,14.165 -32.7992,21.248 -51.4063,21.248 -18.6083,0 -37.2437,-7.08426 -51.4075,-21.248l-451.537 -451.536c-14.9823,-14.9847 -22.4752,-34.6973 -22.4752,-54.3851 0,-19.6866 7.49292,-39.4016 22.4752,-54.3839z"/>
22
+ <path id="_324608552" class="fil0" d="M740.304 255.999c267.475,0 484.304,216.829 484.304,484.304 0,267.475 -216.829,484.304 -484.304,484.304 -267.475,0 -484.304,-216.829 -484.304,-484.304 0,-267.475 216.829,-484.304 484.304,-484.304zm0 96.0001c214.455,0 388.304,173.849 388.304,388.304 0,214.455 -173.849,388.304 -388.304,388.304 -214.455,0 -388.304,-173.849 -388.304,-388.304 0,-214.455 173.849,-388.304 388.304,-388.304z"/>
23
+ </g>
24
+ <g>
25
+ <path id="_324608672" class="fil1" d="M613.621 465.793l253.856 0c13.2543,0 24,10.7457 24,24 0,2.98701 -0.548032,5.84646 -1.54488,8.48386l-22.4516 67.8225 -22.7811 -7.50001 22.7835 7.54253c-3.38859,10.2366 -13.0075,16.6595 -23.2512,16.4575l-208.322 0c-10.9795,0 -20.2382,-7.37363 -23.0918,-17.439l-22.454 -67.8296 -0.0153543 0.00472441c-4.16457,-12.5835 2.65866,-26.1626 15.2421,-30.3272 2.66575,-0.882284 5.3752,-1.26969 8.03032,-1.21536z"/>
26
+ <path id="_324608600" class="fil1" d="M897.845 815.115l-314.668 0c-1.89803,0.0318898 -3.82796,-0.161811 -5.76024,-0.603544 -12.9213,-2.95276 -21.0012,-15.8232 -18.0484,-28.7445l23.3965 5.34804 -23.3433 -5.34331 52.78 -230.916c1.79882,-11.4756 11.7284,-20.2559 23.7083,-20.2559l208.384 0c11.1142,-0.198425 21.2268,7.38662 23.8016,18.652l-0.0519685 0.011811 52.7776 230.902c0.66378,2.2004 1.02402,4.53307 1.02402,6.94961 0,13.2543 -10.7457,24 -24,24z"/>
27
+ <path id="_324608288" class="fil1" d="M771.393 798.194c0,-17.1697 -13.9205,-31.0902 -31.0902,-31.0902 -17.1709,0 -31.0902,13.9205 -31.0902,31.0902l31.0902 289.805 31.0902 -289.805z"/>
28
+ </g>
29
+ </g>
30
+ </g>
31
+ <rect class="fil2" width="2048" height="2048"/>
32
+ </svg>
@@ -0,0 +1,38 @@
1
+ # Development install
2
+
3
+ ```shell
4
+ uv sync
5
+ ```
6
+
7
+ ## Add dependencies
8
+
9
+ Regular or development dependencies are added as following
10
+ ```shell
11
+ uv add numpy
12
+ uv add pytest --dev
13
+ ```
14
+
15
+ ## Run tests
16
+
17
+ ```shell
18
+ uv run pytest
19
+ ```
20
+
21
+ ## Formatting and checking
22
+
23
+ ```shell
24
+ ruff format
25
+ ruff check --fix
26
+ ```
27
+
28
+ ## Bump version number
29
+
30
+ ```shell
31
+ bump-my-version bump patch
32
+ ```
33
+
34
+ ## Upgrading the dependencies
35
+
36
+ ```shell
37
+ uv lock -U
38
+ ```
@@ -0,0 +1,32 @@
1
+ [project]
2
+ name = "kinematic-tracker"
3
+ version = "15.0.0"
4
+ description = "Tracker using kinematic Kalman filters."
5
+ readme = "README.md"
6
+ requires-python = ">=3.10"
7
+ dependencies = [
8
+ "association-quality-clavia>=0.1.0",
9
+ "binary-classification-ratios>=0.3.0",
10
+ "numpy>=1.26.4", # important for compatibility with nuScenes (!)
11
+ "opencv-python>=4.11.0.86",
12
+ "scipy>=1.15.3",
13
+ ]
14
+ license = 'MIT'
15
+ authors = [{name = 'Peter Koval', email = 'pkoval@vicomtech.org'}]
16
+
17
+ [dependency-groups]
18
+ dev = [
19
+ "pytest>=8.4.1",
20
+ "pytest-cov>=6.2.1",
21
+ "pytest-mock>=3.14.1",
22
+ "ruff>=0.12.8",
23
+ "bump-my-version>=1.2.1",
24
+ ]
25
+
26
+ [tool.uv]
27
+ package = true
28
+
29
+ [build-system]
30
+ requires = ["hatchling >= 1.26"]
31
+ build-backend = "hatchling.build"
32
+
@@ -0,0 +1,89 @@
1
+ # Exclude a variety of commonly ignored directories.
2
+ exclude = [
3
+ ".bzr",
4
+ ".direnv",
5
+ ".eggs",
6
+ ".git",
7
+ ".git-rewrite",
8
+ ".hg",
9
+ ".ipynb_checkpoints",
10
+ ".mypy_cache",
11
+ ".nox",
12
+ ".pants.d",
13
+ ".pyenv",
14
+ ".pytest_cache",
15
+ ".pytype",
16
+ ".ruff_cache",
17
+ ".svn",
18
+ ".tox",
19
+ ".venv",
20
+ ".vscode",
21
+ "__pypackages__",
22
+ "_build",
23
+ "buck-out",
24
+ "build",
25
+ "dist",
26
+ "node_modules",
27
+ "site-packages",
28
+ "venv",
29
+ ]
30
+
31
+ # Same as Black.
32
+ line-length = 100
33
+ indent-width = 4
34
+
35
+ target-version = "py313"
36
+
37
+ [lint]
38
+ # Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default.
39
+ # Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or
40
+ # McCabe complexity (`C901`) by default.
41
+ select = ["E4", "E7", "E9", "F", "I"]
42
+ ignore = []
43
+
44
+ # Allow fix for all enabled rules (when `--fix`) is provided.
45
+ fixable = ["ALL"]
46
+ unfixable = []
47
+
48
+ # Allow unused variables when underscore-prefixed.
49
+ dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
50
+
51
+ [lint.isort]
52
+ default-section = "third-party"
53
+ lines-after-imports = 2
54
+ split-on-trailing-comma=false
55
+ lines-between-types = 1 # This adds 1 empty line between import sections
56
+
57
+ [lint.flake8-quotes]
58
+ inline-quotes = "single"
59
+
60
+ [format]
61
+ # Like Black, use double quotes for strings.
62
+ quote-style = "single"
63
+
64
+ # Like Black, indent with spaces, rather than tabs.
65
+ indent-style = "space"
66
+
67
+ # Like Black, respect magic trailing commas.
68
+ skip-magic-trailing-comma = true
69
+
70
+ # Like Black, automatically detect the appropriate line ending.
71
+ line-ending = "auto"
72
+
73
+ # Enable auto-formatting of code examples in docstrings. Markdown,
74
+ # reStructuredText code/literal blocks and doctests are all supported.
75
+ #
76
+ # This is currently disabled by default, but it is planned for this
77
+ # to be opt-out in the future.
78
+ docstring-code-format = false
79
+
80
+ # Set the line length limit used when formatting code snippets in
81
+ # docstrings.
82
+ #
83
+ # This only has an effect when the `docstring-code-format` setting is
84
+ # enabled.
85
+ docstring-code-line-length = "dynamic"
86
+
87
+ [lint.pydocstyle]
88
+ convention = "google"
89
+
@@ -0,0 +1,3 @@
1
+ """."""
2
+
3
+ __version__ = '15.0.0'
@@ -0,0 +1,124 @@
1
+ """
2
+ This module defines the `Association` class. The `Association` class holds
3
+ parameters to for computing an association metric (scores) and for computing
4
+ the bipartite matching between (detection) reports and (tracked) targets.
5
+ Apart from the parameter storage, the class provides methods to generate
6
+ the metric and match drivers based on the selected types of metric and
7
+ matching method.
8
+ """
9
+
10
+ from typing import Sequence
11
+
12
+ from .association_method import AssociationMethod
13
+ from .association_metric import AssociationMetric
14
+ from .match_greedy import MatchDriverGreedy
15
+ from .match_hungarian import MatchDriverHungarian
16
+ from .metric_giou_aligned import MetricGIoUAligned
17
+ from .metric_mahalanobis import MetricMahalanobis
18
+
19
+
20
+ class Association:
21
+ """
22
+ Represents an association mechanism for matching reports and targets
23
+ using configurable metrics and methods. Generates metric and match drivers.
24
+ """
25
+
26
+ def __init__(
27
+ self, num_x: int, num_z: int, ind_pos_size: Sequence[int] = (0, 1, 2, -3, -2, -1)
28
+ ) -> None:
29
+ """
30
+ Initializes the `Association` object with default parameters.
31
+
32
+ Args:
33
+ num_x: Number of variables in the state vector.
34
+ num_z: Number of variables in the measurement vector.
35
+ ind_pos_size: indices to get positions and sizes of cuboids for GIoU.
36
+ By default, the indices will be 0,1,2,-3,-2,-1, i.e.
37
+ the center of the cuboid is taken as first three variables
38
+ of the measurement vector and sizes (dimensions) of the
39
+ cuboids are taken from the last three variables.
40
+ """
41
+ self.threshold = 0.25 # Threshold for association
42
+ self.mah_pre_factor = 1.0 # Pre-factor for Mahalanobis distance
43
+ self.method = AssociationMethod.HUNGARIAN # Default matching method
44
+ self.metric = AssociationMetric.GIOU # Default metric
45
+ self.num_reports_max = 100 # Maximum number of reports
46
+ self.num_targets_max = 500 # Maximum number of targets
47
+ self.num_x = num_x # State vector dimensionality
48
+ self.num_z = num_z # Measurement vector dimensionality
49
+ self.ind_pos_size = ind_pos_size # Distribution of variables in the measurement vector.
50
+
51
+ def __repr__(self) -> str:
52
+ """
53
+ Returns a string representation of the `Association` object.
54
+
55
+ Returns:
56
+ str: A string describing the association configuration.
57
+ """
58
+ return (
59
+ f'Association({self.method.value} '
60
+ f'{self.metric.value} '
61
+ f'threshold {self.threshold} '
62
+ f'mah_pre_factor {self.mah_pre_factor})'
63
+ )
64
+
65
+ def set_ind_pos_size(self, ind_pos_size: Sequence[int]) -> None:
66
+ """Set the location of positions and sizes of the cuboids relevant for GIoU metric.
67
+
68
+ The length of the `ind_pos_size` should be 6. The entries of the array points to
69
+ the locations in the measurement vector extracting the variables to form
70
+ a vector (pos_x, pos_y, pos_z, size_x, size_y, size_z). This vector will be
71
+ input for the GIoU aligned with Cartesian axes.
72
+
73
+ Note:
74
+ If we set this parameter, then we generally need another metric driver.
75
+
76
+ Args:
77
+ ind_pos_size: the permutation pointer array.
78
+ """
79
+ if len(ind_pos_size) != 6:
80
+ raise ValueError(f'Expect 6 elements in ind_pos_size, but got {len(ind_pos_size)}.')
81
+ self.ind_pos_size = ind_pos_size
82
+
83
+ def get_metric_driver(self) -> MetricMahalanobis | MetricGIoUAligned:
84
+ """
85
+ Initializes and returns the metric driver based on the selected metric type.
86
+
87
+ Returns:
88
+ MetricMahalanobis | MetricGIoUAligned: The metric driver instance.
89
+
90
+ Raises:
91
+ ValueError: If the metric is not supported.
92
+ """
93
+ if self.metric == AssociationMetric.MAHALANOBIS:
94
+ return MetricMahalanobis(
95
+ self.num_reports_max,
96
+ self.num_targets_max,
97
+ self.mah_pre_factor,
98
+ self.num_x,
99
+ self.num_z,
100
+ )
101
+ elif self.metric == AssociationMetric.GIOU:
102
+ return MetricGIoUAligned(
103
+ self.num_reports_max, self.num_targets_max, self.num_z, self.ind_pos_size
104
+ )
105
+ else:
106
+ raise ValueError('Unsupported metric.')
107
+
108
+ def get_match_driver(self) -> MatchDriverGreedy | MatchDriverHungarian:
109
+ """
110
+ Initializes and returns the match driver based on the selected matching method.
111
+
112
+ Returns:
113
+ MatchDriverGreedy | MatchDriverHungarian: The match driver instance.
114
+
115
+ Raises:
116
+ ValueError: If the method is not supported.
117
+ """
118
+ method = self.method
119
+ if method == AssociationMethod.GREEDY:
120
+ return MatchDriverGreedy(self.num_reports_max, self.num_targets_max)
121
+ elif method == AssociationMethod.HUNGARIAN:
122
+ return MatchDriverHungarian(self.num_reports_max, self.num_targets_max)
123
+ else:
124
+ raise ValueError('Unsupported matching method.')
@@ -0,0 +1,11 @@
1
+ """."""
2
+
3
+ from enum import Enum
4
+
5
+
6
+ class AssociationMethod(Enum):
7
+ """."""
8
+
9
+ GREEDY = 'greedy'
10
+ HUNGARIAN = 'hungarian'
11
+ UNKNOWN_METHOD = 'unknown-method'
@@ -0,0 +1,11 @@
1
+ """Types of association metrics (matching scores)."""
2
+
3
+ from enum import Enum
4
+
5
+
6
+ class AssociationMetric(Enum):
7
+ """."""
8
+
9
+ GIOU = 'giou'
10
+ MAHALANOBIS = 'mahalanobis'
11
+ UNKNOWN_METRIC = 'unknown-metric'