megadetector 5.0.28__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 +231 -224
  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 +340 -337
  65. megadetector/detection/pytorch_detector.py +304 -262
  66. megadetector/detection/run_detector.py +177 -164
  67. megadetector/detection/run_detector_batch.py +364 -363
  68. megadetector/detection/run_inference_with_yolov5_val.py +328 -325
  69. megadetector/detection/run_tiled_inference.py +256 -249
  70. megadetector/detection/tf_detector.py +24 -24
  71. megadetector/detection/video_utils.py +290 -282
  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 +415 -415
  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 +219 -146
  79. megadetector/postprocessing/detector_calibration.py +173 -168
  80. megadetector/postprocessing/generate_csv_report.py +508 -499
  81. megadetector/postprocessing/load_api_results.py +23 -20
  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 +313 -298
  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 -66
  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 +10 -10
  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 +1018 -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 +1457 -398
  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 +61 -61
  115. megadetector/utils/string_utils.py +147 -26
  116. megadetector/utils/url_utils.py +463 -173
  117. megadetector/utils/wi_utils.py +2629 -2526
  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 +401 -397
  122. megadetector/visualization/visualize_db.py +197 -190
  123. megadetector/visualization/visualize_detector_output.py +79 -73
  124. {megadetector-5.0.28.dist-info → megadetector-5.0.29.dist-info}/METADATA +135 -132
  125. megadetector-5.0.29.dist-info/RECORD +163 -0
  126. {megadetector-5.0.28.dist-info → megadetector-5.0.29.dist-info}/WHEEL +1 -1
  127. {megadetector-5.0.28.dist-info → megadetector-5.0.29.dist-info}/licenses/LICENSE +0 -0
  128. {megadetector-5.0.28.dist-info → megadetector-5.0.29.dist-info}/top_level.txt +0 -0
  129. megadetector/data_management/importers/add_nacti_sizes.py +0 -52
  130. megadetector/data_management/importers/add_timestamps_to_icct.py +0 -79
  131. megadetector/data_management/importers/animl_results_to_md_results.py +0 -158
  132. megadetector/data_management/importers/auckland_doc_test_to_json.py +0 -373
  133. megadetector/data_management/importers/auckland_doc_to_json.py +0 -201
  134. megadetector/data_management/importers/awc_to_json.py +0 -191
  135. megadetector/data_management/importers/bellevue_to_json.py +0 -272
  136. megadetector/data_management/importers/cacophony-thermal-importer.py +0 -793
  137. megadetector/data_management/importers/carrizo_shrubfree_2018.py +0 -269
  138. megadetector/data_management/importers/carrizo_trail_cam_2017.py +0 -289
  139. megadetector/data_management/importers/cct_field_adjustments.py +0 -58
  140. megadetector/data_management/importers/channel_islands_to_cct.py +0 -913
  141. megadetector/data_management/importers/eMammal/copy_and_unzip_emammal.py +0 -180
  142. megadetector/data_management/importers/eMammal/eMammal_helpers.py +0 -249
  143. megadetector/data_management/importers/eMammal/make_eMammal_json.py +0 -223
  144. megadetector/data_management/importers/ena24_to_json.py +0 -276
  145. megadetector/data_management/importers/filenames_to_json.py +0 -386
  146. megadetector/data_management/importers/helena_to_cct.py +0 -283
  147. megadetector/data_management/importers/idaho-camera-traps.py +0 -1407
  148. megadetector/data_management/importers/idfg_iwildcam_lila_prep.py +0 -294
  149. megadetector/data_management/importers/import_desert_lion_conservation_camera_traps.py +0 -387
  150. megadetector/data_management/importers/jb_csv_to_json.py +0 -150
  151. megadetector/data_management/importers/mcgill_to_json.py +0 -250
  152. megadetector/data_management/importers/missouri_to_json.py +0 -490
  153. megadetector/data_management/importers/nacti_fieldname_adjustments.py +0 -79
  154. megadetector/data_management/importers/noaa_seals_2019.py +0 -181
  155. megadetector/data_management/importers/osu-small-animals-to-json.py +0 -364
  156. megadetector/data_management/importers/pc_to_json.py +0 -365
  157. megadetector/data_management/importers/plot_wni_giraffes.py +0 -123
  158. megadetector/data_management/importers/prepare_zsl_imerit.py +0 -131
  159. megadetector/data_management/importers/raic_csv_to_md_results.py +0 -416
  160. megadetector/data_management/importers/rspb_to_json.py +0 -356
  161. megadetector/data_management/importers/save_the_elephants_survey_A.py +0 -320
  162. megadetector/data_management/importers/save_the_elephants_survey_B.py +0 -329
  163. megadetector/data_management/importers/snapshot_safari_importer.py +0 -758
  164. megadetector/data_management/importers/snapshot_serengeti_lila.py +0 -1067
  165. megadetector/data_management/importers/snapshotserengeti/make_full_SS_json.py +0 -150
  166. megadetector/data_management/importers/snapshotserengeti/make_per_season_SS_json.py +0 -153
  167. megadetector/data_management/importers/sulross_get_exif.py +0 -65
  168. megadetector/data_management/importers/timelapse_csv_set_to_json.py +0 -490
  169. megadetector/data_management/importers/ubc_to_json.py +0 -399
  170. megadetector/data_management/importers/umn_to_json.py +0 -507
  171. megadetector/data_management/importers/wellington_to_json.py +0 -263
  172. megadetector/data_management/importers/wi_to_json.py +0 -442
  173. megadetector/data_management/importers/zamba_results_to_md_results.py +0 -180
  174. megadetector/data_management/lila/add_locations_to_island_camera_traps.py +0 -101
  175. megadetector/data_management/lila/add_locations_to_nacti.py +0 -151
  176. megadetector-5.0.28.dist-info/RECORD +0 -209
@@ -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