megadetector 5.0.14__tar.gz → 5.0.15__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 (207) hide show
  1. {megadetector-5.0.14/megadetector.egg-info → megadetector-5.0.15}/PKG-INFO +1 -1
  2. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/detection/process_video.py +2 -2
  3. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/detection/run_detector_batch.py +7 -2
  4. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/detection/video_utils.py +3 -0
  5. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/utils/md_tests.py +202 -87
  6. {megadetector-5.0.14 → megadetector-5.0.15/megadetector.egg-info}/PKG-INFO +1 -1
  7. {megadetector-5.0.14 → megadetector-5.0.15}/pyproject.toml +1 -1
  8. {megadetector-5.0.14 → megadetector-5.0.15}/LICENSE +0 -0
  9. {megadetector-5.0.14 → megadetector-5.0.15}/README-package.md +0 -0
  10. {megadetector-5.0.14 → megadetector-5.0.15}/README.md +0 -0
  11. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/__init__.py +0 -0
  12. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/batch_processing/__init__.py +0 -0
  13. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/batch_processing/api_core/__init__.py +0 -0
  14. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/batch_processing/api_core/batch_service/__init__.py +0 -0
  15. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/batch_processing/api_core/batch_service/score.py +0 -0
  16. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/batch_processing/api_core/server.py +0 -0
  17. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/batch_processing/api_core/server_api_config.py +0 -0
  18. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/batch_processing/api_core/server_app_config.py +0 -0
  19. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/batch_processing/api_core/server_batch_job_manager.py +0 -0
  20. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/batch_processing/api_core/server_job_status_table.py +0 -0
  21. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/batch_processing/api_core/server_orchestration.py +0 -0
  22. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/batch_processing/api_core/server_utils.py +0 -0
  23. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/batch_processing/api_core_support/__init__.py +0 -0
  24. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/batch_processing/api_core_support/aggregate_results_manually.py +0 -0
  25. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/batch_processing/api_support/__init__.py +0 -0
  26. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/batch_processing/api_support/summarize_daily_activity.py +0 -0
  27. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/batch_processing/data_preparation/__init__.py +0 -0
  28. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/batch_processing/integration/digiKam/setup.py +0 -0
  29. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/batch_processing/integration/digiKam/xmp_integration.py +0 -0
  30. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/batch_processing/integration/eMammal/test_scripts/config_template.py +0 -0
  31. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/batch_processing/integration/eMammal/test_scripts/push_annotations_to_emammal.py +0 -0
  32. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/batch_processing/integration/eMammal/test_scripts/select_images_for_testing.py +0 -0
  33. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/synchronous/__init__.py +0 -0
  34. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/synchronous/api_core/animal_detection_api/__init__.py +0 -0
  35. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/synchronous/api_core/animal_detection_api/api_backend.py +0 -0
  36. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/synchronous/api_core/animal_detection_api/api_frontend.py +0 -0
  37. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/synchronous/api_core/animal_detection_api/config.py +0 -0
  38. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/synchronous/api_core/tests/__init__.py +0 -0
  39. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/api/synchronous/api_core/tests/load_test.py +0 -0
  40. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/classification/__init__.py +0 -0
  41. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/classification/aggregate_classifier_probs.py +0 -0
  42. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/classification/analyze_failed_images.py +0 -0
  43. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/classification/cache_batchapi_outputs.py +0 -0
  44. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/classification/create_classification_dataset.py +0 -0
  45. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/classification/crop_detections.py +0 -0
  46. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/classification/csv_to_json.py +0 -0
  47. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/classification/detect_and_crop.py +0 -0
  48. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/classification/efficientnet/__init__.py +0 -0
  49. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/classification/efficientnet/model.py +0 -0
  50. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/classification/efficientnet/utils.py +0 -0
  51. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/classification/evaluate_model.py +0 -0
  52. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/classification/identify_mislabeled_candidates.py +0 -0
  53. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/classification/json_to_azcopy_list.py +0 -0
  54. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/classification/json_validator.py +0 -0
  55. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/classification/map_classification_categories.py +0 -0
  56. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/classification/merge_classification_detection_output.py +0 -0
  57. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/classification/prepare_classification_script.py +0 -0
  58. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/classification/prepare_classification_script_mc.py +0 -0
  59. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/classification/run_classifier.py +0 -0
  60. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/classification/save_mislabeled.py +0 -0
  61. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/classification/train_classifier.py +0 -0
  62. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/classification/train_classifier_tf.py +0 -0
  63. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/classification/train_utils.py +0 -0
  64. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/__init__.py +0 -0
  65. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/annotations/__init__.py +0 -0
  66. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/annotations/annotation_constants.py +0 -0
  67. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/camtrap_dp_to_coco.py +0 -0
  68. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/cct_json_utils.py +0 -0
  69. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/cct_to_md.py +0 -0
  70. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/cct_to_wi.py +0 -0
  71. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/coco_to_labelme.py +0 -0
  72. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/coco_to_yolo.py +0 -0
  73. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/databases/__init__.py +0 -0
  74. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/databases/add_width_and_height_to_db.py +0 -0
  75. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/databases/combine_coco_camera_traps_files.py +0 -0
  76. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/databases/integrity_check_json_db.py +0 -0
  77. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/databases/subset_json_db.py +0 -0
  78. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/generate_crops_from_cct.py +0 -0
  79. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/get_image_sizes.py +0 -0
  80. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/add_nacti_sizes.py +0 -0
  81. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/add_timestamps_to_icct.py +0 -0
  82. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/animl_results_to_md_results.py +0 -0
  83. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/auckland_doc_test_to_json.py +0 -0
  84. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/auckland_doc_to_json.py +0 -0
  85. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/awc_to_json.py +0 -0
  86. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/bellevue_to_json.py +0 -0
  87. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/cacophony-thermal-importer.py +0 -0
  88. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/carrizo_shrubfree_2018.py +0 -0
  89. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/carrizo_trail_cam_2017.py +0 -0
  90. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/cct_field_adjustments.py +0 -0
  91. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/channel_islands_to_cct.py +0 -0
  92. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/eMammal/copy_and_unzip_emammal.py +0 -0
  93. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/eMammal/eMammal_helpers.py +0 -0
  94. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/eMammal/make_eMammal_json.py +0 -0
  95. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/ena24_to_json.py +0 -0
  96. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/filenames_to_json.py +0 -0
  97. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/helena_to_cct.py +0 -0
  98. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/idaho-camera-traps.py +0 -0
  99. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/idfg_iwildcam_lila_prep.py +0 -0
  100. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/jb_csv_to_json.py +0 -0
  101. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/mcgill_to_json.py +0 -0
  102. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/missouri_to_json.py +0 -0
  103. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/nacti_fieldname_adjustments.py +0 -0
  104. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/noaa_seals_2019.py +0 -0
  105. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/pc_to_json.py +0 -0
  106. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/plot_wni_giraffes.py +0 -0
  107. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/prepare-noaa-fish-data-for-lila.py +0 -0
  108. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/prepare_zsl_imerit.py +0 -0
  109. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/rspb_to_json.py +0 -0
  110. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/save_the_elephants_survey_A.py +0 -0
  111. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/save_the_elephants_survey_B.py +0 -0
  112. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/snapshot_safari_importer.py +0 -0
  113. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/snapshot_safari_importer_reprise.py +0 -0
  114. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/snapshot_serengeti_lila.py +0 -0
  115. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/snapshotserengeti/make_full_SS_json.py +0 -0
  116. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/snapshotserengeti/make_per_season_SS_json.py +0 -0
  117. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/sulross_get_exif.py +0 -0
  118. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/timelapse_csv_set_to_json.py +0 -0
  119. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/ubc_to_json.py +0 -0
  120. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/umn_to_json.py +0 -0
  121. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/wellington_to_json.py +0 -0
  122. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/wi_to_json.py +0 -0
  123. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/importers/zamba_results_to_md_results.py +0 -0
  124. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/labelme_to_coco.py +0 -0
  125. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/labelme_to_yolo.py +0 -0
  126. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/lila/__init__.py +0 -0
  127. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/lila/add_locations_to_island_camera_traps.py +0 -0
  128. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/lila/add_locations_to_nacti.py +0 -0
  129. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/lila/create_lila_blank_set.py +0 -0
  130. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/lila/create_lila_test_set.py +0 -0
  131. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/lila/create_links_to_md_results_files.py +0 -0
  132. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/lila/download_lila_subset.py +0 -0
  133. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/lila/generate_lila_per_image_labels.py +0 -0
  134. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/lila/get_lila_annotation_counts.py +0 -0
  135. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/lila/get_lila_image_counts.py +0 -0
  136. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/lila/lila_common.py +0 -0
  137. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/lila/test_lila_metadata_urls.py +0 -0
  138. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/ocr_tools.py +0 -0
  139. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/read_exif.py +0 -0
  140. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/remap_coco_categories.py +0 -0
  141. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/remove_exif.py +0 -0
  142. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/rename_images.py +0 -0
  143. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/resize_coco_dataset.py +0 -0
  144. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/wi_download_csv_to_coco.py +0 -0
  145. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/yolo_output_to_md_output.py +0 -0
  146. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/data_management/yolo_to_coco.py +0 -0
  147. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/detection/__init__.py +0 -0
  148. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/detection/detector_training/__init__.py +0 -0
  149. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/detection/detector_training/model_main_tf2.py +0 -0
  150. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/detection/pytorch_detector.py +0 -0
  151. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/detection/run_detector.py +0 -0
  152. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/detection/run_inference_with_yolov5_val.py +0 -0
  153. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/detection/run_tiled_inference.py +0 -0
  154. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/detection/tf_detector.py +0 -0
  155. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/postprocessing/__init__.py +0 -0
  156. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/postprocessing/add_max_conf.py +0 -0
  157. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/postprocessing/categorize_detections_by_size.py +0 -0
  158. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/postprocessing/classification_postprocessing.py +0 -0
  159. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/postprocessing/combine_api_outputs.py +0 -0
  160. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/postprocessing/compare_batch_results.py +0 -0
  161. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/postprocessing/convert_output_format.py +0 -0
  162. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/postprocessing/load_api_results.py +0 -0
  163. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/postprocessing/md_to_coco.py +0 -0
  164. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/postprocessing/md_to_labelme.py +0 -0
  165. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/postprocessing/merge_detections.py +0 -0
  166. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/postprocessing/postprocess_batch_results.py +0 -0
  167. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/postprocessing/remap_detection_categories.py +0 -0
  168. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/postprocessing/render_detection_confusion_matrix.py +0 -0
  169. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/postprocessing/repeat_detection_elimination/find_repeat_detections.py +0 -0
  170. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/postprocessing/repeat_detection_elimination/remove_repeat_detections.py +0 -0
  171. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/postprocessing/repeat_detection_elimination/repeat_detections_core.py +0 -0
  172. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/postprocessing/separate_detections_into_folders.py +0 -0
  173. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/postprocessing/subset_json_detector_output.py +0 -0
  174. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/postprocessing/top_folders_to_bottom.py +0 -0
  175. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/taxonomy_mapping/__init__.py +0 -0
  176. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/taxonomy_mapping/map_lila_taxonomy_to_wi_taxonomy.py +0 -0
  177. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/taxonomy_mapping/map_new_lila_datasets.py +0 -0
  178. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/taxonomy_mapping/prepare_lila_taxonomy_release.py +0 -0
  179. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/taxonomy_mapping/preview_lila_taxonomy.py +0 -0
  180. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/taxonomy_mapping/retrieve_sample_image.py +0 -0
  181. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/taxonomy_mapping/simple_image_download.py +0 -0
  182. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/taxonomy_mapping/species_lookup.py +0 -0
  183. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/taxonomy_mapping/taxonomy_csv_checker.py +0 -0
  184. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/taxonomy_mapping/taxonomy_graph.py +0 -0
  185. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/taxonomy_mapping/validate_lila_category_mappings.py +0 -0
  186. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/utils/__init__.py +0 -0
  187. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/utils/azure_utils.py +0 -0
  188. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/utils/ct_utils.py +0 -0
  189. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/utils/directory_listing.py +0 -0
  190. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/utils/path_utils.py +0 -0
  191. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/utils/process_utils.py +0 -0
  192. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/utils/sas_blob_utils.py +0 -0
  193. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/utils/split_locations_into_train_val.py +0 -0
  194. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/utils/string_utils.py +0 -0
  195. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/utils/url_utils.py +0 -0
  196. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/utils/write_html_image_list.py +0 -0
  197. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/visualization/__init__.py +0 -0
  198. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/visualization/plot_utils.py +0 -0
  199. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/visualization/render_images_with_thumbnails.py +0 -0
  200. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/visualization/visualization_utils.py +0 -0
  201. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/visualization/visualize_db.py +0 -0
  202. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector/visualization/visualize_detector_output.py +0 -0
  203. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector.egg-info/SOURCES.txt +0 -0
  204. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector.egg-info/dependency_links.txt +0 -0
  205. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector.egg-info/requires.txt +0 -0
  206. {megadetector-5.0.14 → megadetector-5.0.15}/megadetector.egg-info/top_level.txt +0 -0
  207. {megadetector-5.0.14 → megadetector-5.0.15}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: megadetector
