OTVision 0.6.2__tar.gz → 0.6.3__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 (298) hide show
  1. {otvision-0.6.2 → otvision-0.6.3}/.pre-commit-config.yaml +5 -4
  2. {otvision-0.6.2 → otvision-0.6.3}/OTVision/__init__.py +0 -10
  3. {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/detect/current_object_detector.py +1 -2
  4. {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/detect/detected_frame_factory.py +4 -3
  5. {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/detect/detected_frame_producer.py +1 -2
  6. {otvision-0.6.2 → otvision-0.6.3}/OTVision/detect/builder.py +1 -1
  7. {otvision-0.6.2 → otvision-0.6.3}/OTVision/detect/detected_frame_buffer.py +1 -1
  8. {otvision-0.6.2 → otvision-0.6.3}/OTVision/detect/otdet.py +3 -2
  9. {otvision-0.6.2 → otvision-0.6.3}/OTVision/detect/yolo.py +2 -2
  10. {otvision-0.6.2 → otvision-0.6.3}/OTVision/domain/detect_producer_consumer.py +1 -1
  11. {otvision-0.6.2/OTVision/track/model → otvision-0.6.3/OTVision/domain}/frame.py +39 -14
  12. {otvision-0.6.2 → otvision-0.6.3}/OTVision/domain/object_detection.py +1 -2
  13. {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/model/filebased/frame_chunk.py +11 -11
  14. {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/model/tracking_interfaces.py +24 -30
  15. {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/parser/chunk_parser_plugins.py +6 -6
  16. {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/track.py +1 -1
  17. {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/tracker/filebased_tracking.py +7 -12
  18. {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/tracker/tracker_plugin_iou.py +10 -14
  19. {otvision-0.6.2 → otvision-0.6.3}/OTVision/version.py +1 -1
  20. {otvision-0.6.2 → otvision-0.6.3}/PKG-INFO +5 -4
  21. {otvision-0.6.2 → otvision-0.6.3}/convert.py +2 -2
  22. {otvision-0.6.2 → otvision-0.6.3}/requirements.txt +4 -3
  23. {otvision-0.6.2 → otvision-0.6.3}/tests/application/detect/test_detected_frame_factory.py +4 -3
  24. {otvision-0.6.2 → otvision-0.6.3}/tests/application/detect/test_detected_frame_producer.py +1 -2
  25. {otvision-0.6.2 → otvision-0.6.3}/tests/cli/test_convert_cli.py +48 -66
  26. {otvision-0.6.2 → otvision-0.6.3}/tests/cli/test_track_cli.py +50 -68
  27. {otvision-0.6.2 → otvision-0.6.3}/tests/detect/test_detected_frame_buffer.py +1 -1
  28. {otvision-0.6.2 → otvision-0.6.3}/tests/detect/test_odet.py +4 -3
  29. {otvision-0.6.2 → otvision-0.6.3}/tests/detect/yolo_test.py +2 -2
  30. {otvision-0.6.2 → otvision-0.6.3}/tests/track/helper/data_builder.py +12 -12
  31. {otvision-0.6.2 → otvision-0.6.3}/tests/track/parser/test_chunk_parser_plugins.py +1 -1
  32. {otvision-0.6.2 → otvision-0.6.3}/tests/track/test_frame_chunk.py +3 -3
  33. {otvision-0.6.2 → otvision-0.6.3}/tests/track/test_tracking_data_structures.py +5 -5
  34. {otvision-0.6.2 → otvision-0.6.3}/tests/transform/test_transform.py +44 -10
  35. {otvision-0.6.2 → otvision-0.6.3}/track.py +2 -2
  36. {otvision-0.6.2 → otvision-0.6.3}/transform.py +2 -2
  37. {otvision-0.6.2 → otvision-0.6.3}/update_precommit.py +52 -12
  38. otvision-0.6.2/OTVision/domain/detection.py +0 -20
  39. otvision-0.6.2/OTVision/domain/frame.py +0 -29
  40. {otvision-0.6.2 → otvision-0.6.3}/.editorconfig +0 -0
  41. {otvision-0.6.2 → otvision-0.6.3}/.flake8 +0 -0
  42. {otvision-0.6.2 → otvision-0.6.3}/.github/dependabot.yml +0 -0
  43. {otvision-0.6.2 → otvision-0.6.3}/.github/workflows/build-nightly.yml +0 -0
  44. {otvision-0.6.2 → otvision-0.6.3}/.github/workflows/build-release.yml +0 -0
  45. {otvision-0.6.2 → otvision-0.6.3}/.github/workflows/linter.yml +0 -0
  46. {otvision-0.6.2 → otvision-0.6.3}/.github/workflows/release-pypi.yml +0 -0
  47. {otvision-0.6.2 → otvision-0.6.3}/.github/workflows/release-testpypi.yml +0 -0
  48. {otvision-0.6.2 → otvision-0.6.3}/.github/workflows/test.yml +0 -0
  49. {otvision-0.6.2 → otvision-0.6.3}/.gitignore +0 -0
  50. {otvision-0.6.2 → otvision-0.6.3}/.vscode/launch.json +0 -0
  51. {otvision-0.6.2 → otvision-0.6.3}/.vscode/scripts/build_debug_env.cmd +0 -0
  52. {otvision-0.6.2 → otvision-0.6.3}/.vscode/scripts/build_debug_env.sh +0 -0
  53. {otvision-0.6.2 → otvision-0.6.3}/.vscode/scripts/teardown_debug_env.cmd +0 -0
  54. {otvision-0.6.2 → otvision-0.6.3}/.vscode/scripts/teardown_debug_env.sh +0 -0
  55. {otvision-0.6.2 → otvision-0.6.3}/.vscode/settings.json +0 -0
  56. {otvision-0.6.2 → otvision-0.6.3}/.vscode/tasks.json +0 -0
  57. {otvision-0.6.2 → otvision-0.6.3}/.yamllint.yaml +0 -0
  58. {otvision-0.6.2 → otvision-0.6.3}/LICENSE +0 -0
  59. {otvision-0.6.2 → otvision-0.6.3}/OTVision/abstraction/__init__.py +0 -0
  60. {otvision-0.6.2 → otvision-0.6.3}/OTVision/abstraction/observer.py +0 -0
  61. {otvision-0.6.2 → otvision-0.6.3}/OTVision/abstraction/pipes_and_filter.py +0 -0
  62. {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/__init__.py +0 -0
  63. {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/buffer.py +0 -0
  64. {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/configure_logger.py +0 -0
  65. {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/detect/__init__.py +0 -0
  66. {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/detect/current_object_detector_metadata.py +0 -0
  67. {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/detect/detection_file_save_path_provider.py +0 -0
  68. {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/detect/factory.py +0 -0
  69. {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/detect/get_detect_cli_args.py +0 -0
  70. {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/detect/timestamper.py +0 -0
  71. {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/detect/update_detect_config_with_cli_args.py +0 -0
  72. {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/frame_count_provider.py +0 -0
  73. {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/get_config.py +0 -0
  74. {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/get_current_config.py +0 -0
  75. {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/update_current_config.py +0 -0
  76. {otvision-0.6.2 → otvision-0.6.3}/OTVision/config.py +0 -0
  77. {otvision-0.6.2 → otvision-0.6.3}/OTVision/convert/__init__.py +0 -0
  78. {otvision-0.6.2 → otvision-0.6.3}/OTVision/convert/convert.py +0 -0
  79. {otvision-0.6.2 → otvision-0.6.3}/OTVision/dataformat.py +0 -0
  80. {otvision-0.6.2 → otvision-0.6.3}/OTVision/detect/__init__.py +0 -0
  81. {otvision-0.6.2 → otvision-0.6.3}/OTVision/detect/cli.py +0 -0
  82. {otvision-0.6.2 → otvision-0.6.3}/OTVision/detect/detect.py +0 -0
  83. {otvision-0.6.2 → otvision-0.6.3}/OTVision/detect/otdet_file_writer.py +0 -0
  84. {otvision-0.6.2 → otvision-0.6.3}/OTVision/detect/plugin_av/__init__.py +0 -0
  85. {otvision-0.6.2 → otvision-0.6.3}/OTVision/detect/plugin_av/rotate_frame.py +0 -0
  86. {otvision-0.6.2 → otvision-0.6.3}/OTVision/detect/pyav_frame_count_provider.py +0 -0
  87. {otvision-0.6.2 → otvision-0.6.3}/OTVision/detect/timestamper.py +0 -0
  88. {otvision-0.6.2 → otvision-0.6.3}/OTVision/detect/video_input_source.py +0 -0
  89. {otvision-0.6.2 → otvision-0.6.3}/OTVision/domain/__init__.py +0 -0
  90. {otvision-0.6.2 → otvision-0.6.3}/OTVision/domain/cli.py +0 -0
  91. {otvision-0.6.2 → otvision-0.6.3}/OTVision/domain/current_config.py +0 -0
  92. {otvision-0.6.2/OTVision/track/model → otvision-0.6.3/OTVision/domain}/detection.py +0 -0
  93. {otvision-0.6.2 → otvision-0.6.3}/OTVision/domain/input_source_detect.py +0 -0
  94. {otvision-0.6.2 → otvision-0.6.3}/OTVision/helpers/__init__.py +0 -0
  95. {otvision-0.6.2 → otvision-0.6.3}/OTVision/helpers/date.py +0 -0
  96. {otvision-0.6.2 → otvision-0.6.3}/OTVision/helpers/files.py +0 -0
  97. {otvision-0.6.2 → otvision-0.6.3}/OTVision/helpers/formats.py +0 -0
  98. {otvision-0.6.2 → otvision-0.6.3}/OTVision/helpers/input_types.py +0 -0
  99. {otvision-0.6.2 → otvision-0.6.3}/OTVision/helpers/log.py +0 -0
  100. {otvision-0.6.2 → otvision-0.6.3}/OTVision/helpers/machine.py +0 -0
  101. {otvision-0.6.2 → otvision-0.6.3}/OTVision/helpers/video.py +0 -0
  102. {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/__init__.py +0 -0
  103. {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/exporter/__init__.py +0 -0
  104. {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/exporter/filebased_exporter.py +0 -0
  105. {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/model/__init__.py +0 -0
  106. {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/model/filebased/__init__.py +0 -0
  107. {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/model/filebased/frame_group.py +0 -0
  108. {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/model/track_exporter.py +0 -0
  109. {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/parser/__init__.py +0 -0
  110. {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/parser/frame_group_parser_plugins.py +0 -0
  111. {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/tracker/__init__.py +0 -0
  112. {otvision-0.6.2 → otvision-0.6.3}/OTVision/transform/__init__.py +0 -0
  113. {otvision-0.6.2 → otvision-0.6.3}/OTVision/transform/get_homography.py +0 -0
  114. {otvision-0.6.2 → otvision-0.6.3}/OTVision/transform/reference_points_picker.py +0 -0
  115. {otvision-0.6.2 → otvision-0.6.3}/OTVision/transform/transform.py +0 -0
  116. {otvision-0.6.2 → otvision-0.6.3}/OTVision/view/__init__.py +0 -0
  117. {otvision-0.6.2 → otvision-0.6.3}/OTVision/view/helpers/OTC.ico +0 -0
  118. {otvision-0.6.2 → otvision-0.6.3}/OTVision/view/view.py +0 -0
  119. {otvision-0.6.2 → otvision-0.6.3}/OTVision/view/view_convert.py +0 -0
  120. {otvision-0.6.2 → otvision-0.6.3}/OTVision/view/view_detect.py +0 -0
  121. {otvision-0.6.2 → otvision-0.6.3}/OTVision/view/view_helpers.py +0 -0
  122. {otvision-0.6.2 → otvision-0.6.3}/OTVision/view/view_track.py +0 -0
  123. {otvision-0.6.2 → otvision-0.6.3}/OTVision/view/view_transform.py +0 -0
  124. {otvision-0.6.2 → otvision-0.6.3}/OTVision.bat +0 -0
  125. {otvision-0.6.2 → otvision-0.6.3}/README.md +0 -0
  126. {otvision-0.6.2 → otvision-0.6.3}/clean-up-repository.sh +0 -0
  127. {otvision-0.6.2 → otvision-0.6.3}/config.yml +0 -0
  128. {otvision-0.6.2 → otvision-0.6.3}/detect.py +0 -0
  129. {otvision-0.6.2 → otvision-0.6.3}/export_models.py +0 -0
  130. {otvision-0.6.2 → otvision-0.6.3}/install.cmd +0 -0
  131. {otvision-0.6.2 → otvision-0.6.3}/install.sh +0 -0
  132. {otvision-0.6.2 → otvision-0.6.3}/install_dev.cmd +0 -0
  133. {otvision-0.6.2 → otvision-0.6.3}/install_dev.sh +0 -0
  134. {otvision-0.6.2 → otvision-0.6.3}/pyproject.toml +0 -0
  135. {otvision-0.6.2 → otvision-0.6.3}/reference_points_picker.py +0 -0
  136. {otvision-0.6.2 → otvision-0.6.3}/requirements-dev.txt +0 -0
  137. {otvision-0.6.2 → otvision-0.6.3}/tests/__init__.py +0 -0
  138. {otvision-0.6.2 → otvision-0.6.3}/tests/abstraction/__init__.py +0 -0
  139. {otvision-0.6.2 → otvision-0.6.3}/tests/abstraction/test_observer.py +0 -0
  140. {otvision-0.6.2 → otvision-0.6.3}/tests/application/__init__.py +0 -0
  141. {otvision-0.6.2 → otvision-0.6.3}/tests/application/detect/__init__.py +0 -0
  142. {otvision-0.6.2 → otvision-0.6.3}/tests/application/detect/test_current_object_detector.py +0 -0
  143. {otvision-0.6.2 → otvision-0.6.3}/tests/application/detect/test_detection_file_save_path_provider.py +0 -0
  144. {otvision-0.6.2 → otvision-0.6.3}/tests/application/detect/test_get_detect_cli_args.py +0 -0
  145. {otvision-0.6.2 → otvision-0.6.3}/tests/application/detect/test_timestamper.py +0 -0
  146. {otvision-0.6.2 → otvision-0.6.3}/tests/application/detect/test_update_detect_config_with_cli_args.py +0 -0
  147. {otvision-0.6.2 → otvision-0.6.3}/tests/application/test_buffer.py +0 -0
  148. {otvision-0.6.2 → otvision-0.6.3}/tests/application/test_get_config.py +0 -0
  149. {otvision-0.6.2 → otvision-0.6.3}/tests/cli/custom_cli_test_config.yaml +0 -0
  150. {otvision-0.6.2 → otvision-0.6.3}/tests/cli/test_detect_cli.py +0 -0
  151. {otvision-0.6.2 → otvision-0.6.3}/tests/conftest.py +0 -0
  152. {otvision-0.6.2 → otvision-0.6.3}/tests/convert/__init__.py +0 -0
  153. {otvision-0.6.2 → otvision-0.6.3}/tests/convert/test_convert.py +0 -0
  154. {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_CamView.png +0 -0
  155. {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_CamView_Cars-Cyclist.png +0 -0
  156. {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_CamView_Cars-Truck.png +0 -0
  157. {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_CamView_refpts.png +0 -0
  158. {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.gpkg +0 -0
  159. {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  160. {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  161. {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  162. {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otrfpts +0 -0
  163. {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  164. {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.gpkg +0 -0
  165. {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  166. {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  167. {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  168. {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otrfpts +0 -0
  169. {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  170. {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_FR20.otrfpts +0 -0
  171. {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Satellite.jpg +0 -0
  172. {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Satellite_far.jpg +0 -0
  173. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/default/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  174. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/default/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  175. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/default/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  176. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/default/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  177. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/fail_fps_from_filename/Testvideo_Cars-Cyclist_F20_2020-01-01_00-00-00.h264 +0 -0
  178. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/fail_fps_from_filename/Testvideo_Cars-Truck_2020-01-01_00-00-00.h264 +0 -0
  179. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/fps_from_filename/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  180. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/fps_from_filename/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  181. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/fps_from_filename/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  182. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/fps_from_filename/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  183. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/input_fps_20/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  184. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/input_fps_20/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  185. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/input_fps_20/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  186. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/input_fps_20/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  187. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/input_fps_40/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  188. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/input_fps_40/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  189. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/input_fps_40/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  190. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/input_fps_40/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  191. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/output_filetype_avi/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.avi +0 -0
  192. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/output_filetype_avi/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  193. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/output_filetype_avi/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.avi +0 -0
  194. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/output_filetype_avi/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  195. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/output_filetype_mkv/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  196. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/output_filetype_mkv/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mkv +0 -0
  197. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/output_filetype_mkv/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  198. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/output_filetype_mkv/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mkv +0 -0
  199. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/output_filetype_mov/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  200. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/output_filetype_mov/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mov +0 -0
  201. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/output_filetype_mov/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  202. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/output_filetype_mov/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mov +0 -0
  203. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/output_filetype_mp4/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  204. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/output_filetype_mp4/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  205. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/output_filetype_mp4/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  206. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/output_filetype_mp4/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  207. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/rotation/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00_rotate.h264 +0 -0
  208. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/rotation/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00_rotate.mov +0 -0
  209. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/rotation/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00_rotate.mp4 +0 -0
  210. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/rotation/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00_rotate.h264 +0 -0
  211. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/rotation/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00_rotate.mov +0 -0
  212. {otvision-0.6.2 → otvision-0.6.3}/tests/data/convert/rotation/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00_rotate.mp4 +0 -0
  213. {otvision-0.6.2 → otvision-0.6.3}/tests/data/detect/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  214. {otvision-0.6.2 → otvision-0.6.3}/tests/data/detect/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  215. {otvision-0.6.2 → otvision-0.6.3}/tests/data/detect/default/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  216. {otvision-0.6.2 → otvision-0.6.3}/tests/data/detect/default/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  217. {otvision-0.6.2 → otvision-0.6.3}/tests/data/detect/rotated-Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  218. {otvision-0.6.2 → otvision-0.6.3}/tests/data/log/_otvision_logs/test.log +0 -0
  219. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/default/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  220. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/default/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  221. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/default/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  222. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/default/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  223. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/sigma_h_0_2/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  224. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/sigma_h_0_2/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  225. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/sigma_h_0_2/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  226. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/sigma_h_0_2/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  227. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/sigma_h_0_6/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  228. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/sigma_h_0_6/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  229. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/sigma_h_0_6/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  230. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/sigma_h_0_6/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  231. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/sigma_iou_0_2/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  232. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/sigma_iou_0_2/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  233. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/sigma_iou_0_2/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  234. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/sigma_iou_0_2/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  235. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/sigma_iou_0_6/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  236. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/sigma_iou_0_6/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  237. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/sigma_iou_0_6/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  238. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/sigma_iou_0_6/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  239. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/sigma_l_0_1/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  240. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/sigma_l_0_1/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  241. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/sigma_l_0_1/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  242. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/sigma_l_0_1/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  243. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/sigma_l_0_5/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  244. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/sigma_l_0_5/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  245. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/sigma_l_0_5/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  246. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/sigma_l_0_5/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  247. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/t_min_10/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  248. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/t_min_10/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  249. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/t_min_10/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  250. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/t_min_10/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  251. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/t_min_3/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  252. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/t_min_3/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  253. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/t_min_3/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  254. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/t_min_3/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  255. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/t_miss_max_25/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  256. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/t_miss_max_25/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  257. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/t_miss_max_25/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  258. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/t_miss_max_25/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  259. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/t_miss_max_75/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  260. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/t_miss_max_75/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  261. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/t_miss_max_75/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  262. {otvision-0.6.2 → otvision-0.6.3}/tests/data/track/t_miss_max_75/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  263. {otvision-0.6.2 → otvision-0.6.3}/tests/data/transform/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.gpkg +0 -0
  264. {otvision-0.6.2 → otvision-0.6.3}/tests/data/transform/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otrfpts +0 -0
  265. {otvision-0.6.2 → otvision-0.6.3}/tests/data/transform/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  266. {otvision-0.6.2 → otvision-0.6.3}/tests/data/transform/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.gpkg +0 -0
  267. {otvision-0.6.2 → otvision-0.6.3}/tests/data/transform/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otrfpts +0 -0
  268. {otvision-0.6.2 → otvision-0.6.3}/tests/data/transform/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  269. {otvision-0.6.2 → otvision-0.6.3}/tests/data/transform/Testvideo_FR20.otrfpts +0 -0
  270. {otvision-0.6.2 → otvision-0.6.3}/tests/data/yolov8m.mlpackage/Data/com.apple.CoreML/model.mlmodel +0 -0
  271. {otvision-0.6.2 → otvision-0.6.3}/tests/data/yolov8m.mlpackage/Data/com.apple.CoreML/weights/weight.bin +0 -0
  272. {otvision-0.6.2 → otvision-0.6.3}/tests/data/yolov8m.mlpackage/Manifest.json +0 -0
  273. {otvision-0.6.2 → otvision-0.6.3}/tests/detect/__init__.py +0 -0
  274. {otvision-0.6.2 → otvision-0.6.3}/tests/detect/detect_test.py +0 -0
  275. {otvision-0.6.2 → otvision-0.6.3}/tests/detect/plugin_av/__init__.py +0 -0
  276. {otvision-0.6.2 → otvision-0.6.3}/tests/detect/plugin_av/test_rotate_frame.py +0 -0
  277. {otvision-0.6.2 → otvision-0.6.3}/tests/detect/test_otdet_file_writer.py +0 -0
  278. {otvision-0.6.2 → otvision-0.6.3}/tests/detect/test_pyav_frame_count_provider.py +0 -0
  279. {otvision-0.6.2 → otvision-0.6.3}/tests/detect/test_video_input_source.py +0 -0
  280. {otvision-0.6.2 → otvision-0.6.3}/tests/helpers/__init__.py +0 -0
  281. {otvision-0.6.2 → otvision-0.6.3}/tests/helpers/files_test.py +0 -0
  282. {otvision-0.6.2 → otvision-0.6.3}/tests/helpers/formats_test.py +0 -0
  283. {otvision-0.6.2 → otvision-0.6.3}/tests/helpers/test_log.py +0 -0
  284. {otvision-0.6.2 → otvision-0.6.3}/tests/log/__init__.py +0 -0
  285. {otvision-0.6.2 → otvision-0.6.3}/tests/log/log_maker.py +0 -0
  286. {otvision-0.6.2 → otvision-0.6.3}/tests/log/test_log.py +0 -0
  287. {otvision-0.6.2 → otvision-0.6.3}/tests/test_config.py +0 -0
  288. {otvision-0.6.2 → otvision-0.6.3}/tests/track/__init__.py +0 -0
  289. {otvision-0.6.2 → otvision-0.6.3}/tests/track/helper/__init__.py +0 -0
  290. {otvision-0.6.2 → otvision-0.6.3}/tests/track/parser/__init__.py +0 -0
  291. {otvision-0.6.2 → otvision-0.6.3}/tests/track/test_frame_group.py +0 -0
  292. {otvision-0.6.2 → otvision-0.6.3}/tests/track/test_frame_group_parser_plugins.py +0 -0
  293. {otvision-0.6.2 → otvision-0.6.3}/tests/track/test_track.py +0 -0
  294. {otvision-0.6.2 → otvision-0.6.3}/tests/transform/__init__.py +0 -0
  295. {otvision-0.6.2 → otvision-0.6.3}/tests/utils/__init__.py +0 -0
  296. {otvision-0.6.2 → otvision-0.6.3}/tests/utils/generator.py +0 -0
  297. {otvision-0.6.2 → otvision-0.6.3}/tests/utils/mocking.py +0 -0
  298. {otvision-0.6.2 → otvision-0.6.3}/view.py +0 -0
@@ -46,7 +46,7 @@ repos:
46
46
  additional_dependencies:
47
47
  - av==13.0.0
48
48
  - black==24.8.0
49
- - coremltools==8.2;
49
+ - coremltools==8.2; sys_platform == 'darwin'
50
50
  - fire==0.7.0
51
51
  - hatch-requirements-txt==0.4.1
52
52
  - ijson==3.3.0
@@ -55,8 +55,9 @@ repos:
55
55
  - more-itertools==10.5.0
56
56
  - moviepy==1.0.3
57
57
  - mypy==1.15.0
58
- - numpy==1.26.4
59
- - opencv-python==4.9.0.80
58
+ - numpy==1.26.4; sys_platform == 'win32'
59
+ - numpy==2.1.1; sys_platform != 'win32'
60
+ - opencv-python==4.11.0.86
60
61
  - pandas-stubs==2.2.3.250308
61
62
  - pandas==2.2.3
62
63
  - pre-commit==3.8.0
@@ -72,7 +73,7 @@ repos:
72
73
  - types-setuptools
73
74
  - types-tqdm
74
75
  - types-ujson
75
- - ultralytics==8.3.74
76
+ - ultralytics==8.3.94
76
77
  - yamllint==1.35.1
77
78
  always_run: true
78
79
  pass_filenames: false
@@ -18,13 +18,3 @@ OTVision init module
18
18
  #
19
19
  # You should have received a copy of the GNU General Public License
20
20
  # along with this program. If not, see <https://www.gnu.org/licenses/>.
21
-
22
-
23
- # TODO: Might need to change this
24
- from .convert.convert import main as convert
25
- from .track.track import main as track
26
- from .transform.transform import main as transform
27
-
28
- # from .view.view import main as view
29
-
30
- __all__: list = ["track", "convert", "transform"]
@@ -2,8 +2,7 @@ from typing import Generator
2
2
 
3
3
  from OTVision.abstraction.pipes_and_filter import Filter
4
4
  from OTVision.application.get_current_config import GetCurrentConfig
5
- from OTVision.domain.detection import DetectedFrame
6
- from OTVision.domain.frame import Frame
5
+ from OTVision.domain.frame import DetectedFrame, Frame
7
6
  from OTVision.domain.object_detection import ObjectDetector, ObjectDetectorFactory
8
7
 
9
8
 
@@ -1,5 +1,5 @@
1
- from OTVision.domain.detection import DetectedFrame, Detection
2
- from OTVision.domain.frame import Frame, FrameKeys
1
+ from OTVision.domain.detection import Detection
2
+ from OTVision.domain.frame import DetectedFrame, Frame, FrameKeys
3
3
 
4
4
 
5
5
  class DetectedFrameFactory:
@@ -20,7 +20,8 @@ class DetectedFrameFactory:
20
20
 
21
21
  return DetectedFrame(
22
22
  source=frame[FrameKeys.source],
23
- frame_number=frame[FrameKeys.frame],
23
+ no=frame[FrameKeys.frame],
24
24
  occurrence=frame[FrameKeys.occurrence],
25
25
  detections=detections,
26
+ image=frame[FrameKeys.data],
26
27
  )
@@ -2,8 +2,7 @@ from typing import Generator
2
2
 
3
3
  from OTVision.abstraction.pipes_and_filter import Filter
4
4
  from OTVision.domain.detect_producer_consumer import DetectedFrameProducer
5
- from OTVision.domain.detection import DetectedFrame
6
- from OTVision.domain.frame import Frame
5
+ from OTVision.domain.frame import DetectedFrame, Frame
7
6
  from OTVision.domain.input_source_detect import InputSourceDetect
8
7
 
9
8
 
@@ -42,7 +42,7 @@ from OTVision.detect.yolo import YoloDetectionConverter, YoloFactory
42
42
  from OTVision.domain.cli import DetectCliParser
43
43
  from OTVision.domain.current_config import CurrentConfig
44
44
  from OTVision.domain.detect_producer_consumer import DetectedFrameProducer
45
- from OTVision.domain.detection import DetectedFrame
45
+ from OTVision.domain.frame import DetectedFrame
46
46
  from OTVision.domain.input_source_detect import InputSourceDetect
47
47
  from OTVision.domain.object_detection import ObjectDetectorFactory
48
48
 
@@ -2,7 +2,7 @@ from dataclasses import dataclass
2
2
  from datetime import datetime, timedelta
3
3
 
4
4
  from OTVision.application.buffer import Buffer
5
- from OTVision.domain.detection import DetectedFrame
5
+ from OTVision.domain.frame import DetectedFrame
6
6
 
7
7
 
8
8
  @dataclass
@@ -4,7 +4,8 @@ from pathlib import Path
4
4
  from typing import Self
5
5
 
6
6
  from OTVision import dataformat, version
7
- from OTVision.domain.detection import DetectedFrame, Detection
7
+ from OTVision.domain.detection import Detection
8
+ from OTVision.domain.frame import DetectedFrame
8
9
 
9
10
 
10
11
  @dataclass
@@ -74,7 +75,7 @@ class OtdetBuilder:
74
75
  converted_detections = [
75
76
  self.__convert_detection(detection) for detection in frame.detections
76
77
  ]
77
- data[str(frame.frame_number)] = {
78
+ data[str(frame.no)] = {
78
79
  dataformat.DETECTIONS: converted_detections,
79
80
  dataformat.OCCURRENCE: frame.occurrence.timestamp(),
80
81
  }
@@ -33,8 +33,8 @@ from OTVision.abstraction.pipes_and_filter import Filter
33
33
  from OTVision.application.detect.detected_frame_factory import DetectedFrameFactory
34
34
  from OTVision.application.get_current_config import GetCurrentConfig
35
35
  from OTVision.config import DetectConfig
36
- from OTVision.domain.detection import DetectedFrame, Detection
37
- from OTVision.domain.frame import Frame, FrameKeys
36
+ from OTVision.domain.detection import Detection
37
+ from OTVision.domain.frame import DetectedFrame, Frame, FrameKeys
38
38
  from OTVision.domain.object_detection import ObjectDetector, ObjectDetectorFactory
39
39
  from OTVision.helpers.log import LOGGER_NAME
40
40
 
@@ -1,7 +1,7 @@
1
1
  from abc import ABC, abstractmethod
2
2
  from typing import Generator
3
3
 
4
- from OTVision.domain.detection import DetectedFrame
4
+ from OTVision.domain.frame import DetectedFrame
5
5
 
6
6
 
7
7
  class DetectedFrameConsumer(ABC):
@@ -1,45 +1,70 @@
1
1
  from dataclasses import dataclass, field
2
2
  from datetime import datetime
3
- from typing import Callable, Generic, Optional, Sequence, TypeVar
3
+ from typing import Callable, Literal, Optional, Sequence, TypedDict
4
4
 
5
- from PIL.Image import Image
5
+ from numpy import ndarray
6
6
 
7
7
  from OTVision.dataformat import FRAME, OCCURRENCE, TRACK_ID
8
- from OTVision.track.model.detection import (
8
+ from OTVision.domain.detection import (
9
9
  Detection,
10
10
  FinishedDetection,
11
11
  TrackedDetection,
12
12
  TrackId,
13
13
  )
14
14
 
15
+
16
+ class FrameKeys:
17
+ """Keys to access Frame dictionary."""
18
+
19
+ data: Literal["data"] = "data"
20
+ frame: Literal["frame"] = "frame"
21
+ source: Literal["source"] = "source"
22
+ occurrence: Literal["occurrence"] = "occurrence"
23
+
24
+
25
+ class Frame(TypedDict):
26
+ """Frame definition.
27
+
28
+ Attributes:
29
+ data (Optional[ndarray]): The frame data as a numpy array, can be None.
30
+ frame (int): The frame number.
31
+ source (str): The source identifier of the frame.
32
+ occurrence (datetime): Timestamp when the frame was captured/created.
33
+ """
34
+
35
+ data: Optional[ndarray]
36
+ frame: int
37
+ source: str
38
+ occurrence: datetime
39
+
40
+
15
41
  FrameNo = int
16
- S = TypeVar("S")
17
42
 
18
43
 
19
- @dataclass(frozen=True)
20
- class Frame(Generic[S]):
44
+ @dataclass(frozen=True, kw_only=True)
45
+ class DetectedFrame:
21
46
  """Frame metadata, optional image and respective detections.
22
47
 
23
48
  Attributes:
24
49
  no (FrameNo): Frame number.
25
50
  occurrence (datetime): Time stamp, at which frame was recorded.
26
- source (S): Generic source from where frame was obtained, e.g. video file path.
51
+ source (str): Source from where frame was obtained, e.g. video file path.
27
52
  detections (Sequence[Detection]): A sequence of Detections occurring in frame.
28
- image (Optional[Image]): Optional image data of frame.
53
+ image (Optional[ndarray]): Optional image data of frame.
29
54
  """
30
55
 
31
56
  no: FrameNo
32
57
  occurrence: datetime
33
- source: S
58
+ source: str
34
59
  detections: Sequence[Detection]
35
- image: Optional[Image]
60
+ image: Optional[ndarray] = None
36
61
 
37
62
 
38
63
  IsLastFrame = Callable[[FrameNo, TrackId], bool]
39
64
 
40
65
 
41
- @dataclass(frozen=True)
42
- class TrackedFrame(Frame[S]):
66
+ @dataclass(frozen=True, kw_only=True)
67
+ class TrackedFrame(DetectedFrame):
43
68
  """Frame metadata with tracked detections.
44
69
  Also provides additional aggregated information about:
45
70
  observed, finished and unfinished tracks.
@@ -126,8 +151,8 @@ class TrackedFrame(Frame[S]):
126
151
  )
127
152
 
128
153
 
129
- @dataclass(frozen=True)
130
- class FinishedFrame(TrackedFrame[S]):
154
+ @dataclass(frozen=True, kw_only=True)
155
+ class FinishedFrame(TrackedFrame):
131
156
  """TrackedFrame with FinishedDetections.
132
157
 
133
158
  Args:
@@ -2,8 +2,7 @@ from abc import ABC, abstractmethod
2
2
  from typing import Generator
3
3
 
4
4
  from OTVision.config import DetectConfig
5
- from OTVision.domain.detection import DetectedFrame
6
- from OTVision.domain.frame import Frame
5
+ from OTVision.domain.frame import DetectedFrame, Frame
7
6
 
8
7
 
9
8
  class ObjectDetectorMetadata(ABC):
@@ -6,15 +6,15 @@ from typing import Sequence
6
6
  from tqdm import tqdm
7
7
 
8
8
  from OTVision.dataformat import FRAME, INPUT_FILE_PATH, TRACK_ID
9
- from OTVision.track.model.filebased.frame_group import FrameGroup, get_output_file
10
- from OTVision.track.model.frame import (
9
+ from OTVision.domain.detection import TrackId
10
+ from OTVision.domain.frame import (
11
+ DetectedFrame,
11
12
  FinishedFrame,
12
- Frame,
13
13
  FrameNo,
14
14
  IsLastFrame,
15
15
  TrackedFrame,
16
- TrackId,
17
16
  )
17
+ from OTVision.track.model.filebased.frame_group import FrameGroup, get_output_file
18
18
 
19
19
 
20
20
  @dataclass(frozen=True)
@@ -25,13 +25,13 @@ class FrameChunk:
25
25
  Attributes:
26
26
  file (Path): common file path source of Frames.
27
27
  metadata (dict): otdet metadata.
28
- frames (Sequence[Frame[Path]]): a sequence of untracked Frames.
28
+ frames (Sequence[DetectedFrame]): a sequence of untracked Frames.
29
29
  frame_group_id (int): id of FrameGroup this FrameCHunk is part of.
30
30
  """
31
31
 
32
32
  file: Path
33
33
  metadata: dict
34
- frames: Sequence[Frame[Path]]
34
+ frames: Sequence[DetectedFrame]
35
35
  frame_group_id: int
36
36
 
37
37
  def check_output_file_exists(self, with_suffix: str) -> bool:
@@ -49,7 +49,7 @@ class TrackedChunk(FrameChunk):
49
49
  Attributes:
50
50
  is_last_chunk (bool): whether this chunk is the last of
51
51
  subsequently (related/connected) chunks.
52
- frames (Sequence[TrackedFrame[Path]]): overrides frames
52
+ frames (Sequence[TrackedFrame]): overrides frames
53
53
  with more specific frame type.
54
54
  finished_tracks (set[TrackId]): aggregates finished tracks
55
55
  of given TrackedFrames.
@@ -62,7 +62,7 @@ class TrackedChunk(FrameChunk):
62
62
  """
63
63
 
64
64
  is_last_chunk: bool
65
- frames: Sequence[TrackedFrame[Path]] = field(init=False)
65
+ frames: Sequence[TrackedFrame] = field(init=False)
66
66
 
67
67
  finished_tracks: set[TrackId] = field(init=False)
68
68
  observed_tracks: set[TrackId] = field(init=False)
@@ -75,7 +75,7 @@ class TrackedChunk(FrameChunk):
75
75
  file: Path,
76
76
  metadata: dict,
77
77
  is_last_chunk: bool,
78
- frames: Sequence[TrackedFrame[Path]],
78
+ frames: Sequence[TrackedFrame],
79
79
  frame_group_id: int,
80
80
  ) -> None:
81
81
 
@@ -165,11 +165,11 @@ class FinishedChunk(TrackedChunk):
165
165
  """A chunk of FinishedFrames.
166
166
 
167
167
  Attributes:
168
- frames (Sequence[FinishedFrame[Path]]): overrides frames
168
+ frames (Sequence[FinishedFrame]): overrides frames
169
169
  with more specific frame type.
170
170
  """
171
171
 
172
- frames: Sequence[FinishedFrame[Path]]
172
+ frames: Sequence[FinishedFrame]
173
173
 
174
174
  def to_detection_dicts(self) -> list[dict]:
175
175
  chunk_metadata = {INPUT_FILE_PATH: self.file.as_posix()}
@@ -1,46 +1,40 @@
1
1
  from abc import ABC, abstractmethod
2
2
  from typing import Generic, Iterator, TypeVar
3
3
 
4
- from OTVision.track.model.frame import (
4
+ from OTVision.domain.detection import TrackId
5
+ from OTVision.domain.frame import (
6
+ DetectedFrame,
5
7
  FinishedFrame,
6
- Frame,
7
8
  FrameNo,
8
9
  IsLastFrame,
9
10
  TrackedFrame,
10
- TrackId,
11
11
  )
12
12
 
13
- S = TypeVar("S") # Source type (e.g., Path, URL, str, etc.)
14
- # -> would look nicer in python 3.12
15
-
16
13
  ID_GENERATOR = Iterator[TrackId]
17
14
 
18
15
 
19
- class Tracker(ABC, Generic[S]):
16
+ class Tracker(ABC):
20
17
  """Tracker interface for processing a stream of Frames
21
18
  to add tracking information, creating a lazy stream (generator)
22
19
  of TrackedFrames.
23
20
 
24
21
  Implementing class can specify template method:
25
22
  track_frame for processing a single frame.
26
-
27
- Args:
28
- Generic (S): generic type of Frame source (e.g. file path, or stream url)
29
23
  """
30
24
 
31
25
  def track(
32
- self, frames: Iterator[Frame[S]], id_generator: ID_GENERATOR
33
- ) -> Iterator[TrackedFrame[S]]:
26
+ self, frames: Iterator[DetectedFrame], id_generator: ID_GENERATOR
27
+ ) -> Iterator[TrackedFrame]:
34
28
  """Process the given stream of Frames,
35
29
  yielding TrackedFrames one by one as a lazy stream of TrackedFrames.
36
30
 
37
31
  Args:
38
- frames (Iterator[Frame[S]]): (lazy) stream of Frames
32
+ frames (Iterator[DetectedFrame]): (lazy) stream of Frames
39
33
  with untracked Detections.
40
34
  id_generator (ID_GENERATOR): provider of new (unique) track ids.
41
35
 
42
36
  Yields:
43
- Iterator[TrackedFrame[S]]: (lazy) stream of TrackedFrames with
37
+ Iterator[TrackedFrame]: (lazy) stream of TrackedFrames with
44
38
  TrackedDetections
45
39
  """
46
40
  for frame in frames:
@@ -49,19 +43,19 @@ class Tracker(ABC, Generic[S]):
49
43
  @abstractmethod
50
44
  def track_frame(
51
45
  self,
52
- frame: Frame[S],
46
+ frame: DetectedFrame,
53
47
  id_generator: ID_GENERATOR,
54
- ) -> TrackedFrame[S]:
48
+ ) -> TrackedFrame:
55
49
  """Process single Frame with untracked Detections,
56
50
  by adding tracking information,
57
51
  creating a TrackedFrame with TrackedDetections.
58
52
 
59
53
  Args:
60
- frame (Frame[S]): the Frame (with source S) to be tracked.
54
+ frame (DetectedFrame): the Frame to be tracked.
61
55
  id_generator (ID_GENERATOR): provider of new (unique) track ids.
62
56
 
63
57
  Returns:
64
- TrackedFrame[S]: TrackedFrame with TrackedDetections
58
+ TrackedFrame: TrackedFrame with TrackedDetections
65
59
  """
66
60
  pass
67
61
 
@@ -268,42 +262,42 @@ class UnfinishedTracksBuffer(ABC, Generic[C, F]):
268
262
  return finished_containers
269
263
 
270
264
 
271
- class UnfinishedFramesBuffer(UnfinishedTracksBuffer[TrackedFrame[S], FinishedFrame[S]]):
265
+ class UnfinishedFramesBuffer(UnfinishedTracksBuffer[TrackedFrame, FinishedFrame]):
272
266
  """UnfinishedTracksBuffer implementation for Frames as Detection container."""
273
267
 
274
- def __init__(self, tracker: Tracker[S], keep_discarded: bool = False):
268
+ def __init__(self, tracker: Tracker, keep_discarded: bool = False):
275
269
  super().__init__(keep_discarded)
276
270
  self._tracker = tracker
277
271
 
278
272
  def track(
279
- self, frames: Iterator[Frame[S]], id_generator: ID_GENERATOR
280
- ) -> Iterator[FinishedFrame[S]]:
273
+ self, frames: Iterator[DetectedFrame], id_generator: ID_GENERATOR
274
+ ) -> Iterator[FinishedFrame]:
281
275
  tracked_frame_stream = self._tracker.track(frames, id_generator)
282
276
  return self.track_and_finish(tracked_frame_stream)
283
277
 
284
- def _get_last_track_frames(self, container: TrackedFrame[S]) -> dict[TrackId, int]:
278
+ def _get_last_track_frames(self, container: TrackedFrame) -> dict[TrackId, int]:
285
279
  return {o: container.no for o in container.observed_tracks}
286
280
 
287
- def _get_unfinished_tracks(self, container: TrackedFrame[S]) -> set[TrackId]:
281
+ def _get_unfinished_tracks(self, container: TrackedFrame) -> set[TrackId]:
288
282
  return container.unfinished_tracks
289
283
 
290
- def _get_observed_tracks(self, container: TrackedFrame[S]) -> set[TrackId]:
284
+ def _get_observed_tracks(self, container: TrackedFrame) -> set[TrackId]:
291
285
  return container.observed_tracks
292
286
 
293
- def _get_newly_finished_tracks(self, container: TrackedFrame[S]) -> set[TrackId]:
287
+ def _get_newly_finished_tracks(self, container: TrackedFrame) -> set[TrackId]:
294
288
  return container.finished_tracks
295
289
 
296
- def _get_newly_discarded_tracks(self, container: TrackedFrame[S]) -> set[TrackId]:
290
+ def _get_newly_discarded_tracks(self, container: TrackedFrame) -> set[TrackId]:
297
291
  return container.discarded_tracks
298
292
 
299
- def _get_last_frame_of_container(self, container: TrackedFrame[S]) -> FrameNo:
293
+ def _get_last_frame_of_container(self, container: TrackedFrame) -> FrameNo:
300
294
  return container.no
301
295
 
302
296
  def _finish(
303
297
  self,
304
- container: TrackedFrame[S],
298
+ container: TrackedFrame,
305
299
  is_last: IsLastFrame,
306
300
  discarded_tracks: set[TrackId],
307
301
  keep_discarded: bool,
308
- ) -> FinishedFrame[S]:
302
+ ) -> FinishedFrame:
309
303
  return container.finish(is_last, discarded_tracks, keep_discarded)
@@ -16,15 +16,15 @@ from OTVision.dataformat import (
16
16
  X,
17
17
  Y,
18
18
  )
19
+ from OTVision.domain.detection import Detection
20
+ from OTVision.domain.frame import DetectedFrame
19
21
  from OTVision.helpers.date import (
20
22
  parse_date_string_to_utc_datime,
21
23
  parse_timestamp_string_to_utc_datetime,
22
24
  )
23
25
  from OTVision.helpers.files import denormalize_bbox, read_json
24
- from OTVision.track.model.detection import Detection
25
26
  from OTVision.track.model.filebased.frame_chunk import ChunkParser, FrameChunk
26
27
  from OTVision.track.model.filebased.frame_group import FrameGroup
27
- from OTVision.track.model.frame import Frame
28
28
 
29
29
 
30
30
  class JsonChunkParser(ChunkParser):
@@ -47,7 +47,7 @@ class JsonChunkParser(ChunkParser):
47
47
 
48
48
  def convert(
49
49
  self, file: Path, frame_offset: int, input: dict[int, dict[str, Any]]
50
- ) -> list[Frame[Path]]:
50
+ ) -> list[DetectedFrame]:
51
51
  detection_parser = DetectionParser()
52
52
  frames = []
53
53
 
@@ -58,10 +58,10 @@ class JsonChunkParser(ChunkParser):
58
58
  occurrence: datetime = parse_datetime(value[OCCURRENCE])
59
59
  data_detections = value[DETECTIONS]
60
60
  detections = detection_parser.convert(data_detections)
61
- parsed_frame = Frame(
62
- int(key) + frame_offset,
61
+ parsed_frame = DetectedFrame(
62
+ no=int(key) + frame_offset,
63
63
  occurrence=occurrence,
64
- source=file,
64
+ source=str(file),
65
65
  detections=detections,
66
66
  image=None,
67
67
  )
@@ -111,7 +111,7 @@ def main(
111
111
  log.warning(f"No files of type '{filetypes}' found to track!")
112
112
  return
113
113
 
114
- iou_tracker: IouTracker[Path] = IouTracker(
114
+ iou_tracker: IouTracker = IouTracker(
115
115
  parameters=IouParameters(sigma_l, sigma_h, sigma_iou, t_min, t_miss_max)
116
116
  )
117
117
 
@@ -6,6 +6,8 @@ from more_itertools import peekable
6
6
  from tqdm import tqdm
7
7
 
8
8
  from OTVision.config import CONFIG, DEFAULT_FILETYPE, OVERWRITE, TRACK
9
+ from OTVision.domain.detection import TrackId
10
+ from OTVision.domain.frame import DetectedFrame, FrameNo, IsLastFrame, TrackedFrame
9
11
  from OTVision.helpers.log import LOGGER_NAME
10
12
  from OTVision.track.model.filebased.frame_chunk import (
11
13
  ChunkParser,
@@ -14,13 +16,6 @@ from OTVision.track.model.filebased.frame_chunk import (
14
16
  TrackedChunk,
15
17
  )
16
18
  from OTVision.track.model.filebased.frame_group import FrameGroup, FrameGroupParser
17
- from OTVision.track.model.frame import (
18
- Frame,
19
- FrameNo,
20
- IsLastFrame,
21
- TrackedFrame,
22
- TrackId,
23
- )
24
19
  from OTVision.track.model.tracking_interfaces import (
25
20
  ID_GENERATOR,
26
21
  Tracker,
@@ -30,18 +25,18 @@ from OTVision.track.model.tracking_interfaces import (
30
25
  log = logging.getLogger(LOGGER_NAME)
31
26
 
32
27
 
33
- class ChunkBasedTracker(Tracker[Path]):
28
+ class ChunkBasedTracker(Tracker):
34
29
 
35
- def __init__(self, tracker: Tracker[Path], chunkParser: ChunkParser) -> None:
30
+ def __init__(self, tracker: Tracker, chunkParser: ChunkParser) -> None:
36
31
  super().__init__()
37
32
  self._chunk_parser = chunkParser
38
33
  self._tracker = tracker
39
34
 
40
35
  def track_frame(
41
36
  self,
42
- frames: Frame[Path],
37
+ frames: DetectedFrame,
43
38
  id_generator: ID_GENERATOR,
44
- ) -> TrackedFrame[Path]:
39
+ ) -> TrackedFrame:
45
40
  return self._tracker.track_frame(frames, id_generator)
46
41
 
47
42
  def track_chunk(
@@ -82,7 +77,7 @@ class GroupedFilesTracker(ChunkBasedTracker):
82
77
 
83
78
  def __init__(
84
79
  self,
85
- tracker: Tracker[Path],
80
+ tracker: Tracker,
86
81
  chunk_parser: ChunkParser,
87
82
  frame_group_parser: FrameGroupParser,
88
83
  id_generator_factory: ID_GENERATOR_FACTORY,
@@ -1,14 +1,8 @@
1
1
  from dataclasses import dataclass
2
2
 
3
- from OTVision.track.model.detection import Detection, TrackedDetection
4
- from OTVision.track.model.frame import Frame, TrackedFrame
5
- from OTVision.track.model.tracking_interfaces import (
6
- ID_GENERATOR,
7
- FrameNo,
8
- S,
9
- Tracker,
10
- TrackId,
11
- )
3
+ from OTVision.domain.detection import Detection, TrackedDetection, TrackId
4
+ from OTVision.domain.frame import DetectedFrame, FrameNo, TrackedFrame
5
+ from OTVision.track.model.tracking_interfaces import ID_GENERATOR, Tracker
12
6
 
13
7
 
14
8
  @dataclass(frozen=True)
@@ -72,7 +66,9 @@ class ActiveIouTrack:
72
66
  last_frame: FrameNo
73
67
  track_age: int
74
68
 
75
- def __init__(self, id: TrackId, frame: "Frame", detection: "Detection") -> None:
69
+ def __init__(
70
+ self, id: TrackId, frame: "DetectedFrame", detection: "Detection"
71
+ ) -> None:
76
72
  self.id = id
77
73
  self.frame_no = [frame.no]
78
74
  self.bboxes = [BoundingBox.from_xywh(detection)]
@@ -85,7 +81,7 @@ class ActiveIouTrack:
85
81
  self.last_frame = frame.no
86
82
  self.track_age = 0
87
83
 
88
- def add_detection(self, frame: Frame, detection: Detection) -> None:
84
+ def add_detection(self, frame: DetectedFrame, detection: Detection) -> None:
89
85
  self.frame_no.append(frame.no)
90
86
  self.bboxes.append(BoundingBox.from_xywh(detection))
91
87
  self.center.append(Coordinate.center_of(detection))
@@ -141,7 +137,7 @@ def iou(
141
137
  return size_intersection / size_union
142
138
 
143
139
 
144
- class IouTracker(Tracker[S]):
140
+ class IouTracker(Tracker):
145
141
 
146
142
  def __init__(self, parameters: IouParameters):
147
143
  super().__init__()
@@ -169,8 +165,8 @@ class IouTracker(Tracker[S]):
169
165
  return self.parameters.t_miss_max
170
166
 
171
167
  def track_frame(
172
- self, frame: Frame[S], id_generator: ID_GENERATOR
173
- ) -> TrackedFrame[S]:
168
+ self, frame: DetectedFrame, id_generator: ID_GENERATOR
169
+ ) -> TrackedFrame:
174
170
 
175
171
  detections = [d for d in frame.detections if d.conf >= self.sigma_l]
176
172
  tracked_detections: list[TrackedDetection] = []
@@ -1,4 +1,4 @@
1
- __version__ = "v0.6.2"
1
+ __version__ = "v0.6.3"
2
2
 
3
3
 
4
4
  def otdet_version() -> str:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: OTVision
3
- Version: 0.6.2
3
+ Version: 0.6.3
4
4
  Summary: OTVision is a core module of the OpenTrafficCam framework to perform object detection and tracking.
5
5
  Project-URL: Homepage, https://opentrafficcam.org/
6
6
  Project-URL: Documentation, https://opentrafficcam.org/overview/
@@ -22,8 +22,9 @@ Requires-Dist: geopandas==1.0.1
22
22
  Requires-Dist: ijson==3.3.0
23
23
  Requires-Dist: more-itertools==10.5.0
24
24
  Requires-Dist: moviepy==1.0.3
25
- Requires-Dist: numpy==1.26.4
26
- Requires-Dist: opencv-python==4.9.0.80
25
+ Requires-Dist: numpy==1.26.4; sys_platform == 'win32'
26
+ Requires-Dist: numpy==2.1.1; sys_platform != 'win32'
27
+ Requires-Dist: opencv-python==4.11.0.86
27
28
  Requires-Dist: pandas==2.2.3
28
29
  Requires-Dist: pyyaml==6.0.2
29
30
  Requires-Dist: setuptools==74.0.0
@@ -31,7 +32,7 @@ Requires-Dist: torch==2.3.1
31
32
  Requires-Dist: torchvision==0.18.1
32
33
  Requires-Dist: tqdm==4.67.1
33
34
  Requires-Dist: ujson==5.10.0
34
- Requires-Dist: ultralytics==8.3.74
35
+ Requires-Dist: ultralytics==8.3.94
35
36
  Description-Content-Type: text/markdown
36
37
 
37
38
  # OTVision