OTVision 0.6.1__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 (325) hide show
  1. {otvision-0.6.1 → otvision-0.6.3}/.pre-commit-config.yaml +8 -6
  2. {otvision-0.6.1 → otvision-0.6.3}/OTVision/__init__.py +0 -10
  3. {otvision-0.6.1 → otvision-0.6.3}/OTVision/application/detect/current_object_detector.py +1 -2
  4. {otvision-0.6.1 → otvision-0.6.3}/OTVision/application/detect/detected_frame_factory.py +4 -3
  5. {otvision-0.6.1 → otvision-0.6.3}/OTVision/application/detect/detected_frame_producer.py +1 -2
  6. {otvision-0.6.1 → otvision-0.6.3}/OTVision/detect/builder.py +1 -1
  7. {otvision-0.6.1 → otvision-0.6.3}/OTVision/detect/detected_frame_buffer.py +1 -1
  8. {otvision-0.6.1 → otvision-0.6.3}/OTVision/detect/otdet.py +3 -2
  9. {otvision-0.6.1 → otvision-0.6.3}/OTVision/detect/yolo.py +2 -2
  10. {otvision-0.6.1 → otvision-0.6.3}/OTVision/domain/detect_producer_consumer.py +1 -1
  11. otvision-0.6.3/OTVision/domain/detection.py +141 -0
  12. otvision-0.6.3/OTVision/domain/frame.py +174 -0
  13. {otvision-0.6.1 → otvision-0.6.3}/OTVision/domain/object_detection.py +1 -2
  14. {otvision-0.6.1 → otvision-0.6.3}/OTVision/helpers/files.py +10 -2
  15. otvision-0.6.3/OTVision/helpers/input_types.py +15 -0
  16. otvision-0.6.3/OTVision/track/exporter/filebased_exporter.py +24 -0
  17. otvision-0.6.3/OTVision/track/model/filebased/frame_chunk.py +203 -0
  18. otvision-0.6.3/OTVision/track/model/filebased/frame_group.py +95 -0
  19. otvision-0.6.3/OTVision/track/model/track_exporter.py +119 -0
  20. otvision-0.6.3/OTVision/track/model/tracking_interfaces.py +303 -0
  21. otvision-0.6.3/OTVision/track/parser/chunk_parser_plugins.py +99 -0
  22. otvision-0.6.3/OTVision/track/parser/frame_group_parser_plugins.py +127 -0
  23. otvision-0.6.3/OTVision/track/track.py +144 -0
  24. otvision-0.6.3/OTVision/track/tracker/filebased_tracking.py +192 -0
  25. otvision-0.6.3/OTVision/track/tracker/tracker_plugin_iou.py +224 -0
  26. {otvision-0.6.1 → otvision-0.6.3}/OTVision/version.py +1 -1
  27. {otvision-0.6.1 → otvision-0.6.3}/OTVision/view/view_track.py +1 -1
  28. {otvision-0.6.1 → otvision-0.6.3}/PKG-INFO +8 -6
  29. {otvision-0.6.1 → otvision-0.6.3}/convert.py +2 -2
  30. {otvision-0.6.1 → otvision-0.6.3}/requirements-dev.txt +1 -1
  31. {otvision-0.6.1 → otvision-0.6.3}/requirements.txt +7 -5
  32. {otvision-0.6.1 → otvision-0.6.3}/tests/application/detect/test_detected_frame_factory.py +4 -3
  33. {otvision-0.6.1 → otvision-0.6.3}/tests/application/detect/test_detected_frame_producer.py +1 -2
  34. {otvision-0.6.1 → otvision-0.6.3}/tests/cli/test_convert_cli.py +48 -66
  35. {otvision-0.6.1 → otvision-0.6.3}/tests/cli/test_track_cli.py +50 -68
  36. otvision-0.6.3/tests/data/track/default/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  37. otvision-0.6.3/tests/data/track/default/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  38. otvision-0.6.3/tests/data/track/sigma_h_0_2/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  39. otvision-0.6.3/tests/data/track/sigma_h_0_2/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  40. otvision-0.6.3/tests/data/track/sigma_h_0_6/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  41. otvision-0.6.3/tests/data/track/sigma_h_0_6/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  42. otvision-0.6.3/tests/data/track/sigma_iou_0_2/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  43. otvision-0.6.3/tests/data/track/sigma_iou_0_2/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  44. otvision-0.6.3/tests/data/track/sigma_iou_0_6/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  45. otvision-0.6.3/tests/data/track/sigma_iou_0_6/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  46. otvision-0.6.3/tests/data/track/sigma_l_0_1/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  47. otvision-0.6.3/tests/data/track/sigma_l_0_1/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  48. otvision-0.6.3/tests/data/track/sigma_l_0_5/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  49. otvision-0.6.3/tests/data/track/sigma_l_0_5/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  50. otvision-0.6.3/tests/data/track/t_min_10/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  51. otvision-0.6.3/tests/data/track/t_min_10/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  52. otvision-0.6.3/tests/data/track/t_min_3/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  53. otvision-0.6.3/tests/data/track/t_min_3/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  54. otvision-0.6.3/tests/data/track/t_miss_max_25/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  55. otvision-0.6.3/tests/data/track/t_miss_max_25/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  56. otvision-0.6.3/tests/data/track/t_miss_max_75/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  57. otvision-0.6.3/tests/data/track/t_miss_max_75/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  58. {otvision-0.6.1 → otvision-0.6.3}/tests/detect/test_detected_frame_buffer.py +1 -1
  59. {otvision-0.6.1 → otvision-0.6.3}/tests/detect/test_odet.py +4 -3
  60. {otvision-0.6.1 → otvision-0.6.3}/tests/detect/yolo_test.py +2 -2
  61. otvision-0.6.3/tests/helpers/__init__.py +0 -0
  62. otvision-0.6.3/tests/log/__init__.py +0 -0
  63. otvision-0.6.3/tests/track/__init__.py +0 -0
  64. otvision-0.6.3/tests/track/helper/__init__.py +0 -0
  65. otvision-0.6.3/tests/track/helper/data_builder.py +258 -0
  66. otvision-0.6.3/tests/track/parser/__init__.py +0 -0
  67. otvision-0.6.3/tests/track/parser/test_chunk_parser_plugins.py +68 -0
  68. otvision-0.6.3/tests/track/test_frame_chunk.py +290 -0
  69. otvision-0.6.3/tests/track/test_frame_group.py +169 -0
  70. otvision-0.6.3/tests/track/test_frame_group_parser_plugins.py +372 -0
  71. {otvision-0.6.1 → otvision-0.6.3}/tests/track/test_track.py +22 -7
  72. otvision-0.6.3/tests/track/test_tracking_data_structures.py +372 -0
  73. otvision-0.6.3/tests/transform/__init__.py +0 -0
  74. {otvision-0.6.1 → otvision-0.6.3}/tests/transform/test_transform.py +44 -10
  75. otvision-0.6.3/tests/utils/__init__.py +0 -0
  76. {otvision-0.6.1 → otvision-0.6.3}/track.py +2 -2
  77. {otvision-0.6.1 → otvision-0.6.3}/transform.py +2 -2
  78. {otvision-0.6.1 → otvision-0.6.3}/update_precommit.py +52 -12
  79. otvision-0.6.1/OTVision/domain/detection.py +0 -20
  80. otvision-0.6.1/OTVision/domain/frame.py +0 -29
  81. otvision-0.6.1/OTVision/track/iou.py +0 -282
  82. otvision-0.6.1/OTVision/track/iou_util.py +0 -140
  83. otvision-0.6.1/OTVision/track/preprocess.py +0 -453
  84. otvision-0.6.1/OTVision/track/track.py +0 -422
  85. otvision-0.6.1/tests/data/track/default/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  86. otvision-0.6.1/tests/data/track/default/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  87. otvision-0.6.1/tests/data/track/sigma_h_0_2/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  88. otvision-0.6.1/tests/data/track/sigma_h_0_2/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  89. otvision-0.6.1/tests/data/track/sigma_h_0_6/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  90. otvision-0.6.1/tests/data/track/sigma_h_0_6/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  91. otvision-0.6.1/tests/data/track/sigma_iou_0_2/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  92. otvision-0.6.1/tests/data/track/sigma_iou_0_2/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  93. otvision-0.6.1/tests/data/track/sigma_iou_0_6/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  94. otvision-0.6.1/tests/data/track/sigma_iou_0_6/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  95. otvision-0.6.1/tests/data/track/sigma_l_0_1/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  96. otvision-0.6.1/tests/data/track/sigma_l_0_1/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  97. otvision-0.6.1/tests/data/track/sigma_l_0_5/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  98. otvision-0.6.1/tests/data/track/sigma_l_0_5/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  99. otvision-0.6.1/tests/data/track/t_min_10/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  100. otvision-0.6.1/tests/data/track/t_min_10/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  101. otvision-0.6.1/tests/data/track/t_min_3/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  102. otvision-0.6.1/tests/data/track/t_min_3/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  103. otvision-0.6.1/tests/data/track/t_miss_max_25/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  104. otvision-0.6.1/tests/data/track/t_miss_max_25/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  105. otvision-0.6.1/tests/data/track/t_miss_max_75/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  106. otvision-0.6.1/tests/data/track/t_miss_max_75/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  107. otvision-0.6.1/tests/track/test_preprocess.py +0 -553
  108. {otvision-0.6.1 → otvision-0.6.3}/.editorconfig +0 -0
  109. {otvision-0.6.1 → otvision-0.6.3}/.flake8 +0 -0
  110. {otvision-0.6.1 → otvision-0.6.3}/.github/dependabot.yml +0 -0
  111. {otvision-0.6.1 → otvision-0.6.3}/.github/workflows/build-nightly.yml +0 -0
  112. {otvision-0.6.1 → otvision-0.6.3}/.github/workflows/build-release.yml +0 -0
  113. {otvision-0.6.1 → otvision-0.6.3}/.github/workflows/linter.yml +0 -0
  114. {otvision-0.6.1 → otvision-0.6.3}/.github/workflows/release-pypi.yml +0 -0
  115. {otvision-0.6.1 → otvision-0.6.3}/.github/workflows/release-testpypi.yml +0 -0
  116. {otvision-0.6.1 → otvision-0.6.3}/.github/workflows/test.yml +0 -0
  117. {otvision-0.6.1 → otvision-0.6.3}/.gitignore +0 -0
  118. {otvision-0.6.1 → otvision-0.6.3}/.vscode/launch.json +0 -0
  119. {otvision-0.6.1 → otvision-0.6.3}/.vscode/scripts/build_debug_env.cmd +0 -0
  120. {otvision-0.6.1 → otvision-0.6.3}/.vscode/scripts/build_debug_env.sh +0 -0
  121. {otvision-0.6.1 → otvision-0.6.3}/.vscode/scripts/teardown_debug_env.cmd +0 -0
  122. {otvision-0.6.1 → otvision-0.6.3}/.vscode/scripts/teardown_debug_env.sh +0 -0
  123. {otvision-0.6.1 → otvision-0.6.3}/.vscode/settings.json +0 -0
  124. {otvision-0.6.1 → otvision-0.6.3}/.vscode/tasks.json +0 -0
  125. {otvision-0.6.1 → otvision-0.6.3}/.yamllint.yaml +0 -0
  126. {otvision-0.6.1 → otvision-0.6.3}/LICENSE +0 -0
  127. {otvision-0.6.1 → otvision-0.6.3}/OTVision/abstraction/__init__.py +0 -0
  128. {otvision-0.6.1 → otvision-0.6.3}/OTVision/abstraction/observer.py +0 -0
  129. {otvision-0.6.1 → otvision-0.6.3}/OTVision/abstraction/pipes_and_filter.py +0 -0
  130. {otvision-0.6.1 → otvision-0.6.3}/OTVision/application/__init__.py +0 -0
  131. {otvision-0.6.1 → otvision-0.6.3}/OTVision/application/buffer.py +0 -0
  132. {otvision-0.6.1 → otvision-0.6.3}/OTVision/application/configure_logger.py +0 -0
  133. {otvision-0.6.1 → otvision-0.6.3}/OTVision/application/detect/__init__.py +0 -0
  134. {otvision-0.6.1 → otvision-0.6.3}/OTVision/application/detect/current_object_detector_metadata.py +0 -0
  135. {otvision-0.6.1 → otvision-0.6.3}/OTVision/application/detect/detection_file_save_path_provider.py +0 -0
  136. {otvision-0.6.1 → otvision-0.6.3}/OTVision/application/detect/factory.py +0 -0
  137. {otvision-0.6.1 → otvision-0.6.3}/OTVision/application/detect/get_detect_cli_args.py +0 -0
  138. {otvision-0.6.1 → otvision-0.6.3}/OTVision/application/detect/timestamper.py +0 -0
  139. {otvision-0.6.1 → otvision-0.6.3}/OTVision/application/detect/update_detect_config_with_cli_args.py +0 -0
  140. {otvision-0.6.1 → otvision-0.6.3}/OTVision/application/frame_count_provider.py +0 -0
  141. {otvision-0.6.1 → otvision-0.6.3}/OTVision/application/get_config.py +0 -0
  142. {otvision-0.6.1 → otvision-0.6.3}/OTVision/application/get_current_config.py +0 -0
  143. {otvision-0.6.1 → otvision-0.6.3}/OTVision/application/update_current_config.py +0 -0
  144. {otvision-0.6.1 → otvision-0.6.3}/OTVision/config.py +0 -0
  145. {otvision-0.6.1 → otvision-0.6.3}/OTVision/convert/__init__.py +0 -0
  146. {otvision-0.6.1 → otvision-0.6.3}/OTVision/convert/convert.py +0 -0
  147. {otvision-0.6.1 → otvision-0.6.3}/OTVision/dataformat.py +0 -0
  148. {otvision-0.6.1 → otvision-0.6.3}/OTVision/detect/__init__.py +0 -0
  149. {otvision-0.6.1 → otvision-0.6.3}/OTVision/detect/cli.py +0 -0
  150. {otvision-0.6.1 → otvision-0.6.3}/OTVision/detect/detect.py +0 -0
  151. {otvision-0.6.1 → otvision-0.6.3}/OTVision/detect/otdet_file_writer.py +0 -0
  152. {otvision-0.6.1 → otvision-0.6.3}/OTVision/detect/plugin_av/__init__.py +0 -0
  153. {otvision-0.6.1 → otvision-0.6.3}/OTVision/detect/plugin_av/rotate_frame.py +0 -0
  154. {otvision-0.6.1 → otvision-0.6.3}/OTVision/detect/pyav_frame_count_provider.py +0 -0
  155. {otvision-0.6.1 → otvision-0.6.3}/OTVision/detect/timestamper.py +0 -0
  156. {otvision-0.6.1 → otvision-0.6.3}/OTVision/detect/video_input_source.py +0 -0
  157. {otvision-0.6.1 → otvision-0.6.3}/OTVision/domain/__init__.py +0 -0
  158. {otvision-0.6.1 → otvision-0.6.3}/OTVision/domain/cli.py +0 -0
  159. {otvision-0.6.1 → otvision-0.6.3}/OTVision/domain/current_config.py +0 -0
  160. {otvision-0.6.1 → otvision-0.6.3}/OTVision/domain/input_source_detect.py +0 -0
  161. {otvision-0.6.1 → otvision-0.6.3}/OTVision/helpers/__init__.py +0 -0
  162. {otvision-0.6.1 → otvision-0.6.3}/OTVision/helpers/date.py +0 -0
  163. {otvision-0.6.1 → otvision-0.6.3}/OTVision/helpers/formats.py +0 -0
  164. {otvision-0.6.1 → otvision-0.6.3}/OTVision/helpers/log.py +0 -0
  165. {otvision-0.6.1 → otvision-0.6.3}/OTVision/helpers/machine.py +0 -0
  166. {otvision-0.6.1 → otvision-0.6.3}/OTVision/helpers/video.py +0 -0
  167. {otvision-0.6.1 → otvision-0.6.3}/OTVision/track/__init__.py +0 -0
  168. {otvision-0.6.1/OTVision/transform → otvision-0.6.3/OTVision/track/exporter}/__init__.py +0 -0
  169. {otvision-0.6.1/OTVision/view → otvision-0.6.3/OTVision/track/model}/__init__.py +0 -0
  170. {otvision-0.6.1/tests → otvision-0.6.3/OTVision/track/model/filebased}/__init__.py +0 -0
  171. {otvision-0.6.1/tests/abstraction → otvision-0.6.3/OTVision/track/parser}/__init__.py +0 -0
  172. {otvision-0.6.1/tests/application → otvision-0.6.3/OTVision/track/tracker}/__init__.py +0 -0
  173. {otvision-0.6.1/tests/application/detect → otvision-0.6.3/OTVision/transform}/__init__.py +0 -0
  174. {otvision-0.6.1 → otvision-0.6.3}/OTVision/transform/get_homography.py +0 -0
  175. {otvision-0.6.1 → otvision-0.6.3}/OTVision/transform/reference_points_picker.py +0 -0
  176. {otvision-0.6.1 → otvision-0.6.3}/OTVision/transform/transform.py +0 -0
  177. {otvision-0.6.1/tests/convert → otvision-0.6.3/OTVision/view}/__init__.py +0 -0
  178. {otvision-0.6.1 → otvision-0.6.3}/OTVision/view/helpers/OTC.ico +0 -0
  179. {otvision-0.6.1 → otvision-0.6.3}/OTVision/view/view.py +0 -0
  180. {otvision-0.6.1 → otvision-0.6.3}/OTVision/view/view_convert.py +0 -0
  181. {otvision-0.6.1 → otvision-0.6.3}/OTVision/view/view_detect.py +0 -0
  182. {otvision-0.6.1 → otvision-0.6.3}/OTVision/view/view_helpers.py +0 -0
  183. {otvision-0.6.1 → otvision-0.6.3}/OTVision/view/view_transform.py +0 -0
  184. {otvision-0.6.1 → otvision-0.6.3}/OTVision.bat +0 -0
  185. {otvision-0.6.1 → otvision-0.6.3}/README.md +0 -0
  186. {otvision-0.6.1 → otvision-0.6.3}/clean-up-repository.sh +0 -0
  187. {otvision-0.6.1 → otvision-0.6.3}/config.yml +0 -0
  188. {otvision-0.6.1 → otvision-0.6.3}/detect.py +0 -0
  189. {otvision-0.6.1 → otvision-0.6.3}/export_models.py +0 -0
  190. {otvision-0.6.1 → otvision-0.6.3}/install.cmd +0 -0
  191. {otvision-0.6.1 → otvision-0.6.3}/install.sh +0 -0
  192. {otvision-0.6.1 → otvision-0.6.3}/install_dev.cmd +0 -0
  193. {otvision-0.6.1 → otvision-0.6.3}/install_dev.sh +0 -0
  194. {otvision-0.6.1 → otvision-0.6.3}/pyproject.toml +0 -0
  195. {otvision-0.6.1 → otvision-0.6.3}/reference_points_picker.py +0 -0
  196. {otvision-0.6.1/tests/detect → otvision-0.6.3/tests}/__init__.py +0 -0
  197. {otvision-0.6.1/tests/detect/plugin_av → otvision-0.6.3/tests/abstraction}/__init__.py +0 -0
  198. {otvision-0.6.1 → otvision-0.6.3}/tests/abstraction/test_observer.py +0 -0
  199. {otvision-0.6.1/tests/helpers → otvision-0.6.3/tests/application}/__init__.py +0 -0
  200. {otvision-0.6.1/tests/log → otvision-0.6.3/tests/application/detect}/__init__.py +0 -0
  201. {otvision-0.6.1 → otvision-0.6.3}/tests/application/detect/test_current_object_detector.py +0 -0
  202. {otvision-0.6.1 → otvision-0.6.3}/tests/application/detect/test_detection_file_save_path_provider.py +0 -0
  203. {otvision-0.6.1 → otvision-0.6.3}/tests/application/detect/test_get_detect_cli_args.py +0 -0
  204. {otvision-0.6.1 → otvision-0.6.3}/tests/application/detect/test_timestamper.py +0 -0
  205. {otvision-0.6.1 → otvision-0.6.3}/tests/application/detect/test_update_detect_config_with_cli_args.py +0 -0
  206. {otvision-0.6.1 → otvision-0.6.3}/tests/application/test_buffer.py +0 -0
  207. {otvision-0.6.1 → otvision-0.6.3}/tests/application/test_get_config.py +0 -0
  208. {otvision-0.6.1 → otvision-0.6.3}/tests/cli/custom_cli_test_config.yaml +0 -0
  209. {otvision-0.6.1 → otvision-0.6.3}/tests/cli/test_detect_cli.py +0 -0
  210. {otvision-0.6.1 → otvision-0.6.3}/tests/conftest.py +0 -0
  211. {otvision-0.6.1/tests/track → otvision-0.6.3/tests/convert}/__init__.py +0 -0
  212. {otvision-0.6.1 → otvision-0.6.3}/tests/convert/test_convert.py +0 -0
  213. {otvision-0.6.1 → otvision-0.6.3}/tests/data/Testvideo_CamView.png +0 -0
  214. {otvision-0.6.1 → otvision-0.6.3}/tests/data/Testvideo_CamView_Cars-Cyclist.png +0 -0
  215. {otvision-0.6.1 → otvision-0.6.3}/tests/data/Testvideo_CamView_Cars-Truck.png +0 -0
  216. {otvision-0.6.1 → otvision-0.6.3}/tests/data/Testvideo_CamView_refpts.png +0 -0
  217. {otvision-0.6.1 → otvision-0.6.3}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.gpkg +0 -0
  218. {otvision-0.6.1 → otvision-0.6.3}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  219. {otvision-0.6.1 → otvision-0.6.3}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  220. {otvision-0.6.1 → otvision-0.6.3}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  221. {otvision-0.6.1 → otvision-0.6.3}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otrfpts +0 -0
  222. {otvision-0.6.1 → otvision-0.6.3}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  223. {otvision-0.6.1 → otvision-0.6.3}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.gpkg +0 -0
  224. {otvision-0.6.1 → otvision-0.6.3}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  225. {otvision-0.6.1 → otvision-0.6.3}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  226. {otvision-0.6.1 → otvision-0.6.3}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  227. {otvision-0.6.1 → otvision-0.6.3}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otrfpts +0 -0
  228. {otvision-0.6.1 → otvision-0.6.3}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  229. {otvision-0.6.1 → otvision-0.6.3}/tests/data/Testvideo_FR20.otrfpts +0 -0
  230. {otvision-0.6.1 → otvision-0.6.3}/tests/data/Testvideo_Satellite.jpg +0 -0
  231. {otvision-0.6.1 → otvision-0.6.3}/tests/data/Testvideo_Satellite_far.jpg +0 -0
  232. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/default/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  233. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/default/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  234. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/default/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  235. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/default/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  236. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/fail_fps_from_filename/Testvideo_Cars-Cyclist_F20_2020-01-01_00-00-00.h264 +0 -0
  237. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/fail_fps_from_filename/Testvideo_Cars-Truck_2020-01-01_00-00-00.h264 +0 -0
  238. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/fps_from_filename/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  239. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/fps_from_filename/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  240. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/fps_from_filename/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  241. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/fps_from_filename/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  242. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/input_fps_20/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  243. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/input_fps_20/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  244. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/input_fps_20/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  245. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/input_fps_20/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  246. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/input_fps_40/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  247. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/input_fps_40/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  248. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/input_fps_40/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  249. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/input_fps_40/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  250. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/output_filetype_avi/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.avi +0 -0
  251. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/output_filetype_avi/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  252. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/output_filetype_avi/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.avi +0 -0
  253. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/output_filetype_avi/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  254. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/output_filetype_mkv/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  255. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/output_filetype_mkv/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mkv +0 -0
  256. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/output_filetype_mkv/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  257. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/output_filetype_mkv/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mkv +0 -0
  258. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/output_filetype_mov/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  259. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/output_filetype_mov/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mov +0 -0
  260. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/output_filetype_mov/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  261. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/output_filetype_mov/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mov +0 -0
  262. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/output_filetype_mp4/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  263. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/output_filetype_mp4/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  264. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/output_filetype_mp4/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  265. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/output_filetype_mp4/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  266. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/rotation/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00_rotate.h264 +0 -0
  267. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/rotation/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00_rotate.mov +0 -0
  268. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/rotation/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00_rotate.mp4 +0 -0
  269. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/rotation/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00_rotate.h264 +0 -0
  270. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/rotation/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00_rotate.mov +0 -0
  271. {otvision-0.6.1 → otvision-0.6.3}/tests/data/convert/rotation/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00_rotate.mp4 +0 -0
  272. {otvision-0.6.1 → otvision-0.6.3}/tests/data/detect/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  273. {otvision-0.6.1 → otvision-0.6.3}/tests/data/detect/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  274. {otvision-0.6.1 → otvision-0.6.3}/tests/data/detect/default/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  275. {otvision-0.6.1 → otvision-0.6.3}/tests/data/detect/default/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  276. {otvision-0.6.1 → otvision-0.6.3}/tests/data/detect/rotated-Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  277. {otvision-0.6.1 → otvision-0.6.3}/tests/data/log/_otvision_logs/test.log +0 -0
  278. {otvision-0.6.1 → otvision-0.6.3}/tests/data/track/default/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  279. {otvision-0.6.1 → otvision-0.6.3}/tests/data/track/default/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  280. {otvision-0.6.1 → otvision-0.6.3}/tests/data/track/sigma_h_0_2/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  281. {otvision-0.6.1 → otvision-0.6.3}/tests/data/track/sigma_h_0_2/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  282. {otvision-0.6.1 → otvision-0.6.3}/tests/data/track/sigma_h_0_6/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  283. {otvision-0.6.1 → otvision-0.6.3}/tests/data/track/sigma_h_0_6/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  284. {otvision-0.6.1 → otvision-0.6.3}/tests/data/track/sigma_iou_0_2/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  285. {otvision-0.6.1 → otvision-0.6.3}/tests/data/track/sigma_iou_0_2/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  286. {otvision-0.6.1 → otvision-0.6.3}/tests/data/track/sigma_iou_0_6/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  287. {otvision-0.6.1 → otvision-0.6.3}/tests/data/track/sigma_iou_0_6/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  288. {otvision-0.6.1 → otvision-0.6.3}/tests/data/track/sigma_l_0_1/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  289. {otvision-0.6.1 → otvision-0.6.3}/tests/data/track/sigma_l_0_1/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  290. {otvision-0.6.1 → otvision-0.6.3}/tests/data/track/sigma_l_0_5/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  291. {otvision-0.6.1 → otvision-0.6.3}/tests/data/track/sigma_l_0_5/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  292. {otvision-0.6.1 → otvision-0.6.3}/tests/data/track/t_min_10/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  293. {otvision-0.6.1 → otvision-0.6.3}/tests/data/track/t_min_10/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  294. {otvision-0.6.1 → otvision-0.6.3}/tests/data/track/t_min_3/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  295. {otvision-0.6.1 → otvision-0.6.3}/tests/data/track/t_min_3/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  296. {otvision-0.6.1 → otvision-0.6.3}/tests/data/track/t_miss_max_25/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  297. {otvision-0.6.1 → otvision-0.6.3}/tests/data/track/t_miss_max_25/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  298. {otvision-0.6.1 → otvision-0.6.3}/tests/data/track/t_miss_max_75/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  299. {otvision-0.6.1 → otvision-0.6.3}/tests/data/track/t_miss_max_75/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  300. {otvision-0.6.1 → otvision-0.6.3}/tests/data/transform/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.gpkg +0 -0
  301. {otvision-0.6.1 → otvision-0.6.3}/tests/data/transform/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otrfpts +0 -0
  302. {otvision-0.6.1 → otvision-0.6.3}/tests/data/transform/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  303. {otvision-0.6.1 → otvision-0.6.3}/tests/data/transform/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.gpkg +0 -0
  304. {otvision-0.6.1 → otvision-0.6.3}/tests/data/transform/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otrfpts +0 -0
  305. {otvision-0.6.1 → otvision-0.6.3}/tests/data/transform/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  306. {otvision-0.6.1 → otvision-0.6.3}/tests/data/transform/Testvideo_FR20.otrfpts +0 -0
  307. {otvision-0.6.1 → otvision-0.6.3}/tests/data/yolov8m.mlpackage/Data/com.apple.CoreML/model.mlmodel +0 -0
  308. {otvision-0.6.1 → otvision-0.6.3}/tests/data/yolov8m.mlpackage/Data/com.apple.CoreML/weights/weight.bin +0 -0
  309. {otvision-0.6.1 → otvision-0.6.3}/tests/data/yolov8m.mlpackage/Manifest.json +0 -0
  310. {otvision-0.6.1/tests/transform → otvision-0.6.3/tests/detect}/__init__.py +0 -0
  311. {otvision-0.6.1 → otvision-0.6.3}/tests/detect/detect_test.py +0 -0
  312. {otvision-0.6.1/tests/utils → otvision-0.6.3/tests/detect/plugin_av}/__init__.py +0 -0
  313. {otvision-0.6.1 → otvision-0.6.3}/tests/detect/plugin_av/test_rotate_frame.py +0 -0
  314. {otvision-0.6.1 → otvision-0.6.3}/tests/detect/test_otdet_file_writer.py +0 -0
  315. {otvision-0.6.1 → otvision-0.6.3}/tests/detect/test_pyav_frame_count_provider.py +0 -0
  316. {otvision-0.6.1 → otvision-0.6.3}/tests/detect/test_video_input_source.py +0 -0
  317. {otvision-0.6.1 → otvision-0.6.3}/tests/helpers/files_test.py +0 -0
  318. {otvision-0.6.1 → otvision-0.6.3}/tests/helpers/formats_test.py +0 -0
  319. {otvision-0.6.1 → otvision-0.6.3}/tests/helpers/test_log.py +0 -0
  320. {otvision-0.6.1 → otvision-0.6.3}/tests/log/log_maker.py +0 -0
  321. {otvision-0.6.1 → otvision-0.6.3}/tests/log/test_log.py +0 -0
  322. {otvision-0.6.1 → otvision-0.6.3}/tests/test_config.py +0 -0
  323. {otvision-0.6.1 → otvision-0.6.3}/tests/utils/generator.py +0 -0
  324. {otvision-0.6.1 → otvision-0.6.3}/tests/utils/mocking.py +0 -0
  325. {otvision-0.6.1 → otvision-0.6.3}/view.py +0 -0
