megadetector 5.0.27__py3-none-any.whl → 5.0.29__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 (176) hide show
  1. megadetector/api/batch_processing/api_core/batch_service/score.py +4 -5
  2. megadetector/api/batch_processing/api_core_support/aggregate_results_manually.py +1 -1
  3. megadetector/api/batch_processing/api_support/summarize_daily_activity.py +1 -1
  4. megadetector/api/batch_processing/integration/digiKam/xmp_integration.py +2 -2
  5. megadetector/api/batch_processing/integration/eMammal/test_scripts/push_annotations_to_emammal.py +1 -1
  6. megadetector/api/batch_processing/integration/eMammal/test_scripts/select_images_for_testing.py +1 -1
  7. megadetector/api/synchronous/api_core/tests/load_test.py +2 -3
  8. megadetector/classification/aggregate_classifier_probs.py +3 -3
  9. megadetector/classification/analyze_failed_images.py +5 -5
  10. megadetector/classification/cache_batchapi_outputs.py +5 -5
  11. megadetector/classification/create_classification_dataset.py +11 -12
  12. megadetector/classification/crop_detections.py +10 -10
  13. megadetector/classification/csv_to_json.py +8 -8
  14. megadetector/classification/detect_and_crop.py +13 -15
  15. megadetector/classification/evaluate_model.py +7 -7
  16. megadetector/classification/identify_mislabeled_candidates.py +6 -6
  17. megadetector/classification/json_to_azcopy_list.py +1 -1
  18. megadetector/classification/json_validator.py +29 -32
  19. megadetector/classification/map_classification_categories.py +9 -9
  20. megadetector/classification/merge_classification_detection_output.py +12 -9
  21. megadetector/classification/prepare_classification_script.py +19 -19
  22. megadetector/classification/prepare_classification_script_mc.py +23 -23
  23. megadetector/classification/run_classifier.py +4 -4
  24. megadetector/classification/save_mislabeled.py +6 -6
  25. megadetector/classification/train_classifier.py +1 -1
  26. megadetector/classification/train_classifier_tf.py +9 -9
  27. megadetector/classification/train_utils.py +10 -10
  28. megadetector/data_management/annotations/annotation_constants.py +1 -1
  29. megadetector/data_management/camtrap_dp_to_coco.py +45 -45
  30. megadetector/data_management/cct_json_utils.py +101 -101
  31. megadetector/data_management/cct_to_md.py +49 -49
  32. megadetector/data_management/cct_to_wi.py +33 -33
  33. megadetector/data_management/coco_to_labelme.py +75 -75
  34. megadetector/data_management/coco_to_yolo.py +189 -189
  35. megadetector/data_management/databases/add_width_and_height_to_db.py +3 -2
  36. megadetector/data_management/databases/combine_coco_camera_traps_files.py +38 -38
  37. megadetector/data_management/databases/integrity_check_json_db.py +202 -188
  38. megadetector/data_management/databases/subset_json_db.py +33 -33
  39. megadetector/data_management/generate_crops_from_cct.py +38 -38
  40. megadetector/data_management/get_image_sizes.py +54 -49
  41. megadetector/data_management/labelme_to_coco.py +130 -124
  42. megadetector/data_management/labelme_to_yolo.py +78 -72
  43. megadetector/data_management/lila/create_lila_blank_set.py +81 -83
  44. megadetector/data_management/lila/create_lila_test_set.py +32 -31
  45. megadetector/data_management/lila/create_links_to_md_results_files.py +18 -18
  46. megadetector/data_management/lila/download_lila_subset.py +21 -24
  47. megadetector/data_management/lila/generate_lila_per_image_labels.py +91 -91
  48. megadetector/data_management/lila/get_lila_annotation_counts.py +30 -30
  49. megadetector/data_management/lila/get_lila_image_counts.py +22 -22
  50. megadetector/data_management/lila/lila_common.py +70 -70
  51. megadetector/data_management/lila/test_lila_metadata_urls.py +13 -14
  52. megadetector/data_management/mewc_to_md.py +339 -340
  53. megadetector/data_management/ocr_tools.py +258 -252
  54. megadetector/data_management/read_exif.py +232 -223
  55. megadetector/data_management/remap_coco_categories.py +26 -26
  56. megadetector/data_management/remove_exif.py +31 -20
  57. megadetector/data_management/rename_images.py +187 -187
  58. megadetector/data_management/resize_coco_dataset.py +41 -41
  59. megadetector/data_management/speciesnet_to_md.py +41 -41
  60. megadetector/data_management/wi_download_csv_to_coco.py +55 -55
  61. megadetector/data_management/yolo_output_to_md_output.py +117 -120
  62. megadetector/data_management/yolo_to_coco.py +195 -188
  63. megadetector/detection/change_detection.py +831 -0
  64. megadetector/detection/process_video.py +341 -338
  65. megadetector/detection/pytorch_detector.py +308 -266
  66. megadetector/detection/run_detector.py +186 -166
  67. megadetector/detection/run_detector_batch.py +366 -364
  68. megadetector/detection/run_inference_with_yolov5_val.py +328 -325
  69. megadetector/detection/run_tiled_inference.py +312 -253
  70. megadetector/detection/tf_detector.py +24 -24
  71. megadetector/detection/video_utils.py +291 -283
  72. megadetector/postprocessing/add_max_conf.py +15 -11
  73. megadetector/postprocessing/categorize_detections_by_size.py +44 -44
  74. megadetector/postprocessing/classification_postprocessing.py +808 -311
  75. megadetector/postprocessing/combine_batch_outputs.py +20 -21
  76. megadetector/postprocessing/compare_batch_results.py +528 -517
  77. megadetector/postprocessing/convert_output_format.py +97 -97
  78. megadetector/postprocessing/create_crop_folder.py +220 -147
  79. megadetector/postprocessing/detector_calibration.py +173 -168
  80. megadetector/postprocessing/generate_csv_report.py +508 -0
  81. megadetector/postprocessing/load_api_results.py +25 -22
  82. megadetector/postprocessing/md_to_coco.py +129 -98
  83. megadetector/postprocessing/md_to_labelme.py +89 -83
  84. megadetector/postprocessing/md_to_wi.py +40 -40
  85. megadetector/postprocessing/merge_detections.py +87 -114
  86. megadetector/postprocessing/postprocess_batch_results.py +319 -302
  87. megadetector/postprocessing/remap_detection_categories.py +36 -36
  88. megadetector/postprocessing/render_detection_confusion_matrix.py +205 -199
  89. megadetector/postprocessing/repeat_detection_elimination/find_repeat_detections.py +57 -57
  90. megadetector/postprocessing/repeat_detection_elimination/remove_repeat_detections.py +27 -28
  91. megadetector/postprocessing/repeat_detection_elimination/repeat_detections_core.py +702 -677
  92. megadetector/postprocessing/separate_detections_into_folders.py +226 -211
  93. megadetector/postprocessing/subset_json_detector_output.py +265 -262
  94. megadetector/postprocessing/top_folders_to_bottom.py +45 -45
  95. megadetector/postprocessing/validate_batch_results.py +70 -70
  96. megadetector/taxonomy_mapping/map_lila_taxonomy_to_wi_taxonomy.py +52 -52
  97. megadetector/taxonomy_mapping/map_new_lila_datasets.py +15 -15
  98. megadetector/taxonomy_mapping/prepare_lila_taxonomy_release.py +14 -14
  99. megadetector/taxonomy_mapping/preview_lila_taxonomy.py +66 -69
  100. megadetector/taxonomy_mapping/retrieve_sample_image.py +16 -16
  101. megadetector/taxonomy_mapping/simple_image_download.py +8 -8
  102. megadetector/taxonomy_mapping/species_lookup.py +33 -33
  103. megadetector/taxonomy_mapping/taxonomy_csv_checker.py +14 -14
  104. megadetector/taxonomy_mapping/taxonomy_graph.py +11 -11
  105. megadetector/taxonomy_mapping/validate_lila_category_mappings.py +13 -13
  106. megadetector/utils/azure_utils.py +22 -22
  107. megadetector/utils/ct_utils.py +1019 -200
  108. megadetector/utils/directory_listing.py +21 -77
  109. megadetector/utils/gpu_test.py +22 -22
  110. megadetector/utils/md_tests.py +541 -518
  111. megadetector/utils/path_utils.py +1511 -406
  112. megadetector/utils/process_utils.py +41 -41
  113. megadetector/utils/sas_blob_utils.py +53 -49
  114. megadetector/utils/split_locations_into_train_val.py +73 -60
  115. megadetector/utils/string_utils.py +147 -26
  116. megadetector/utils/url_utils.py +463 -173
  117. megadetector/utils/wi_utils.py +2629 -2868
  118. megadetector/utils/write_html_image_list.py +137 -137
  119. megadetector/visualization/plot_utils.py +21 -21
  120. megadetector/visualization/render_images_with_thumbnails.py +37 -73
  121. megadetector/visualization/visualization_utils.py +424 -404
  122. megadetector/visualization/visualize_db.py +197 -190
  123. megadetector/visualization/visualize_detector_output.py +126 -98
  124. {megadetector-5.0.27.dist-info → megadetector-5.0.29.dist-info}/METADATA +6 -3
  125. megadetector-5.0.29.dist-info/RECORD +163 -0
  126. {megadetector-5.0.27.dist-info → megadetector-5.0.29.dist-info}/WHEEL +1 -1
  127. megadetector/data_management/importers/add_nacti_sizes.py +0 -52
  128. megadetector/data_management/importers/add_timestamps_to_icct.py +0 -79
  129. megadetector/data_management/importers/animl_results_to_md_results.py +0 -158
  130. megadetector/data_management/importers/auckland_doc_test_to_json.py +0 -373
  131. megadetector/data_management/importers/auckland_doc_to_json.py +0 -201
  132. megadetector/data_management/importers/awc_to_json.py +0 -191
  133. megadetector/data_management/importers/bellevue_to_json.py +0 -272
  134. megadetector/data_management/importers/cacophony-thermal-importer.py +0 -793
  135. megadetector/data_management/importers/carrizo_shrubfree_2018.py +0 -269
  136. megadetector/data_management/importers/carrizo_trail_cam_2017.py +0 -289
  137. megadetector/data_management/importers/cct_field_adjustments.py +0 -58
  138. megadetector/data_management/importers/channel_islands_to_cct.py +0 -913
  139. megadetector/data_management/importers/eMammal/copy_and_unzip_emammal.py +0 -180
  140. megadetector/data_management/importers/eMammal/eMammal_helpers.py +0 -249
  141. megadetector/data_management/importers/eMammal/make_eMammal_json.py +0 -223
  142. megadetector/data_management/importers/ena24_to_json.py +0 -276
  143. megadetector/data_management/importers/filenames_to_json.py +0 -386
  144. megadetector/data_management/importers/helena_to_cct.py +0 -283
  145. megadetector/data_management/importers/idaho-camera-traps.py +0 -1407
  146. megadetector/data_management/importers/idfg_iwildcam_lila_prep.py +0 -294
  147. megadetector/data_management/importers/import_desert_lion_conservation_camera_traps.py +0 -387
  148. megadetector/data_management/importers/jb_csv_to_json.py +0 -150
  149. megadetector/data_management/importers/mcgill_to_json.py +0 -250
  150. megadetector/data_management/importers/missouri_to_json.py +0 -490
  151. megadetector/data_management/importers/nacti_fieldname_adjustments.py +0 -79
  152. megadetector/data_management/importers/noaa_seals_2019.py +0 -181
  153. megadetector/data_management/importers/osu-small-animals-to-json.py +0 -364
  154. megadetector/data_management/importers/pc_to_json.py +0 -365
  155. megadetector/data_management/importers/plot_wni_giraffes.py +0 -123
  156. megadetector/data_management/importers/prepare_zsl_imerit.py +0 -131
  157. megadetector/data_management/importers/raic_csv_to_md_results.py +0 -416
  158. megadetector/data_management/importers/rspb_to_json.py +0 -356
  159. megadetector/data_management/importers/save_the_elephants_survey_A.py +0 -320
  160. megadetector/data_management/importers/save_the_elephants_survey_B.py +0 -329
  161. megadetector/data_management/importers/snapshot_safari_importer.py +0 -758
  162. megadetector/data_management/importers/snapshot_serengeti_lila.py +0 -1067
  163. megadetector/data_management/importers/snapshotserengeti/make_full_SS_json.py +0 -150
  164. megadetector/data_management/importers/snapshotserengeti/make_per_season_SS_json.py +0 -153
  165. megadetector/data_management/importers/sulross_get_exif.py +0 -65
  166. megadetector/data_management/importers/timelapse_csv_set_to_json.py +0 -490
  167. megadetector/data_management/importers/ubc_to_json.py +0 -399
  168. megadetector/data_management/importers/umn_to_json.py +0 -507
  169. megadetector/data_management/importers/wellington_to_json.py +0 -263
  170. megadetector/data_management/importers/wi_to_json.py +0 -442
  171. megadetector/data_management/importers/zamba_results_to_md_results.py +0 -180
  172. megadetector/data_management/lila/add_locations_to_island_camera_traps.py +0 -101
  173. megadetector/data_management/lila/add_locations_to_nacti.py +0 -151
  174. megadetector-5.0.27.dist-info/RECORD +0 -208
  175. {megadetector-5.0.27.dist-info → megadetector-5.0.29.dist-info}/licenses/LICENSE +0 -0
  176. {megadetector-5.0.27.dist-info → megadetector-5.0.29.dist-info}/top_level.txt +0 -0
