megadetector 5.0.18__tar.gz → 5.0.19__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.

Potentially problematic release.


This version of megadetector might be problematic. Click here for more details.

Files changed (210) hide show
  1. {megadetector-5.0.18/megadetector.egg-info → megadetector-5.0.19}/PKG-INFO +1 -1
  2. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/cct_to_md.py +1 -1
  3. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/yolo_output_to_md_output.py +2 -2
  4. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/detection/process_video.py +6 -3
  5. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/detection/run_detector_batch.py +1 -1
  6. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/detection/video_utils.py +3 -1
  7. megadetector-5.0.19/megadetector/postprocessing/validate_batch_results.py +186 -0
  8. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/utils/md_tests.py +7 -1
  9. {megadetector-5.0.18 → megadetector-5.0.19/megadetector.egg-info}/PKG-INFO +1 -1
  10. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector.egg-info/SOURCES.txt +1 -0
  11. {megadetector-5.0.18 → megadetector-5.0.19}/pyproject.toml +1 -1
  12. {megadetector-5.0.18 → megadetector-5.0.19}/LICENSE +0 -0
  13. {megadetector-5.0.18 → megadetector-5.0.19}/README-package.md +0 -0
  14. {megadetector-5.0.18 → megadetector-5.0.19}/README.md +0 -0
  15. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/__init__.py +0 -0
  16. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/batch_processing/__init__.py +0 -0
  17. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/batch_processing/api_core/__init__.py +0 -0
  18. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/batch_processing/api_core/batch_service/__init__.py +0 -0
  19. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/batch_processing/api_core/batch_service/score.py +0 -0
  20. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/batch_processing/api_core/server.py +0 -0
  21. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/batch_processing/api_core/server_api_config.py +0 -0
  22. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/batch_processing/api_core/server_app_config.py +0 -0
  23. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/batch_processing/api_core/server_batch_job_manager.py +0 -0
  24. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/batch_processing/api_core/server_job_status_table.py +0 -0
  25. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/batch_processing/api_core/server_orchestration.py +0 -0
  26. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/batch_processing/api_core/server_utils.py +0 -0
  27. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/batch_processing/api_core_support/__init__.py +0 -0
  28. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/batch_processing/api_core_support/aggregate_results_manually.py +0 -0
  29. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/batch_processing/api_support/__init__.py +0 -0
  30. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/batch_processing/api_support/summarize_daily_activity.py +0 -0
  31. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/batch_processing/data_preparation/__init__.py +0 -0
  32. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/batch_processing/integration/digiKam/setup.py +0 -0
  33. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/batch_processing/integration/digiKam/xmp_integration.py +0 -0
  34. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/batch_processing/integration/eMammal/test_scripts/config_template.py +0 -0
  35. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/batch_processing/integration/eMammal/test_scripts/push_annotations_to_emammal.py +0 -0
  36. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/batch_processing/integration/eMammal/test_scripts/select_images_for_testing.py +0 -0
  37. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/synchronous/__init__.py +0 -0
  38. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/synchronous/api_core/animal_detection_api/__init__.py +0 -0
  39. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/synchronous/api_core/animal_detection_api/api_backend.py +0 -0
  40. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/synchronous/api_core/animal_detection_api/api_frontend.py +0 -0
  41. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/synchronous/api_core/animal_detection_api/config.py +0 -0
  42. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/synchronous/api_core/tests/__init__.py +0 -0
  43. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/api/synchronous/api_core/tests/load_test.py +0 -0
  44. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/classification/__init__.py +0 -0
  45. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/classification/aggregate_classifier_probs.py +0 -0
  46. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/classification/analyze_failed_images.py +0 -0
  47. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/classification/cache_batchapi_outputs.py +0 -0
  48. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/classification/create_classification_dataset.py +0 -0
  49. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/classification/crop_detections.py +0 -0
  50. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/classification/csv_to_json.py +0 -0
  51. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/classification/detect_and_crop.py +0 -0
  52. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/classification/efficientnet/__init__.py +0 -0
  53. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/classification/efficientnet/model.py +0 -0
  54. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/classification/efficientnet/utils.py +0 -0
  55. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/classification/evaluate_model.py +0 -0
  56. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/classification/identify_mislabeled_candidates.py +0 -0
  57. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/classification/json_to_azcopy_list.py +0 -0
  58. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/classification/json_validator.py +0 -0
  59. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/classification/map_classification_categories.py +0 -0
  60. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/classification/merge_classification_detection_output.py +0 -0
  61. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/classification/prepare_classification_script.py +0 -0
  62. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/classification/prepare_classification_script_mc.py +0 -0
  63. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/classification/run_classifier.py +0 -0
  64. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/classification/save_mislabeled.py +0 -0
  65. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/classification/train_classifier.py +0 -0
  66. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/classification/train_classifier_tf.py +0 -0
  67. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/classification/train_utils.py +0 -0
  68. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/__init__.py +0 -0
  69. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/annotations/__init__.py +0 -0
  70. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/annotations/annotation_constants.py +0 -0
  71. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/camtrap_dp_to_coco.py +0 -0
  72. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/cct_json_utils.py +0 -0
  73. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/cct_to_wi.py +0 -0
  74. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/coco_to_labelme.py +0 -0
  75. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/coco_to_yolo.py +0 -0
  76. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/databases/__init__.py +0 -0
  77. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/databases/add_width_and_height_to_db.py +0 -0
  78. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/databases/combine_coco_camera_traps_files.py +0 -0
  79. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/databases/integrity_check_json_db.py +0 -0
  80. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/databases/subset_json_db.py +0 -0
  81. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/generate_crops_from_cct.py +0 -0
  82. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/get_image_sizes.py +0 -0
  83. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/add_nacti_sizes.py +0 -0
  84. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/add_timestamps_to_icct.py +0 -0
  85. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/animl_results_to_md_results.py +0 -0
  86. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/auckland_doc_test_to_json.py +0 -0
  87. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/auckland_doc_to_json.py +0 -0
  88. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/awc_to_json.py +0 -0
  89. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/bellevue_to_json.py +0 -0
  90. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/cacophony-thermal-importer.py +0 -0
  91. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/carrizo_shrubfree_2018.py +0 -0
  92. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/carrizo_trail_cam_2017.py +0 -0
  93. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/cct_field_adjustments.py +0 -0
  94. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/channel_islands_to_cct.py +0 -0
  95. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/eMammal/copy_and_unzip_emammal.py +0 -0
  96. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/eMammal/eMammal_helpers.py +0 -0
  97. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/eMammal/make_eMammal_json.py +0 -0
  98. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/ena24_to_json.py +0 -0
  99. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/filenames_to_json.py +0 -0
  100. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/helena_to_cct.py +0 -0
  101. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/idaho-camera-traps.py +0 -0
  102. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/idfg_iwildcam_lila_prep.py +0 -0
  103. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/import_desert_lion_conservation_camera_traps.py +0 -0
  104. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/jb_csv_to_json.py +0 -0
  105. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/mcgill_to_json.py +0 -0
  106. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/missouri_to_json.py +0 -0
  107. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/nacti_fieldname_adjustments.py +0 -0
  108. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/noaa_seals_2019.py +0 -0
  109. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/pc_to_json.py +0 -0
  110. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/plot_wni_giraffes.py +0 -0
  111. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/prepare-noaa-fish-data-for-lila.py +0 -0
  112. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/prepare_zsl_imerit.py +0 -0
  113. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/rspb_to_json.py +0 -0
  114. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/save_the_elephants_survey_A.py +0 -0
  115. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/save_the_elephants_survey_B.py +0 -0
  116. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/snapshot_safari_importer.py +0 -0
  117. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/snapshot_safari_importer_reprise.py +0 -0
  118. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/snapshot_serengeti_lila.py +0 -0
  119. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/snapshotserengeti/make_full_SS_json.py +0 -0
  120. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/snapshotserengeti/make_per_season_SS_json.py +0 -0
  121. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/sulross_get_exif.py +0 -0
  122. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/timelapse_csv_set_to_json.py +0 -0
  123. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/ubc_to_json.py +0 -0
  124. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/umn_to_json.py +0 -0
  125. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/wellington_to_json.py +0 -0
  126. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/wi_to_json.py +0 -0
  127. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/importers/zamba_results_to_md_results.py +0 -0
  128. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/labelme_to_coco.py +0 -0
  129. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/labelme_to_yolo.py +0 -0
  130. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/lila/__init__.py +0 -0
  131. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/lila/add_locations_to_island_camera_traps.py +0 -0
  132. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/lila/add_locations_to_nacti.py +0 -0
  133. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/lila/create_lila_blank_set.py +0 -0
  134. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/lila/create_lila_test_set.py +0 -0
  135. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/lila/create_links_to_md_results_files.py +0 -0
  136. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/lila/download_lila_subset.py +0 -0
  137. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/lila/generate_lila_per_image_labels.py +0 -0
  138. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/lila/get_lila_annotation_counts.py +0 -0
  139. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/lila/get_lila_image_counts.py +0 -0
  140. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/lila/lila_common.py +0 -0
  141. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/lila/test_lila_metadata_urls.py +0 -0
  142. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/ocr_tools.py +0 -0
  143. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/read_exif.py +0 -0
  144. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/remap_coco_categories.py +0 -0
  145. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/remove_exif.py +0 -0
  146. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/rename_images.py +0 -0
  147. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/resize_coco_dataset.py +0 -0
  148. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/wi_download_csv_to_coco.py +0 -0
  149. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/data_management/yolo_to_coco.py +0 -0
  150. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/detection/__init__.py +0 -0
  151. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/detection/detector_training/__init__.py +0 -0
  152. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/detection/detector_training/model_main_tf2.py +0 -0
  153. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/detection/pytorch_detector.py +0 -0
  154. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/detection/run_detector.py +0 -0
  155. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/detection/run_inference_with_yolov5_val.py +0 -0
  156. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/detection/run_tiled_inference.py +0 -0
  157. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/detection/tf_detector.py +0 -0
  158. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/postprocessing/__init__.py +0 -0
  159. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/postprocessing/add_max_conf.py +0 -0
  160. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/postprocessing/categorize_detections_by_size.py +0 -0
  161. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/postprocessing/classification_postprocessing.py +0 -0
  162. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/postprocessing/combine_api_outputs.py +0 -0
  163. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/postprocessing/compare_batch_results.py +0 -0
  164. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/postprocessing/convert_output_format.py +0 -0
  165. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/postprocessing/load_api_results.py +0 -0
  166. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/postprocessing/md_to_coco.py +0 -0
  167. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/postprocessing/md_to_labelme.py +0 -0
  168. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/postprocessing/merge_detections.py +0 -0
  169. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/postprocessing/postprocess_batch_results.py +0 -0
  170. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/postprocessing/remap_detection_categories.py +0 -0
  171. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/postprocessing/render_detection_confusion_matrix.py +0 -0
  172. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/postprocessing/repeat_detection_elimination/find_repeat_detections.py +0 -0
  173. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/postprocessing/repeat_detection_elimination/remove_repeat_detections.py +0 -0
  174. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/postprocessing/repeat_detection_elimination/repeat_detections_core.py +0 -0
  175. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/postprocessing/separate_detections_into_folders.py +0 -0
  176. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/postprocessing/subset_json_detector_output.py +0 -0
  177. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/postprocessing/top_folders_to_bottom.py +0 -0
  178. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/taxonomy_mapping/__init__.py +0 -0
  179. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/taxonomy_mapping/map_lila_taxonomy_to_wi_taxonomy.py +0 -0
  180. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/taxonomy_mapping/map_new_lila_datasets.py +0 -0
  181. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/taxonomy_mapping/prepare_lila_taxonomy_release.py +0 -0
  182. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/taxonomy_mapping/preview_lila_taxonomy.py +0 -0
  183. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/taxonomy_mapping/retrieve_sample_image.py +0 -0
  184. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/taxonomy_mapping/simple_image_download.py +0 -0
  185. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/taxonomy_mapping/species_lookup.py +0 -0
  186. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/taxonomy_mapping/taxonomy_csv_checker.py +0 -0
  187. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/taxonomy_mapping/taxonomy_graph.py +0 -0
  188. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/taxonomy_mapping/validate_lila_category_mappings.py +0 -0
  189. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/utils/__init__.py +0 -0
  190. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/utils/azure_utils.py +0 -0
  191. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/utils/ct_utils.py +0 -0
  192. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/utils/directory_listing.py +0 -0
  193. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/utils/path_utils.py +0 -0
  194. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/utils/process_utils.py +0 -0
  195. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/utils/sas_blob_utils.py +0 -0
  196. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/utils/split_locations_into_train_val.py +0 -0
  197. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/utils/string_utils.py +0 -0
  198. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/utils/torch_test.py +0 -0
  199. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/utils/url_utils.py +0 -0
  200. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/utils/write_html_image_list.py +0 -0
  201. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/visualization/__init__.py +0 -0
  202. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/visualization/plot_utils.py +0 -0
  203. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/visualization/render_images_with_thumbnails.py +0 -0
  204. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/visualization/visualization_utils.py +0 -0
  205. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/visualization/visualize_db.py +0 -0
  206. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector/visualization/visualize_detector_output.py +0 -0
  207. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector.egg-info/dependency_links.txt +0 -0
  208. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector.egg-info/requires.txt +0 -0
  209. {megadetector-5.0.18 → megadetector-5.0.19}/megadetector.egg-info/top_level.txt +0 -0
  210. {megadetector-5.0.18 → megadetector-5.0.19}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: megadetector