@@ -46,18 +46,20 @@ 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
53
53
  - interrogate==1.5.0
54
54
  - isort==5.13.2
55
+ - more-itertools==10.5.0
55
56
  - moviepy==1.0.3
56
57
  - mypy==1.15.0
57
- - numpy==1.26.4
58
- - opencv-python==4.9.0.80
59
- - pandas-stubs==2.2.2.240807
60
- - pandas==2.2.2
58
+ - numpy==1.26.4; sys_platform == 'win32'
59
+ - numpy==2.1.1; sys_platform != 'win32'
60
+ - opencv-python==4.11.0.86
61
+ - pandas-stubs==2.2.3.250308
62
+ - pandas==2.2.3
61
63
  - pre-commit==3.8.0
62
64
  - pytest-cov==5.0.0
63
65
  - pytest==8.3.3
@@ -71,7 +73,7 @@ repos:
71
73
  - types-setuptools
72
74
  - types-tqdm
73
75
  - types-ujson
74
- - ultralytics==8.3.74
76
+ - ultralytics==8.3.94
75
77
  - yamllint==1.35.1
76
78
  always_run: true
77
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):
@@ -0,0 +1,141 @@
1
+ from dataclasses import dataclass
2
+
3
+ from OTVision.dataformat import (
4
+ CLASS,
5
+ CONFIDENCE,
6
+ FINISHED,
7
+ FIRST,
8
+ INTERPOLATED_DETECTION,
9
+ TRACK_ID,
10
+ H,
11
+ W,
12
+ X,
13
+ Y,
14
+ )
15
+
16
+ TrackId = int
17
+
18
+
19
+ @dataclass(frozen=True, repr=True)
20
+ class Detection:
21
+ """Detection data without track context data.
22
+
23
+ Attributes:
24
+ label (str): Assigned label, e.g. vehicle class.
25
+ conf (float): Confidence of detected class.
26
+ x (float): X-coordinate of detection center.
27
+ y (float): Y-coordinate of detection center.
28
+ w (float): Width of detection.
29
+ h (float): Height of detection.
30
+ """
31
+
32
+ label: str
33
+ conf: float
34
+ x: float
35
+ y: float
36
+ w: float
37
+ h: float
38
+
39
+ def of_track(self, id: TrackId, is_first: bool) -> "TrackedDetection":
40
+ """Convert to TrackedDetection by adding track information.
41
+
42
+ Args:
43
+ id (TrackId): id of assigned track.
44
+ is_first (bool): whether this detection is first of track.
45
+
46
+ Returns:
47
+ TrackedDetection: This detection data with additional track information.
48
+ """
49
+ return TrackedDetection(
50
+ self.label,
51
+ self.conf,
52
+ self.x,
53
+ self.y,
54
+ self.w,
55
+ self.h,
56
+ is_first,
57
+ id,
58
+ )
59
+
60
+ def to_otdet(self) -> dict:
61
+ return {
62
+ CLASS: self.label,
63
+ CONFIDENCE: self.conf,
64
+ X: self.x,
65
+ Y: self.y,
66
+ W: self.w,
67
+ H: self.h,
68
+ }
69
+
70
+
71
+ @dataclass(frozen=True, repr=True)
72
+ class TrackedDetection(Detection):
73
+ """Detection with additional track data.
74
+ At the time a detection is tracked,
75
+ it might not be known whether it is the last of a track.
76
+
77
+ Attributes:
78
+ is_first (bool): whether this detection is the first in the track.
79
+ track_id (TrackId): id of the assigned track.
80
+ """
81
+
82
+ is_first: bool
83
+ track_id: TrackId
84
+
85
+ def finish(self, is_last: bool, is_discarded: bool) -> "FinishedDetection":
86
+ return FinishedDetection.from_tracked_detection(self, is_last, is_discarded)
87
+
88
+ def as_last_detection(self, is_discarded: bool) -> "FinishedDetection":
89
+ return FinishedDetection.from_tracked_detection(
90
+ self, is_last=True, is_discarded=is_discarded
91
+ )
92
+
93
+ def as_intermediate_detection(self, is_discarded: bool) -> "FinishedDetection":
94
+ return FinishedDetection.from_tracked_detection(
95
+ self, is_last=False, is_discarded=is_discarded
96
+ )
97
+
98
+
99
+ @dataclass(frozen=True, repr=True)
100
+ class FinishedDetection(TrackedDetection):
101
+ """Detection data with extended track information including is_finished.
102
+
103
+ Attributes:
104
+ is_last (bool): whether this detection is the last in the track.
105
+ is_discarded (bool): whether the detections's track was discarded.
106
+ """
107
+
108
+ is_last: bool
109
+ is_discarded: bool
110
+
111
+ @classmethod
112
+ def from_tracked_detection(
113
+ cls, tracked_detection: TrackedDetection, is_last: bool, is_discarded: bool
114
+ ) -> "FinishedDetection":
115
+ td = tracked_detection
116
+ return cls(
117
+ label=td.label,
118
+ conf=td.conf,
119
+ x=td.x,
120
+ y=td.y,
121
+ w=td.w,
122
+ h=td.h,
123
+ is_first=td.is_first,
124
+ track_id=td.track_id,
125
+ is_last=is_last,
126
+ is_discarded=is_discarded,
127
+ )
128
+
129
+ def to_dict(self) -> dict:
130
+ return {
131
+ CLASS: self.label,
132
+ CONFIDENCE: self.conf,
133
+ X: self.x,
134
+ Y: self.y,
135
+ W: self.w,
136
+ H: self.h,
137
+ INTERPOLATED_DETECTION: False,
138
+ FIRST: self.is_first,
139
+ FINISHED: self.is_last,
140
+ TRACK_ID: self.track_id,
141
+ }
@@ -0,0 +1,174 @@
1
+ from dataclasses import dataclass, field
2
+ from datetime import datetime
3
+ from typing import Callable, Literal, Optional, Sequence, TypedDict
4
+
5
+ from numpy import ndarray
6
+
7
+ from OTVision.dataformat import FRAME, OCCURRENCE, TRACK_ID
8
+ from OTVision.domain.detection import (
9
+ Detection,
10
+ FinishedDetection,
11
+ TrackedDetection,
12
+ TrackId,
13
+ )
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
+
41
+ FrameNo = int
42
+
43
+
44
+ @dataclass(frozen=True, kw_only=True)
45
+ class DetectedFrame:
46
+ """Frame metadata, optional image and respective detections.
47
+
48
+ Attributes:
49
+ no (FrameNo): Frame number.
50
+ occurrence (datetime): Time stamp, at which frame was recorded.
51
+ source (str): Source from where frame was obtained, e.g. video file path.
52
+ detections (Sequence[Detection]): A sequence of Detections occurring in frame.
53
+ image (Optional[ndarray]): Optional image data of frame.
54
+ """
55
+
56
+ no: FrameNo
57
+ occurrence: datetime
58
+ source: str
59
+ detections: Sequence[Detection]
60
+ image: Optional[ndarray] = None
61
+
62
+
63
+ IsLastFrame = Callable[[FrameNo, TrackId], bool]
64
+
65
+
66
+ @dataclass(frozen=True, kw_only=True)
67
+ class TrackedFrame(DetectedFrame):
68
+ """Frame metadata with tracked detections.
69
+ Also provides additional aggregated information about:
70
+ observed, finished and unfinished tracks.
71
+
72
+ Attributes:
73
+ detections (Sequence[TrackedDetection]): overrides Frame.detections with more
74
+ specific type of detection.
75
+ observed_tracks (set[TrackId]): set of tracks of which detection occur in this
76
+ frame.
77
+ finished_tracks (set[TrackId]): track ids of tracks observed in this or prior
78
+ to this frame that can now be considered finished. These track ids should
79
+ no longer be observed/assigned in future frames. (successfully completed)
80
+ discarded_tracks (set[TrackId]): track ids, that are now considered discarded.
81
+ The corresponding tracks are no longer pursued, previous TrackedDetections
82
+ of these tracks are also considered discarded. Discarded tracks may be
83
+ observed but not finished.(unsuccessful, incomplete)
84
+ unfinished_tracks (set[TrackId]): observed tracks that are not yet finished
85
+ and were not discarded.
86
+ """
87
+
88
+ detections: Sequence[TrackedDetection]
89
+ finished_tracks: set[TrackId]
90
+ discarded_tracks: set[TrackId]
91
+ observed_tracks: set[TrackId] = field(init=False)
92
+ unfinished_tracks: set[TrackId] = field(init=False)
93
+
94
+ def __post_init__(self) -> None:
95
+ """
96
+ Derive observed and unfinished tracks from tracked detections and finished
97
+ track information.
98
+ """
99
+ observed = {d.track_id for d in self.detections}
100
+ object.__setattr__(self, "observed_tracks", observed)
101
+
102
+ unfinished = {
103
+ o
104
+ for o in self.observed_tracks
105
+ if o not in self.finished_tracks and o not in self.discarded_tracks
106
+ }
107
+ object.__setattr__(self, "unfinished_tracks", unfinished)
108
+
109
+ def finish(
110
+ self,
111
+ is_last: IsLastFrame,
112
+ discarded_tracks: set[TrackId],
113
+ keep_discarded: bool = False,
114
+ ) -> "FinishedFrame":
115
+ """Turn this TrackedFrame into a finished frame
116
+ by adding is_finished information to all its detections.
117
+
118
+ Args:
119
+ is_last (IsLastFrame): function to determine whether
120
+ a track is finished in a certain frame.
121
+ discarded_tracks (set[TrackId]): list of tracks considered discarded.
122
+ Used to mark corresponding tracks.
123
+ keep_discarded (bool): whether FinishedDetections marked as discarded
124
+ should be kept in detections list. Defaults to False.
125
+ Returns:
126
+ FinishedFrame: frame with FinishedDetections
127
+ """
128
+ if keep_discarded:
129
+ detections = [
130
+ det.finish(
131
+ is_last=is_last(self.no, det.track_id),
132
+ is_discarded=(det.track_id in discarded_tracks),
133
+ )
134
+ for det in self.detections
135
+ ]
136
+ else:
137
+ detections = [
138
+ det.finish(is_last=is_last(self.no, det.track_id), is_discarded=False)
139
+ for det in self.detections
140
+ if (det.track_id not in discarded_tracks)
141
+ ]
142
+
143
+ return FinishedFrame(
144
+ no=self.no,
145
+ occurrence=self.occurrence,
146
+ source=self.source,
147
+ finished_tracks=self.finished_tracks,
148
+ detections=detections,
149
+ image=self.image,
150
+ discarded_tracks=discarded_tracks,
151
+ )
152
+
153
+
154
+ @dataclass(frozen=True, kw_only=True)
155
+ class FinishedFrame(TrackedFrame):
156
+ """TrackedFrame with FinishedDetections.
157
+
158
+ Args:
159
+ detections (Sequence[FinishedDetection]): overrides TrackedFrame.detections
160
+ with more specific detection type.
161
+ """
162
+
163
+ detections: Sequence[FinishedDetection]
164
+
165
+ def to_detection_dicts(self) -> list[dict]:
166
+ frame_metadata = {FRAME: self.no, OCCURRENCE: self.occurrence.timestamp()}
167
+
168
+ # add frame metadata to each detection dict
169
+ detection_dict_list = [
170
+ {**detection.to_dict(), **frame_metadata} for detection in self.detections
171
+ ]
172
+
173
+ detection_dict_list.sort(key=lambda det: det[TRACK_ID])
174
+ return detection_dict_list
@@ -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):
@@ -329,6 +329,7 @@ def get_metadata(otdict: dict) -> dict:
329
329
  # TODO: Type hint nested dict during refactoring
