megadetector 5.0.10__py3-none-any.whl → 5.0.12__py3-none-any.whl

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 (226) hide show
  1. {api → megadetector/api}/batch_processing/api_core/batch_service/score.py +2 -2
  2. {api → megadetector/api}/synchronous/api_core/animal_detection_api/api_backend.py +1 -1
  3. {api → megadetector/api}/synchronous/api_core/animal_detection_api/api_frontend.py +1 -1
  4. {classification → megadetector/classification}/analyze_failed_images.py +3 -3
  5. {classification → megadetector/classification}/cache_batchapi_outputs.py +1 -1
  6. {classification → megadetector/classification}/create_classification_dataset.py +1 -1
  7. {classification → megadetector/classification}/crop_detections.py +1 -1
  8. {classification → megadetector/classification}/detect_and_crop.py +5 -5
  9. {classification → megadetector/classification}/evaluate_model.py +1 -1
  10. {classification → megadetector/classification}/json_to_azcopy_list.py +2 -2
  11. {classification → megadetector/classification}/json_validator.py +13 -9
  12. {classification → megadetector/classification}/map_classification_categories.py +1 -1
  13. {classification → megadetector/classification}/merge_classification_detection_output.py +1 -1
  14. {classification → megadetector/classification}/run_classifier.py +2 -1
  15. {classification → megadetector/classification}/train_classifier.py +8 -6
  16. {classification → megadetector/classification}/train_classifier_tf.py +10 -9
  17. {classification → megadetector/classification}/train_utils.py +3 -2
  18. {data_management → megadetector/data_management}/camtrap_dp_to_coco.py +4 -3
  19. {data_management → megadetector/data_management}/cct_json_utils.py +2 -2
  20. {data_management → megadetector/data_management}/cct_to_md.py +1 -1
  21. {data_management → megadetector/data_management}/coco_to_labelme.py +1 -1
  22. {data_management → megadetector/data_management}/coco_to_yolo.py +1 -1
  23. {data_management → megadetector/data_management}/databases/integrity_check_json_db.py +2 -2
  24. {data_management → megadetector/data_management}/get_image_sizes.py +4 -3
  25. {data_management → megadetector/data_management}/importers/auckland_doc_test_to_json.py +6 -5
  26. {data_management → megadetector/data_management}/importers/auckland_doc_to_json.py +4 -3
  27. {data_management → megadetector/data_management}/importers/awc_to_json.py +6 -4
  28. {data_management → megadetector/data_management}/importers/bellevue_to_json.py +3 -3
  29. {data_management → megadetector/data_management}/importers/cacophony-thermal-importer.py +4 -4
  30. {data_management → megadetector/data_management}/importers/carrizo_shrubfree_2018.py +5 -4
  31. {data_management → megadetector/data_management}/importers/carrizo_trail_cam_2017.py +8 -6
  32. {data_management → megadetector/data_management}/importers/cct_field_adjustments.py +2 -1
  33. {data_management → megadetector/data_management}/importers/channel_islands_to_cct.py +2 -2
  34. {data_management → megadetector/data_management}/importers/ena24_to_json.py +6 -5
  35. {data_management → megadetector/data_management}/importers/filenames_to_json.py +2 -1
  36. {data_management → megadetector/data_management}/importers/helena_to_cct.py +7 -6
  37. {data_management → megadetector/data_management}/importers/idaho-camera-traps.py +6 -6
  38. {data_management → megadetector/data_management}/importers/idfg_iwildcam_lila_prep.py +4 -4
  39. {data_management → megadetector/data_management}/importers/jb_csv_to_json.py +1 -1
  40. {data_management → megadetector/data_management}/importers/missouri_to_json.py +4 -3
  41. {data_management → megadetector/data_management}/importers/noaa_seals_2019.py +2 -2
  42. {data_management → megadetector/data_management}/importers/pc_to_json.py +5 -5
  43. {data_management → megadetector/data_management}/importers/prepare-noaa-fish-data-for-lila.py +3 -3
  44. {data_management → megadetector/data_management}/importers/prepare_zsl_imerit.py +3 -3
  45. {data_management → megadetector/data_management}/importers/rspb_to_json.py +2 -2
  46. {data_management → megadetector/data_management}/importers/save_the_elephants_survey_A.py +4 -4
  47. {data_management → megadetector/data_management}/importers/save_the_elephants_survey_B.py +6 -9
  48. {data_management → megadetector/data_management}/importers/snapshot_safari_importer.py +4 -4
  49. {data_management → megadetector/data_management}/importers/snapshot_safari_importer_reprise.py +2 -2
  50. {data_management → megadetector/data_management}/importers/snapshot_serengeti_lila.py +4 -4
  51. {data_management → megadetector/data_management}/importers/timelapse_csv_set_to_json.py +3 -3
  52. {data_management → megadetector/data_management}/importers/ubc_to_json.py +3 -3
  53. {data_management → megadetector/data_management}/importers/umn_to_json.py +2 -2
  54. {data_management → megadetector/data_management}/importers/wellington_to_json.py +3 -3
  55. {data_management → megadetector/data_management}/importers/wi_to_json.py +3 -2
  56. {data_management → megadetector/data_management}/labelme_to_coco.py +6 -7
  57. {data_management → megadetector/data_management}/labelme_to_yolo.py +2 -2
  58. {data_management → megadetector/data_management}/lila/add_locations_to_island_camera_traps.py +4 -4
  59. {data_management → megadetector/data_management}/lila/create_lila_blank_set.py +10 -9
  60. {data_management → megadetector/data_management}/lila/create_lila_test_set.py +3 -2
  61. {data_management → megadetector/data_management}/lila/create_links_to_md_results_files.py +1 -1
  62. {data_management → megadetector/data_management}/lila/download_lila_subset.py +5 -4
  63. {data_management → megadetector/data_management}/lila/generate_lila_per_image_labels.py +6 -5
  64. {data_management → megadetector/data_management}/lila/get_lila_annotation_counts.py +2 -2
  65. {data_management → megadetector/data_management}/lila/get_lila_image_counts.py +2 -1
  66. {data_management → megadetector/data_management}/lila/lila_common.py +5 -5
  67. {data_management → megadetector/data_management}/lila/test_lila_metadata_urls.py +2 -2
  68. {data_management → megadetector/data_management}/ocr_tools.py +6 -6
  69. {data_management → megadetector/data_management}/read_exif.py +2 -2
  70. {data_management → megadetector/data_management}/remap_coco_categories.py +1 -1
  71. {data_management → megadetector/data_management}/remove_exif.py +1 -1
  72. {data_management → megadetector/data_management}/resize_coco_dataset.py +4 -4
  73. {data_management → megadetector/data_management}/wi_download_csv_to_coco.py +3 -3
  74. {data_management → megadetector/data_management}/yolo_output_to_md_output.py +5 -5
  75. {data_management → megadetector/data_management}/yolo_to_coco.py +9 -9
  76. {detection → megadetector/detection}/process_video.py +9 -10
  77. {detection → megadetector/detection}/pytorch_detector.py +12 -8
  78. {detection → megadetector/detection}/run_detector.py +6 -6
  79. {detection → megadetector/detection}/run_detector_batch.py +12 -12
  80. {detection → megadetector/detection}/run_inference_with_yolov5_val.py +12 -12
  81. {detection → megadetector/detection}/run_tiled_inference.py +8 -9
  82. {detection → megadetector/detection}/tf_detector.py +3 -2
  83. {detection → megadetector/detection}/video_utils.py +2 -2
  84. {api/batch_processing → megadetector}/postprocessing/add_max_conf.py +1 -1
  85. {api/batch_processing → megadetector}/postprocessing/categorize_detections_by_size.py +1 -1
  86. {api/batch_processing → megadetector}/postprocessing/combine_api_outputs.py +1 -1
  87. {api/batch_processing → megadetector}/postprocessing/compare_batch_results.py +5 -5
  88. {api/batch_processing → megadetector}/postprocessing/convert_output_format.py +4 -5
  89. {api/batch_processing → megadetector}/postprocessing/load_api_results.py +1 -1
  90. {api/batch_processing → megadetector}/postprocessing/md_to_coco.py +3 -3
  91. {api/batch_processing → megadetector}/postprocessing/md_to_labelme.py +3 -3
  92. {api/batch_processing → megadetector}/postprocessing/merge_detections.py +1 -1
  93. {api/batch_processing → megadetector}/postprocessing/postprocess_batch_results.py +19 -21
  94. {api/batch_processing → megadetector}/postprocessing/remap_detection_categories.py +1 -1
  95. {api/batch_processing → megadetector}/postprocessing/render_detection_confusion_matrix.py +5 -6
  96. {api/batch_processing → megadetector}/postprocessing/repeat_detection_elimination/find_repeat_detections.py +3 -3
  97. {api/batch_processing → megadetector}/postprocessing/repeat_detection_elimination/remove_repeat_detections.py +3 -2
  98. {api/batch_processing → megadetector}/postprocessing/repeat_detection_elimination/repeat_detections_core.py +11 -11
  99. {api/batch_processing → megadetector}/postprocessing/separate_detections_into_folders.py +3 -4
  100. {api/batch_processing → megadetector}/postprocessing/subset_json_detector_output.py +2 -2
  101. {api/batch_processing → megadetector}/postprocessing/top_folders_to_bottom.py +1 -1
  102. {taxonomy_mapping → megadetector/taxonomy_mapping}/map_lila_taxonomy_to_wi_taxonomy.py +2 -2
  103. {taxonomy_mapping → megadetector/taxonomy_mapping}/map_new_lila_datasets.py +2 -6
  104. {taxonomy_mapping → megadetector/taxonomy_mapping}/preview_lila_taxonomy.py +6 -7
  105. {taxonomy_mapping → megadetector/taxonomy_mapping}/retrieve_sample_image.py +1 -1
  106. {taxonomy_mapping → megadetector/taxonomy_mapping}/simple_image_download.py +2 -1
  107. {taxonomy_mapping → megadetector/taxonomy_mapping}/species_lookup.py +1 -1
  108. {taxonomy_mapping → megadetector/taxonomy_mapping}/taxonomy_csv_checker.py +1 -1
  109. {taxonomy_mapping → megadetector/taxonomy_mapping}/validate_lila_category_mappings.py +1 -1
  110. {md_utils → megadetector/utils}/azure_utils.py +7 -3
  111. {md_utils → megadetector/utils}/directory_listing.py +1 -1
  112. {md_utils → megadetector/utils}/md_tests.py +29 -29
  113. {md_utils → megadetector/utils}/split_locations_into_train_val.py +1 -1
  114. {md_utils → megadetector/utils}/write_html_image_list.py +1 -1
  115. {md_visualization → megadetector/visualization}/render_images_with_thumbnails.py +3 -3
  116. {md_visualization → megadetector/visualization}/visualization_utils.py +6 -7
  117. {md_visualization → megadetector/visualization}/visualize_db.py +3 -4
  118. {md_visualization → megadetector/visualization}/visualize_detector_output.py +9 -10
  119. {megadetector-5.0.10.dist-info → megadetector-5.0.12.dist-info}/LICENSE +0 -0
  120. {megadetector-5.0.10.dist-info → megadetector-5.0.12.dist-info}/METADATA +12 -11
  121. megadetector-5.0.12.dist-info/RECORD +199 -0
  122. megadetector-5.0.12.dist-info/top_level.txt +1 -0
  123. api/batch_processing/data_preparation/manage_local_batch.py +0 -2391
  124. api/batch_processing/data_preparation/manage_video_batch.py +0 -327
  125. api/synchronous/api_core/animal_detection_api/data_management/annotations/annotation_constants.py +0 -47
  126. api/synchronous/api_core/animal_detection_api/detection/detector_training/copy_checkpoints.py +0 -43
  127. api/synchronous/api_core/animal_detection_api/detection/process_video.py +0 -543
  128. api/synchronous/api_core/animal_detection_api/detection/pytorch_detector.py +0 -304
  129. api/synchronous/api_core/animal_detection_api/detection/run_detector.py +0 -627
  130. api/synchronous/api_core/animal_detection_api/detection/run_detector_batch.py +0 -1029
  131. api/synchronous/api_core/animal_detection_api/detection/run_inference_with_yolov5_val.py +0 -581
  132. api/synchronous/api_core/animal_detection_api/detection/run_tiled_inference.py +0 -754
  133. api/synchronous/api_core/animal_detection_api/detection/tf_detector.py +0 -165
  134. api/synchronous/api_core/animal_detection_api/detection/video_utils.py +0 -495
  135. api/synchronous/api_core/animal_detection_api/md_utils/azure_utils.py +0 -174
  136. api/synchronous/api_core/animal_detection_api/md_utils/ct_utils.py +0 -262
  137. api/synchronous/api_core/animal_detection_api/md_utils/directory_listing.py +0 -251
  138. api/synchronous/api_core/animal_detection_api/md_utils/matlab_porting_tools.py +0 -97
  139. api/synchronous/api_core/animal_detection_api/md_utils/path_utils.py +0 -416
  140. api/synchronous/api_core/animal_detection_api/md_utils/process_utils.py +0 -110
  141. api/synchronous/api_core/animal_detection_api/md_utils/sas_blob_utils.py +0 -509
  142. api/synchronous/api_core/animal_detection_api/md_utils/string_utils.py +0 -59
  143. api/synchronous/api_core/animal_detection_api/md_utils/url_utils.py +0 -144
  144. api/synchronous/api_core/animal_detection_api/md_utils/write_html_image_list.py +0 -226
  145. api/synchronous/api_core/animal_detection_api/md_visualization/visualization_utils.py +0 -841
  146. detection/detector_training/model_main_tf2.py +0 -114
  147. docs/source/conf.py +0 -43
  148. megadetector-5.0.10.dist-info/RECORD +0 -224
  149. megadetector-5.0.10.dist-info/top_level.txt +0 -8
  150. {api → megadetector/api}/__init__.py +0 -0
  151. {api → megadetector/api}/batch_processing/__init__.py +0 -0
  152. {api → megadetector/api}/batch_processing/api_core/__init__.py +0 -0
  153. {api → megadetector/api}/batch_processing/api_core/batch_service/__init__.py +0 -0
  154. {api → megadetector/api}/batch_processing/api_core/server.py +0 -0
  155. {api → megadetector/api}/batch_processing/api_core/server_api_config.py +0 -0
  156. {api → megadetector/api}/batch_processing/api_core/server_app_config.py +0 -0
  157. {api → megadetector/api}/batch_processing/api_core/server_batch_job_manager.py +0 -0
  158. {api → megadetector/api}/batch_processing/api_core/server_job_status_table.py +0 -0
  159. {api → megadetector/api}/batch_processing/api_core/server_orchestration.py +0 -0
  160. {api → megadetector/api}/batch_processing/api_core/server_utils.py +0 -0
  161. {api → megadetector/api}/batch_processing/api_core_support/__init__.py +0 -0
  162. {api → megadetector/api}/batch_processing/api_core_support/aggregate_results_manually.py +0 -0
  163. {api → megadetector/api}/batch_processing/api_support/__init__.py +0 -0
  164. {api → megadetector/api}/batch_processing/api_support/summarize_daily_activity.py +0 -0
  165. {api → megadetector/api}/batch_processing/data_preparation/__init__.py +0 -0
  166. {api → megadetector/api}/batch_processing/integration/digiKam/setup.py +0 -0
  167. {api → megadetector/api}/batch_processing/integration/digiKam/xmp_integration.py +0 -0
  168. {api → megadetector/api}/batch_processing/integration/eMammal/test_scripts/config_template.py +0 -0
  169. {api → megadetector/api}/batch_processing/integration/eMammal/test_scripts/push_annotations_to_emammal.py +0 -0
  170. {api → megadetector/api}/batch_processing/integration/eMammal/test_scripts/select_images_for_testing.py +0 -0
  171. {api/batch_processing/postprocessing → megadetector/api/synchronous}/__init__.py +0 -0
  172. {api/synchronous → megadetector/api/synchronous/api_core/animal_detection_api}/__init__.py +0 -0
  173. {api → megadetector/api}/synchronous/api_core/animal_detection_api/config.py +0 -0
  174. {api/synchronous/api_core/animal_detection_api → megadetector/api/synchronous/api_core/tests}/__init__.py +0 -0
  175. {api → megadetector/api}/synchronous/api_core/tests/load_test.py +0 -0
  176. {api/synchronous/api_core/tests → megadetector/classification}/__init__.py +0 -0
  177. {classification → megadetector/classification}/aggregate_classifier_probs.py +0 -0
  178. {classification → megadetector/classification}/csv_to_json.py +0 -0
  179. {classification → megadetector/classification}/efficientnet/__init__.py +0 -0
  180. {classification → megadetector/classification}/efficientnet/model.py +0 -0
  181. {classification → megadetector/classification}/efficientnet/utils.py +0 -0
  182. {classification → megadetector/classification}/identify_mislabeled_candidates.py +0 -0
  183. {classification → megadetector/classification}/prepare_classification_script.py +0 -0
  184. {classification → megadetector/classification}/prepare_classification_script_mc.py +0 -0
  185. {classification → megadetector/classification}/save_mislabeled.py +0 -0
  186. {classification → megadetector/data_management}/__init__.py +0 -0
  187. {data_management → megadetector/data_management/annotations}/__init__.py +0 -0
  188. {data_management → megadetector/data_management}/annotations/annotation_constants.py +0 -0
  189. {data_management → megadetector/data_management}/cct_to_wi.py +0 -0
  190. {data_management/annotations → megadetector/data_management/databases}/__init__.py +0 -0
  191. {data_management → megadetector/data_management}/databases/add_width_and_height_to_db.py +0 -0
  192. {data_management → megadetector/data_management}/databases/combine_coco_camera_traps_files.py +0 -0
  193. {data_management → megadetector/data_management}/databases/subset_json_db.py +0 -0
  194. {data_management → megadetector/data_management}/generate_crops_from_cct.py +0 -0
  195. {data_management → megadetector/data_management}/importers/add_nacti_sizes.py +0 -0
  196. {data_management → megadetector/data_management}/importers/add_timestamps_to_icct.py +0 -0
  197. {data_management → megadetector/data_management}/importers/animl_results_to_md_results.py +0 -0
  198. {data_management → megadetector/data_management}/importers/eMammal/copy_and_unzip_emammal.py +0 -0
  199. {data_management → megadetector/data_management}/importers/eMammal/eMammal_helpers.py +0 -0
  200. {data_management → megadetector/data_management}/importers/eMammal/make_eMammal_json.py +0 -0
  201. {data_management → megadetector/data_management}/importers/mcgill_to_json.py +0 -0
  202. {data_management → megadetector/data_management}/importers/nacti_fieldname_adjustments.py +0 -0
  203. {data_management → megadetector/data_management}/importers/plot_wni_giraffes.py +0 -0
  204. {data_management → megadetector/data_management}/importers/snapshotserengeti/make_full_SS_json.py +0 -0
  205. {data_management → megadetector/data_management}/importers/snapshotserengeti/make_per_season_SS_json.py +0 -0
  206. {data_management → megadetector/data_management}/importers/sulross_get_exif.py +0 -0
  207. {data_management → megadetector/data_management}/importers/zamba_results_to_md_results.py +0 -0
  208. {data_management/databases → megadetector/data_management/lila}/__init__.py +0 -0
  209. {data_management → megadetector/data_management}/lila/add_locations_to_nacti.py +0 -0
  210. {data_management/lila → megadetector/detection}/__init__.py +0 -0
  211. {detection → megadetector/detection/detector_training}/__init__.py +0 -0
  212. {api/synchronous/api_core/animal_detection_api → megadetector}/detection/detector_training/model_main_tf2.py +0 -0
  213. {detection/detector_training → megadetector/postprocessing}/__init__.py +0 -0
  214. {md_utils → megadetector/taxonomy_mapping}/__init__.py +0 -0
  215. {taxonomy_mapping → megadetector/taxonomy_mapping}/prepare_lila_taxonomy_release.py +0 -0
  216. {taxonomy_mapping → megadetector/taxonomy_mapping}/taxonomy_graph.py +0 -0
  217. {md_visualization → megadetector/utils}/__init__.py +0 -0
  218. {md_utils → megadetector/utils}/ct_utils.py +0 -0
  219. {md_utils → megadetector/utils}/path_utils.py +0 -0
  220. {md_utils → megadetector/utils}/process_utils.py +0 -0
  221. {md_utils → megadetector/utils}/sas_blob_utils.py +0 -0
  222. {md_utils → megadetector/utils}/string_utils.py +0 -0
  223. {md_utils → megadetector/utils}/url_utils.py +0 -0
  224. {taxonomy_mapping → megadetector/visualization}/__init__.py +0 -0
  225. {md_visualization → megadetector/visualization}/plot_utils.py +0 -0
  226. {megadetector-5.0.10.dist-info → megadetector-5.0.12.dist-info}/WHEEL +0 -0
