megadetector 5.0.28__py3-none-any.whl → 10.0.0__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 (197) hide show
  1. megadetector/api/batch_processing/integration/digiKam/xmp_integration.py +2 -2
  2. megadetector/api/batch_processing/integration/eMammal/test_scripts/push_annotations_to_emammal.py +1 -1
  3. megadetector/api/batch_processing/integration/eMammal/test_scripts/select_images_for_testing.py +1 -1
  4. megadetector/classification/aggregate_classifier_probs.py +3 -3
  5. megadetector/classification/analyze_failed_images.py +5 -5
  6. megadetector/classification/cache_batchapi_outputs.py +5 -5
  7. megadetector/classification/create_classification_dataset.py +11 -12
  8. megadetector/classification/crop_detections.py +10 -10
  9. megadetector/classification/csv_to_json.py +8 -8
  10. megadetector/classification/detect_and_crop.py +13 -15
  11. megadetector/classification/efficientnet/model.py +8 -8
  12. megadetector/classification/efficientnet/utils.py +6 -5
  13. megadetector/classification/evaluate_model.py +7 -7
  14. megadetector/classification/identify_mislabeled_candidates.py +6 -6
  15. megadetector/classification/json_to_azcopy_list.py +1 -1
  16. megadetector/classification/json_validator.py +29 -32
  17. megadetector/classification/map_classification_categories.py +9 -9
  18. megadetector/classification/merge_classification_detection_output.py +12 -9
  19. megadetector/classification/prepare_classification_script.py +19 -19
  20. megadetector/classification/prepare_classification_script_mc.py +26 -26
  21. megadetector/classification/run_classifier.py +4 -4
  22. megadetector/classification/save_mislabeled.py +6 -6
  23. megadetector/classification/train_classifier.py +1 -1
  24. megadetector/classification/train_classifier_tf.py +9 -9
  25. megadetector/classification/train_utils.py +10 -10
  26. megadetector/data_management/annotations/annotation_constants.py +1 -2
  27. megadetector/data_management/camtrap_dp_to_coco.py +79 -46
  28. megadetector/data_management/cct_json_utils.py +103 -103
  29. megadetector/data_management/cct_to_md.py +49 -49
  30. megadetector/data_management/cct_to_wi.py +33 -33
  31. megadetector/data_management/coco_to_labelme.py +75 -75
  32. megadetector/data_management/coco_to_yolo.py +210 -193
  33. megadetector/data_management/databases/add_width_and_height_to_db.py +86 -12
  34. megadetector/data_management/databases/combine_coco_camera_traps_files.py +40 -40
  35. megadetector/data_management/databases/integrity_check_json_db.py +228 -200
  36. megadetector/data_management/databases/subset_json_db.py +33 -33
  37. megadetector/data_management/generate_crops_from_cct.py +88 -39
  38. megadetector/data_management/get_image_sizes.py +54 -49
  39. megadetector/data_management/labelme_to_coco.py +133 -125
  40. megadetector/data_management/labelme_to_yolo.py +159 -73
  41. megadetector/data_management/lila/create_lila_blank_set.py +81 -83
  42. megadetector/data_management/lila/create_lila_test_set.py +32 -31
  43. megadetector/data_management/lila/create_links_to_md_results_files.py +18 -18
  44. megadetector/data_management/lila/download_lila_subset.py +21 -24
  45. megadetector/data_management/lila/generate_lila_per_image_labels.py +365 -107
  46. megadetector/data_management/lila/get_lila_annotation_counts.py +35 -33
  47. megadetector/data_management/lila/get_lila_image_counts.py +22 -22
  48. megadetector/data_management/lila/lila_common.py +73 -70
  49. megadetector/data_management/lila/test_lila_metadata_urls.py +28 -19
  50. megadetector/data_management/mewc_to_md.py +344 -340
  51. megadetector/data_management/ocr_tools.py +262 -255
  52. megadetector/data_management/read_exif.py +249 -227
  53. megadetector/data_management/remap_coco_categories.py +90 -28
  54. megadetector/data_management/remove_exif.py +81 -21
  55. megadetector/data_management/rename_images.py +187 -187
  56. megadetector/data_management/resize_coco_dataset.py +588 -120
  57. megadetector/data_management/speciesnet_to_md.py +41 -41
  58. megadetector/data_management/wi_download_csv_to_coco.py +55 -55
  59. megadetector/data_management/yolo_output_to_md_output.py +248 -122
  60. megadetector/data_management/yolo_to_coco.py +333 -191
  61. megadetector/detection/change_detection.py +832 -0
  62. megadetector/detection/process_video.py +340 -337
  63. megadetector/detection/pytorch_detector.py +358 -278
  64. megadetector/detection/run_detector.py +399 -186
  65. megadetector/detection/run_detector_batch.py +404 -377
  66. megadetector/detection/run_inference_with_yolov5_val.py +340 -327
  67. megadetector/detection/run_tiled_inference.py +257 -249
  68. megadetector/detection/tf_detector.py +24 -24
  69. megadetector/detection/video_utils.py +332 -295
  70. megadetector/postprocessing/add_max_conf.py +19 -11
  71. megadetector/postprocessing/categorize_detections_by_size.py +45 -45
  72. megadetector/postprocessing/classification_postprocessing.py +468 -433
  73. megadetector/postprocessing/combine_batch_outputs.py +23 -23
  74. megadetector/postprocessing/compare_batch_results.py +590 -525
  75. megadetector/postprocessing/convert_output_format.py +106 -102
  76. megadetector/postprocessing/create_crop_folder.py +347 -147
  77. megadetector/postprocessing/detector_calibration.py +173 -168
  78. megadetector/postprocessing/generate_csv_report.py +508 -499
  79. megadetector/postprocessing/load_api_results.py +48 -27
  80. megadetector/postprocessing/md_to_coco.py +133 -102
  81. megadetector/postprocessing/md_to_labelme.py +107 -90
  82. megadetector/postprocessing/md_to_wi.py +40 -40
  83. megadetector/postprocessing/merge_detections.py +92 -114
  84. megadetector/postprocessing/postprocess_batch_results.py +319 -301
  85. megadetector/postprocessing/remap_detection_categories.py +91 -38
  86. megadetector/postprocessing/render_detection_confusion_matrix.py +214 -205
  87. megadetector/postprocessing/repeat_detection_elimination/find_repeat_detections.py +57 -57
  88. megadetector/postprocessing/repeat_detection_elimination/remove_repeat_detections.py +27 -28
  89. megadetector/postprocessing/repeat_detection_elimination/repeat_detections_core.py +704 -679
  90. megadetector/postprocessing/separate_detections_into_folders.py +226 -211
  91. megadetector/postprocessing/subset_json_detector_output.py +265 -262
  92. megadetector/postprocessing/top_folders_to_bottom.py +45 -45
  93. megadetector/postprocessing/validate_batch_results.py +70 -70
  94. megadetector/taxonomy_mapping/map_lila_taxonomy_to_wi_taxonomy.py +52 -52
  95. megadetector/taxonomy_mapping/map_new_lila_datasets.py +18 -19
  96. megadetector/taxonomy_mapping/prepare_lila_taxonomy_release.py +54 -33
  97. megadetector/taxonomy_mapping/preview_lila_taxonomy.py +67 -67
  98. megadetector/taxonomy_mapping/retrieve_sample_image.py +16 -16
  99. megadetector/taxonomy_mapping/simple_image_download.py +8 -8
  100. megadetector/taxonomy_mapping/species_lookup.py +156 -74
  101. megadetector/taxonomy_mapping/taxonomy_csv_checker.py +14 -14
  102. megadetector/taxonomy_mapping/taxonomy_graph.py +10 -10
  103. megadetector/taxonomy_mapping/validate_lila_category_mappings.py +13 -13
  104. megadetector/utils/ct_utils.py +1049 -211
  105. megadetector/utils/directory_listing.py +21 -77
  106. megadetector/utils/gpu_test.py +22 -22
  107. megadetector/utils/md_tests.py +632 -529
  108. megadetector/utils/path_utils.py +1520 -431
  109. megadetector/utils/process_utils.py +41 -41
  110. megadetector/utils/split_locations_into_train_val.py +62 -62
  111. megadetector/utils/string_utils.py +148 -27
  112. megadetector/utils/url_utils.py +489 -176
  113. megadetector/utils/wi_utils.py +2658 -2526
  114. megadetector/utils/write_html_image_list.py +137 -137
  115. megadetector/visualization/plot_utils.py +34 -30
  116. megadetector/visualization/render_images_with_thumbnails.py +39 -74
  117. megadetector/visualization/visualization_utils.py +487 -435
  118. megadetector/visualization/visualize_db.py +232 -198
  119. megadetector/visualization/visualize_detector_output.py +82 -76
  120. {megadetector-5.0.28.dist-info → megadetector-10.0.0.dist-info}/METADATA +5 -2
  121. megadetector-10.0.0.dist-info/RECORD +139 -0
  122. {megadetector-5.0.28.dist-info → megadetector-10.0.0.dist-info}/WHEEL +1 -1
  123. megadetector/api/batch_processing/api_core/__init__.py +0 -0
  124. megadetector/api/batch_processing/api_core/batch_service/__init__.py +0 -0
  125. megadetector/api/batch_processing/api_core/batch_service/score.py +0 -439
  126. megadetector/api/batch_processing/api_core/server.py +0 -294
  127. megadetector/api/batch_processing/api_core/server_api_config.py +0 -97
  128. megadetector/api/batch_processing/api_core/server_app_config.py +0 -55
  129. megadetector/api/batch_processing/api_core/server_batch_job_manager.py +0 -220
  130. megadetector/api/batch_processing/api_core/server_job_status_table.py +0 -149
  131. megadetector/api/batch_processing/api_core/server_orchestration.py +0 -360
  132. megadetector/api/batch_processing/api_core/server_utils.py +0 -88
  133. megadetector/api/batch_processing/api_core_support/__init__.py +0 -0
  134. megadetector/api/batch_processing/api_core_support/aggregate_results_manually.py +0 -46
  135. megadetector/api/batch_processing/api_support/__init__.py +0 -0
  136. megadetector/api/batch_processing/api_support/summarize_daily_activity.py +0 -152
  137. megadetector/api/batch_processing/data_preparation/__init__.py +0 -0
  138. megadetector/api/synchronous/__init__.py +0 -0
  139. megadetector/api/synchronous/api_core/animal_detection_api/__init__.py +0 -0
  140. megadetector/api/synchronous/api_core/animal_detection_api/api_backend.py +0 -151
  141. megadetector/api/synchronous/api_core/animal_detection_api/api_frontend.py +0 -263
  142. megadetector/api/synchronous/api_core/animal_detection_api/config.py +0 -35
  143. megadetector/api/synchronous/api_core/tests/__init__.py +0 -0
  144. megadetector/api/synchronous/api_core/tests/load_test.py +0 -110
  145. megadetector/data_management/importers/add_nacti_sizes.py +0 -52
  146. megadetector/data_management/importers/add_timestamps_to_icct.py +0 -79
  147. megadetector/data_management/importers/animl_results_to_md_results.py +0 -158
  148. megadetector/data_management/importers/auckland_doc_test_to_json.py +0 -373
  149. megadetector/data_management/importers/auckland_doc_to_json.py +0 -201
  150. megadetector/data_management/importers/awc_to_json.py +0 -191
  151. megadetector/data_management/importers/bellevue_to_json.py +0 -272
  152. megadetector/data_management/importers/cacophony-thermal-importer.py +0 -793
  153. megadetector/data_management/importers/carrizo_shrubfree_2018.py +0 -269
  154. megadetector/data_management/importers/carrizo_trail_cam_2017.py +0 -289
  155. megadetector/data_management/importers/cct_field_adjustments.py +0 -58
  156. megadetector/data_management/importers/channel_islands_to_cct.py +0 -913
  157. megadetector/data_management/importers/eMammal/copy_and_unzip_emammal.py +0 -180
  158. megadetector/data_management/importers/eMammal/eMammal_helpers.py +0 -249
  159. megadetector/data_management/importers/eMammal/make_eMammal_json.py +0 -223
  160. megadetector/data_management/importers/ena24_to_json.py +0 -276
  161. megadetector/data_management/importers/filenames_to_json.py +0 -386
  162. megadetector/data_management/importers/helena_to_cct.py +0 -283
  163. megadetector/data_management/importers/idaho-camera-traps.py +0 -1407
  164. megadetector/data_management/importers/idfg_iwildcam_lila_prep.py +0 -294
  165. megadetector/data_management/importers/import_desert_lion_conservation_camera_traps.py +0 -387
  166. megadetector/data_management/importers/jb_csv_to_json.py +0 -150
  167. megadetector/data_management/importers/mcgill_to_json.py +0 -250
  168. megadetector/data_management/importers/missouri_to_json.py +0 -490
  169. megadetector/data_management/importers/nacti_fieldname_adjustments.py +0 -79
  170. megadetector/data_management/importers/noaa_seals_2019.py +0 -181
  171. megadetector/data_management/importers/osu-small-animals-to-json.py +0 -364
  172. megadetector/data_management/importers/pc_to_json.py +0 -365
  173. megadetector/data_management/importers/plot_wni_giraffes.py +0 -123
  174. megadetector/data_management/importers/prepare_zsl_imerit.py +0 -131
  175. megadetector/data_management/importers/raic_csv_to_md_results.py +0 -416
  176. megadetector/data_management/importers/rspb_to_json.py +0 -356
  177. megadetector/data_management/importers/save_the_elephants_survey_A.py +0 -320
  178. megadetector/data_management/importers/save_the_elephants_survey_B.py +0 -329
  179. megadetector/data_management/importers/snapshot_safari_importer.py +0 -758
  180. megadetector/data_management/importers/snapshot_serengeti_lila.py +0 -1067
  181. megadetector/data_management/importers/snapshotserengeti/make_full_SS_json.py +0 -150
  182. megadetector/data_management/importers/snapshotserengeti/make_per_season_SS_json.py +0 -153
  183. megadetector/data_management/importers/sulross_get_exif.py +0 -65
  184. megadetector/data_management/importers/timelapse_csv_set_to_json.py +0 -490
  185. megadetector/data_management/importers/ubc_to_json.py +0 -399
  186. megadetector/data_management/importers/umn_to_json.py +0 -507
  187. megadetector/data_management/importers/wellington_to_json.py +0 -263
  188. megadetector/data_management/importers/wi_to_json.py +0 -442
  189. megadetector/data_management/importers/zamba_results_to_md_results.py +0 -180
  190. megadetector/data_management/lila/add_locations_to_island_camera_traps.py +0 -101
  191. megadetector/data_management/lila/add_locations_to_nacti.py +0 -151
  192. megadetector/utils/azure_utils.py +0 -178
  193. megadetector/utils/sas_blob_utils.py +0 -509
  194. megadetector-5.0.28.dist-info/RECORD +0 -209
  195. /megadetector/{api/batch_processing/__init__.py → __init__.py} +0 -0
  196. {megadetector-5.0.28.dist-info → megadetector-10.0.0.dist-info}/licenses/LICENSE +0 -0
  197. {megadetector-5.0.28.dist-info → megadetector-10.0.0.dist-info}/top_level.txt +0 -0