3
- Version: 5.0.18
3
+ Version: 5.0.19
4
4
  Summary: MegaDetector is an AI model that helps conservation folks spend less time doing boring things with camera trap images.
5
5
  Author-email: Your friendly neighborhood MegaDetector team <cameratraps@lila.science>
6
6
  Maintainer-email: Your friendly neighborhood MegaDetector team <cameratraps@lila.science>
@@ -79,7 +79,7 @@ def cct_to_md(input_filename,output_filename=None):
79
79
  results = {}
80
80
 
81
81
  info = {}
82
- info['format_version'] = "1.3"
82
+ info['format_version'] = '1.4'
83
83
  info['detector'] = 'cct_to_md'
84
84
  results['info'] = info
85
85
  results['detection_categories'] = category_id_to_name
@@ -301,7 +301,7 @@ def yolo_json_output_to_md_output(yolo_json_file,
301
301
 
302
302
  d = {}
303
303
  d['images'] = output_images
304
- d['info'] = {'format_version':1.3,'detector':detector_name}
304
+ d['info'] = {'format_version':'1.4','detector':detector_name}
305
305
  d['detection_categories'] = {}
306
306
 
307
307
  for cat_id in yolo_category_id_to_name:
@@ -411,7 +411,7 @@ def yolo_txt_output_to_md_output(input_results_folder,
411
411
  'info': {
412
412
  'detector': detector_string,
413
413
  'detector_metadata': {},
414
- 'format_version': '1.3'
414
+ 'format_version': '1.4'
415
415
  },
416
416
  'detection_categories': {
417
417
  '1': 'animal',
@@ -578,6 +578,7 @@ def process_video_folder(options):
578
578
  video_results = md_results['results']
579
579
 
580
580
  for i_video,video_filename in enumerate(md_results['video_filenames']):
581
+ video_filename = video_filename.replace('\\','/')
581
582
  assert video_filename not in video_filename_to_fs
582
583
  video_filename_to_fs[video_filename] = md_results['frame_rates'][i_video]
583
584
 
@@ -621,9 +622,11 @@ def process_video_folder(options):
621
622
  frames_to_extract=options.frames_to_extract,
622
623
  allow_empty_videos=options.allow_empty_videos)
623
624
 
624
- for i_video,video_filename in enumerate(video_filenames):
625
- assert video_filename not in video_filename_to_fs
626
- video_filename_to_fs[video_filename] = Fs[i_video]
625
+ for i_video,video_filename_abs in enumerate(video_filenames):
626
+ video_filename_relative = os.path.relpath(video_filename_abs,options.input_video_file)
627
+ video_filename_relative = video_filename_relative.replace('\\','/')
628
+ assert video_filename_relative not in video_filename_to_fs
629
+ video_filename_to_fs[video_filename_relative] = Fs[i_video]
627
630
 
628
631
  print('Extracted frames for {} videos'.format(len(set(video_filenames))))
629
632
  image_file_names = list(itertools.chain.from_iterable(frame_filenames))
@@ -886,7 +886,7 @@ def write_results_to_file(results,
886
886
 
887
887
  info = {
888
888
  'detection_completion_time': datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S'),
889
- 'format_version': '1.3'
889
+ 'format_version': '1.4'
890
890
  }
891
891
 
892
892
  if detector_file is not None:
@@ -781,7 +781,9 @@ class FrameToVideoOptions:
781
781
  self.non_video_behavior = 'error'
782
782
 
783
783
 
784
- def frame_results_to_video_results(input_file,output_file,options=None,
784
+ def frame_results_to_video_results(input_file,
785
+ output_file,
786
+ options=None,
785
787
  video_filename_to_frame_rate=None):
786
788
  """
787
789
  Given an MD results file produced at the *frame* level, corresponding to a directory
@@ -0,0 +1,186 @@
1
+ """
2
+
3
+ validate_batch_results.py
4
+
5
+ Given a .json file containing MD results, validate that it's compliant with the format spec:
6
+
7
+ https://lila.science/megadetector-output-format
8
+
9
+ """
10
+
11
+ #%% Constants and imports
12
+
13
+ import os
14
+ import sys
15
+ import json
16
+ import argparse
17
+
18
+ from megadetector.detection.video_utils import is_video_file
19
+ from megadetector.utils.ct_utils import args_to_object
20
+
21
+ typical_info_fields = ['detector','detection_completion_time',
22
+ 'classifier','classification_completion_time',
23
+ 'detection_metadata','classifier_metadata']
24
+ required_keys = ['info','images','detection_categories']
25
+ typical_keys = ['classification_categories']
26
+
27
+
28
+ #%% Classes
29
+
30
+ class ValidateBatchResultsOptions:
31
+ """
32
+ Options controlling the behavior of validate_bach_results()
33
+ """
34
+
35
+ def __init__(self):
36
+
37
+ #: Should we verify that images exist? If this is True, and the .json
38
+ #: file contains relative paths, relative_path_base needs to be specified.
39
+ self.check_image_existence = False
40
+
41
+ #: If check_image_existence is True, where do the images live?
42
+ #:
43
+ #: If None, assumes absolute paths.
44
+ self.relative_path_base = None
45
+
46
+ # ...class ValidateBatchResultsOptions
47
+
48
+
49
+
50
+ #%% Main function
51
+
52
+ def validate_batch_results(json_filename,options=None):
53
+ """
54
+ Verify that [json_filename] is a valid MD output file. Currently errors on invalid files.
55
+
56
+ Args:
57
+ json_filename (str): the filename to validate
58
+ options (ValidateBatchResultsOptions, optionsl): all the parameters used to control this
59
+ process, see ValidateBatchResultsOptions for details
60
+
61
+ Returns:
62
+ bool: reserved; currently always errors or returns True.
63
+ """
64
+
65
+ if options is None:
66
+ options = ValidateBatchResultsOptions()
67
+
68
+ with open(json_filename,'r') as f:
69
+ d = json.load(f)
70
+
71
+ ## Info validation
72
+
73
+ assert 'info' in d
74
+ info = d['info']
75
+
76
+ assert isinstance(info,dict)
77
+ assert 'format_version' in info
78
+ format_version = float(info['format_version'])
79
+ assert format_version >= 1.3, 'This validator can only be used with format version 1.3 or later'
80
+
81
+ print('Validating a .json results file with format version {}'.format(format_version))
82
+
83
+ ## Category validation
84
+
85
+ assert 'detection_categories' in d
86
+ for k in d['detection_categories'].keys():
87
+ # Categories should be string-formatted ints
88
+ assert isinstance(k,str)
89
+ _ = int(k)
90
+ assert isinstance(d['detection_categories'][k],str)
91
+
92
+ if 'classification_categories' in d:
93
+ for k in d['classification_categories'].keys():
94
+ # Categories should be string-formatted ints
95
+ assert isinstance(k,str)
96
+ _ = int(k)
97
+ assert isinstance(d['classification_categories'][k],str)
98
+
99
+
100
+ ## Image validation
101
+
102
+ assert 'images' in d
103
+ assert isinstance(d['images'],list)
104
+
105
+ # im = d['images'][0]
106
+ for im in d['images']:
107
+
108
+ assert isinstance(im,dict)
109
+ assert 'file' in im
110
+
111
+ file = im['file']
112
+
113
+ if options.check_image_existence:
114
+ if options.relative_path_base is None:
115
+ file_abs = file
116
+ else:
117
+ file_abs = os.path.join(options.relative_path_base,file)
118
+ assert os.path.isfile(file_abs), 'Cannot find file {}'.format(file_abs)
119
+
120
+ if 'detections' not in im or im['detections'] is None:
121
+ assert 'failure' in im and isinstance(im['failure'],str)
122
+ else:
123
+ assert isinstance(im['detections'],list)
124
+
125
+ if is_video_file(im['file']) and (format_version >= 1.4):
126
+ assert 'frame_rate' in im
127
+ if 'detections' in im and im['detections'] is not None:
128
+ for det in im['detections']:
129
+ assert 'frame_number' in det
130
+
131
+ # ...for each image
132
+
133
+
134
+ ## Checking on other keys
135
+
136
+ for k in d.keys():
137
+ if k not in typical_keys and k not in required_keys:
138
+ print('Warning: non-standard key {} present at file level'.format(k))
139
+
140
+ # ...def validate_batch_results(...)
141
+
142
+
143
+ #%% Interactive driver(s)
144
+
145
+ if False:
146
+
147
+ #%%
148
+
149
+ options = ValidateBatchResultsOptions()
150
+ # json_filename = r'g:\temp\format.json'
151
+ # json_filename = r'g:\temp\test-videos\video_results.json'
152
+ json_filename = r'g:\temp\test-videos\image_results.json'
153
+ options.check_image_existence = True
154
+ options.relative_path_base = r'g:\temp\test-videos'
155
+ validate_batch_results(json_filename,options)
156
+
157
+
158
+ #%% Command-line driver
159
+
160
+ def main():
161
+
162
+ options = ValidateBatchResultsOptions()
163
+
164
+ parser = argparse.ArgumentParser()
165
+ parser.add_argument(
166
+ 'json_filename',
167
+ help='path to .json file containing MegaDetector results')
168
+ parser.add_argument(
169
+ '--check_image_existence', action='store_true',
170
+ help='check that all images referred to in the results file exist')
171
+ parser.add_argument(
172
+ '--relative_path_base', default=None,
173
+ help='if --check_image_existence is specified and paths are relative, use this as the base folder')
174
+ if len(sys.argv[1:]) == 0:
175
+ parser.print_help()
176
+ parser.exit()
177
+
178
+ args = parser.parse_args()
179
+
180
+ args_to_object(args, options)
181
+
182
+ validate_batch_results(args.json_filename,options)
183
+
184
+
185
+ if __name__ == '__main__':
186
+ main()
@@ -683,10 +683,16 @@ def run_python_tests(options):
683
683
 
684
684
  ## Verify results
685
685
 
686
+ # Verify format correctness
687
+ from megadetector.postprocessing.validate_batch_results import validate_batch_results
688
+ validate_batch_results(inference_output_file)
689
+
690
+ # Verify value correctness
686
691
  expected_results_file = get_expected_results_filename(is_gpu_available(verbose=False),
687
692
  options=options)
688
693
  compare_results(inference_output_file,expected_results_file,options)
689
-
694
+
695
+
690
696
  # Make note of this filename, we will use it again later
691
697
  inference_output_file_standard_inference = inference_output_file
692
698
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: megadetector
3
- Version: 5.0.18
3
+ Version: 5.0.19
4
4
  Summary: MegaDetector is an AI model that helps conservation folks spend less time doing boring things with camera trap images.
5
5
  Author-email: Your friendly neighborhood MegaDetector team <cameratraps@lila.science>
6
6
  Maintainer-email: Your friendly neighborhood MegaDetector team <cameratraps@lila.science>
@@ -172,6 +172,7 @@ megadetector/postprocessing/render_detection_confusion_matrix.py
172
172
  megadetector/postprocessing/separate_detections_into_folders.py
173
173
  megadetector/postprocessing/subset_json_detector_output.py
174
174
  megadetector/postprocessing/top_folders_to_bottom.py
175
+ megadetector/postprocessing/validate_batch_results.py
175
176
  megadetector/postprocessing/repeat_detection_elimination/find_repeat_detections.py
176
177
  megadetector/postprocessing/repeat_detection_elimination/remove_repeat_detections.py
177
178
  megadetector/postprocessing/repeat_detection_elimination/repeat_detections_core.py
@@ -5,7 +5,7 @@ requires = [
5
5
 
6
6
  [project]
7
7
  name = "megadetector"
8
- version = "5.0.18"
8
+ version = "5.0.19"
9
9
  description = "MegaDetector is an AI model that helps conservation folks spend less time doing boring things with camera trap images."
10
10
  readme = "README-package.md"
11
11
  # As of 2023.10.10, PyTorch isn't installable on Python 3.12
File without changes
File without changes
File without changes