@@ -1,304 +0,0 @@
1
- ########
2
- #
3
- # pytorch_detector.py
4
- #
5
- # Module to run MegaDetector v5, a PyTorch YOLOv5 animal detection model.
6
- #
7
- ########
8
-
9
- #%% Imports
10
-
11
- import torch
12
- import numpy as np
13
- import traceback
14
-
15
- from detection.run_detector import CONF_DIGITS, COORD_DIGITS, FAILURE_INFER
16
- from md_utils import ct_utils
17
-
18
- # We support a few ways of accessing the YOLOv5 dependencies:
19
- #
20
- # * The standard configuration as of 9.2023 expects that the YOLOv5 repo is checked
21
- # out and on the PYTHONPATH (import utils)
22
- #
23
- # * Experimental: pip install ultralytics (doesn't totally work yet)
24
- #
25
- # * Experimental but works so far: pip install yolov5
26
-
27
- utils_imported = False
28
- try_yolov5_import = True
29
-
30
- # This still encounters some namespace issues
31
- try_ultralytics_import = False
32
-
33
- # First try importing from the yolov5 package
34
- if try_yolov5_import and not utils_imported:
35
-
36
- try:
37
- from yolov5.utils.general import non_max_suppression, xyxy2xywh # noqa
38
- from yolov5.utils.augmentations import letterbox # noqa
39
- from yolov5.utils.general import scale_boxes as scale_coords # noqa
40
- utils_imported = True
41
- print('Imported YOLOv5 from YOLOv5 package')
42
- except Exception:
43
- # print('YOLOv5 module import failed, falling back to path-based import')
44
- pass
45
-
46
- # If we haven't succeeded yet, import from the ultralytics package
47
- if try_ultralytics_import and not utils_imported:
48
-
49
- try:
50
- from ultralytics.utils.ops import non_max_suppression # noqa
51
- from ultralytics.utils.ops import xyxy2xywh # noqa
52
- from ultralytics.utils.ops import scale_coords # noqa
53
- from ultralytics.data.augment import LetterBox
54
-
55
- # letterbox() became a LetterBox class in the ultralytics package
56
- def letterbox(img,new_shape,stride,auto=True): # noqa
57
- L = LetterBox(new_shape,stride=stride,auto=auto)
58
- letterbox_result = L(image=img)
59
- return [letterbox_result]
60
- utils_imported = True
61
- print('Imported YOLOv5 from ultralytics package')
62
- except Exception:
63
- # print('Ultralytics module import failed, falling back to yolov5 import')
64
- pass
65
-
66
- # If we haven't succeeded yet, import from the YOLOv5 repo
67
- if not utils_imported:
68
-
69
- try:
70
- # import pre- and post-processing functions from the YOLOv5 repo
71
- from utils.general import non_max_suppression, xyxy2xywh # noqa
72
- from utils.augmentations import letterbox # noqa
73
-
74
- # scale_coords() became scale_boxes() in later YOLOv5 versions
75
- try:
76
- from utils.general import scale_coords # noqa
77
- except ImportError:
78
- from utils.general import scale_boxes as scale_coords
79
- utils_imported = True
80
- print('Imported YOLOv5 from PYTHONPATH')
81
- except ModuleNotFoundError:
82
- raise ModuleNotFoundError('Could not import YOLOv5 functions.')
83
-
84
- assert utils_imported, 'YOLOv5 import error'
85
-
86
- print(f'Using PyTorch version {torch.__version__}')
87
-
88
-
89
- #%% Classes
90
-
91
- class PTDetector:
92
-
93
- IMAGE_SIZE = 1280 # image size used in training
94
- STRIDE = 64
95
-
96
- def __init__(self, model_path: str,
97
- force_cpu: bool = False,
98
- use_model_native_classes: bool = False):
99
- self.device = 'cpu'
100
- if not force_cpu:
101
- if torch.cuda.is_available():
102
- self.device = torch.device('cuda:0')
103
- try:
104
- if torch.backends.mps.is_built and torch.backends.mps.is_available():
105
- self.device = 'mps'
106
- except AttributeError:
107
- pass
108
- self.model = PTDetector._load_model(model_path, self.device)
109
- if (self.device != 'cpu'):
110
- print('Sending model to GPU')
111
- self.model.to(self.device)
112
-
113
- self.printed_image_size_warning = False
114
- self.use_model_native_classes = use_model_native_classes
115
-
116
-
117
- @staticmethod
118
- def _load_model(model_pt_path, device):
119
-
120
- # There are two very slightly different ways to load the model, (1) using the
121
- # map_location=device parameter to torch.load and (2) calling .to(device) after
122
- # loading the model. The former is what we did for a zillion years, but is not
123
- # supported on Apple silicon at of 2029.09. Switching to the latter causes
124
- # very slight changes to the output, which always make me nervous, so I'm not
125
- # doing a wholesale swap just yet. Instead, we'll just do this on M1 hardware.
126
- use_map_location = (device != 'mps')
127
-
128
- if use_map_location:
129
- checkpoint = torch.load(model_pt_path, map_location=device)
130
- else:
131
- checkpoint = torch.load(model_pt_path)
132
-
133
- # Compatibility fix that allows us to load older YOLOv5 models with
134
- # newer versions of YOLOv5/PT
135
- for m in checkpoint['model'].modules():
136
- t = type(m)
137
- if t is torch.nn.Upsample and not hasattr(m, 'recompute_scale_factor'):
138
- m.recompute_scale_factor = None
139
-
140
- if use_map_location:
141
- model = checkpoint['model'].float().fuse().eval()
142
- else:
143
- model = checkpoint['model'].float().fuse().eval().to(device)
144
-
145
- return model
146
-
147
- def generate_detections_one_image(self, img_original, image_id='unknown',
148
- detection_threshold=0.00001, image_size=None,
149
- skip_image_resizing=False):
150
- """
151
- Apply the detector to an image.
152
-
153
- Args:
154
- img_original: the PIL Image object with EXIF rotation taken into account
155
- image_id: a path to identify the image; will be in the "file" field of the output object
156
- detection_threshold: confidence above which to include the detection proposal
157
- skip_image_resizing: whether to skip internal image resizing and rely on external resizing
158
-
159
- Returns:
160
- A dict with the following fields, see the 'images' key in https://github.com/agentmorris/MegaDetector/tree/master/api/batch_processing#batch-processing-api-output-format
161
- - 'file' (always present)
162
- - 'max_detection_conf' (removed from MegaDetector output by default, but generated here)
163
- - 'detections', which is a list of detection objects containing keys 'category',
164
- 'conf' and 'bbox'
165
- - 'failure'
166
- """
167
-
168
- result = {
169
- 'file': image_id
170
- }
171
- detections = []
172
- max_conf = 0.0
173
-
174
- try:
175
-
176
- img_original = np.asarray(img_original)
177
-
178
- # padded resize
179
- target_size = PTDetector.IMAGE_SIZE
180
-
181
- # Image size can be an int (which translates to a square target size) or (h,w)
182
- if image_size is not None:
183
-
184
- assert isinstance(image_size,int) or (len(image_size)==2)
185
-
186
- if not self.printed_image_size_warning:
187
- print('Warning: using user-supplied image size {}'.format(image_size))
188
- self.printed_image_size_warning = True
189
-
190
- target_size = image_size
191
-
192
- else:
193
-
194
- self.printed_image_size_warning = False
195
-
196
- # ...if the caller has specified an image size
197
-
198
- if skip_image_resizing:
199
- img = img_original
200
- else:
201
- letterbox_result = letterbox(img_original, new_shape=target_size,
202
- stride=PTDetector.STRIDE, auto=True)
203
- img = letterbox_result[0]
204
-
205
- # HWC to CHW; PIL Image is RGB already
206
- img = img.transpose((2, 0, 1))
207
- img = np.ascontiguousarray(img)
208
- img = torch.from_numpy(img)
209
- img = img.to(self.device)
210
- img = img.float()
211
- img /= 255
212
-
213
- # In practice this is always true
214
- if len(img.shape) == 3:
215
- img = torch.unsqueeze(img, 0)
216
-
217
- pred: list = self.model(img)[0]
218
-
219
- # NMS
220
- if self.device == 'mps':
221
- # As of v1.13.0.dev20220824, nms is not implemented for MPS.
222
- #
223
- # Send predication back to the CPU to fix.
224
- pred = non_max_suppression(prediction=pred.cpu(), conf_thres=detection_threshold)
225
- else:
226
- pred = non_max_suppression(prediction=pred, conf_thres=detection_threshold)
227
-
228
- # format detections/bounding boxes
229
- #
230
- # normalization gain whwh
231
- gn = torch.tensor(img_original.shape)[[1, 0, 1, 0]]
232
-
233
- # This is a loop over detection batches, which will always be length 1 in our case,
234
- # since we're not doing batch inference.
235
- for det in pred:
236
-
237
- if len(det):
238
-
239
- # Rescale boxes from img_size to im0 size
240
- det[:, :4] = scale_coords(img.shape[2:], det[:, :4], img_original.shape).round()
241
-
242
- for *xyxy, conf, cls in reversed(det):
243
-
244
- # normalized center-x, center-y, width and height
245
- xywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(-1).tolist()
246
-
247
- api_box = ct_utils.convert_yolo_to_xywh(xywh)
248
-
249
- conf = ct_utils.truncate_float(conf.tolist(), precision=CONF_DIGITS)
250
-
251
- if not self.use_model_native_classes:
252
- # MegaDetector output format's categories start at 1, but the MD
253
- # model's categories start at 0.
254
- cls = int(cls.tolist()) + 1
255
- if cls not in (1, 2, 3):
256
- raise KeyError(f'{cls} is not a valid class.')
257
- else:
258
- cls = int(cls.tolist())
259
-
260
- detections.append({
261
- 'category': str(cls),
262
- 'conf': conf,
263
- 'bbox': ct_utils.truncate_float_array(api_box, precision=COORD_DIGITS)
264
- })
265
- max_conf = max(max_conf, conf)
266
-
267
- # ...for each detection in this batch
268
-
269
- # ...if this is a non-empty batch
270
-
271
- # ...for each detection batch
272
-
273
- # ...try
274
-
275
- except Exception as e:
276
-
277
- result['failure'] = FAILURE_INFER
278
- print('PTDetector: image {} failed during inference: {}\n'.format(image_id, str(e)))
279
- traceback.print_exc(e)
280
-
281
- result['max_detection_conf'] = max_conf
282
- result['detections'] = detections
283
-
284
- return result
285
-
286
-
287
- #%% Command-line driver
288
-
289
- if __name__ == '__main__':
290
-
291
- # For testing only... you don't really want to run this module directly
292
-
293
- #%%
294
-
295
- import md_visualization.visualization_utils as vis_utils
296
- import os
297
-
298
- model_file = os.path.expanduser('~/models/camera_traps/megadetector/md_v5.0.0/md_v5a.0.0.pt')
299
- im_file = r"G:\temp\coyote\DSCF0043.JPG"
300
-
301
- detector = PTDetector(model_file)
302
- image = vis_utils.load_image(im_file)
303
-
304
- res = detector.generate_detections_one_image(image, im_file, detection_threshold=0.00001)