OTVision 0.6.3__tar.gz → 0.6.5__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 (324) hide show
  1. {otvision-0.6.3 → otvision-0.6.5}/.editorconfig +1 -1
  2. {otvision-0.6.3 → otvision-0.6.5}/.github/workflows/linter.yml +1 -0
  3. {otvision-0.6.3 → otvision-0.6.5}/.pre-commit-config.yaml +1 -1
  4. otvision-0.6.5/OTVision/abstraction/defaults.py +15 -0
  5. {otvision-0.6.3 → otvision-0.6.5}/OTVision/application/buffer.py +2 -1
  6. otvision-0.6.5/OTVision/application/config.py +475 -0
  7. otvision-0.6.5/OTVision/application/config_parser.py +280 -0
  8. {otvision-0.6.3 → otvision-0.6.5}/OTVision/application/configure_logger.py +1 -1
  9. {otvision-0.6.3 → otvision-0.6.5}/OTVision/application/detect/factory.py +1 -1
  10. {otvision-0.6.3 → otvision-0.6.5}/OTVision/application/detect/update_detect_config_with_cli_args.py +2 -1
  11. {otvision-0.6.3 → otvision-0.6.5}/OTVision/application/get_config.py +2 -1
  12. {otvision-0.6.3 → otvision-0.6.5}/OTVision/application/get_current_config.py +1 -1
  13. otvision-0.6.5/OTVision/application/track/get_track_cli_args.py +20 -0
  14. otvision-0.6.5/OTVision/application/track/update_current_track_config.py +42 -0
  15. otvision-0.6.5/OTVision/application/track/update_track_config_with_cli_args.py +52 -0
  16. {otvision-0.6.3 → otvision-0.6.5}/OTVision/application/update_current_config.py +1 -1
  17. otvision-0.6.5/OTVision/config.py +216 -0
  18. {otvision-0.6.3 → otvision-0.6.5}/OTVision/convert/convert.py +3 -3
  19. {otvision-0.6.3 → otvision-0.6.5}/OTVision/detect/builder.py +27 -20
  20. {otvision-0.6.3 → otvision-0.6.5}/OTVision/detect/cli.py +3 -3
  21. {otvision-0.6.3 → otvision-0.6.5}/OTVision/detect/detected_frame_buffer.py +6 -0
  22. otvision-0.6.5/OTVision/detect/file_based_detect_builder.py +19 -0
  23. {otvision-0.6.3 → otvision-0.6.5}/OTVision/detect/otdet.py +54 -1
  24. {otvision-0.6.3 → otvision-0.6.5}/OTVision/detect/otdet_file_writer.py +3 -2
  25. otvision-0.6.5/OTVision/detect/rtsp_based_detect_builder.py +37 -0
  26. otvision-0.6.5/OTVision/detect/rtsp_input_source.py +199 -0
  27. {otvision-0.6.3 → otvision-0.6.5}/OTVision/detect/timestamper.py +1 -1
  28. {otvision-0.6.3 → otvision-0.6.5}/OTVision/detect/video_input_source.py +3 -3
  29. {otvision-0.6.3 → otvision-0.6.5}/OTVision/detect/yolo.py +17 -1
  30. {otvision-0.6.3 → otvision-0.6.5}/OTVision/domain/cli.py +31 -1
  31. {otvision-0.6.3 → otvision-0.6.5}/OTVision/domain/current_config.py +1 -1
  32. {otvision-0.6.3 → otvision-0.6.5}/OTVision/domain/frame.py +9 -0
  33. {otvision-0.6.3 → otvision-0.6.5}/OTVision/domain/object_detection.py +6 -1
  34. otvision-0.6.5/OTVision/domain/serialization.py +12 -0
  35. otvision-0.6.5/OTVision/domain/time.py +13 -0
  36. {otvision-0.6.3 → otvision-0.6.5}/OTVision/helpers/files.py +14 -15
  37. otvision-0.6.5/OTVision/plugin/yaml_serialization.py +20 -0
  38. otvision-0.6.5/OTVision/track/builder.py +132 -0
  39. otvision-0.6.5/OTVision/track/cli.py +128 -0
  40. {otvision-0.6.3 → otvision-0.6.5}/OTVision/track/exporter/filebased_exporter.py +2 -1
  41. otvision-0.6.5/OTVision/track/id_generator.py +15 -0
  42. {otvision-0.6.3 → otvision-0.6.5}/OTVision/track/model/track_exporter.py +2 -1
  43. {otvision-0.6.3 → otvision-0.6.5}/OTVision/track/model/tracking_interfaces.py +6 -6
  44. {otvision-0.6.3 → otvision-0.6.5}/OTVision/track/parser/frame_group_parser_plugins.py +35 -5
  45. otvision-0.6.5/OTVision/track/track.py +65 -0
  46. {otvision-0.6.3 → otvision-0.6.5}/OTVision/track/tracker/filebased_tracking.py +8 -7
  47. {otvision-0.6.3 → otvision-0.6.5}/OTVision/track/tracker/tracker_plugin_iou.py +14 -9
  48. {otvision-0.6.3 → otvision-0.6.5}/OTVision/transform/transform.py +2 -2
  49. {otvision-0.6.3 → otvision-0.6.5}/OTVision/version.py +1 -1
  50. otvision-0.6.5/PKG-INFO +182 -0
  51. otvision-0.6.5/README.md +145 -0
  52. {otvision-0.6.3 → otvision-0.6.5}/convert.py +20 -8
  53. {otvision-0.6.3 → otvision-0.6.5}/detect.py +3 -3
  54. {otvision-0.6.3 → otvision-0.6.5}/reference_points_picker.py +3 -2
  55. {otvision-0.6.3 → otvision-0.6.5}/requirements.txt +1 -1
  56. otvision-0.6.5/tests/abstraction/test_defaults.py +41 -0
  57. {otvision-0.6.3 → otvision-0.6.5}/tests/application/detect/test_current_object_detector.py +1 -1
  58. {otvision-0.6.3 → otvision-0.6.5}/tests/application/detect/test_detection_file_save_path_provider.py +1 -1
  59. {otvision-0.6.3 → otvision-0.6.5}/tests/application/detect/test_update_detect_config_with_cli_args.py +2 -2
  60. {otvision-0.6.3 → otvision-0.6.5}/tests/application/test_get_config.py +1 -1
  61. otvision-0.6.5/tests/application/track/test_get_track_cli_args.py +16 -0
  62. otvision-0.6.5/tests/application/track/test_update_current_track_config.py +83 -0
  63. otvision-0.6.5/tests/application/track/test_update_track_config_with_cli_args.py +96 -0
  64. {otvision-0.6.3 → otvision-0.6.5}/tests/cli/test_convert_cli.py +1 -1
  65. {otvision-0.6.3 → otvision-0.6.5}/tests/cli/test_detect_cli.py +21 -24
  66. {otvision-0.6.3 → otvision-0.6.5}/tests/cli/test_track_cli.py +92 -29
  67. {otvision-0.6.3 → otvision-0.6.5}/tests/convert/test_convert.py +12 -9
  68. {otvision-0.6.3 → otvision-0.6.5}/tests/detect/detect_test.py +45 -33
  69. {otvision-0.6.3 → otvision-0.6.5}/tests/detect/test_detected_frame_buffer.py +34 -0
  70. {otvision-0.6.3 → otvision-0.6.5}/tests/detect/test_odet.py +58 -3
  71. {otvision-0.6.3 → otvision-0.6.5}/tests/detect/test_otdet_file_writer.py +5 -4
  72. otvision-0.6.5/tests/detect/test_rtsp_input_source.py +160 -0
  73. {otvision-0.6.3 → otvision-0.6.5}/tests/detect/test_video_input_source.py +5 -5
  74. {otvision-0.6.3 → otvision-0.6.5}/tests/detect/yolo_test.py +1 -1
  75. {otvision-0.6.3 → otvision-0.6.5}/tests/helpers/files_test.py +9 -18
  76. {otvision-0.6.3 → otvision-0.6.5}/tests/test_config.py +2 -1
  77. otvision-0.6.5/tests/track/parser/__init__.py +0 -0
  78. {otvision-0.6.3 → otvision-0.6.5}/tests/track/test_frame_group_parser_plugins.py +47 -35
  79. {otvision-0.6.3 → otvision-0.6.5}/tests/track/test_track.py +81 -18
  80. otvision-0.6.5/tests/transform/__init__.py +0 -0
  81. otvision-0.6.5/tests/utils/__init__.py +0 -0
  82. otvision-0.6.5/track.py +55 -0
  83. {otvision-0.6.3 → otvision-0.6.5}/transform.py +12 -4
  84. otvision-0.6.3/OTVision/config.py +0 -823
  85. otvision-0.6.3/OTVision/track/track.py +0 -144
  86. otvision-0.6.3/PKG-INFO +0 -49
  87. otvision-0.6.3/README.md +0 -12
  88. otvision-0.6.3/track.py +0 -242
  89. {otvision-0.6.3 → otvision-0.6.5}/.flake8 +0 -0
  90. {otvision-0.6.3 → otvision-0.6.5}/.github/dependabot.yml +0 -0
  91. {otvision-0.6.3 → otvision-0.6.5}/.github/workflows/build-nightly.yml +0 -0
  92. {otvision-0.6.3 → otvision-0.6.5}/.github/workflows/build-release.yml +0 -0
  93. {otvision-0.6.3 → otvision-0.6.5}/.github/workflows/release-pypi.yml +0 -0
  94. {otvision-0.6.3 → otvision-0.6.5}/.github/workflows/release-testpypi.yml +0 -0
  95. {otvision-0.6.3 → otvision-0.6.5}/.github/workflows/test.yml +0 -0
  96. {otvision-0.6.3 → otvision-0.6.5}/.gitignore +0 -0
  97. {otvision-0.6.3 → otvision-0.6.5}/.vscode/launch.json +0 -0
  98. {otvision-0.6.3 → otvision-0.6.5}/.vscode/scripts/build_debug_env.cmd +0 -0
  99. {otvision-0.6.3 → otvision-0.6.5}/.vscode/scripts/build_debug_env.sh +0 -0
  100. {otvision-0.6.3 → otvision-0.6.5}/.vscode/scripts/teardown_debug_env.cmd +0 -0
  101. {otvision-0.6.3 → otvision-0.6.5}/.vscode/scripts/teardown_debug_env.sh +0 -0
  102. {otvision-0.6.3 → otvision-0.6.5}/.vscode/settings.json +0 -0
  103. {otvision-0.6.3 → otvision-0.6.5}/.vscode/tasks.json +0 -0
  104. {otvision-0.6.3 → otvision-0.6.5}/.yamllint.yaml +0 -0
  105. {otvision-0.6.3 → otvision-0.6.5}/LICENSE +0 -0
  106. {otvision-0.6.3 → otvision-0.6.5}/OTVision/__init__.py +0 -0
  107. {otvision-0.6.3 → otvision-0.6.5}/OTVision/abstraction/__init__.py +0 -0
  108. {otvision-0.6.3 → otvision-0.6.5}/OTVision/abstraction/observer.py +0 -0
  109. {otvision-0.6.3 → otvision-0.6.5}/OTVision/abstraction/pipes_and_filter.py +0 -0
  110. {otvision-0.6.3 → otvision-0.6.5}/OTVision/application/__init__.py +0 -0
  111. {otvision-0.6.3 → otvision-0.6.5}/OTVision/application/detect/__init__.py +0 -0
  112. {otvision-0.6.3 → otvision-0.6.5}/OTVision/application/detect/current_object_detector.py +0 -0
  113. {otvision-0.6.3 → otvision-0.6.5}/OTVision/application/detect/current_object_detector_metadata.py +0 -0
  114. {otvision-0.6.3 → otvision-0.6.5}/OTVision/application/detect/detected_frame_factory.py +0 -0
  115. {otvision-0.6.3 → otvision-0.6.5}/OTVision/application/detect/detected_frame_producer.py +0 -0
  116. {otvision-0.6.3 → otvision-0.6.5}/OTVision/application/detect/detection_file_save_path_provider.py +0 -0
  117. {otvision-0.6.3 → otvision-0.6.5}/OTVision/application/detect/get_detect_cli_args.py +0 -0
  118. {otvision-0.6.3 → otvision-0.6.5}/OTVision/application/detect/timestamper.py +0 -0
  119. {otvision-0.6.3 → otvision-0.6.5}/OTVision/application/frame_count_provider.py +0 -0
  120. {otvision-0.6.3/OTVision/convert → otvision-0.6.5/OTVision/application/track}/__init__.py +0 -0
  121. {otvision-0.6.3/OTVision/detect → otvision-0.6.5/OTVision/convert}/__init__.py +0 -0
  122. {otvision-0.6.3 → otvision-0.6.5}/OTVision/dataformat.py +0 -0
  123. {otvision-0.6.3/OTVision/detect/plugin_av → otvision-0.6.5/OTVision/detect}/__init__.py +0 -0
  124. {otvision-0.6.3 → otvision-0.6.5}/OTVision/detect/detect.py +0 -0
  125. {otvision-0.6.3/OTVision/domain → otvision-0.6.5/OTVision/detect/plugin_av}/__init__.py +0 -0
  126. {otvision-0.6.3 → otvision-0.6.5}/OTVision/detect/plugin_av/rotate_frame.py +0 -0
  127. {otvision-0.6.3 → otvision-0.6.5}/OTVision/detect/pyav_frame_count_provider.py +0 -0
  128. {otvision-0.6.3/OTVision/helpers → otvision-0.6.5/OTVision/domain}/__init__.py +0 -0
  129. {otvision-0.6.3 → otvision-0.6.5}/OTVision/domain/detect_producer_consumer.py +0 -0
  130. {otvision-0.6.3 → otvision-0.6.5}/OTVision/domain/detection.py +0 -0
  131. {otvision-0.6.3 → otvision-0.6.5}/OTVision/domain/input_source_detect.py +0 -0
  132. {otvision-0.6.3/OTVision/track → otvision-0.6.5/OTVision/helpers}/__init__.py +0 -0
  133. {otvision-0.6.3 → otvision-0.6.5}/OTVision/helpers/date.py +0 -0
  134. {otvision-0.6.3 → otvision-0.6.5}/OTVision/helpers/formats.py +0 -0
  135. {otvision-0.6.3 → otvision-0.6.5}/OTVision/helpers/input_types.py +0 -0
  136. {otvision-0.6.3 → otvision-0.6.5}/OTVision/helpers/log.py +0 -0
  137. {otvision-0.6.3 → otvision-0.6.5}/OTVision/helpers/machine.py +0 -0
  138. {otvision-0.6.3 → otvision-0.6.5}/OTVision/helpers/video.py +0 -0
  139. {otvision-0.6.3/OTVision/track/exporter → otvision-0.6.5/OTVision/plugin}/__init__.py +0 -0
  140. {otvision-0.6.3/OTVision/track/model → otvision-0.6.5/OTVision/track}/__init__.py +0 -0
  141. {otvision-0.6.3/OTVision/track/model/filebased → otvision-0.6.5/OTVision/track/exporter}/__init__.py +0 -0
  142. {otvision-0.6.3/OTVision/track/parser → otvision-0.6.5/OTVision/track/model}/__init__.py +0 -0
  143. {otvision-0.6.3/OTVision/track/tracker → otvision-0.6.5/OTVision/track/model/filebased}/__init__.py +0 -0
  144. {otvision-0.6.3 → otvision-0.6.5}/OTVision/track/model/filebased/frame_chunk.py +0 -0
  145. {otvision-0.6.3 → otvision-0.6.5}/OTVision/track/model/filebased/frame_group.py +0 -0
  146. {otvision-0.6.3/OTVision/transform → otvision-0.6.5/OTVision/track/parser}/__init__.py +0 -0
  147. {otvision-0.6.3 → otvision-0.6.5}/OTVision/track/parser/chunk_parser_plugins.py +0 -0
  148. {otvision-0.6.3/OTVision/view → otvision-0.6.5/OTVision/track/tracker}/__init__.py +0 -0
  149. {otvision-0.6.3/tests → otvision-0.6.5/OTVision/transform}/__init__.py +0 -0
  150. {otvision-0.6.3 → otvision-0.6.5}/OTVision/transform/get_homography.py +0 -0
  151. {otvision-0.6.3 → otvision-0.6.5}/OTVision/transform/reference_points_picker.py +0 -0
  152. {otvision-0.6.3/tests/abstraction → otvision-0.6.5/OTVision/view}/__init__.py +0 -0
  153. {otvision-0.6.3 → otvision-0.6.5}/OTVision/view/helpers/OTC.ico +0 -0
  154. {otvision-0.6.3 → otvision-0.6.5}/OTVision/view/view.py +0 -0
  155. {otvision-0.6.3 → otvision-0.6.5}/OTVision/view/view_convert.py +0 -0
  156. {otvision-0.6.3 → otvision-0.6.5}/OTVision/view/view_detect.py +0 -0
  157. {otvision-0.6.3 → otvision-0.6.5}/OTVision/view/view_helpers.py +0 -0
  158. {otvision-0.6.3 → otvision-0.6.5}/OTVision/view/view_track.py +0 -0
  159. {otvision-0.6.3 → otvision-0.6.5}/OTVision/view/view_transform.py +0 -0
  160. {otvision-0.6.3 → otvision-0.6.5}/OTVision.bat +0 -0
  161. {otvision-0.6.3 → otvision-0.6.5}/clean-up-repository.sh +0 -0
  162. {otvision-0.6.3 → otvision-0.6.5}/config.yml +0 -0
  163. {otvision-0.6.3 → otvision-0.6.5}/export_models.py +0 -0
  164. {otvision-0.6.3 → otvision-0.6.5}/install.cmd +0 -0
  165. {otvision-0.6.3 → otvision-0.6.5}/install.sh +0 -0
  166. {otvision-0.6.3 → otvision-0.6.5}/install_dev.cmd +0 -0
  167. {otvision-0.6.3 → otvision-0.6.5}/install_dev.sh +0 -0
  168. {otvision-0.6.3 → otvision-0.6.5}/pyproject.toml +0 -0
  169. {otvision-0.6.3 → otvision-0.6.5}/requirements-dev.txt +0 -0
  170. {otvision-0.6.3/tests/application → otvision-0.6.5/tests}/__init__.py +0 -0
  171. {otvision-0.6.3/tests/application/detect → otvision-0.6.5/tests/abstraction}/__init__.py +0 -0
  172. {otvision-0.6.3 → otvision-0.6.5}/tests/abstraction/test_observer.py +0 -0
  173. {otvision-0.6.3/tests/convert → otvision-0.6.5/tests/application}/__init__.py +0 -0
  174. {otvision-0.6.3/tests → otvision-0.6.5/tests/application}/detect/__init__.py +0 -0
  175. {otvision-0.6.3 → otvision-0.6.5}/tests/application/detect/test_detected_frame_factory.py +0 -0
  176. {otvision-0.6.3 → otvision-0.6.5}/tests/application/detect/test_detected_frame_producer.py +0 -0
  177. {otvision-0.6.3 → otvision-0.6.5}/tests/application/detect/test_get_detect_cli_args.py +0 -0
  178. {otvision-0.6.3 → otvision-0.6.5}/tests/application/detect/test_timestamper.py +0 -0
  179. {otvision-0.6.3 → otvision-0.6.5}/tests/application/test_buffer.py +0 -0
  180. {otvision-0.6.3/tests/detect/plugin_av → otvision-0.6.5/tests/application/track}/__init__.py +0 -0
  181. {otvision-0.6.3 → otvision-0.6.5}/tests/cli/custom_cli_test_config.yaml +0 -0
  182. {otvision-0.6.3 → otvision-0.6.5}/tests/conftest.py +0 -0
  183. {otvision-0.6.3/tests/helpers → otvision-0.6.5/tests/convert}/__init__.py +0 -0
  184. {otvision-0.6.3 → otvision-0.6.5}/tests/data/Testvideo_CamView.png +0 -0
  185. {otvision-0.6.3 → otvision-0.6.5}/tests/data/Testvideo_CamView_Cars-Cyclist.png +0 -0
  186. {otvision-0.6.3 → otvision-0.6.5}/tests/data/Testvideo_CamView_Cars-Truck.png +0 -0
  187. {otvision-0.6.3 → otvision-0.6.5}/tests/data/Testvideo_CamView_refpts.png +0 -0
  188. {otvision-0.6.3 → otvision-0.6.5}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.gpkg +0 -0
  189. {otvision-0.6.3 → otvision-0.6.5}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  190. {otvision-0.6.3 → otvision-0.6.5}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  191. {otvision-0.6.3 → otvision-0.6.5}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  192. {otvision-0.6.3 → otvision-0.6.5}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otrfpts +0 -0
  193. {otvision-0.6.3 → otvision-0.6.5}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  194. {otvision-0.6.3 → otvision-0.6.5}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.gpkg +0 -0
  195. {otvision-0.6.3 → otvision-0.6.5}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  196. {otvision-0.6.3 → otvision-0.6.5}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  197. {otvision-0.6.3 → otvision-0.6.5}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  198. {otvision-0.6.3 → otvision-0.6.5}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otrfpts +0 -0
  199. {otvision-0.6.3 → otvision-0.6.5}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  200. {otvision-0.6.3 → otvision-0.6.5}/tests/data/Testvideo_FR20.otrfpts +0 -0
  201. {otvision-0.6.3 → otvision-0.6.5}/tests/data/Testvideo_Satellite.jpg +0 -0
  202. {otvision-0.6.3 → otvision-0.6.5}/tests/data/Testvideo_Satellite_far.jpg +0 -0
  203. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/default/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  204. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/default/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  205. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/default/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  206. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/default/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  207. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/fail_fps_from_filename/Testvideo_Cars-Cyclist_F20_2020-01-01_00-00-00.h264 +0 -0
  208. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/fail_fps_from_filename/Testvideo_Cars-Truck_2020-01-01_00-00-00.h264 +0 -0
  209. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/fps_from_filename/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  210. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/fps_from_filename/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  211. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/fps_from_filename/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  212. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/fps_from_filename/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  213. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/input_fps_20/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  214. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/input_fps_20/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  215. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/input_fps_20/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  216. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/input_fps_20/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  217. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/input_fps_40/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  218. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/input_fps_40/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  219. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/input_fps_40/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  220. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/input_fps_40/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  221. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/output_filetype_avi/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.avi +0 -0
  222. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/output_filetype_avi/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  223. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/output_filetype_avi/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.avi +0 -0
  224. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/output_filetype_avi/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  225. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/output_filetype_mkv/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  226. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/output_filetype_mkv/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mkv +0 -0
  227. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/output_filetype_mkv/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  228. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/output_filetype_mkv/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mkv +0 -0
  229. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/output_filetype_mov/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  230. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/output_filetype_mov/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mov +0 -0
  231. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/output_filetype_mov/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  232. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/output_filetype_mov/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mov +0 -0
  233. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/output_filetype_mp4/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  234. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/output_filetype_mp4/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  235. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/output_filetype_mp4/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  236. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/output_filetype_mp4/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  237. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/rotation/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00_rotate.h264 +0 -0
  238. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/rotation/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00_rotate.mov +0 -0
  239. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/rotation/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00_rotate.mp4 +0 -0
  240. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/rotation/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00_rotate.h264 +0 -0
  241. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/rotation/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00_rotate.mov +0 -0
  242. {otvision-0.6.3 → otvision-0.6.5}/tests/data/convert/rotation/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00_rotate.mp4 +0 -0
  243. {otvision-0.6.3 → otvision-0.6.5}/tests/data/detect/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  244. {otvision-0.6.3 → otvision-0.6.5}/tests/data/detect/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  245. {otvision-0.6.3 → otvision-0.6.5}/tests/data/detect/default/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  246. {otvision-0.6.3 → otvision-0.6.5}/tests/data/detect/default/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  247. {otvision-0.6.3 → otvision-0.6.5}/tests/data/detect/rotated-Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  248. {otvision-0.6.3 → otvision-0.6.5}/tests/data/log/_otvision_logs/test.log +0 -0
  249. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/default/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  250. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/default/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  251. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/default/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  252. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/default/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  253. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/sigma_h_0_2/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  254. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/sigma_h_0_2/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  255. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/sigma_h_0_2/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  256. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/sigma_h_0_2/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  257. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/sigma_h_0_6/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  258. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/sigma_h_0_6/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  259. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/sigma_h_0_6/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  260. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/sigma_h_0_6/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  261. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/sigma_iou_0_2/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  262. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/sigma_iou_0_2/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  263. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/sigma_iou_0_2/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  264. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/sigma_iou_0_2/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  265. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/sigma_iou_0_6/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  266. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/sigma_iou_0_6/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  267. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/sigma_iou_0_6/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  268. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/sigma_iou_0_6/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  269. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/sigma_l_0_1/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  270. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/sigma_l_0_1/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  271. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/sigma_l_0_1/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  272. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/sigma_l_0_1/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  273. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/sigma_l_0_5/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  274. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/sigma_l_0_5/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  275. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/sigma_l_0_5/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  276. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/sigma_l_0_5/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  277. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/t_min_10/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  278. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/t_min_10/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  279. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/t_min_10/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  280. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/t_min_10/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  281. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/t_min_3/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  282. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/t_min_3/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  283. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/t_min_3/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  284. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/t_min_3/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  285. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/t_miss_max_25/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  286. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/t_miss_max_25/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  287. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/t_miss_max_25/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  288. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/t_miss_max_25/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  289. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/t_miss_max_75/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  290. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/t_miss_max_75/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  291. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/t_miss_max_75/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  292. {otvision-0.6.3 → otvision-0.6.5}/tests/data/track/t_miss_max_75/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  293. {otvision-0.6.3 → otvision-0.6.5}/tests/data/transform/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.gpkg +0 -0
  294. {otvision-0.6.3 → otvision-0.6.5}/tests/data/transform/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otrfpts +0 -0
  295. {otvision-0.6.3 → otvision-0.6.5}/tests/data/transform/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  296. {otvision-0.6.3 → otvision-0.6.5}/tests/data/transform/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.gpkg +0 -0
  297. {otvision-0.6.3 → otvision-0.6.5}/tests/data/transform/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otrfpts +0 -0
  298. {otvision-0.6.3 → otvision-0.6.5}/tests/data/transform/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  299. {otvision-0.6.3 → otvision-0.6.5}/tests/data/transform/Testvideo_FR20.otrfpts +0 -0
  300. {otvision-0.6.3 → otvision-0.6.5}/tests/data/yolov8m.mlpackage/Data/com.apple.CoreML/model.mlmodel +0 -0
  301. {otvision-0.6.3 → otvision-0.6.5}/tests/data/yolov8m.mlpackage/Data/com.apple.CoreML/weights/weight.bin +0 -0
  302. {otvision-0.6.3 → otvision-0.6.5}/tests/data/yolov8m.mlpackage/Manifest.json +0 -0
  303. {otvision-0.6.3/tests/log → otvision-0.6.5/tests/detect}/__init__.py +0 -0
  304. {otvision-0.6.3/tests/track → otvision-0.6.5/tests/detect/plugin_av}/__init__.py +0 -0
  305. {otvision-0.6.3 → otvision-0.6.5}/tests/detect/plugin_av/test_rotate_frame.py +0 -0
  306. {otvision-0.6.3 → otvision-0.6.5}/tests/detect/test_pyav_frame_count_provider.py +0 -0
  307. {otvision-0.6.3/tests/track/helper → otvision-0.6.5/tests/helpers}/__init__.py +0 -0
  308. {otvision-0.6.3 → otvision-0.6.5}/tests/helpers/formats_test.py +0 -0
  309. {otvision-0.6.3 → otvision-0.6.5}/tests/helpers/test_log.py +0 -0
  310. {otvision-0.6.3/tests/track/parser → otvision-0.6.5/tests/log}/__init__.py +0 -0
  311. {otvision-0.6.3 → otvision-0.6.5}/tests/log/log_maker.py +0 -0
  312. {otvision-0.6.3 → otvision-0.6.5}/tests/log/test_log.py +0 -0
  313. {otvision-0.6.3/tests/transform → otvision-0.6.5/tests/track}/__init__.py +0 -0
  314. {otvision-0.6.3/tests/utils → otvision-0.6.5/tests/track/helper}/__init__.py +0 -0
  315. {otvision-0.6.3 → otvision-0.6.5}/tests/track/helper/data_builder.py +0 -0
  316. {otvision-0.6.3 → otvision-0.6.5}/tests/track/parser/test_chunk_parser_plugins.py +0 -0
  317. {otvision-0.6.3 → otvision-0.6.5}/tests/track/test_frame_chunk.py +0 -0
  318. {otvision-0.6.3 → otvision-0.6.5}/tests/track/test_frame_group.py +0 -0
  319. {otvision-0.6.3 → otvision-0.6.5}/tests/track/test_tracking_data_structures.py +0 -0
  320. {otvision-0.6.3 → otvision-0.6.5}/tests/transform/test_transform.py +0 -0
  321. {otvision-0.6.3 → otvision-0.6.5}/tests/utils/generator.py +0 -0
  322. {otvision-0.6.3 → otvision-0.6.5}/tests/utils/mocking.py +0 -0
  323. {otvision-0.6.3 → otvision-0.6.5}/update_precommit.py +0 -0
  324. {otvision-0.6.3 → otvision-0.6.5}/view.py +0 -0
