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.
- {otvision-0.6.2 → otvision-0.6.3}/.pre-commit-config.yaml +5 -4
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/__init__.py +0 -10
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/detect/current_object_detector.py +1 -2
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/detect/detected_frame_factory.py +4 -3
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/detect/detected_frame_producer.py +1 -2
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/detect/builder.py +1 -1
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/detect/detected_frame_buffer.py +1 -1
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/detect/otdet.py +3 -2
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/detect/yolo.py +2 -2
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/domain/detect_producer_consumer.py +1 -1
- {otvision-0.6.2/OTVision/track/model → otvision-0.6.3/OTVision/domain}/frame.py +39 -14
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/domain/object_detection.py +1 -2
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/model/filebased/frame_chunk.py +11 -11
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/model/tracking_interfaces.py +24 -30
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/parser/chunk_parser_plugins.py +6 -6
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/track.py +1 -1
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/tracker/filebased_tracking.py +7 -12
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/tracker/tracker_plugin_iou.py +10 -14
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/version.py +1 -1
- {otvision-0.6.2 → otvision-0.6.3}/PKG-INFO +5 -4
- {otvision-0.6.2 → otvision-0.6.3}/convert.py +2 -2
- {otvision-0.6.2 → otvision-0.6.3}/requirements.txt +4 -3
- {otvision-0.6.2 → otvision-0.6.3}/tests/application/detect/test_detected_frame_factory.py +4 -3
- {otvision-0.6.2 → otvision-0.6.3}/tests/application/detect/test_detected_frame_producer.py +1 -2
- {otvision-0.6.2 → otvision-0.6.3}/tests/cli/test_convert_cli.py +48 -66
- {otvision-0.6.2 → otvision-0.6.3}/tests/cli/test_track_cli.py +50 -68
- {otvision-0.6.2 → otvision-0.6.3}/tests/detect/test_detected_frame_buffer.py +1 -1
- {otvision-0.6.2 → otvision-0.6.3}/tests/detect/test_odet.py +4 -3
- {otvision-0.6.2 → otvision-0.6.3}/tests/detect/yolo_test.py +2 -2
- {otvision-0.6.2 → otvision-0.6.3}/tests/track/helper/data_builder.py +12 -12
- {otvision-0.6.2 → otvision-0.6.3}/tests/track/parser/test_chunk_parser_plugins.py +1 -1
- {otvision-0.6.2 → otvision-0.6.3}/tests/track/test_frame_chunk.py +3 -3
- {otvision-0.6.2 → otvision-0.6.3}/tests/track/test_tracking_data_structures.py +5 -5
- {otvision-0.6.2 → otvision-0.6.3}/tests/transform/test_transform.py +44 -10
- {otvision-0.6.2 → otvision-0.6.3}/track.py +2 -2
- {otvision-0.6.2 → otvision-0.6.3}/transform.py +2 -2
- {otvision-0.6.2 → otvision-0.6.3}/update_precommit.py +52 -12
- otvision-0.6.2/OTVision/domain/detection.py +0 -20
- otvision-0.6.2/OTVision/domain/frame.py +0 -29
- {otvision-0.6.2 → otvision-0.6.3}/.editorconfig +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/.flake8 +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/.github/dependabot.yml +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/.github/workflows/build-nightly.yml +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/.github/workflows/build-release.yml +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/.github/workflows/linter.yml +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/.github/workflows/release-pypi.yml +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/.github/workflows/release-testpypi.yml +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/.github/workflows/test.yml +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/.gitignore +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/.vscode/launch.json +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/.vscode/scripts/build_debug_env.cmd +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/.vscode/scripts/build_debug_env.sh +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/.vscode/scripts/teardown_debug_env.cmd +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/.vscode/scripts/teardown_debug_env.sh +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/.vscode/settings.json +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/.vscode/tasks.json +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/.yamllint.yaml +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/LICENSE +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/abstraction/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/abstraction/observer.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/abstraction/pipes_and_filter.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/buffer.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/configure_logger.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/detect/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/detect/current_object_detector_metadata.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/detect/detection_file_save_path_provider.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/detect/factory.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/detect/get_detect_cli_args.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/detect/timestamper.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/detect/update_detect_config_with_cli_args.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/frame_count_provider.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/get_config.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/get_current_config.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/application/update_current_config.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/config.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/convert/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/convert/convert.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/dataformat.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/detect/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/detect/cli.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/detect/detect.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/detect/otdet_file_writer.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/detect/plugin_av/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/detect/plugin_av/rotate_frame.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/detect/pyav_frame_count_provider.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/detect/timestamper.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/detect/video_input_source.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/domain/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/domain/cli.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/domain/current_config.py +0 -0
- {otvision-0.6.2/OTVision/track/model → otvision-0.6.3/OTVision/domain}/detection.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/domain/input_source_detect.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/helpers/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/helpers/date.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/helpers/files.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/helpers/formats.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/helpers/input_types.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/helpers/log.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/helpers/machine.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/helpers/video.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/exporter/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/exporter/filebased_exporter.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/model/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/model/filebased/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/model/filebased/frame_group.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/model/track_exporter.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/parser/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/parser/frame_group_parser_plugins.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/track/tracker/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/transform/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/transform/get_homography.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/transform/reference_points_picker.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/transform/transform.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/view/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/view/helpers/OTC.ico +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/view/view.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/view/view_convert.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/view/view_detect.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/view/view_helpers.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/view/view_track.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision/view/view_transform.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/OTVision.bat +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/README.md +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/clean-up-repository.sh +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/config.yml +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/detect.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/export_models.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/install.cmd +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/install.sh +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/install_dev.cmd +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/install_dev.sh +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/pyproject.toml +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/reference_points_picker.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/requirements-dev.txt +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/abstraction/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/abstraction/test_observer.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/application/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/application/detect/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/application/detect/test_current_object_detector.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/application/detect/test_detection_file_save_path_provider.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/application/detect/test_get_detect_cli_args.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/application/detect/test_timestamper.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/application/detect/test_update_detect_config_with_cli_args.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/application/test_buffer.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/application/test_get_config.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/cli/custom_cli_test_config.yaml +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/cli/test_detect_cli.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/conftest.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/convert/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/convert/test_convert.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_CamView.png +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_CamView_Cars-Cyclist.png +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_CamView_Cars-Truck.png +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_CamView_refpts.png +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.gpkg +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otrfpts +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.gpkg +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otrfpts +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_FR20.otrfpts +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Satellite.jpg +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/Testvideo_Satellite_far.jpg +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/detect/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/detect/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
- {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
- {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
- {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
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/log/_otvision_logs/test.log +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/transform/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.gpkg +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/transform/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otrfpts +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/transform/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/transform/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.gpkg +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/transform/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otrfpts +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/transform/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/transform/Testvideo_FR20.otrfpts +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/yolov8m.mlpackage/Data/com.apple.CoreML/model.mlmodel +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/yolov8m.mlpackage/Data/com.apple.CoreML/weights/weight.bin +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/data/yolov8m.mlpackage/Manifest.json +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/detect/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/detect/detect_test.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/detect/plugin_av/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/detect/plugin_av/test_rotate_frame.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/detect/test_otdet_file_writer.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/detect/test_pyav_frame_count_provider.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/detect/test_video_input_source.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/helpers/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/helpers/files_test.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/helpers/formats_test.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/helpers/test_log.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/log/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/log/log_maker.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/log/test_log.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/test_config.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/track/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/track/helper/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/track/parser/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/track/test_frame_group.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/track/test_frame_group_parser_plugins.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/track/test_track.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/transform/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/utils/__init__.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/utils/generator.py +0 -0
- {otvision-0.6.2 → otvision-0.6.3}/tests/utils/mocking.py +0 -0
- {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
|
-
-
|
|
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.
|
|
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.
|
|
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
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
|
|
@@ -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
|
|
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.
|
|
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
|
|
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,45 +1,70 @@
|
|
|
1
1
|
from dataclasses import dataclass, field
|
|
2
2
|
from datetime import datetime
|
|
3
|
-
from typing import Callable,
|
|
3
|
+
from typing import Callable, Literal, Optional, Sequence, TypedDict
|
|
4
4
|
|
|
5
|
-
from
|
|
5
|
+
from numpy import ndarray
|
|
6
6
|
|
|
7
7
|
from OTVision.dataformat import FRAME, OCCURRENCE, TRACK_ID
|
|
8
|
-
from OTVision.
|
|
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
|
|
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 (
|
|
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[
|
|
53
|
+
image (Optional[ndarray]): Optional image data of frame.
|
|
29
54
|
"""
|
|
30
55
|
|
|
31
56
|
no: FrameNo
|
|
32
57
|
occurrence: datetime
|
|
33
|
-
source:
|
|
58
|
+
source: str
|
|
34
59
|
detections: Sequence[Detection]
|
|
35
|
-
image: Optional[
|
|
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(
|
|
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
|
|
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.
|
|
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.
|
|
10
|
-
from OTVision.
|
|
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[
|
|
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[
|
|
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
|
|
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
|
|
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
|
|
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
|
|
168
|
+
frames (Sequence[FinishedFrame]): overrides frames
|
|
169
169
|
with more specific frame type.
|
|
170
170
|
"""
|
|
171
171
|
|
|
172
|
-
frames: Sequence[FinishedFrame
|
|
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.
|
|
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
|
|
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[
|
|
33
|
-
) -> Iterator[TrackedFrame
|
|
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[
|
|
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
|
|
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:
|
|
46
|
+
frame: DetectedFrame,
|
|
53
47
|
id_generator: ID_GENERATOR,
|
|
54
|
-
) -> TrackedFrame
|
|
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 (
|
|
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
|
|
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
|
|
265
|
+
class UnfinishedFramesBuffer(UnfinishedTracksBuffer[TrackedFrame, FinishedFrame]):
|
|
272
266
|
"""UnfinishedTracksBuffer implementation for Frames as Detection container."""
|
|
273
267
|
|
|
274
|
-
def __init__(self, tracker: Tracker
|
|
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[
|
|
280
|
-
) -> Iterator[FinishedFrame
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
298
|
+
container: TrackedFrame,
|
|
305
299
|
is_last: IsLastFrame,
|
|
306
300
|
discarded_tracks: set[TrackId],
|
|
307
301
|
keep_discarded: bool,
|
|
308
|
-
) -> FinishedFrame
|
|
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[
|
|
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 =
|
|
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
|
|
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
|
|
28
|
+
class ChunkBasedTracker(Tracker):
|
|
34
29
|
|
|
35
|
-
def __init__(self, tracker: Tracker
|
|
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:
|
|
37
|
+
frames: DetectedFrame,
|
|
43
38
|
id_generator: ID_GENERATOR,
|
|
44
|
-
) -> TrackedFrame
|
|
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
|
|
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.
|
|
4
|
-
from OTVision.
|
|
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__(
|
|
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:
|
|
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
|
|
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:
|
|
173
|
-
) -> TrackedFrame
|
|
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,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: OTVision
|
|
3
|
-
Version: 0.6.
|
|
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:
|
|
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.
|
|
35
|
+
Requires-Dist: ultralytics==8.3.94
|
|
35
36
|
Description-Content-Type: text/markdown
|
|
36
37
|
|
|
37
38
|
# OTVision
|