@@ -2,7 +2,7 @@
2
2
 
3
3
  remap_detection_categories.py
4
4
 
5
- Given a MegaDetector results file, remap the category IDs according to a specified
5
+ Given a MegaDetector results file, remap the category IDs according to a specified
6
6
  dictionary, writing the results to a new file.
7
7
 
8
8
  Currently only supports remapping detection categories, not classification categories.
@@ -11,8 +11,9 @@ Currently only supports remapping detection categories, not classification categ
11
11
 
12
12
  #%% Constants and imports
13
13
 
14
- import json
15
14
  import os
15
+ import json
16
+ import argparse
16
17
 
17
18
  from tqdm import tqdm
18
19
 
@@ -28,13 +29,13 @@ def remap_detection_categories(input_file,
28
29
  overwrite=False):
29
30
  """
30
31
  Given a MegaDetector results file [input_file], remap the category IDs according to the dictionary
31
- [target_category_map], writing the results to [output_file]. The remapped dictionary needs to have
32
+ [target_category_map], writing the results to [output_file]. The remapped dictionary needs to have
32
33
  the same category names as the input file's detection_categories dictionary.
33
-
34
+
34
35
  Typically used to map, e.g., a variety of species to the class "mammal" or the class "animal".
35
-
36
+
36
37
  Currently only supports remapping detection categories, not classification categories.
37
-
38
+
38
39
  Args:
39
40
  input_file (str): the MD .json results file to remap
40
41
  output_file (str): the remapped .json file to write
@@ -43,21 +44,21 @@ def remap_detection_categories(input_file,
43
44
  detection_categories dictionary.
44
45
  extra_category_handling (str, optional): specifies what we should do if categories are present
45
46
  in the source file that are not present in the target mapping:
46
-
47
+
47
48
  * 'error' == Error in this case.
48
- * 'drop_if_unused' == Don't include these in the output file's category mappings if they are
49
+ * 'drop_if_unused' == Don't include these in the output file's category mappings if they are
49
50
  unused, error if they are.
50
51
  * 'remap' == Remap to unused category IDs. This is reserved for future use, not currently
51
52
  implemented.
52
53
  overwrite (bool, optional): whether to overwrite [output_file] if it exists; if this is True and
53
54
  [output_file] exists, this function is a no-op
54
-
55
+
55
56
  """