3
- Version: 5.0.14
3
+ Version: 5.0.15
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>
@@ -146,7 +146,7 @@ class ProcessVideoOptions:
146
146
  #: detector.
147
147
  self.class_mapping_filename = None
148
148
 
149
- #: JPEG quality for frame output, from 0-100. Defaults to the opencv default (typically 95)
149
+ #: JPEG quality for frame output, from 0-100. Use None or -1 to let opencv decide.
150
150
  self.quality = 90
151
151
 
152
152
  #: Resize frames so they're at most this wide
@@ -957,7 +957,7 @@ def main():
957
957
 
958
958
  parser.add_argument('--quality', type=int,
959
959
  default=default_options.quality,
960
- help='JPEG quality for extracted frames (defaults to {})'.format(
960
+ help='JPEG quality for extracted frames (defaults to {}), use -1 to force no quality setting'.format(
961
961
  default_options.quality))
962
962
 
963
963
  parser.add_argument('--max_width', type=int,
@@ -748,8 +748,13 @@ def load_and_run_detector_batch(model_file,
748
748
  results += new_results
749
749
 
750
750
  # ...if checkpointing is/isn't enabled
751
-
752
- # ...if we're running (1) with image queue, (2) on one core, (3) on multiple cores
751
+
752
+ try:
753
+ pool.close()
754
+ except Exception as e:
755
+ print('Warning: error closing multiprocessing pool:\n{}'.format(str(e)))
756
+
757
+ # ...if we're running (1) with image queue, (2) on one core, or (3) on multiple cores
753
758
 
754
759
  # 'results' may have been modified in place, but we also return it for
755
760
  # backwards-compatibility.
@@ -250,6 +250,9 @@ def video_to_frames(input_video_file,
250
250
 
251
251
  assert os.path.isfile(input_video_file), 'File {} not found'.format(input_video_file)
252
252
 
253
+ if quality is not None and quality < 0:
254
+ quality = None
255
+
253
256
  if isinstance(frames_to_extract,int):
254
257
  frames_to_extract = [frames_to_extract]
255
258
 
@@ -10,6 +10,8 @@ This module should not depend on anything else in this repo outside of the
10
10
  tests themselves, even if it means some duplicated code (e.g. for downloading files),
11
11
  since much of what it tries to test is, e.g., imports.
12
12
 
13
+ "Correctness" is determined by agreement with a file that this script fetches from lila.science.
14
+
13
15
  """
14
16
 
15
17
  #%% Imports and constants
@@ -108,7 +110,9 @@ class MDTestOptions:
108
110
 
109
111
  def get_expected_results_filename(gpu_is_available,
110
112
  model_string='mdv5a',
111
- test_type='images'):
113
+ test_type='image',
114
+ augment=False,
115
+ options=None):
112
116
  """
113
117
  Expected results vary just a little across inference environments, particularly
114
118
  between PT 1.x and 2.x, so when making sure things are working acceptably, we
@@ -150,7 +154,21 @@ def get_expected_results_filename(gpu_is_available,
150
154
  except Exception:
151
155
  pass
152
156
 
153
- return '{}-{}-results-{}-{}.json'.format(model_string,test_type,hw_string,pt_string)
157
+ aug_string = ''
158
+ if augment:
159
+ aug_string = 'augment-'
160
+
161
+ fn = '{}-{}{}-{}-{}.json'.format(model_string,aug_string,test_type,hw_string,pt_string)
162
+
163
+ from megadetector.utils.path_utils import insert_before_extension
164
+
165
+ if test_type == 'video':
166
+ fn = insert_before_extension(fn,'frames')
167
+
168
+ if options is not None and options.scratch_dir is not None:
169
+ fn = os.path.join(options.scratch_dir,fn)
170
+
171
+ return fn
154
172
 
155
173
 
156
174
  def download_test_data(options=None):
@@ -220,7 +238,12 @@ def download_test_data(options=None):
220
238
 
221
239
  # ...for each file in the zipfile
222
240
 
223
- # Warn if file are present that aren't expected
241
+ try:
242
+ zipf.close()
243
+ except Exception as e:
244
+ print('Warning: error closing zipfile:\n{}'.format(str(e)))
245
+
246
+ # Warn if files are present that aren't expected
224
247
  test_files = glob.glob(os.path.join(scratch_dir,'**/*'), recursive=True)
225
248
  test_files = [os.path.relpath(fn,scratch_dir).replace('\\','/') for fn in test_files]
226
249
  test_files_set = set(test_files)
@@ -336,6 +359,100 @@ def output_files_are_identical(fn1,fn2,verbose=False):
336
359
  # ...def output_files_are_identical(...)
337
360
 
338
361
 
362
+ def compare_results(inference_output_file,expected_results_file,options):
363
+ """
364
+ Compare two MD-formatted output files that should be nearly identical, allowing small
365
+ changes (e.g. rounding differences). Generally used to compare a new results file to
366
+ an expected results file.
367
+
368
+ Args:
369
+ inference_output_file (str): the first results file to compare
370
+ expected_results_file (str): the second results file to compare
371
+ options (MDTestOptions): options that determine tolerable differences between files
372
+ """
373
+
374
+ # Read results
375
+ with open(inference_output_file,'r') as f:
376
+ results_from_file = json.load(f) # noqa
377
+
378
+ with open(os.path.join(options.scratch_dir,expected_results_file),'r') as f:
379
+ expected_results = json.load(f)
380
+
381
+ filename_to_results = {im['file'].replace('\\','/'):im for im in results_from_file['images']}
382
+ filename_to_results_expected = {im['file'].replace('\\','/'):im for im in expected_results['images']}
383
+
384
+ assert len(filename_to_results) == len(filename_to_results_expected), \
385
+ 'Error: expected {} files in results, found {}'.format(
386
+ len(filename_to_results_expected),
387
+ len(filename_to_results))
388
+
389
+ max_coord_error = 0
390
+ max_conf_error = 0
391
+
392
+ # fn = next(iter(filename_to_results.keys()))
393
+ for fn in filename_to_results.keys():
394
+
395
+ actual_image_results = filename_to_results[fn]
396
+ expected_image_results = filename_to_results_expected[fn]
397
+
398
+ if 'failure' in actual_image_results:
399
+ assert 'failure' in expected_image_results and \
400
+ 'detections' not in actual_image_results and \
401
+ 'detections' not in expected_image_results
402
+ continue
403
+ assert 'failure' not in expected_image_results
404
+
405
+ actual_detections = actual_image_results['detections']
406
+ expected_detections = expected_image_results['detections']
407
+
408
+ s = 'expected {} detections for file {}, found {}'.format(
409
+ len(expected_detections),fn,len(actual_detections))
410
+ s += '\nExpected results file: {}\nActual results file: {}'.format(
411
+ expected_results_file,inference_output_file)
412
+
413
+ if options.warning_mode:
414
+ if len(actual_detections) != len(expected_detections):
415
+ print('Warning: {}'.format(s))
416
+ continue
417
+ assert len(actual_detections) == len(expected_detections), \
418
+ 'Error: {}'.format(s)
419
+
420
+ # i_det = 0
421
+ for i_det in range(0,len(actual_detections)):
422
+ actual_det = actual_detections[i_det]
423
+ expected_det = expected_detections[i_det]
424
+ assert actual_det['category'] == expected_det['category']
425
+ conf_err = abs(actual_det['conf'] - expected_det['conf'])
426
+ coord_differences = []
427
+ for i_coord in range(0,4):
428
+ coord_differences.append(abs(actual_det['bbox'][i_coord]-expected_det['bbox'][i_coord]))
429
+ coord_err = max(coord_differences)
430
+
431
+ if conf_err > max_conf_error:
432
+ max_conf_error = conf_err
433
+ if coord_err > max_coord_error:
434
+ max_coord_error = coord_err
435
+
436
+ # ...for each detection
437
+
438
+ # ...for each image
439
+
440
+ if not options.warning_mode:
441
+
442
+ assert max_conf_error <= options.max_conf_error, \
443
+ 'Confidence error {} is greater than allowable ({})'.format(
444
+ max_conf_error,options.max_conf_error)
445
+
446
+ assert max_coord_error <= options.max_coord_error, \
447
+ 'Coord error {} is greater than allowable ({})'.format(
448
+ max_coord_error,options.max_coord_error)
449
+
450
+ print('Max conf error: {}'.format(max_conf_error))
451
+ print('Max coord error: {}'.format(max_coord_error))
452
+
453
+ # ...def compare_results(...)
454
+
455
+
339
456
  def _args_to_object(args, obj):
340
457
  """
341
458
  Copies all fields from a Namespace (typically the output from parse_args) to an
@@ -449,6 +566,8 @@ def run_python_tests(options):
449
566
 
450
567
 
451
568
  ## Run inference on a folder
569
+
570
+ print('\n** Running MD on images **\n')
452
571
 
453
572
  from megadetector.detection.run_detector_batch import load_and_run_detector_batch,write_results_to_file
454
573
  from megadetector.utils import path_utils
@@ -458,95 +577,38 @@ def run_python_tests(options):
458
577
  inference_output_file = os.path.join(options.scratch_dir,'folder_inference_output.json')
459
578
  image_file_names = path_utils.find_images(image_folder,recursive=True)
460
579
  results = load_and_run_detector_batch(options.default_model, image_file_names, quiet=True)
461
- _ = write_results_to_file(results,inference_output_file,
462
- relative_path_base=image_folder,detector_file=options.default_model)
580
+ _ = write_results_to_file(results,
581
+ inference_output_file,
582
+ relative_path_base=image_folder,
583
+ detector_file=options.default_model)
463
584
 
464
- # Read results
465
- with open(inference_output_file,'r') as f:
466
- results_from_file = json.load(f) # noqa
467
585
 
468
-
469
586
  ## Verify results
470
587
 
471
- # Read expected results
472
- expected_results_filename = get_expected_results_filename(is_gpu_available(verbose=False))
473
-
474
- with open(os.path.join(options.scratch_dir,expected_results_filename),'r') as f:
475
- expected_results = json.load(f)
476
-
477
- filename_to_results = {im['file'].replace('\\','/'):im for im in results_from_file['images']}
478
- filename_to_results_expected = {im['file'].replace('\\','/'):im for im in expected_results['images']}
588
+ expected_results_file = get_expected_results_filename(is_gpu_available(verbose=False),
589
+ options=options)
590
+ compare_results(inference_output_file,expected_results_file,options)
591
+
592
+
593
+ ## Run and verify again with augmentation enabled
479
594
 
480
- assert len(filename_to_results) == len(filename_to_results_expected), \
481
- 'Error: expected {} files in results, found {}'.format(
482
- len(filename_to_results_expected),
483
- len(filename_to_results))
595
+ print('\n** Running MD on images with augmentation **\n')
484
596
 
485
- max_coord_error = 0
486
- max_conf_error = 0
597
+ from megadetector.utils.path_utils import insert_before_extension
487
598
 
488
- # fn = next(iter(filename_to_results.keys()))
489
- for fn in filename_to_results.keys():
490
-
491
- actual_image_results = filename_to_results[fn]
492
- expected_image_results = filename_to_results_expected[fn]
493
-
494
- if 'failure' in actual_image_results:
495
- assert 'failure' in expected_image_results and \
496
- 'detections' not in actual_image_results and \
497
- 'detections' not in expected_image_results
498
- continue
499
- assert 'failure' not in expected_image_results
500
-
501
- actual_detections = actual_image_results['detections']
502
- expected_detections = expected_image_results['detections']
503
-
504
- s = 'expected {} detections for file {}, found {}'.format(
505
- len(expected_detections),fn,len(actual_detections))
506
- s += '\nExpected results file: {}\nActual results file: {}'.format(
507
- expected_results_filename,inference_output_file)
508
-
509
- if options.warning_mode:
510
- if len(actual_detections) != len(expected_detections):
511
- print('Warning: {}'.format(s))
512
- continue
513
- assert len(actual_detections) == len(expected_detections), \
514
- 'Error: {}'.format(s)
515
-
516
- # i_det = 0
517
- for i_det in range(0,len(actual_detections)):
518
- actual_det = actual_detections[i_det]
519
- expected_det = expected_detections[i_det]
520
- assert actual_det['category'] == expected_det['category']
521
- conf_err = abs(actual_det['conf'] - expected_det['conf'])
522
- coord_differences = []
523
- for i_coord in range(0,4):
524
- coord_differences.append(abs(actual_det['bbox'][i_coord]-expected_det['bbox'][i_coord]))
525
- coord_err = max(coord_differences)
526
-
527
- if conf_err > max_conf_error:
528
- max_conf_error = conf_err
529
- if coord_err > max_coord_error:
530
- max_coord_error = coord_err
531
-
532
- # ...for each detection
599
+ inference_output_file_augmented = insert_before_extension(inference_output_file,'augmented')
600
+ results = load_and_run_detector_batch(options.default_model, image_file_names, quiet=True, augment=True)
601
+ _ = write_results_to_file(results,
602
+ inference_output_file_augmented,
603
+ relative_path_base=image_folder,
604
+ detector_file=options.default_model)
605
+
606
+ expected_results_file_augmented = \
607
+ get_expected_results_filename(is_gpu_available(verbose=False),
608
+ augment=True,options=options)
609
+ compare_results(inference_output_file_augmented,expected_results_file_augmented,options)
533
610
 
534
- # ...for each image
535
611
 
536
- if not options.warning_mode:
537
-
538
- assert max_conf_error <= options.max_conf_error, \
539
- 'Confidence error {} is greater than allowable ({})'.format(
540
- max_conf_error,options.max_conf_error)
541
-
542
- assert max_coord_error <= options.max_coord_error, \
543
- 'Coord error {} is greater than allowable ({})'.format(
544
- max_coord_error,options.max_coord_error)
545
-
546
- print('Max conf error: {}'.format(max_conf_error))
547
- print('Max coord error: {}'.format(max_coord_error))
548
-
549
-
550
612
  ## Postprocess results
551
613
 
552
614
  from megadetector.postprocessing.postprocess_batch_results import \
@@ -647,6 +709,8 @@ def run_python_tests(options):
647
709
 
648
710
  ## Video test (single video)
649
711
 
712
+ print('\n** Running MD on a single video **\n')
713
+
650
714
  from megadetector.detection.process_video import ProcessVideoOptions, process_video
651
715
 
652
716
  video_options = ProcessVideoOptions()
@@ -668,7 +732,7 @@ def run_python_tests(options):
668
732
  video_options.fourcc = options.video_fourcc
669
733
  # video_options.rendering_confidence_threshold = None
670
734
  # video_options.json_confidence_threshold = 0.005
671
- video_options.frame_sample = 5
735
+ video_options.frame_sample = 10
672
736
  video_options.n_cores = 5
673
737
  # video_options.debug_max_frames = -1
674
738
  # video_options.class_mapping_filename = None
@@ -683,6 +747,8 @@ def run_python_tests(options):
683
747
 
684
748
  ## Video test (folder)
685
749
 
750
+ print('\n** Running MD on a folder of videos **\n')
751
+
686
752
  from megadetector.detection.process_video import ProcessVideoOptions, process_video_folder
687
753
 
688
754
  video_options = ProcessVideoOptions()
@@ -705,15 +771,30 @@ def run_python_tests(options):
705
771
  video_options.fourcc = options.video_fourcc
706
772
  # video_options.rendering_confidence_threshold = None
707
773
  # video_options.json_confidence_threshold = 0.005
708
- video_options.frame_sample = 5
709
- video_options.n_cores = 5
774
+ video_options.frame_sample = 10
775
+ video_options.n_cores = 5
710
776
  # video_options.debug_max_frames = -1
711
777
  # video_options.class_mapping_filename = None
712
778
 
779
+ # Use quality == None, because we can't control whether YOLOv5 has patched cm2.imread,
780
+ # and therefore can't rely on using the quality parameter
781
+ video_options.quality = None
782
+
713
783
  _ = process_video_folder(video_options)
714
784
 
715
785
  assert os.path.isfile(video_options.output_json_file), \
716
786
  'Python video test failed to render output .json file'
787
+
788
+ frame_output_file = insert_before_extension(video_options.output_json_file,'frames')
789
+ assert os.path.isfile(frame_output_file)
790
+
791
+
792
+ ## Verify results
793
+
794
+ expected_results_file = \
795
+ get_expected_results_filename(is_gpu_available(verbose=False),test_type='video',options=options)
796
+ assert os.path.isfile(expected_results_file)
797
+ compare_results(frame_output_file,expected_results_file,options)
717
798
 
718
799
  # ...if we're not skipping video tests
719
800
 
@@ -925,7 +1006,7 @@ def run_cli_tests(options):
925
1006
  results_from_file = json.load(f) # noqa
926
1007
 
927
1008
 
928
- ## Run inference on a folder (augmented)
1009
+ ## Run inference on a folder (augmented, w/YOLOv5 val script)
929
1010
 
930
1011
  if options.yolo_working_dir is None:
931
1012
 
@@ -1218,3 +1299,37 @@ python md_tests.py --cli_working_dir "/mnt/c/git/MegaDetector" --yolo_working_di
1218
1299
 
1219
1300
  python -c "import md_tests; print(md_tests.get_expected_results_filename(True))"
1220
1301
  """
1302
+
1303
+
1304
+ #%% Scrap
1305
+
1306
+ if False:
1307
+
1308
+ pass
1309
+
1310
+ #%%
1311
+
1312
+ import sys; sys.path.append(r'c:\git\yolov5-md')
1313
+
1314
+ #%%
1315
+
1316
+ fn1 = r"G:\temp\md-test-package\mdv5a-video-cpu-pt1.10.1.frames.json"
1317
+ fn2 = r"G:\temp\md-test-package\mdv5a-video-gpu-pt1.10.1.frames.json"
1318
+ fn3 = r"G:\temp\md-test-package\mdv5a-video-cpu-pt2.x.frames.json"
1319
+ fn4 = r"G:\temp\md-test-package\mdv5a-video-gpu-pt2.x.frames.json"
1320
+
1321
+ assert all([os.path.isfile(fn) for fn in [fn1,fn2,fn3,fn4]])
1322
+ print(output_files_are_identical(fn1,fn1,verbose=False))
1323
+ print(output_files_are_identical(fn1,fn2,verbose=False))
1324
+ print(output_files_are_identical(fn1,fn3,verbose=False))
1325
+
1326
+ #%%
1327
+
1328
+ fn1 = r"G:\temp\md-test-package\mdv5a-image-gpu-pt1.10.1.json"
1329
+ fn2 = r"G:\temp\md-test-package\mdv5a-augment-image-gpu-pt1.10.1.json"
1330
+ print(output_files_are_identical(fn1,fn2,verbose=True))
1331
+
1332
+ fn1 = r"G:\temp\md-test-package\mdv5a-image-cpu-pt1.10.1.json"
1333
+ fn2 = r"G:\temp\md-test-package\mdv5a-augment-image-cpu-pt1.10.1.json"
1334
+ print(output_files_are_identical(fn1,fn2,verbose=True))
1335
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: megadetector
3
- Version: 5.0.14
3
+ Version: 5.0.15
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>
@@ -5,7 +5,7 @@ requires = [
5
5
 
6
6
  [project]
7
7
  name = "megadetector"
8
- version = "5.0.14"
8
+ version = "5.0.15"
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