@@ -10,5 +10,5 @@ charset = utf-8
10
10
  indent_style = space
11
11
  indent_size = 4
12
12
 
13
- [*.{yaml,yml,sh}]
13
+ [*.{md,sh,yaml,yml}]
14
14
  indent_size = 2
@@ -30,6 +30,7 @@ jobs:
30
30
  VALIDATE_ALL_CODEBASE: false
31
31
  DEFAULT_BRANCH: main
32
32
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
33
+ VALIDATE_EDITORCONFIG: false
33
34
  VALIDATE_GO_RELEASER: false
34
35
  VALIDATE_PYTHON_PYLINT: false
35
36
  VALIDATE_PYTHON_MYPY: false
@@ -57,7 +57,7 @@ repos:
57
57
  - mypy==1.15.0
58
58
  - numpy==1.26.4; sys_platform == 'win32'
59
59
  - numpy==2.1.1; sys_platform != 'win32'
60
- - opencv-python==4.11.0.86
60
+ - opencv-python==4.10.0.84
61
61
  - pandas-stubs==2.2.3.250308
62
62
  - pandas==2.2.3
63
63
  - pre-commit==3.8.0
@@ -0,0 +1,15 @@
1
+ def value_or_default[T](value: T | None, default: T) -> T:
2
+ """
3
+ Returns the provided value if it is not None; otherwise, returns a default value.
4
+
5
+ Args:
6
+ value (T | None): The value to be evaluated.
7
+ default (T): The fallback value if 'value' is None.
8
+
9
+ Returns:
10
+ T: The provided value or the default value if the original is None.
11
+ """
12
+
13
+ if value is not None:
14
+ return value
15
+ return default
@@ -22,7 +22,8 @@ class Buffer[T, SUBJECT_TYPE, OBSERVING_TYPE](Observable[SUBJECT_TYPE], Filter[T
22
22
  return self._buffer
23
23
 
24
24
  def _reset_buffer(self) -> None:
25
- self._buffer = []
25
+ del self._buffer
26
+ self._buffer = list()
26
27
 
27
28
  def on_flush(self, event: OBSERVING_TYPE) -> None:
28
29
  buffered_elements = self._get_buffered_elements()
@@ -0,0 +1,475 @@
1
+ from dataclasses import dataclass, field
2
+ from datetime import datetime, timedelta
3
+ from pathlib import Path
4
+
5
+ AVAILABLE_WEIGHTS = "AVAILABLEWEIGHTS"
6
+ CALIBRATIONS = "CALIBRATIONS"
7
+ COL_WIDTH = "COLWIDTH"
8
+ CONF = "CONF"
9
+ CONVERT = "CONVERT"
10
+ DEFAULT_FILETYPE = "DEFAULT_FILETYPE"
11
+ DELETE_INPUT = "DELETE_INPUT"
12
+ ROTATION = "ROTATION"
13
+ DETECT = "DETECT"
14
+ DETECTIONS = "DETECTIONS"
15
+ FILETYPES = "FILETYPES"
16
+ FONT = "FONT"
17
+ FONT_SIZE = "FONTSIZE"
18
+ FPS_FROM_FILENAME = "FPS_FROM_FILENAME"
19
+ FRAME_WIDTH = "FRAMEWIDTH"
20
+ GUI = "GUI"
21
+ HALF_PRECISION = "HALF_PRECISION"
22
+ INPUT_FPS = "INPUT_FPS"
23
+ IMG = "IMG"
24
+ IMG_SIZE = "IMGSIZE"
25
+ IOU = "IOU"
26
+ LAST_PATHS = "LAST PATHS"
27
+ LOCATION_X = "LOCATION_X"
28
+ LOCATION_Y = "LOCATION_Y"
29
+ NORMALIZED = "NORMALIZED"
30
+ OTC_ICON = "OTC ICON"
31
+ OUTPUT_FPS = "OUTPUT_FPS"
32
+ OUTPUT_FILETYPE = "OUTPUT_FILETYPE"
33
+ OVERWRITE = "OVERWRITE"
34
+ PATHS = "PATHS"
35
+ RUN_CHAINED = "RUN_CHAINED"
36
+ EXPECTED_DURATION = "EXPECTED_DURATION"
37
+ REFPTS = "REFPTS"
38
+ SEARCH_SUBDIRS = "SEARCH_SUBDIRS"
39
+ SIGMA_H = "SIGMA_H"
40
+ SIGMA_IOU = "SIGMA_IOU"
41
+ SIGMA_L = "SIGMA_L"
42
+ T_MIN = "T_MIN"
43
+ T_MISS_MAX = "T_MISS_MAX"
44
+ TRACK = "TRACK"
45
+ TRACKS = "TRACKS"
46
+ TRANSFORM = "TRANSFORM"
47
+ UNDISTORT = "UNDISTORT"
48
+ VID = "VID"
49
+ VID_ROTATABLE = "VID_ROTATABLE"
50
+ VIDEOS = "VIDEOS"
51
+ WEIGHTS = "WEIGHTS"
52
+ WINDOW = "WINDOW"
53
+ YOLO = "YOLO"
54
+ LOG = "LOG"
55
+ LOG_LEVEL_CONSOLE = "LOG_LEVEL_CONSOLE"
56
+ LOG_LEVEL_FILE = "LOG_LEVEL_FILE"
57
+ LOG_DIR = "LOG_DIR"
58
+ START_TIME = "START_TIME"
59
+ DETECT_END = "DETECT_END"
60
+ DETECT_START = "DETECT_START"
61
+ DATETIME_FORMAT = "%Y-%m-%d_%H-%M-%S"
62
+ DEFAULT_EXPECTED_DURATION: timedelta = timedelta(minutes=15)
63
+ """Default length of a video is 15 minutes."""
64
+ STREAM = "STREAM"
65
+ STREAM_SAVE_DIR = "SAVE_DIR"
66
+ STREAM_NAME = "NAME"
67
+ STREAM_SOURCE = "SOURCE"
68
+ FLUSH_BUFFER_SIZE = "FLUSH_BUFFER_SIZE"
69
+
70
+
71
+ @dataclass(frozen=True)
72
+ class _LogConfig:
73
+ log_level_console: str = "WARNING"
74
+ log_level_file: str = "DEBUG"
75
+
76
+ def to_dict(self) -> dict:
77
+ return {
78
+ LOG_LEVEL_CONSOLE: self.log_level_console,
79
+ LOG_LEVEL_FILE: self.log_level_file,
80
+ }
81
+
82
+
83
+ @dataclass(frozen=True)
84
+ class _DefaultFiletype:
85
+ video: str = ".mp4"
86
+ image: str = ".jpg"
87
+ detect: str = ".otdet"
88
+ track: str = ".ottrk"
89
+ refpts: str = ".otrfpts"
90
+
91
+ def to_dict(self) -> dict:
92
+ return {
93
+ VID: self.video,
94
+ IMG: self.image,
95
+ DETECT: self.detect,
96
+ TRACK: self.track,
97
+ REFPTS: self.refpts,
98
+ }
99
+
100
+
101
+ @dataclass(frozen=True)
102
+ class _VideoFiletypes:
103
+ avi: str = ".avi"
104
+ mkv: str = ".mkv"
105
+ mov: str = ".mov"
106
+ mp4: str = ".mp4"
107
+
108
+ def to_list(self) -> list:
109
+ return [
110
+ self.avi,
111
+ self.mkv,
112
+ self.mov,
113
+ self.mp4,
114
+ ]
115
+
116
+ def rotatable_to_list(self) -> list:
117
+ return [self.mov, self.mp4]
118
+
119
+
120
+ @dataclass(frozen=True)
121
+ class _ImageFiletypes:
122
+ jpg: str = ".jpg"
123
+ jpeg: str = ".jpeg"
124
+ png: str = ".png"
125
+
126
+ def to_list(self) -> list:
127
+ return [self.jpg, self.jpeg, self.png]
128
+
129
+
130
+ @dataclass(frozen=True)
131
+ class _Filetypes:
132
+ video_filetypes: _VideoFiletypes = _VideoFiletypes()
133
+ image_filetypes: _ImageFiletypes = _ImageFiletypes()
134
+ detect: str = _DefaultFiletype.detect
135
+ track: str = _DefaultFiletype.track
136
+ refpts: str = _DefaultFiletype.refpts
137
+ transform: str = ".gpkg"
138
+
139
+ def to_dict(self) -> dict:
140
+ return {
141
+ VID: self.video_filetypes.to_list(),
142
+ VID_ROTATABLE: self.video_filetypes.rotatable_to_list(),
143
+ IMG: self.image_filetypes.to_list(),
144
+ DETECT: [self.detect],
145
+ TRACK: [self.track],
146
+ REFPTS: [self.refpts],
147
+ TRANSFORM: [self.transform],
148
+ }
149
+
150
+
151
+ @dataclass(frozen=True)
152
+ class _LastPaths:
153
+ videos: list = field(default_factory=list)
154
+ detections: list = field(default_factory=list)
155
+ tracks: list = field(default_factory=list)
156
+ calibrations: list = field(default_factory=list)
157
+ refpts: list = field(default_factory=list)
158
+
159
+ def to_dict(self) -> dict:
160
+ return {
161
+ VIDEOS: self.videos,
162
+ DETECTIONS: self.detections,
163
+ TRACKS: self.tracks,
164
+ CALIBRATIONS: self.calibrations,
165
+ REFPTS: self.refpts,
166
+ }
167
+
168
+
169
+ @dataclass(frozen=True)
170
+ class ConvertConfig:
171
+ paths: list[str] = field(default_factory=list)
172
+ run_chained: bool = True
173
+ output_filetype: str = _VideoFiletypes.mp4
174
+ input_fps: float = 20.0
175
+ output_fps: float = 20.0
176
+ fps_from_filename: bool = True
177
+ delete_input: bool = False
178
+ rotation: int = 0
179
+ overwrite: bool = True
180
+
181
+ def to_dict(self) -> dict:
182
+ return {
183
+ PATHS: self.paths,
184
+ RUN_CHAINED: self.run_chained,
185
+ OUTPUT_FILETYPE: self.output_filetype,
186
+ INPUT_FPS: self.input_fps,
187
+ OUTPUT_FPS: self.output_fps,
188
+ FPS_FROM_FILENAME: self.fps_from_filename,
189
+ DELETE_INPUT: self.delete_input,
190
+ ROTATION: self.rotation,
191
+ OVERWRITE: self.overwrite,
192
+ }
193
+
194
+
195
+ @dataclass(frozen=True)
196
+ class _YoloWeights:
197
+ yolov8s: str = "yolov8s"
198
+ yolov8m: str = "yolov8m"
199
+ yolov8l: str = "yolov8l"
200
+ yolov8x: str = "yolov8x"
201
+
202
+ def to_list(self) -> list:
203
+ return [self.yolov8s, self.yolov8m, self.yolov8l, self.yolov8x]
204
+
205
+
206
+ @dataclass(frozen=True)
207
+ class YoloConfig:
208
+ """Represents the configuration for the YOLO model.
209
+
210
+ Attributes:
211
+ weights (str): Path to YOLO model weights.
212
+ available_weights (_YoloWeights): List of available default YOLO model weights.
213
+ conf (float): Confidence threshold.
214
+ iou (float): Intersection over union threshold.
215
+ img_size (int): Size of the input image.
216
+ chunk_size (int): Chunk size for processing.
217
+ normalized (bool): Whether to normalize the bounding boxes.
218
+ """
219
+
220
+ weights: str = _YoloWeights.yolov8s
221
+ available_weights: _YoloWeights = _YoloWeights()
222
+ conf: float = 0.25
223
+ iou: float = 0.45
224
+ img_size: int = 640
225
+ chunk_size: int = 1
226
+ normalized: bool = False
227
+
228
+ def to_dict(self) -> dict:
229
+ return {
230
+ WEIGHTS: self.weights,
231
+ AVAILABLE_WEIGHTS: self.available_weights.to_list(),
232
+ CONF: self.conf,
233
+ IOU: self.iou,
234
+ IMG_SIZE: self.img_size,
235
+ NORMALIZED: self.normalized,
236
+ }
237
+
238
+
239
+ @dataclass(frozen=True)
240
+ class DetectConfig:
241
+ """Represents the configuration for the `detect` command.
242
+
243
+ Attributes:
244
+ paths (list[Path]): List of files to be processed.
245
+ run_chained (bool): Whether to run chained commands.
246
+ yolo_config (YoloConfig): Configuration for the YOLO model.
247
+ expected_duration (timedelta | None): Expected duration of the video.
248
+ `None` if unknown.
249
+ overwrite (bool): Whether to overwrite existing files.
250
+ half_precision (bool): Whether to use half precision.
251
+ detect_start (int | None): Start frame for detection expressed in seconds.
252
+ Value `None` marks the start of the video.
253
+ detect_end (int | None): End frame for detection expressed in seconds.
254
+ Value `None` marks the end of the video.
255
+
256
+ """
257
+
258
+ @property
259
+ def confidence(self) -> float:
260
+ """Gets the confidence level set in the YOLO configuration.
261
+
262
+ Returns:
263
+ float: The intersection over union threshold value.
264
+ """
265
+ return self.yolo_config.conf
266
+
267
+ @property
268
+ def weights(self) -> str:
269
+ return self.yolo_config.weights
270
+
271
+ @property
272
+ def iou(self) -> float:
273
+ return self.yolo_config.iou
274
+
275
+ @property
276
+ def img_size(self) -> int:
277
+ return self.yolo_config.img_size
278
+
279
+ @property
280
+ def normalized(self) -> bool:
281
+ return self.yolo_config.normalized
282
+
283
+ paths: list[str] = field(default_factory=list)
284
+ run_chained: bool = True
285
+ yolo_config: YoloConfig = YoloConfig()
286
+ expected_duration: timedelta | None = None
287
+ overwrite: bool = True
288
+ half_precision: bool = False
289
+ start_time: datetime | None = None
290
+ detect_start: int | None = None
291
+ detect_end: int | None = None
292
+
293
+ def to_dict(self) -> dict:
294
+ expected_duration = (
295
+ int(self.expected_duration.total_seconds())
296
+ if self.expected_duration is not None
297
+ else None
298
+ )
299
+ return {
300
+ PATHS: [str(p) for p in self.paths],
301
+ RUN_CHAINED: self.run_chained,
302
+ YOLO: self.yolo_config.to_dict(),
303
+ EXPECTED_DURATION: expected_duration,
304
+ OVERWRITE: self.overwrite,
305
+ HALF_PRECISION: self.half_precision,
306
+ START_TIME: self.start_time,
307
+ DETECT_START: self.detect_start,
308
+ DETECT_END: self.detect_end,
309
+ }
310
+
311
+
312
+ @dataclass(frozen=True)
313
+ class _TrackIouConfig:
314
+ sigma_l: float = 0.27
315
+ sigma_h: float = 0.42
316
+ sigma_iou: float = 0.38
317
+ t_min: int = 5
318
+ t_miss_max: int = 51
319
+
320
+ def to_dict(self) -> dict:
321
+ return {
322
+ SIGMA_L: self.sigma_l,
323
+ SIGMA_H: self.sigma_h,
324
+ SIGMA_IOU: self.sigma_iou,
325
+ T_MIN: self.t_min,
326
+ T_MISS_MAX: self.t_miss_max,
327
+ }
328
+
329
+
330
+ @dataclass(frozen=True)
331
+ class TrackConfig:
332
+ @property
333
+ def sigma_l(self) -> float:
334
+ return self.iou.sigma_l
335
+
336
+ @property
337
+ def sigma_h(self) -> float:
338
+ return self.iou.sigma_h
339
+
340
+ @property
341
+ def sigma_iou(self) -> float:
342
+ return self.iou.sigma_iou
343
+
344
+ @property
345
+ def t_min(self) -> int:
346
+ return self.iou.t_min
347
+
348
+ @property
349
+ def t_miss_max(self) -> int:
350
+ return self.iou.t_miss_max
351
+
352
+ paths: list[str] = field(default_factory=list)
353
+ run_chained: bool = True
354
+ iou: _TrackIouConfig = _TrackIouConfig()
355
+ overwrite: bool = True
356
+
357
+ def to_dict(self) -> dict:
358
+ return {
359
+ PATHS: [str(p) for p in self.paths],
360
+ RUN_CHAINED: self.run_chained,
361
+ IOU: self.iou.to_dict(),
362
+ OVERWRITE: self.overwrite,
363
+ }
364
+
365
+
366
+ @dataclass(frozen=True)
367
+ class _UndistortConfig:
368
+ overwrite: bool = False
369
+
370
+ def to_dict(self) -> dict:
371
+ return {OVERWRITE: self.overwrite}
372
+
373
+
374
+ @dataclass(frozen=True)
375
+ class _TransformConfig:
376
+ paths: list[str] = field(default_factory=list)
377
+ run_chained: bool = True
378
+ overwrite: bool = True
379
+
380
+ def to_dict(self) -> dict:
381
+ return {
382
+ PATHS: [str(p) for p in self.paths],
383
+ RUN_CHAINED: self.run_chained,
384
+ OVERWRITE: self.overwrite,
385
+ }
386
+
387
+
388
+ @dataclass(frozen=True)
389
+ class _GuiWindowConfig:
390
+ location_x: int = 0
391
+ location_y: int = 0
392
+
393
+ def to_dict(self) -> dict:
394
+ return {LOCATION_X: self.location_x, LOCATION_Y: self.location_y}
395
+
396
+
397
+ @dataclass(frozen=True)
398
+ class _GuiConfig:
399
+ otc_icon: str = str(Path(__file__).parents[0] / r"view" / r"helpers" / r"OTC.ico")
400
+ font: str = "Open Sans"
401
+ font_size: int = 12
402
+ window_config: _GuiWindowConfig = _GuiWindowConfig()
403
+ frame_width: int = 80
404
+ col_width: int = 50
405
+
406
+ def to_dict(self) -> dict:
407
+ return {
408
+ OTC_ICON: self.otc_icon,
409
+ FONT: self.font,
410
+ FONT_SIZE: self.font_size,
411
+ WINDOW: self.window_config.to_dict(),
412
+ FRAME_WIDTH: self.frame_width,
413
+ COL_WIDTH: self.col_width,
414
+ }
415
+
416
+
417
+ @dataclass(frozen=True)
418
+ class StreamConfig:
419
+ name: str
420
+ source: str
421
+ save_dir: Path
422
+ flush_buffer_size: int
423
+
424
+ def to_dict(self) -> dict:
425
+ return {
426
+ STREAM_NAME: self.name,
427
+ STREAM_SOURCE: self.source,
428
+ STREAM_SAVE_DIR: str(self.save_dir),
429
+ FLUSH_BUFFER_SIZE: self.flush_buffer_size,
430
+ }
431
+
432
+
433
+ @dataclass
434
+ class Config:
435
+ """Represents the OTVision config file.
436
+
437
+ Provides methods to parse in a custom config file from a dict or a YAML file.
438
+ Updates the default configuration with the custom config.
439
+ """
440
+
441
+ log: _LogConfig = _LogConfig()
442
+ search_subdirs: bool = True
443
+ default_filetype: _DefaultFiletype = _DefaultFiletype()
444
+ filetypes: _Filetypes = _Filetypes()
445
+ last_paths: _LastPaths = _LastPaths()
446
+ convert: ConvertConfig = ConvertConfig()
447
+ detect: DetectConfig = DetectConfig()
448
+ track: TrackConfig = TrackConfig()
449
+ undistort: _UndistortConfig = _UndistortConfig()
450
+ transform: _TransformConfig = _TransformConfig()
451
+ gui: _GuiConfig = _GuiConfig()
452
+ stream: StreamConfig | None = None
453
+
454
+ def to_dict(self) -> dict:
455
+ """Returns the OTVision config as a dict.
456
+
457
+ Returns:
458
+ dict: The OTVision config.
459
+ """
460
+ data = {
461
+ LOG: self.log.to_dict(),
462
+ SEARCH_SUBDIRS: self.search_subdirs,
463
+ DEFAULT_FILETYPE: self.default_filetype.to_dict(),
464
+ FILETYPES: self.filetypes.to_dict(),
465
+ LAST_PATHS: self.last_paths.to_dict(),
466
+ CONVERT: self.convert.to_dict(),
467
+ DETECT: self.detect.to_dict(),
468
+ TRACK: self.track.to_dict(),
469
+ UNDISTORT: self.undistort.to_dict(),
470
+ TRANSFORM: self.transform.to_dict(),
471
+ GUI: self.gui.to_dict(),
472
+ }
473
+ if self.stream is not None:
474
+ data[STREAM] = self.stream.to_dict()
475
+ return data