330
330
  def denormalize_bbox(
331
331
  otdict: dict,
332
+ file_path: Path | None = None,
332
333
  keys_width: Union[list[str], None] = None,
333
334
  keys_height: Union[list[str], None] = None,
334
335
  metadata: dict[str, dict] = {},
@@ -337,6 +338,8 @@ def denormalize_bbox(
337
338
 
338
339
  Args:
339
340
  otdict (dict): dict of detections or tracks
341
+ file_path (Path): file path source of the given otdict
342
+ if all detections stem from the same file.
340
343
  keys_width (list[str], optional): list of keys describing horizontal position.
341
344
  Defaults to ["x", "w"].
342
345
  keys_height (list[str], optional): list of keys describing vertical position.
@@ -351,7 +354,9 @@ def denormalize_bbox(
351
354
  if keys_height is None:
352
355
  keys_height = [dataformat.Y, dataformat.H]
353
356
  log.debug("Denormalize frame wise")
354
- otdict = _denormalize_transformation(otdict, keys_width, keys_height, metadata)
357
+ otdict = _denormalize_transformation(
358
+ otdict, keys_width, keys_height, metadata, file_path
359
+ )
355
360
  return otdict
356
361
 
357
362
 
@@ -361,6 +366,7 @@ def _denormalize_transformation(
361
366
  keys_width: list[str],
362
367
  keys_height: list[str],
363
368
  metadata: dict[str, dict] = {},
369
+ file_path: Path | None = None,
364
370
  ) -> dict:
365
371
  """Helper to do the actual denormalization.
366
372
 
@@ -371,6 +377,8 @@ def _denormalize_transformation(
371
377
  keys_height (list[str]): list of keys describing vertical position.
372
378
  Defaults to ["y", "h"].
373
379
  metadata (dict[str, dict]): dict of metadata per input file.
380
+ file_path (Path): file path source of otdict
381
+ if all detections stem from the same file.
374
382
 
375
383
  Returns:
376
384
  dict: denormalized dict
@@ -378,7 +386,7 @@ def _denormalize_transformation(
378
386
  changed_files = set()
379
387
 
380
388
  for frame in otdict[dataformat.DATA].values():
381
- input_file = frame[INPUT_FILE_PATH]
389
+ input_file = file_path.as_posix() if file_path else frame[INPUT_FILE_PATH]
382
390
  metadate = metadata[input_file]
383
391
  width = metadate[dataformat.VIDEO][dataformat.WIDTH]
384
392
  height = metadate[dataformat.VIDEO][dataformat.HEIGHT]
@@ -0,0 +1,15 @@
1
+ def check_types(
2
+ sigma_l: float, sigma_h: float, sigma_iou: float, t_min: int, t_miss_max: int
3
+ ) -> None:
4
+ """Raise ValueErrors if wrong types"""
5
+
6
+ if not isinstance(sigma_l, (int, float)):
7
+ raise ValueError("sigma_l has to be int or float")
8
+ if not isinstance(sigma_h, (int, float)):
9
+ raise ValueError("sigma_h has to be int or float")
10
+ if not isinstance(sigma_iou, (int, float)):
11
+ raise ValueError("sigma_iou has to be int or float")
12
+ if not isinstance(t_min, int):
13
+ raise ValueError("t_min has to be int")
14
+ if not isinstance(t_miss_max, int):
15
+ raise ValueError("t_miss_max has to be int")
@@ -0,0 +1,24 @@
1
+ from pathlib import Path
2
+
3
+ from OTVision.config import CONFIG, DEFAULT_FILETYPE, TRACK
4
+ from OTVision.track.model.filebased.frame_chunk import FinishedChunk
5
+ from OTVision.track.model.filebased.frame_group import get_output_file
6
+ from OTVision.track.model.track_exporter import FinishedTracksExporter
7
+
8
+
9
+ class FinishedChunkTrackExporter(FinishedTracksExporter[FinishedChunk]):
10
+
11
+ def __init__(self, file_type: str = CONFIG[DEFAULT_FILETYPE][TRACK]) -> None:
12
+ super().__init__(file_type)
13
+
14
+ def get_detection_dicts(self, container: FinishedChunk) -> list[dict]:
15
+ return container.to_detection_dicts()
16
+
17
+ def get_result_path(self, container: FinishedChunk) -> Path:
18
+ return get_output_file(container.file, self.file_type)
19
+
20
+ def get_metadata(self, container: FinishedChunk) -> dict:
21
+ return container.metadata
22
+
23
+ def get_frame_group_id(self, container: FinishedChunk) -> int:
24
+ return container.frame_group_id