56
-
57
+
57
58
  if os.path.exists(output_file) and (not overwrite):
58
- print('File {} exists, bypassing remapping'.format(output_file))
59
+ print('File {} exists, bypassing remapping'.format(output_file))
59
60
  return
60
-
61
+
61
62
  assert os.path.isfile(input_file), \
62
63
  'File {} does not exist'.format(input_file)
63
64
 
@@ -69,27 +70,27 @@ def remap_detection_categories(input_file,
69
70
  d = json.load(f)
70
71
  target_category_map = d['detection_categories']
71
72
  assert isinstance(target_category_map,dict)
72
-
73
+
73
74
  with open(input_file,'r') as f:
74
75
  input_data = json.load(f)
75
-
76
+
76
77
  input_images = input_data['images']
77
78
  input_categories = input_data['detection_categories']
78
-
79
+
79
80
  # Figure out which categories are actually used
80
81
  used_category_ids = set()
81
82
  for im in input_images:
82
-
83
+
83
84
  if 'detections' not in im or im['detections'] is None:
84
85
  continue
85
-
86
+
86
87
  for det in im['detections']:
87
88
  used_category_ids.add(det['category'])
88
89
  used_category_names = [input_categories[cid] for cid in used_category_ids]
89
-
90
+
90
91
  input_names_set = set(input_categories.values())
91
92
  output_names_set = set(target_category_map.values())
92
-
93
+
93
94
  # category_name = list(input_names_set)[0]
94
95
  for category_name in input_names_set:
95
96
  if category_name in output_names_set:
@@ -109,9 +110,9 @@ def remap_detection_categories(input_file,
109
110
  else:
110
111
  raise ValueError('Unrecognized extra category handling scheme {}'.format(
111
112
  extra_category_handling))
112
-
113
+
113
114
  output_category_name_to_output_category_id = invert_dictionary(target_category_map)
114
-
115
+
115
116
  input_category_id_to_output_category_id = {}
116
117
  for input_category_id in input_categories.keys():
117
118
  category_name = input_categories[input_category_id]
@@ -120,51 +121,103 @@ def remap_detection_categories(input_file,
120
121
  else:
121
122
  output_category_id = output_category_name_to_output_category_id[category_name]
122
123
  input_category_id_to_output_category_id[input_category_id] = output_category_id
123
-
124
+
124
125
  # im = input_images[0]
125
126
  for im in tqdm(input_images):
126
-
127
+
127
128
  if 'detections' not in im or im['detections'] is None:
128
129
  continue
129
-
130
+
130
131
  # det = im['detections'][0]
131
132
  for det in im['detections']:
132
133
  det['category'] = input_category_id_to_output_category_id[det['category']]
133
-
134
+
134
135
  input_data['detection_categories'] = target_category_map
135
-
136
+
136
137
  with open(output_file,'w') as f:
137
138
  json.dump(input_data,f,indent=1)
138
-
139
-
139
+
140
+
140
141
  print('Saved remapped results to {}'.format(output_file))
141
-
142
+
142
143
 
143
144
  #%% Interactive driver
144
145
 
145
146
  if False:
146
-
147
+
147
148
  pass
148
149
 
149
- #%%
150
-
151
- target_categories_file = '/home/dmorris/tmp/usgs-tegus/model-comparison/all-classes_usgs-only_yolov5x6.json'
150
+ #%%
151
+
152
+ target_categories_file = 'all-classes_usgs-only_yolov5x6.json'
152
153
  target_category_map = target_categories_file
153
- input_file = '/home/dmorris/tmp/usgs-tegus/model-comparison/all-classes_usgs-goannas-lilablanks_yolov5x6-20240223.json'
154
+ input_file = 'x.json'
154
155
 
155
156
  output_file = input_file.replace('.json','_remapped.json')
156
157
  assert output_file != input_file
157
158
  overwrite = True
158
-
159
+
159
160
  extra_category_handling = 'drop_if_unused'
160
-
161
+
161
162
  remap_detection_categories(input_file=input_file,
162
163
  output_file=output_file,
163
164
  target_category_map=target_category_map,
164
- extra_category_handling=extra_category_handling,
165
+ extra_category_handling=extra_category_handling,
165
166
  overwrite=overwrite)
166
167
 
167
168
 
168
169
  #%% Command-line driver
169
170
 
170
- # TODO
171
+ def main():
172
+ """
173
+ Command-line interface for remapping detection categories in a MegaDetector results file
174
+ """
175
+
176
+ parser = argparse.ArgumentParser(
177
+ description='Remap detection categories in a MegaDetector .json results file'
178
+ )
179
+ parser.add_argument(
180
+ 'input_file',
181
+ type=str,
182
+ help='Path to the MegaDetector .json results file to remap'
183
+ )
184
+ parser.add_argument(
185
+ 'output_file',
186
+ type=str,
187
+ help='Path to save the remapped .json results file'
188
+ )
189
+ parser.add_argument(
190
+ 'target_category_map_file',
191
+ type=str,
192
+ help="Path to a MegaDetector .json results file from which to take the target 'detection_categories' mapping"
193
+ )
194
+ parser.add_argument(
195
+ '--extra_category_handling',
196
+ type=str,
197
+ default='error',
198
+ choices=['error', 'drop_if_unused'],
199
+ help="How to handle source categories not in target map (default: 'error')"
200
+ )
201
+ parser.add_argument(
202
+ '--overwrite',
203
+ type=str,
204
+ default='false',
205
+ choices=['true', 'false'],
206
+ help="Overwrite output file if it exists (default: 'false')."
207
+ )
208
+
209
+ args = parser.parse_args()
210
+
211
+ overwrite_bool = (args.overwrite.lower() == 'true')
212
+
213
+ print('Starting category remapping...')
214
+
215
+ remap_detection_categories(
216
+ input_file=args.input_file,
217
+ output_file=args.output_file,
218
+ target_category_map=args.target_category_map_file, # Pass filename directly
219
+ extra_category_handling=args.extra_category_handling,
220
+ overwrite=overwrite_bool)
221
+
222
+ if __name__ == '__main__':
223
+ main()