@@ -12,11 +12,12 @@ TODO: this is a one-off script waiting to be cleaned up for more general use.
12
12
 
13
13
  import json
14
14
  from PIL import Image
15
+ from megadetector.utils import ct_utils
15
16
 
16
17
  datafile = '/datadrive/snapshotserengeti/databases/snapshotserengeti.json'
17
18
  image_base = '/datadrive/snapshotserengeti/images/'
18
19
 
19
- def main():
20
+ def main(): # noqa
20
21
 
21
22
  with open(datafile,'r') as f:
22
23
  data = json.load(f)
@@ -27,7 +28,7 @@ def main():
27
28
  im['height'] = im_h
28
29
  im['width'] = im_w
29
30
 
30
- json.dump(data, open(datafile,'w'))
31
+ ct_utils.write_json(datafile, data, indent=None)
31
32
 
32
33
  if __name__ == '__main__':
33
34
  main()
@@ -10,7 +10,7 @@ writing the results to another .json file.
10
10
  - Checks compatibility in info structs, within reason.
11
11
 
12
12
  *Example command-line invocation*
13
-
13
+
14
14
  combine_coco_camera_traps_files input1.json input2.json ... inputN.json output.json
15
15
 
16
16
  """
@@ -20,12 +20,13 @@ combine_coco_camera_traps_files input1.json input2.json ... inputN.json output.j
20
20
  import argparse
21
21
  import json
22
22
  import sys
23
+ from megadetector.utils import ct_utils
23
24
 
24
25
 
25
26
  #%% Merge functions
26
27
 
27
- def combine_cct_files(input_files,
28
- output_file=None,
28
+ def combine_cct_files(input_files,
29
+ output_file=None,
29
30
  require_uniqueness=True,
30
31
  filename_prefixes=None):
31
32
  """
