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
@@ -54,11 +54,11 @@ def _render_image(entry,
54
54
  """
55
55
  Internal function for rendering a single image.
56
56
  """
57
-
57
+
58
58
  rendering_result = {'failed_image':False,'missing_image':False,
59
59
  'skipped_image':False,'annotated_image_path':None,
60
60
  'max_conf':None,'file':entry['file']}
61
-
61
+
62
62
  image_id = entry['file']
63
63
 
64
64
  if 'failure' in entry and entry['failure'] is not None:
@@ -66,14 +66,14 @@ def _render_image(entry,
66
66
  return rendering_result
67
67
 
68
68
  assert 'detections' in entry and entry['detections'] is not None
69
-
69
+
70
70
  max_conf = get_max_conf(entry)
71
71
  rendering_result['max_conf'] = max_conf
72
-
72
+
73
73
  if (max_conf < confidence_threshold) and render_detections_only:
74
74
  rendering_result['skipped_image'] = True
75
75
  return rendering_result
76
-
76
+
77
77
  if images_dir is None:
78
78
  image_filename_in_abs = image_id
79
79
  assert path_is_abs(image_filename_in_abs), \
@@ -89,7 +89,7 @@ def _render_image(entry,
89
89
 
90
90
  # Load the image
91
91
  image = vis_utils.open_image(image_filename_in_abs)
92
-
92
+
93
93
  # Find categories we're supposed to blur
94
94
  category_ids_to_blur = []
95
95
  if category_names_to_blur is not None:
@@ -98,21 +98,21 @@ def _render_image(entry,
98
98
  for category_id in detector_label_map:
99
99
  if detector_label_map[category_id] in category_names_to_blur:
100
100
  category_ids_to_blur.append(category_id)
101
-
101
+
102
102
  detections_to_blur = []
103
103
  for d in entry['detections']:
104
104
  if d['conf'] >= confidence_threshold and d['category'] in category_ids_to_blur:
105
105
  detections_to_blur.append(d)
106
106
  if len(detections_to_blur) > 0:
107
107
  blur_detections(image,detections_to_blur)
108
-
108
+
109
109
  # Resize if necessary
110
110
  #
111
111
  # If output_image_width is -1 or None, this will just return the original image
112
112
  image = vis_utils.resize_image(image, output_image_width)
113
113
 
114
114
  vis_utils.render_detection_bounding_boxes(
115
- entry['detections'], image,
115
+ entry['detections'], image,
116
116
  label_map=detector_label_map,
117
117
  classification_label_map=classification_label_map,
118
118
  confidence_threshold=confidence_threshold,
@@ -127,9 +127,9 @@ def _render_image(entry,
127
127
  assert not os.path.isabs(image_id), "Can't preserve paths when operating on absolute paths"
128
128
  annotated_img_path = os.path.join(out_dir, image_id)
129
129
  os.makedirs(os.path.dirname(annotated_img_path),exist_ok=True)
130
-
130
+
131
131
  image.save(annotated_img_path)
132
- rendering_result['annotated_image_path'] = annotated_img_path
132
+ rendering_result['annotated_image_path'] = annotated_img_path
133
133
 
134
134
  return rendering_result
135
135
 
@@ -155,14 +155,13 @@ def visualize_detector_output(detector_output_path,
155
155
  parallelize_rendering_with_threads=True,
156
156
  box_sort_order=None,
157
157
  category_names_to_blur=None):
158
-
159
158
  """
160
159
  Draws bounding boxes on images given the output of a detector.
161
160
 
162
161
  Args:
163
162
  detector_output_path (str): path to detector output .json file
164
163
  out_dir (str): path to directory for saving annotated images
165
- images_dir (str): folder where the images live; filenames in
164
+ images_dir (str, optional): folder where the images live; filenames in
166
165
  [detector_output_path] should be relative to [image_dir]. Can be None if paths are
167
166
  absolute.
168
167
  confidence_threshold (float, optional): threshold above which detections will be rendered
@@ -170,25 +169,25 @@ def visualize_detector_output(detector_output_path,
170
169
  output_image_width (int, optional): width in pixels to resize images for display,
171
170
  preserving aspect ration; set to -1 to use original image width
172
171
  random_seed (int, optional): seed to use for choosing images when sample != -1
173
- render_detections_only (bool): only render images with above-threshold detections. Empty
174
- images are discarded after sampling, so if you want to see, e.g., 1000 non-empty images,
175
- you can set [render_detections_only], but you need to sample more than 1000 images.
172
+ render_detections_only (bool, optional): only render images with above-threshold detections.
173
+ Empty images are discarded after sampling, so if you want to see, e.g., 1000 non-empty
174
+ images, you can set [render_detections_only], but you need to sample more than 1000 images.
176
175
  classification_confidence_threshold (float, optional): only show classifications
177
176
  above this threshold; does not impact whether images are rendered, only whether
178
177
  classification labels (not detection categories) are displayed
179
178
  html_output_file (str, optional): output path for an HTML index file (not written
180
179
  if None)
181
- html_output_options (dict, optional): HTML formatting options; see write_html_image_list
182
- for details. The most common option you may want to supply here is
180
+ html_output_options (dict, optional): HTML formatting options; see write_html_image_list
181
+ for details. The most common option you may want to supply here is
183
182
  'maxFiguresPerHtmlFile'.
184
183
  preserve_path_structure (bool, optional): if False (default), writes images to unique
185
184
  names in a flat structure in the output folder; if True, preserves relative paths
186
185
  within the output folder
187
186
  parallelize_rendering (bool, optional): whether to use concurrent workers for rendering
188
- parallelize_rendering_n_cores (int, optional): number of concurrent workers to use
187
+ parallelize_rendering_n_cores (int, optional): number of concurrent workers to use
189
188
  (ignored if parallelize_rendering is False)
190
189
  parallelize_rendering_with_threads (bool, optional): determines whether we use
191
- threads (True) or processes (False) for parallelization (ignored if parallelize_rendering
190
+ threads (True) or processes (False) for parallelization (ignored if parallelize_rendering
192
191
  is False)
193
192
  box_sort_order (str, optional): sorting scheme for detection boxes, can be None, "confidence", or
194
193
  "reverse_confidence"
@@ -198,11 +197,11 @@ def visualize_detector_output(detector_output_path,
198
197
  Returns:
199
198
  list: list of paths to annotated images
200
199
  """
201
-
200
+
202
201
  assert os.path.exists(detector_output_path), \
203
202
  'Detector output file does not exist at {}'.format(detector_output_path)
204
203
 
205
- if images_dir is not None:
204
+ if images_dir is not None:
206
205
  assert os.path.isdir(images_dir), \
207
206
  'Image folder {} is not available'.format(images_dir)
208
207
 
@@ -212,15 +211,15 @@ def visualize_detector_output(detector_output_path,
212
211
  ##%% Load detector output
213
212
 
214
213
  detector_output = load_md_or_speciesnet_file(detector_output_path)
215
-
214
+
216
215
  images = detector_output['images']
217
-
216
+
218
217
  if confidence_threshold is None:
219
218
  confidence_threshold = get_typical_confidence_threshold_from_results(detector_output)
220
-
219
+
221
220
  assert confidence_threshold >= 0 and confidence_threshold <= 1, \
222
221
  f'Confidence threshold {confidence_threshold} is invalid, must be in (0, 1).'
223
-
222
+
224
223
  if 'detection_categories' in detector_output:
225
224
  detector_label_map = detector_output['detection_categories']
226
225
  else:
@@ -244,77 +243,84 @@ def visualize_detector_output(detector_output_path,
244
243
 
245
244
  print('Rendering detections above a confidence threshold of {}'.format(
246
245
  confidence_threshold))
247
-
246
+
248
247
  classification_label_map = None
249
-
248
+
250
249
  if 'classification_categories' in detector_output:
251
250
  classification_label_map = detector_output['classification_categories']
252
-
251
+
253
252
  rendering_results = []
254
-
253
+
255
254
  if parallelize_rendering:
256
-
255
+
257
256
  if parallelize_rendering_with_threads:
258
257
  worker_string = 'threads'
259
258
  else:
260
259
  worker_string = 'processes'
261
-
262
- if parallelize_rendering_n_cores is None:
263
- if parallelize_rendering_with_threads:
264
- pool = ThreadPool()
265
- else:
266
- pool = Pool()
267
- else:
268
- if parallelize_rendering_with_threads:
269
- pool = ThreadPool(parallelize_rendering_n_cores)
260
+
261
+ pool = None
262
+ try:
263
+ if parallelize_rendering_n_cores is None:
264
+ if parallelize_rendering_with_threads:
265
+ pool = ThreadPool()
266
+ else:
267
+ pool = Pool()
270
268
  else:
271
- pool = Pool(parallelize_rendering_n_cores)
272
- print('Rendering images with {} {}'.format(parallelize_rendering_n_cores,
273
- worker_string))
274
- rendering_results = list(tqdm(pool.imap(
275
- partial(_render_image,detector_label_map=detector_label_map,
276
- classification_label_map=classification_label_map,
277
- confidence_threshold=confidence_threshold,
278
- classification_confidence_threshold=classification_confidence_threshold,
279
- render_detections_only=render_detections_only,
280
- preserve_path_structure=preserve_path_structure,
281
- out_dir=out_dir,
282
- images_dir=images_dir,
283
- output_image_width=output_image_width,
284
- box_sort_order=box_sort_order,
285
- category_names_to_blur=category_names_to_blur),
286
- images), total=len(images)))
287
-
269
+ if parallelize_rendering_with_threads:
270
+ pool = ThreadPool(parallelize_rendering_n_cores)
271
+ else:
272
+ pool = Pool(parallelize_rendering_n_cores)
273
+ print('Rendering images with {} {}'.format(parallelize_rendering_n_cores,
274
+ worker_string))
275
+ rendering_results = list(tqdm(pool.imap(
276
+ partial(_render_image,detector_label_map=detector_label_map,
277
+ classification_label_map=classification_label_map,
278
+ confidence_threshold=confidence_threshold,
279
+ classification_confidence_threshold=classification_confidence_threshold,
280
+ render_detections_only=render_detections_only,
281
+ preserve_path_structure=preserve_path_structure,
282
+ out_dir=out_dir,
283
+ images_dir=images_dir,
284
+ output_image_width=output_image_width,
285
+ box_sort_order=box_sort_order,
286
+ category_names_to_blur=category_names_to_blur),
287
+ images), total=len(images)))
288
+ finally:
289
+ if pool is not None:
290
+ pool.close()
291
+ pool.join()
292
+ print("Pool closed and joined for detector output visualization")
293
+
288
294
  else:
289
-
295
+
290
296
  for entry in tqdm(images):
291
-
297
+
292
298
  rendering_result = _render_image(entry,detector_label_map,classification_label_map,
293
299
  confidence_threshold,classification_confidence_threshold,
294
300
  render_detections_only,preserve_path_structure,out_dir,
295
301
  images_dir,output_image_width,box_sort_order,
296
302
  category_names_to_blur=category_names_to_blur)
297
303
  rendering_results.append(rendering_result)
298
-
304
+
299
305
  # ...for each image
300
-
306
+
301
307
  failed_images = [r for r in rendering_results if r['failed_image']]
302
308
  missing_images = [r for r in rendering_results if r['missing_image']]
303
309
  skipped_images = [r for r in rendering_results if r['skipped_image']]
304
-
310
+
305
311
  print('Skipped {} failed images (of {})'.format(len(failed_images),len(images)))
306
312
  print('Skipped {} missing images (of {})'.format(len(missing_images),len(images)))
307
313
  print('Skipped {} below-threshold images (of {})'.format(len(skipped_images),len(images)))
308
-
314
+
309
315
  print(f'Rendered detection results to {out_dir}')
310
316
 
311
317
  annotated_image_paths = [r['annotated_image_path'] for r in rendering_results if \
312
318
  r['annotated_image_path'] is not None]
313
-
319
+
314
320
  if html_output_file is not None:
315
-
321
+
316
322
  html_dir = os.path.dirname(html_output_file)
317
-
323
+
318
324
  html_image_info = []
319
325
 
320
326
  for r in rendering_results:
@@ -329,10 +335,10 @@ def visualize_detector_output(detector_output_path,
329
335
  'text-align:left;margin-top:20;margin-bottom:5'
330
336
  d['title'] = '{} (max conf: {})'.format(r['file'],r['max_conf'])
331
337
  html_image_info.append(d)
332
-
338
+
333
339
  _ = write_html_image_list.write_html_image_list(html_output_file,html_image_info,
334
340
  options=html_output_options)
335
-
341
+
336
342
  return annotated_image_paths
337
343
 
338
344
  # ...def visualize_detector_output(...)
@@ -340,8 +346,8 @@ def visualize_detector_output(detector_output_path,
340
346
 
341
347
  #%% Command-line driver
342
348
 
343
- def main():
344
-
349
+ def main(): # noqa
350
+
345
351
  parser = argparse.ArgumentParser(
346
352
  formatter_class=argparse.ArgumentDefaultsHelpFormatter,
347
353
  description='Annotate the bounding boxes predicted by a detector above '
@@ -399,11 +405,11 @@ def main():
399
405
  parser.exit()
400
406
 
401
407
  args = parser.parse_args()
402
-
408
+
403
409
  category_names_to_blur = args.category_names_to_blur
404
410
  if category_names_to_blur is not None:
405
411
  category_names_to_blur = category_names_to_blur.split(',')
406
-
412
+
407
413
  visualize_detector_output(
408
414
  detector_output_path=args.detector_output_path,
409
415
  out_dir=args.out_dir,
@@ -429,12 +435,12 @@ if __name__ == '__main__':
429
435
  #%% Interactive driver
430
436
 
431
437
  if False:
432
-
438
+
433
439
  pass
434
440
 
435
441
  #%%
436
-
437
- detector_output_path = os.path.expanduser('~/postprocessing/bellevue-camera-traps/bellevue-camera-traps-2023-12-05-v5a.0.0/combined_api_outputs/bellevue-camera-traps-2023-12-05-v5a.0.0_detections.json')
442
+
443
+ detector_output_path = os.path.expanduser('detections.json')
438
444
  out_dir = r'g:\temp\preview'
439
445
  images_dir = r'g:\camera_traps\camera_trap_images'
440
446
  confidence_threshold = 0.15
@@ -465,6 +471,6 @@ if False:
465
471
  parallelize_rendering,
466
472
  parallelize_rendering_n_cores,
467
473
  parallelize_rendering_with_threads)
468
-
474
+
469
475
  from megadetector.utils.path_utils import open_file
470
476
  open_file(html_output_file)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: megadetector
3
- Version: 5.0.28
3
+ Version: 10.0.0
4
4
  Summary: MegaDetector is an AI model that helps conservation folks spend less time doing boring things with camera trap images.
5
5
  Author-email: Your friendly neighborhood MegaDetector team <cameratraps@lila.science>
6
6
  Maintainer-email: Your friendly neighborhood MegaDetector team <cameratraps@lila.science>
@@ -47,10 +47,13 @@ Requires-Dist: scikit-learn>=1.3.1
47
47
  Requires-Dist: pandas>=2.1.1
48
48
  Requires-Dist: python-dateutil
49
49
  Requires-Dist: send2trash
50
+ Requires-Dist: python-dateutil
51
+ Requires-Dist: clipboard
50
52
  Requires-Dist: dill
53
+ Requires-Dist: ruff
54
+ Requires-Dist: pytest
51
55
  Requires-Dist: ultralytics-yolov5==0.1.1
52
56
  Requires-Dist: yolov9pip==0.0.4
53
- Requires-Dist: python-dateutil
54
57
  Dynamic: license-file
55
58
 
56
59
  # MegaDetector
@@ -0,0 +1,139 @@
1
+ megadetector/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ megadetector/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ megadetector/api/batch_processing/integration/digiKam/setup.py,sha256=7P1X3JYrBDXmLUeLRrzxNfDkL5lo-pY8nXsp9Cz8rOI,203
4
+ megadetector/api/batch_processing/integration/digiKam/xmp_integration.py,sha256=dbib8WseSrNpLnSTKvnmEseii5ls5WAi1C612ovmwps,17796
5
+ megadetector/api/batch_processing/integration/eMammal/test_scripts/config_template.py,sha256=UnvrgaFRBu59MuVUJa2WpG8ebcOJWcNeZEx6GWuYLzc,73
6
+ megadetector/api/batch_processing/integration/eMammal/test_scripts/push_annotations_to_emammal.py,sha256=86MluxfHY5JsslX0OWgmVUyuPP6DMDE-o6kYKdlTtMI,3583
7
+ megadetector/api/batch_processing/integration/eMammal/test_scripts/select_images_for_testing.py,sha256=z8DkkV9VU69HFPEwwTVDQI9BSJa72TMoqwRt6ZiilNo,1376
8
+ megadetector/classification/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ megadetector/classification/aggregate_classifier_probs.py,sha256=ScRlN7yV6qOES8hDwyAylKQ92Vn-klbdPGqDbPM3pGw,3417
10
+ megadetector/classification/analyze_failed_images.py,sha256=dsNajqn4c-yL6vUelxqhotdNBFLHzaONfJkMAdwX7QI,8426
11
+ megadetector/classification/cache_batchapi_outputs.py,sha256=m4HrRg2XSP1oP_1YTzPSOydnhyR1pWu0m2LbIXUUWwE,6304
12
+ megadetector/classification/create_classification_dataset.py,sha256=Sv79ocsy1sWAWzzkKg4tWruQD434faOpJGBHb4Kt3XY,25404
13
+ megadetector/classification/crop_detections.py,sha256=LWT3zzNKfJNwTVKl1-nM_qzjkdCuFjEmPRDsSZ0MV4Y,20387
14
+ megadetector/classification/csv_to_json.py,sha256=j_edQLiMyDvpZFxYDNh-BAvzwSM4zbbQEXMIH-44nAs,5894
15
+ megadetector/classification/detect_and_crop.py,sha256=Y3T1gr2DJr6LEg17QXoBvhYMihnMAmbKJ-gBmmwoMd8,36925
16
+ megadetector/classification/evaluate_model.py,sha256=x51dfebVtsObAcLafXq7xMJv7hOiwiXHM-Cg06sUAyw,19323
17
+ megadetector/classification/identify_mislabeled_candidates.py,sha256=NvLAUk5VgwyyPKMxY875V5k2iRsl-Eh_sAuZRjtgc4c,5011
18
+ megadetector/classification/json_to_azcopy_list.py,sha256=Om8efCzRwlfA5LRXtzOgdrY0P5YDofs0vuewQvKNmsA,1669
19
+ megadetector/classification/json_validator.py,sha256=EOwX2aV_GDhkz6EQqkq6iC08IuBlNiUiR4OMUXuSGWo,26417
20
+ megadetector/classification/map_classification_categories.py,sha256=VFSBQhZjJMwMDZwv-rFHs4cE3q5GionqLYumjBypZhw,10661
21
+ megadetector/classification/merge_classification_detection_output.py,sha256=N4HhGSKZz_YbgY8SNtxxjw3S-CvpwfpIEsj2WCpUD7M,20163
22
+ megadetector/classification/prepare_classification_script.py,sha256=hD_vdd4oMBimz4rTkuTVI51dYnlDXHaAoBdL7FvXan4,6361
23
+ megadetector/classification/prepare_classification_script_mc.py,sha256=e9wLNy3EGLrUBSdhDacoa4Y9ciY1CI6YnYy9gaE7k-U,7061
24
+ megadetector/classification/run_classifier.py,sha256=JKMdeD33yo-CY6lyTfPZmOWnvr_Ft-vDbysfdSiXSX4,9323
25
+ megadetector/classification/save_mislabeled.py,sha256=hoxYmGbfGxEwvuH9JcYDW8NOs8CxCx0K4UtMHDaG0KI,3386
26
+ megadetector/classification/train_classifier.py,sha256=ksAcLpIn-D1sq8jdJjpjru8cUNXLhEoNVJsfWRayfLA,32334
27
+ megadetector/classification/train_classifier_tf.py,sha256=sXJ9i_BhEam5ndxm65cwe3CaZIFTg5-eEdKGhMpEhHo,28051
28
+ megadetector/classification/train_utils.py,sha256=BNOnGl2dNegsQdOYzfq5IE3hsS2gL3eUd9q-Tgimf_E,11293
29
+ megadetector/classification/efficientnet/__init__.py,sha256=e-jfknjzCc5a0CSW-TaZ2vi0SPU1OMIsayoz2s94QAo,182
30
+ megadetector/classification/efficientnet/model.py,sha256=o7m379-FVeHrioW1HSJ48fLUqH9MMlf4b1BwktL2EoQ,17120
31
+ megadetector/classification/efficientnet/utils.py,sha256=76SQdh0zK7CFcwTW4kiechCGMHSftPT0tC1PtqNRLZI,24756
32
+ megadetector/data_management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
+ megadetector/data_management/camtrap_dp_to_coco.py,sha256=HoCGMzZTEvnudnAjbOr-mCizXHmc8mMNSUChy_Q9PkI,9673
34
+ megadetector/data_management/cct_json_utils.py,sha256=iybRIlARCsId-yWiwRckNZhfmY5aFFfsiJbyaXCDr1E,19535
35
+ megadetector/data_management/cct_to_md.py,sha256=e1fYevSz0m65n5H16uB6uwzNiXiwxjdB2ka5p68R4d0,5120
36
+ megadetector/data_management/cct_to_wi.py,sha256=wcBOmurXY5I-hiqV6SmRSGUAeYaKHEU1LgCZjqVmCyw,9561
37
+ megadetector/data_management/coco_to_labelme.py,sha256=uYJ60XoZfHUEfLzj-EjLyeNM590skNnMp-IThWwNISo,8683
38
+ megadetector/data_management/coco_to_yolo.py,sha256=UwFaLRuh5emeZx8i-Bi4uyPxXSH0bG3LRhv8I5NxJTQ,28602
39
+ megadetector/data_management/generate_crops_from_cct.py,sha256=sKvT0NTsKhuVQYI0SOQYwrDgMY1rVQO97AXftz9ERSQ,5357
40
+ megadetector/data_management/get_image_sizes.py,sha256=sZtjRxhlIj56oA9X4Iq1ek4xeT3MllyWpZCOV19MkCY,6501
41
+ megadetector/data_management/labelme_to_coco.py,sha256=SO6DMfJ9WNlMUHF9EUYWjSNyepqudO3qzxknnzSZHdE,20958
42
+ megadetector/data_management/labelme_to_yolo.py,sha256=bsqpNUsnDJucJ60wSQD_yvq_tWiots1u4tSFNiHeaYA,12769
43
+ megadetector/data_management/mewc_to_md.py,sha256=09XHEykIG-whGkgEIkho7xfVuPlic1TYTKGAufv_tto,12637
44
+ megadetector/data_management/ocr_tools.py,sha256=aYpULCPn_tHaqatOd8qjEpKJ7MksRZS0o1kqQF04IE0,31389
45
+ megadetector/data_management/read_exif.py,sha256=M_8492al57kWgZ-0gNWLNdzpm442zPCC8J2DtgzHAyA,29646
46
+ megadetector/data_management/remap_coco_categories.py,sha256=DT4Rdt7Y1IdhbO2TZiBhQDESdit-l_-b_Hw0tbJ2Nuw,7090
47
+ megadetector/data_management/remove_exif.py,sha256=5JHGWMIeXqB2PE2ZwIMJOEtNYopxknNDwynQAuJCLvw,4031
48
+ megadetector/data_management/rename_images.py,sha256=iHkdQ_c1G9Oc8C4wcnPLmhKv0S9i9g7ppbytfBBqn2Y,6516
49
+ megadetector/data_management/resize_coco_dataset.py,sha256=onXe3y27QKC53OQQ2Y2h9115-UOztQYWpOoTljUbKxY,26613
50
+ megadetector/data_management/speciesnet_to_md.py,sha256=kINd7PfWC1G-kawZH8YDigtBAuewahLYpLszKC-lpOM,1368
51
+ megadetector/data_management/wi_download_csv_to_coco.py,sha256=rhqWSEmDiXs1GbHavoNwdGSqk01-a-4xmz7z7x1Qjs4,7973
52
+ megadetector/data_management/yolo_output_to_md_output.py,sha256=4wU31dHo8rSwge91m0bO0YAYrytvmxZH0YRHiRjRGa8,22509
53
+ megadetector/data_management/yolo_to_coco.py,sha256=5fa7VAbRZQgWK-03DeyVhpj6qeIW6cT7v8B33rhsN3I,31003
54
+ megadetector/data_management/annotations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
+ megadetector/data_management/annotations/annotation_constants.py,sha256=Fp_uaFQbMzhjMBcXOBUuTA9eOmenjPboMQojPQUaJjI,951
56
+ megadetector/data_management/databases/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
+ megadetector/data_management/databases/add_width_and_height_to_db.py,sha256=EYfFGPkXyFz6ZGQfXjCK3pNXLBg0hu73wiACdEEB0E0,2964
58
+ megadetector/data_management/databases/combine_coco_camera_traps_files.py,sha256=Au7akR2KZHm_l8-MGGRGf0CQy1az_JVgZW5Yz1_XQeQ,6609
59
+ megadetector/data_management/databases/integrity_check_json_db.py,sha256=kxGCHpBADXT_LHVLUENGvmby-orvVYIsK6fdgqhABBI,17386
60
+ megadetector/data_management/databases/subset_json_db.py,sha256=mO1eAkrfCSAp2_r5vHVjHvet_utFJcWRm3rNa8WvSx8,4134
61
+ megadetector/data_management/lila/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
+ megadetector/data_management/lila/create_lila_blank_set.py,sha256=tApCL4XN1Vzl6YvcdI6SY4TZbHeCyHLzNYweFfX0sy0,19490
63
+ megadetector/data_management/lila/create_lila_test_set.py,sha256=UWJPKrwNW-UVeGrMUrFvmIt2UHVyuFiPzRFKkbEbk5A,5014
64
+ megadetector/data_management/lila/create_links_to_md_results_files.py,sha256=XrtbM1MJtN-4PKzViGkDov8Rw-lJogF1E8_hHh6wR9U,3687
65
+ megadetector/data_management/lila/download_lila_subset.py,sha256=coLlmga7r5I37L_YxjUoERLC1JAGUjcED16oWtd072Y,5339
66
+ megadetector/data_management/lila/generate_lila_per_image_labels.py,sha256=PIFfQudH2z02q4diJ0zujqIneWnnrEN9ceHSCWmZYQQ,25760
67
+ megadetector/data_management/lila/get_lila_annotation_counts.py,sha256=1U-49HVsgc_rmN1KrocI1mwFvS61FPxA9I_DyzS9YMg,5534
68
+ megadetector/data_management/lila/get_lila_image_counts.py,sha256=Jz89nNHwghguMJBUs1v_ZN5VPwg9zH9ggat-6ZsUfQ4,3518
69
+ megadetector/data_management/lila/lila_common.py,sha256=IRWs46TrxcjckLidDwXPmb5O6kyW6qvSWf8CQo2ctfM,10791
70
+ megadetector/data_management/lila/test_lila_metadata_urls.py,sha256=ThU78Ks5V3rFyJSKStFcM5M2yTlhR_pgMTa6_KuF5Hs,5256
71
+ megadetector/detection/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
+ megadetector/detection/change_detection.py,sha256=Ne3GajbH_0KPBU8ruHp4Rkr0uKd5oKAMQ3CQTRKRHgQ,28659
73
+ megadetector/detection/process_video.py,sha256=yc5TdaCxUX1dBzckXwp0b7ehXjfNqAIAjQIFG5qDEy4,52388
74
+ megadetector/detection/pytorch_detector.py,sha256=-0b016Oyv0IlQcRvvKnK7m0ab0aTnPBn30KLTDc230k,46861
75
+ megadetector/detection/run_detector.py,sha256=mFnGU3D6jZuLTatuszftWpwf8qC_nA5rJv1HRjhL9F4,46479
76
+ megadetector/detection/run_detector_batch.py,sha256=RCpGHW-WSCr87JNcG6Iuumtx30auXnSWWl4CbueCUSs,72863
77
+ megadetector/detection/run_inference_with_yolov5_val.py,sha256=A-AQuARVVy7oR9WtenCZwzvd5U3HQwihMr4Jkiv9U0g,53515
78
+ megadetector/detection/run_tiled_inference.py,sha256=wrQkKIloHBO9v2i0nZ1_Tt75iFtVrnco3Y4FafoVxdw,39382
79
+ megadetector/detection/tf_detector.py,sha256=3b2MiqgMw8KBDzHQliUSDXWrmKpa9iZnfe6EgYpMcYo,8398
80
+ megadetector/detection/video_utils.py,sha256=nk2xsbJK5e7IcXdYD7648MkicnPL8KDv-scLQAK_tQc,44095
81
+ megadetector/postprocessing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
+ megadetector/postprocessing/add_max_conf.py,sha256=9MYtsH2mwkiaZb7Qcor5J_HskfAj7d9srp8G_Qldpk0,1722
83
+ megadetector/postprocessing/categorize_detections_by_size.py,sha256=DpZpRNFlyeOfWuOc6ICuENgIWDCEtiErJ_frBZp9lYM,5382
84
+ megadetector/postprocessing/classification_postprocessing.py,sha256=y3y46XDydA7SvSQpfJ8XA0-PhNw3y5eB7Obvb2mDiMo,59243
85
+ megadetector/postprocessing/combine_batch_outputs.py,sha256=I7cVKoAi_Dr5a8TBZGp9hU1QmkaDHB5tIgN3oGOeUfk,8417
86
+ megadetector/postprocessing/compare_batch_results.py,sha256=Dn0eD5uVaaHd3vsGE3iA8qvoGZe9mAp5MGpxg7jTaic,83214
87
+ megadetector/postprocessing/convert_output_format.py,sha256=FiwKSiMyEeNVLLfjpQtx3CrMbchwNUaW2TgLmdXGFVo,14892
88
+ megadetector/postprocessing/create_crop_folder.py,sha256=T37HnvBEakikXY3n3Bgk5boFo_0-Z5aKnkEWXv-Ki4s,23166
89
+ megadetector/postprocessing/detector_calibration.py,sha256=UFjJ8D6tMghatLRj3CyrtJ7vrPIJkULMNsYMIj98j2M,20495
90
+ megadetector/postprocessing/generate_csv_report.py,sha256=QLLxE2b6JXoqtuU4h1tgVROgOQXjwK4tCTYcNF0XJlk,19160
91
+ megadetector/postprocessing/load_api_results.py,sha256=v2Nn7wSXRqAetr3V_vohxycCoBFa9UrlsAHXtS5r23I,7873
92
+ megadetector/postprocessing/md_to_coco.py,sha256=CkN1ky4A2uZj_gUu8rmyaaxyOH00k6J5cuW_ZtKv3Ow,16932
93
+ megadetector/postprocessing/md_to_labelme.py,sha256=r-EGyXVrSSyN6N6wqQ6pwKeV-fCNzb50ZkJqaDqjrvM,11935
94
+ megadetector/postprocessing/md_to_wi.py,sha256=AiECnonxGBrAvWYl_hnOGvciGRZKBfF4BcJX6ZV3hyE,1211
95
+ megadetector/postprocessing/merge_detections.py,sha256=wXC1dPvA2TTGyjQGeUZNFIMiEkCty6IGTiOzaVh4YxE,15664
96
+ megadetector/postprocessing/postprocess_batch_results.py,sha256=iAoCLKgwfC_vlrUGNg9cI694nzohJLNvdT7R0FScfLI,84597
97
+ megadetector/postprocessing/remap_detection_categories.py,sha256=BE6Ce-PGBEx1FyG3XwbYp2D5sh5xUlVf6fonaMuPMAg,7927
98
+ megadetector/postprocessing/render_detection_confusion_matrix.py,sha256=oNvDTh5td5ynELNnhz4XaLP2HiwLuojkJlob15TpgcY,26365
99
+ megadetector/postprocessing/separate_detections_into_folders.py,sha256=rRYvRblQFKYTV-dNt7e19Eco9eLTaGru_i9aOCGyEH0,32258
100
+ megadetector/postprocessing/subset_json_detector_output.py,sha256=Quz6xxM1T0N6bb1zGVKMv5GHBECLwNtuu9Sb35bWPhI,32188
101
+ megadetector/postprocessing/top_folders_to_bottom.py,sha256=zYrqMHjUZG8urh2CYphfs91ZQ620uqe-TL8jVYy8KVw,6049
102
+ megadetector/postprocessing/validate_batch_results.py,sha256=alIAJj4g76m3sXDwjkj6JaJCfeoWrGLyY89xCvw64K4,11012
103
+ megadetector/postprocessing/repeat_detection_elimination/find_repeat_detections.py,sha256=XgVeyga8iSC01MAjXxb2rn-CgJTYHqC_gfxxEoSn4aw,9420
104
+ megadetector/postprocessing/repeat_detection_elimination/remove_repeat_detections.py,sha256=mJtexTuWRJbjxu-ss4GRs6Ivl7PFDWlFVSitXTbpbhA,2820
105
+ megadetector/postprocessing/repeat_detection_elimination/repeat_detections_core.py,sha256=ku4tHM5kRemDtX3leMZIpQPhz4gJEhIIFctCkn_5tCk,66781
106
+ megadetector/taxonomy_mapping/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
+ megadetector/taxonomy_mapping/map_lila_taxonomy_to_wi_taxonomy.py,sha256=cutQ4rtZ6T3WtnpHxUd9A5tM5f3bdyUdMMbe8Qss8eA,17694
108
+ megadetector/taxonomy_mapping/map_new_lila_datasets.py,sha256=eSC18J-hxL9OUUN1hx9EGtSKaut9qX15VAek3NYFkAA,4088
109
+ megadetector/taxonomy_mapping/prepare_lila_taxonomy_release.py,sha256=rj9L9SPjsqiJJK0ZLWX9c3BVDWEr6t6MWSP-slpO0UY,5097
110
+ megadetector/taxonomy_mapping/preview_lila_taxonomy.py,sha256=M5V7kmKGmICrV12Y0z3gWVFcZp0mz3KxxWIA1ZTGt_o,17341
111
+ megadetector/taxonomy_mapping/retrieve_sample_image.py,sha256=YZcOsu15ZSQCZSzkYPw80Rk6eCfnDjKg5y2wyYKkybY,1866
112
+ megadetector/taxonomy_mapping/simple_image_download.py,sha256=sxmt8LGOd0rQCLpJhu3XI_tqzI_b3U1iVl5d9sK9Ygc,6875
113
+ megadetector/taxonomy_mapping/species_lookup.py,sha256=LQmX6Vx_RW0ai9QwRFNRs38P4fEAJreSbKlSxK94PTg,32969
114
+ megadetector/taxonomy_mapping/taxonomy_csv_checker.py,sha256=PIQh-5q43ibSgT6CdG1iwfZXZx_zOHWSv7AiHnql8d4,4782
115
+ megadetector/taxonomy_mapping/taxonomy_graph.py,sha256=GjrDZq7HesF40cUA9sPz7bGKojRdM2KBFvcUPy69hp4,12203
116
+ megadetector/taxonomy_mapping/validate_lila_category_mappings.py,sha256=sAKYreO1FDMxWl_0IvkmaGhiuS4OtzzMvSosovpugNc,2415
117
+ megadetector/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
118
+ megadetector/utils/ct_utils.py,sha256=onduG59K7Fgx-Kndw4fyA3Fba8De3-Raw20EUghaSpk,58303
119
+ megadetector/utils/directory_listing.py,sha256=CZBzwg0Fus1xuRAp3ycEBjViDdwwk4eKdGq06ZERLDg,6414
120
+ megadetector/utils/gpu_test.py,sha256=5zUfAVeSjH8I08eCqayFmMxL-0mix8SjJJTe5ORABvU,3544
121
+ megadetector/utils/md_tests.py,sha256=Qp_UfmD6HhTJYu-u0xHaXTl9CFnYIngoYL6BEA4egaA,76435
122
+ megadetector/utils/path_utils.py,sha256=tUNnx2OzDm4ND5rEhIw60DS0dUfXqByk6JJ4DKNlibU,98982
123
+ megadetector/utils/process_utils.py,sha256=gQcpH9WYvGPUs0FhtJ5_Xvl6JsvoGz8_mnDQk0PbTRM,5673
124
+ megadetector/utils/split_locations_into_train_val.py,sha256=fd_6pj1aWY6hybwaXvBn9kBcOHjI90U-OsTmEAGpeu8,10297
125
+ megadetector/utils/string_utils.py,sha256=r2Maw3zbzk3EyaZcNkdqr96yP_8m4ey6v0WxlemEY9U,6155
126
+ megadetector/utils/url_utils.py,sha256=VWYDHbWctTtw7mvbb_A5DTdF3v9V2mWhBoOP5MGE5S8,25728
127
+ megadetector/utils/wi_utils.py,sha256=L9GU-hpEtQuOZHrZfe-Fkm9_XfucErCGo-v-n8gJytw,100521
128
+ megadetector/utils/write_html_image_list.py,sha256=6Tbe5wyUxoBYJgH9yVrxxKCeWF2BVre_wQMEOQJ-ZIU,9068
129
+ megadetector/visualization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
130
+ megadetector/visualization/plot_utils.py,sha256=uDDlOhdaJ3V8sGj2kS9b0cgszKc8WCq2_ofl6TW_XUs,10727
131
+ megadetector/visualization/render_images_with_thumbnails.py,sha256=-XX4PG4wnrFjFTIwd0sMxXxKMxPuu0SZ_TfK3dI1x8Y,8425
132
+ megadetector/visualization/visualization_utils.py,sha256=_f8x6Tx5mWeGYpvTbkBDOGGaxenK-qPi2ba3ndOLQDk,75865
133
+ megadetector/visualization/visualize_db.py,sha256=DTqeLPqtSdY-DVAUJpGxkcHPnXHI5WJifsTuWoDKaRY,25951
134
+ megadetector/visualization/visualize_detector_output.py,sha256=BBX93VFHJubMJVH0h-QNncS_VypOitPFHV_mv4NPqy0,20217
135
+ megadetector-10.0.0.dist-info/licenses/LICENSE,sha256=RMa3qq-7Cyk7DdtqRj_bP1oInGFgjyHn9-PZ3PcrqIs,1100
136
+ megadetector-10.0.0.dist-info/METADATA,sha256=nRDKdsXF-B_Zfio310mRuoxfsy1usVmYtTlvyTJW5X4,6519
137
+ megadetector-10.0.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
138
+ megadetector-10.0.0.dist-info/top_level.txt,sha256=wf9DXa8EwiOSZ4G5IPjakSxBPxTDjhYYnqWRfR-zS4M,13
139
+ megadetector-10.0.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.3.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
File without changes