@@ -38,12 +39,12 @@ def combine_cct_files(input_files,
38
39
  require_uniqueness (bool, optional): whether to require that the images in
39
40
  each input_dict be unique
40
41
  filename_prefixes (dict, optional): dict mapping input filenames to strings
41
- that should be prepended to image filenames from that source
42
-
42
+ that should be prepended to image filenames from that source
43
+
43
44
  Returns:
44
45
  dict: the merged COCO-formatted .json dict
45
46
  """
46
-
47
+
47
48
  input_dicts = []
48
49
  print('Loading input files')
49
50
  for fn in input_files:
@@ -60,13 +61,12 @@ def combine_cct_files(input_files,
60
61
 
61
62
  print('Writing output')
62
63
  if output_file is not None:
63
- with open(output_file, 'w') as f:
64
- json.dump(merged_dict, f, indent=1)
64
+ ct_utils.write_json(output_file, merged_dict)
65
65
 
66
66
  return merged_dict
67
67
 
68
68
 
69
- def combine_cct_dictionaries(input_dicts, require_uniqueness=True):
69
+ def combine_cct_dictionaries(input_dicts, require_uniqueness=True):
70
70
  """
71
71
  Merges the list of COCO Camera Traps dictionaries [input_dicts]. See module header
72
72
  comment for details on merge rules.
@@ -76,18 +76,18 @@ def combine_cct_dictionaries(input_dicts, require_uniqueness=True):
76
76
  require_uniqueness: bool, whether to require that the images in
77
77
  each input_dict be unique
78
78
 
79
- Returns:
79
+ Returns:
80
80
  dict: the merged COCO-formatted .json dict
81
81
  """
82
-
82
+
83
83
  filename_to_image = {}
84
84
  all_annotations = []
85
85
  info = None
86
-
86
+
87
87
  category_name_to_id = {}
88
88
  category_name_to_id['empty'] = 0
89
89
  next_category_id = 1
90
-
90
+
91
91
  known_fields = ['info', 'categories', 'annotations','images','filename_prefix']
92
92
 
93
93
  # i_input_dict = 0; input_dict = input_dicts[i_input_dict]
@@ -96,19 +96,19 @@ def combine_cct_dictionaries(input_dicts, require_uniqueness=True):
96
96
  filename_prefix = ''
97
97
  if ('filename_prefix' in input_dict.keys()):
98
98
  filename_prefix = input_dict['filename_prefix']
99
-
99
+
100
100
  for k in input_dict.keys():
101
101
  if k not in known_fields:
102
102
  raise ValueError(f'Unrecognized CCT field: {k}')
103
103
 
104
104
  # We will prepend an index to every ID to guarantee uniqueness
105
105
  index_string = 'ds' + str(i_input_dict).zfill(3) + '_'
106
-
106
+
107
107
  old_cat_id_to_new_cat_id = {}
108
-
108
+
109
109
  # Map detection categories from the original data set into the merged data set
110
110
  for original_category in input_dict['categories']:
111
-
111
+
112
112
  original_cat_id = original_category['id']
113
113
  cat_name = original_category['name']
114
114
  if cat_name in category_name_to_id:
@@ -117,58 +117,58 @@ def combine_cct_dictionaries(input_dicts, require_uniqueness=True):
117
117
  new_cat_id = next_category_id
118
118
  next_category_id += 1
119
119
  category_name_to_id[cat_name] = new_cat_id
120
-
120
+
121
121
  if original_cat_id in old_cat_id_to_new_cat_id:
122
122
  assert old_cat_id_to_new_cat_id[original_cat_id] == new_cat_id
123
123
  else:
124
124
  old_cat_id_to_new_cat_id[original_cat_id] = new_cat_id
125
-
125
+
126
126
  # ...for each category
127
-
128
-
127
+
128
+
129
129
  # Merge original image list into the merged data set
130
130
  for im in input_dict['images']:
131
-
131
+
132
132
  if 'seq_id' in im:
133
133
  im['seq_id'] = index_string + im['seq_id']
134
134
  if 'location' in im:
135
135
  im['location'] = index_string + im['location']
136
-
136
+
137
137
  im_file = filename_prefix + im['file_name']
138
138
  im['file_name'] = im_file
139
139
  if require_uniqueness:
140
- assert im_file not in filename_to_image, f'Duplicate image: {im_file}'
140
+ assert im_file not in filename_to_image, f'Duplicate image: {im_file}'
141
141
  else:
142
142
  if im_file in filename_to_image:
143
143
  print('Redundant image {}'.format(im_file))
144
-
144
+
145
145
  # Create a unique ID
146
146
  im['id'] = index_string + im['id']
147
147
  filename_to_image[im_file] = im
148
148
 
149
149
  # ...for each image
150
-
151
-
150
+
151
+
152
152
  # Same for annotations
153
153
  for ann in input_dict['annotations']:
154
-
154
+
155
155
  ann['image_id'] = index_string + ann['image_id']
156
156
  ann['id'] = index_string + ann['id']
157
157
  assert ann['category_id'] in old_cat_id_to_new_cat_id
158
158
  ann['category_id'] = old_cat_id_to_new_cat_id[ann['category_id']]
159
-
159
+
160
160
  # ...for each annotation
161
-
161
+
162
162
  all_annotations.extend(input_dict['annotations'])
163
-
163
+
164
164
  # Merge info dicts, don't check completion time fields
165
165
  if info is None:
166
- import copy
166
+ import copy
167
167
  info = copy.deepcopy(input_dict['info'])
168
168
  info['original_info'] = [input_dict['info']]
169
169
  else:
170
170
  info['original_info'].append(input_dict['info'])
171
-
171
+
172
172
  # ...for each dictionary
173
173
 
174
174
  # Convert merged image dictionaries to a sorted list
@@ -176,12 +176,12 @@ def combine_cct_dictionaries(input_dicts, require_uniqueness=True):
176
176
 
177
177
  all_categories = [{'id':category_name_to_id[cat_name],'name':cat_name} for\
178
178
  cat_name in category_name_to_id.keys()]
179
-
179
+
180
180
  merged_dict = {'info': info,
181
181
  'categories': all_categories,
182
182
  'images': sorted_images,
183
183
  'annotations': all_annotations}
184
-
184
+
185
185
  return merged_dict
186
186
 
187
187
  # ...combine_cct_dictionaries(...)
@@ -189,8 +189,8 @@ def combine_cct_dictionaries(input_dicts, require_uniqueness=True):
189
189
 
190
190
  #%% Command-line driver
191
191
 
192
- def main():
193
-
192
+ def main(): # noqa
193
+
194
194
  parser = argparse.ArgumentParser()
195
195
  parser.add_argument(
196
196
  'input_paths', nargs='+',
@@ -202,7 +202,7 @@ def main():
202
202
  if len(sys.argv[1:]) == 0:
203
203
  parser.print_help()
204
204
  parser.exit()
205
-
205
+
206
206
  args = parser.parse_args()
207
207
  combine_cct_files(args.input_paths, args.output_path)
208
208