megadetector 5.0.6__py3-none-any.whl → 5.0.7__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 (62) hide show
  1. api/batch_processing/data_preparation/manage_local_batch.py +278 -197
  2. api/batch_processing/data_preparation/manage_video_batch.py +7 -2
  3. api/batch_processing/postprocessing/add_max_conf.py +1 -0
  4. api/batch_processing/postprocessing/compare_batch_results.py +110 -60
  5. api/batch_processing/postprocessing/load_api_results.py +55 -69
  6. api/batch_processing/postprocessing/md_to_labelme.py +1 -0
  7. api/batch_processing/postprocessing/postprocess_batch_results.py +158 -50
  8. api/batch_processing/postprocessing/render_detection_confusion_matrix.py +625 -0
  9. api/batch_processing/postprocessing/repeat_detection_elimination/find_repeat_detections.py +71 -23
  10. api/batch_processing/postprocessing/repeat_detection_elimination/remove_repeat_detections.py +1 -1
  11. api/batch_processing/postprocessing/repeat_detection_elimination/repeat_detections_core.py +222 -74
  12. api/batch_processing/postprocessing/subset_json_detector_output.py +132 -5
  13. api/batch_processing/postprocessing/top_folders_to_bottom.py +1 -1
  14. classification/prepare_classification_script.py +191 -191
  15. data_management/coco_to_yolo.py +65 -44
  16. data_management/databases/integrity_check_json_db.py +7 -5
  17. data_management/generate_crops_from_cct.py +1 -1
  18. data_management/importers/animl_results_to_md_results.py +2 -2
  19. data_management/importers/noaa_seals_2019.py +1 -1
  20. data_management/importers/zamba_results_to_md_results.py +2 -2
  21. data_management/labelme_to_coco.py +34 -6
  22. data_management/labelme_to_yolo.py +1 -1
  23. data_management/lila/create_lila_blank_set.py +474 -0
  24. data_management/lila/create_lila_test_set.py +2 -1
  25. data_management/lila/create_links_to_md_results_files.py +1 -1
  26. data_management/lila/download_lila_subset.py +46 -21
  27. data_management/lila/generate_lila_per_image_labels.py +23 -14
  28. data_management/lila/get_lila_annotation_counts.py +16 -10
  29. data_management/lila/lila_common.py +14 -11
  30. data_management/lila/test_lila_metadata_urls.py +116 -0
  31. data_management/resize_coco_dataset.py +12 -10
  32. data_management/yolo_output_to_md_output.py +40 -13
  33. data_management/yolo_to_coco.py +34 -21
  34. detection/process_video.py +36 -14
  35. detection/pytorch_detector.py +1 -1
  36. detection/run_detector.py +73 -18
  37. detection/run_detector_batch.py +104 -24
  38. detection/run_inference_with_yolov5_val.py +127 -26
  39. detection/run_tiled_inference.py +153 -43
  40. detection/video_utils.py +3 -1
  41. md_utils/ct_utils.py +79 -3
  42. md_utils/md_tests.py +253 -15
  43. md_utils/path_utils.py +129 -24
  44. md_utils/process_utils.py +26 -7
  45. md_utils/split_locations_into_train_val.py +215 -0
  46. md_utils/string_utils.py +10 -0
  47. md_utils/url_utils.py +0 -2
  48. md_utils/write_html_image_list.py +1 -0
  49. md_visualization/visualization_utils.py +17 -2
  50. md_visualization/visualize_db.py +8 -0
  51. md_visualization/visualize_detector_output.py +185 -104
  52. {megadetector-5.0.6.dist-info → megadetector-5.0.7.dist-info}/METADATA +2 -2
  53. {megadetector-5.0.6.dist-info → megadetector-5.0.7.dist-info}/RECORD +62 -58
  54. {megadetector-5.0.6.dist-info → megadetector-5.0.7.dist-info}/WHEEL +1 -1
  55. taxonomy_mapping/map_lila_taxonomy_to_wi_taxonomy.py +1 -1
  56. taxonomy_mapping/map_new_lila_datasets.py +43 -39
  57. taxonomy_mapping/prepare_lila_taxonomy_release.py +5 -2
  58. taxonomy_mapping/preview_lila_taxonomy.py +27 -27
  59. taxonomy_mapping/species_lookup.py +33 -13
  60. taxonomy_mapping/taxonomy_csv_checker.py +7 -5
  61. {megadetector-5.0.6.dist-info → megadetector-5.0.7.dist-info}/LICENSE +0 -0
  62. {megadetector-5.0.6.dist-info → megadetector-5.0.7.dist-info}/top_level.txt +0 -0
@@ -3,8 +3,7 @@
3
3
  # visualize_detector_output.py
4
4
  #
5
5
  # Render images with bounding boxes annotated on them to a folder, based on a
6
- # detector output result file (json). The original images can be local or in
7
- # Azure Blob Storage.
6
+ # detector output result file (json), optionally writing an HTML index file.
8
7
  #
9
8
  ########
10
9
 
@@ -15,51 +14,115 @@ import json
15
14
  import os
16
15
  import random
17
16
  import sys
18
- from typing import List, Optional
17
+ from multiprocessing.pool import ThreadPool
18
+ from multiprocessing.pool import Pool
19
+ from typing import List
20
+ from functools import partial
19
21
 
20
22
  from tqdm import tqdm
21
23
 
22
- from data_management.annotations.annotation_constants import (
23
- detector_bbox_category_id_to_name) # here id is int
24
+ from data_management.annotations.annotation_constants import detector_bbox_category_id_to_name
24
25
  from md_visualization import visualization_utils as vis_utils
25
26
  from md_utils.ct_utils import get_max_conf
27
+ from md_utils import write_html_image_list
28
+ from detection.run_detector import get_typical_confidence_threshold_from_results
26
29
 
27
30
 
28
31
  #%% Constants
29
32
 
30
- # convert category ID from int to str
33
+ # This will only be used if a category mapping is not available in the results file.
31
34
  DEFAULT_DETECTOR_LABEL_MAP = {
32
35
  str(k): v for k, v in detector_bbox_category_id_to_name.items()
33
36
  }
34
37
 
35
38
 
39
+ #%% Support functions
40
+
41
+ def render_image(entry,
42
+ detector_label_map,classification_label_map,
43
+ confidence_threshold,classification_confidence_threshold,
44
+ render_detections_only,preserve_path_structure,out_dir,images_dir,
45
+ output_image_width):
46
+
47
+ rendering_result = {'failed_image':False,'missing_image':False,
48
+ 'skipped_image':False,'annotated_image_path':None,
49
+ 'max_conf':None,'file':entry['file']}
50
+
51
+ image_id = entry['file']
52
+
53
+ if 'failure' in entry and entry['failure'] is not None:
54
+ rendering_result['failed_image'] = True
55
+ return rendering_result
56
+
57
+ assert 'detections' in entry and entry['detections'] is not None
58
+
59
+ max_conf = get_max_conf(entry)
60
+ rendering_result['max_conf'] = max_conf
61
+
62
+ if (max_conf < confidence_threshold) and render_detections_only:
63
+ rendering_result['skipped_image'] = True
64
+ return rendering_result
65
+
66
+ image_obj = os.path.join(images_dir, image_id)
67
+ if not os.path.exists(image_obj):
68
+ print(f'Image {image_id} not found in images_dir')
69
+ rendering_result['missing_image'] = True
70
+ return rendering_result
71
+
72
+ # If output_image_width is -1 or None, this will just return the original image
73
+ image = vis_utils.resize_image(
74
+ vis_utils.open_image(image_obj), output_image_width)
75
+
76
+ vis_utils.render_detection_bounding_boxes(
77
+ entry['detections'], image,
78
+ label_map=detector_label_map,
79
+ classification_label_map=classification_label_map,
80
+ confidence_threshold=confidence_threshold,
81
+ classification_confidence_threshold=classification_confidence_threshold)
82
+
83
+ if not preserve_path_structure:
84
+ for char in ['/', '\\', ':']:
85
+ image_id = image_id.replace(char, '~')
86
+ annotated_img_path = os.path.join(out_dir, f'anno_{image_id}')
87
+ else:
88
+ assert not os.path.isabs(image_id), "Can't preserve paths when operating on absolute paths"
89
+ annotated_img_path = os.path.join(out_dir, image_id)
90
+ os.makedirs(os.path.dirname(annotated_img_path),exist_ok=True)
91
+
92
+ image.save(annotated_img_path)
93
+ rendering_result['annotated_image_path'] = annotated_img_path
94
+
95
+ return rendering_result
96
+
97
+
36
98
  #%% Main function
37
99
 
38
100
  def visualize_detector_output(detector_output_path: str,
39
101
  out_dir: str,
40
102
  images_dir: str,
41
- is_azure: bool = False,
42
103
  confidence_threshold: float = 0.15,
43
104
  sample: int = -1,
44
105
  output_image_width: int = 700,
45
- random_seed: Optional[int] = None,
106
+ random_seed: int = None,
46
107
  render_detections_only: bool = False,
47
108
  classification_confidence_threshold = 0.1,
48
109
  html_output_file = None,
49
110
  html_output_options = None,
50
- preserve_path_structure = False) -> List[str]:
111
+ preserve_path_structure = False,
112
+ parallelize_rendering = False,
113
+ parallelize_rendering_n_cores = 10,
114
+ parallelize_rendering_with_threads = True) -> List[str]:
51
115
 
52
116
  """
53
- Draw bounding boxes on images given the output of the detector.
117
+ Draw bounding boxes on images given the output of a detector.
54
118
 
55
119
  Args:
56
120
  detector_output_path: str, path to detector output json file
57
121
  out_dir: str, path to directory for saving annotated images
58
- images_dir: str, path to local images dir, or a SAS URL to an Azure Blob
59
- Storage container
60
- is_azure: bool, whether images_dir points to an Azure URL
122
+ images_dir: str, path to images dir
61
123
  confidence: float, threshold above which annotations will be rendered
62
124
  sample: int, maximum number of images to annotate, -1 for all
125
+ random_seed: seed for sampling (not relevant if sample == -1)
63
126
  output_image_width: int, width in pixels to resize images for display,
64
127
  set to -1 to use original image width
65
128
  random_seed: int, for deterministic image sampling when sample != -1
@@ -68,16 +131,11 @@ def visualize_detector_output(detector_output_path: str,
68
131
  Returns: list of str, paths to annotated images
69
132
  """
70
133
 
71
- assert confidence_threshold >= 0 and confidence_threshold <= 1, (
72
- f'Confidence threshold {confidence_threshold} is invalid, must be in (0, 1).')
73
-
74
- assert os.path.exists(detector_output_path), (
75
- f'Detector output file does not exist at {detector_output_path}.')
134
+ assert os.path.exists(detector_output_path), \
135
+ 'Detector output file does not exist at {}'.format(detector_output_path)
76
136
 
77
- if is_azure:
78
- from md_utils import sas_blob_utils
79
- else:
80
- assert os.path.isdir(images_dir)
137
+ assert os.path.isdir(images_dir), \
138
+ 'Image folder {} is not available'.format(images_dir)
81
139
 
82
140
  os.makedirs(out_dir, exist_ok=True)
83
141
 
@@ -89,12 +147,18 @@ def visualize_detector_output(detector_output_path: str,
89
147
  assert 'images' in detector_output, (
90
148
  'Detector output file should be a json with an "images" field.')
91
149
  images = detector_output['images']
92
-
150
+
151
+ if confidence_threshold is None:
152
+ confidence_threshold = get_typical_confidence_threshold_from_results(detector_output)
153
+
154
+ assert confidence_threshold >= 0 and confidence_threshold <= 1, (
155
+ f'Confidence threshold {confidence_threshold} is invalid, must be in (0, 1).')
156
+
93
157
  if 'detection_categories' in detector_output:
94
158
  print('Using custom label mapping')
95
159
  detector_label_map = detector_output['detection_categories']
96
160
  else:
97
- detector_label_map = DEFAULT_DETECTOR_LABEL_MAP
161
+ detector_label_map = DEFAULT_DETECTOR_LABEL_MAP
98
162
 
99
163
  num_images = len(images)
100
164
  print(f'Detector output file contains {num_images} entries.')
@@ -118,85 +182,89 @@ def visualize_detector_output(detector_output_path: str,
118
182
  print('Rendering detections above a confidence threshold of {}'.format(
119
183
  confidence_threshold))
120
184
 
121
- num_saved = 0
122
- annotated_img_paths = []
123
- failed_images = []
124
- missing_images = []
125
-
126
185
  classification_label_map = None
127
186
 
128
187
  if 'classification_categories' in detector_output:
129
188
  classification_label_map = detector_output['classification_categories']
130
189
 
131
- for entry in tqdm(images):
132
-
133
- image_id = entry['file']
134
-
135
- if 'failure' in entry and entry['failure'] is not None:
136
- failed_images.append(image_id)
137
- continue
138
-
139
- assert 'detections' in entry and entry['detections'] is not None
140
-
141
- max_conf = get_max_conf(entry)
142
- if (max_conf < confidence_threshold) and render_detections_only:
143
- continue
190
+ rendering_results = []
191
+
192
+ if parallelize_rendering:
144
193
 
145
- if is_azure:
146
- blob_uri = sas_blob_utils.build_blob_uri(
147
- container_uri=images_dir, blob_name=image_id)
148
- if not sas_blob_utils.check_blob_exists(blob_uri):
149
- container = sas_blob_utils.get_container_from_uri(images_dir)
150
- print(f'Image {image_id} not found in blob container '
151
- f'{container}; skipped.')
152
- continue
153
- # BytesIO object
154
- image_obj, _ = sas_blob_utils.download_blob_to_stream(blob_uri)
194
+ if parallelize_rendering_with_threads:
195
+ worker_string = 'threads'
155
196
  else:
156
- image_obj = os.path.join(images_dir, image_id)
157
- if not os.path.exists(image_obj):
158
- print(f'Image {image_id} not found in images_dir')
159
- missing_images.append(image_id)
160
- continue
161
-
162
- image = vis_utils.resize_image(
163
- vis_utils.open_image(image_obj), output_image_width)
164
-
165
- vis_utils.render_detection_bounding_boxes(
166
- entry['detections'], image, label_map=detector_label_map,
167
- classification_label_map = classification_label_map,
168
- confidence_threshold=confidence_threshold,
169
- classification_confidence_threshold=classification_confidence_threshold)
170
-
171
- if not preserve_path_structure:
172
- for char in ['/', '\\', ':']:
173
- image_id = image_id.replace(char, '~')
174
- annotated_img_path = os.path.join(out_dir, f'anno_{image_id}')
197
+ worker_string = 'processes'
198
+
199
+ if parallelize_rendering_n_cores is None:
200
+ if parallelize_rendering_with_threads:
201
+ pool = ThreadPool()
202
+ else:
203
+ pool = Pool()
175
204
  else:
176
- assert not os.path.isabs(image_id), "Can't preserve paths when operating on absolute paths"
177
- annotated_img_path = os.path.join(out_dir, image_id)
178
- os.makedirs(os.path.dirname(annotated_img_path),exist_ok=True)
179
- annotated_img_paths.append(annotated_img_path)
180
- image.save(annotated_img_path)
181
- num_saved += 1
182
-
183
- if is_azure:
184
- image_obj.close()
185
-
205
+ if parallelize_rendering_with_threads:
206
+ pool = ThreadPool(parallelize_rendering_n_cores)
207
+ else:
208
+ pool = Pool(parallelize_rendering_n_cores)
209
+ print('Rendering images with {} {}'.format(parallelize_rendering_n_cores,
210
+ worker_string))
211
+ rendering_results = list(tqdm(pool.imap(
212
+ partial(render_image,detector_label_map=detector_label_map,
213
+ classification_label_map=classification_label_map,
214
+ confidence_threshold=confidence_threshold,
215
+ classification_confidence_threshold=classification_confidence_threshold,
216
+ render_detections_only=render_detections_only,
217
+ preserve_path_structure=preserve_path_structure,
218
+ out_dir=out_dir,
219
+ images_dir=images_dir,
220
+ output_image_width=output_image_width),
221
+ images), total=len(images)))
222
+
223
+ else:
224
+
225
+ for entry in tqdm(images):
226
+
227
+ rendering_result = render_image(entry,detector_label_map,classification_label_map,
228
+ confidence_threshold,classification_confidence_threshold,
229
+ render_detections_only,preserve_path_structure,out_dir,
230
+ images_dir,output_image_width)
231
+ rendering_results.append(rendering_result)
232
+
186
233
  # ...for each image
187
234
 
235
+ failed_images = [r for r in rendering_results if r['failed_image']]
236
+ missing_images = [r for r in rendering_results if r['missing_image']]
237
+ skipped_images = [r for r in rendering_results if r['skipped_image']]
238
+
188
239
  print('Skipped {} failed images (of {})'.format(len(failed_images),len(images)))
189
240
  print('Skipped {} missing images (of {})'.format(len(missing_images),len(images)))
241
+ print('Skipped {} below-threshold images (of {})'.format(len(skipped_images),len(images)))
190
242
 
191
- print(f'Rendered detection results on {num_saved} images, '
192
- f'saved to {out_dir}')
243
+ print(f'Rendered detection results to {out_dir}')
193
244
 
245
+ annotated_image_paths = [r['annotated_image_path'] for r in rendering_results if \
246
+ r['annotated_image_path'] is not None]
247
+
194
248
  if html_output_file is not None:
195
- from md_utils import write_html_image_list
196
- write_html_image_list.write_html_image_list(html_output_file,annotated_img_paths,
249
+
250
+ html_dir = os.path.dirname(html_output_file)
251
+
252
+ html_image_info = []
253
+
254
+ for r in rendering_results:
255
+ d = {}
256
+ annotated_image_path_relative = os.path.relpath(r['annotated_image_path'],html_dir)
257
+ d['filename'] = annotated_image_path_relative
258
+ d['textStyle'] = \
259
+ 'font-family:verdana,arial,calibri;font-size:80%;' + \
260
+ 'text-align:left;margin-top:20;margin-bottom:5'
261
+ d['title'] = '{} (max conf: {})'.format(r['file'],r['max_conf'])
262
+ html_image_info.append(d)
263
+
264
+ _ = write_html_image_list.write_html_image_list(html_output_file,html_image_info,
197
265
  options=html_output_options)
198
266
 
199
- return annotated_img_paths
267
+ return annotated_image_paths
200
268
 
201
269
 
202
270
  #%% Command-line driver
@@ -221,15 +289,9 @@ def main() -> None:
221
289
  'above which to visualize bounding boxes')
222
290
  parser.add_argument(
223
291
  '-i', '--images_dir', type=str, default=None,
224
- help='Path to a local directory or a SAS URL (in double quotes) to an '
225
- 'Azure blob storage container where images are stored. This '
292
+ help='Path to a local directory where images are stored. This '
226
293
  'serves as the root directory for image paths in '
227
- 'detector_output_path. If an Azure URL, pass the -a/--is-azure '
228
- 'flag. You can use Azure Storage Explorer to obtain a SAS URL.')
229
- parser.add_argument(
230
- '-a', '--is-azure', action='store_true',
231
- help='Flag that indidcates images_dir is an Azure blob storage '
232
- 'container URL.')
294
+ 'detector_output_path.')
233
295
  parser.add_argument(
234
296
  '-n', '--sample', type=int, default=-1,
235
297
  help='Number of images to be annotated and rendered. Set to -1 '
@@ -266,7 +328,6 @@ def main() -> None:
266
328
  out_dir=args.out_dir,
267
329
  confidence_threshold=args.confidence,
268
330
  images_dir=args.images_dir,
269
- is_azure=args.is_azure,
270
331
  sample=args.sample,
271
332
  output_image_width=args.output_image_width,
272
333
  random_seed=args.random_seed,
@@ -290,17 +351,37 @@ if False:
290
351
 
291
352
  #%%
292
353
 
293
- detector_output_path = r"g:\temp\animl-runs\animl-runs\Coati_v2\manifest.csv.json"
354
+ 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')
294
355
  out_dir = r'g:\temp\preview'
295
- images_dir = r"g:\temp\animl-runs\animl-runs\Coati_v2"
296
- is_azure = False
356
+ images_dir = r'g:\camera_traps\camera_trap_images'
297
357
  confidence_threshold = 0.15
298
- sample = -1
358
+ sample = 50
299
359
  output_image_width = 700
300
- random_seed = None
301
- render_detections_only = False
360
+ random_seed = 1
361
+ render_detections_only = True
302
362
  classification_confidence_threshold = 0.1
303
- html_output_file = None
304
- html_output_options = None,
363
+ html_output_file = os.path.join(out_dir,'index.html')
364
+ html_output_options = None
305
365
  preserve_path_structure = False
306
-
366
+ parallelize_rendering = True
367
+ parallelize_rendering_n_cores = 10
368
+ parallelize_rendering_with_threads = False
369
+
370
+ _ = visualize_detector_output(detector_output_path,
371
+ out_dir,
372
+ images_dir,
373
+ confidence_threshold,
374
+ sample,
375
+ output_image_width,
376
+ random_seed,
377
+ render_detections_only,
378
+ classification_confidence_threshold,
379
+ html_output_file,
380
+ html_output_options,
381
+ preserve_path_structure,
382
+ parallelize_rendering,
383
+ parallelize_rendering_n_cores,
384
+ parallelize_rendering_with_threads)
385
+
386
+ from md_utils.path_utils import open_file
387
+ open_file(html_output_file)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: megadetector
3
- Version: 5.0.6
3
+ Version: 5.0.7
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>
@@ -68,7 +68,7 @@ If you are a computer-vision-y person looking to run or fine-tune MegaDetector p
68
68
 
69
69
  ## Reasons you might want to use this package
70
70
 
71
- If you want to programatically interact with the postprocessing tools from the MegaDetector repo, or programmatically run MegaDetector in a way that produces [Timelapse](https://saul.cpsc.ucalgary.ca/timelapse)-friendly output (i.e., output in the standard [MegaDetector output format](https://github.com/agentmorris/MegaDetector/tree/main/api/batch_processing#megadetector-batch-output-format)), this package might be for you.
71
+ If you want to programmatically interact with the postprocessing tools from the MegaDetector repo, or programmatically run MegaDetector in a way that produces [Timelapse](https://saul.cpsc.ucalgary.ca/timelapse)-friendly output (i.e., output in the standard [MegaDetector output format](https://github.com/agentmorris/MegaDetector/tree/main/api/batch_processing#megadetector-batch-output-format)), this package might be for you.
72
72
 
73
73
  Although even if that describes you, you <i>still</i> might be better off cloning the MegaDetector repo. Pip-installability requires that some dependencies be newer than what was available at the time MDv5 was trained, so results are <i>very slightly</i> different than results produced in the "official" environment. These differences <i>probably</i> don't matter much, but they have not been formally characterized.
74
74
 
@@ -8,29 +8,30 @@ api/batch_processing/api_core/server_utils.py,sha256=oFusP1E29op5DN1nEaR-jQZgREx
8
8
  api/batch_processing/api_core/batch_service/score.py,sha256=ZuPQV7O1u9QNPhWVSYxQqvYgXo9p15e-XhnUyuz0vLE,17347
9
9
  api/batch_processing/api_core_support/aggregate_results_manually.py,sha256=8yDXbw12G8Y6SOv09tY-0hPXMNG_iRPv6mzxBiccsaU,2275
10
10
  api/batch_processing/api_support/summarize_daily_activity.py,sha256=SmRGAMWTKXf9bDXUPsTySMiIg8K1LDkAC8KVBVH_mPg,5383
11
- api/batch_processing/data_preparation/manage_local_batch.py,sha256=nNpQWPkdYP5Z122fg8otvr7bHJFkVIoQANh6f09yTlw,85371
12
- api/batch_processing/data_preparation/manage_video_batch.py,sha256=ISpM0bO5RJ_byWhuJqddGZuaE_rxntidhxJz6teFH5E,9592
11
+ api/batch_processing/data_preparation/manage_local_batch.py,sha256=Nb9MxJyAJC2e4twWkoGfI-crSSgB9g8Ue28cbbeE5QA,88618
12
+ api/batch_processing/data_preparation/manage_video_batch.py,sha256=fobPIMmfvdqa1OzxsurEYCFVnUTHGrtrGBiCq3xnYHs,9668
13
13
  api/batch_processing/integration/digiKam/setup.py,sha256=7P1X3JYrBDXmLUeLRrzxNfDkL5lo-pY8nXsp9Cz8rOI,203
14
14
  api/batch_processing/integration/digiKam/xmp_integration.py,sha256=AbGPTe9RjjOkKdiZDSElai61QyfeiLQQqJR2fiJpymA,17775
15
15
  api/batch_processing/integration/eMammal/test_scripts/config_template.py,sha256=UnvrgaFRBu59MuVUJa2WpG8ebcOJWcNeZEx6GWuYLzc,73
16
16
  api/batch_processing/integration/eMammal/test_scripts/push_annotations_to_emammal.py,sha256=eIzEKiwzCfifCOCGf-jf8G4dMuzyxQMWlrFzt-Z-nVk,3608
17
17
  api/batch_processing/integration/eMammal/test_scripts/select_images_for_testing.py,sha256=OYMu97p8vprSv03QcnS6aSxPBocn9sgaozfUqq_JpyM,1369
18
- api/batch_processing/postprocessing/add_max_conf.py,sha256=pqD-I-e0vqtf49Jm-SNhh9u7jhnVlyi4Lf5prNksldU,1529
18
+ api/batch_processing/postprocessing/add_max_conf.py,sha256=y4Xr_OHRxcop3vsLWQJ56eYIemm2HHKqVfvKJonTcQA,1530
19
19
  api/batch_processing/postprocessing/categorize_detections_by_size.py,sha256=b_O2OM44zIXewR4RjzeS2ue-32k5jE6KgjiPn8JRxAA,4877
20
20
  api/batch_processing/postprocessing/combine_api_outputs.py,sha256=WsOV4EsK9JUCMka1_-u-vinmWc6Ko8B0PD5fmwoXHh0,8233
21
- api/batch_processing/postprocessing/compare_batch_results.py,sha256=puzEA02yrCjtfjdhur0RSnqyIjG09hvxJQdEMS-srgU,32705
21
+ api/batch_processing/postprocessing/compare_batch_results.py,sha256=65Kq6mChsPElQfjhWgLDmnO9b6igatQvXiasB2YVHno,34652
22
22
  api/batch_processing/postprocessing/convert_output_format.py,sha256=aLboVVZdlGUNYOZhme0w8LtYrd04i15oK0apOgZaYWk,12947
23
- api/batch_processing/postprocessing/load_api_results.py,sha256=VcqVjNzDjLFQCCn-gtFEHR19rulm7stLiXsWcz_XlUg,7416
23
+ api/batch_processing/postprocessing/load_api_results.py,sha256=1BwpXUUQiGJeOUDfQTiA9thNd5jbSbOU3siTO1_Dw5s,6997
24
24
  api/batch_processing/postprocessing/md_to_coco.py,sha256=dRAkCGWtcNy_vsSTkX1h_0DZAsW6zNO7F-8XSkR8wAo,10139
25
- api/batch_processing/postprocessing/md_to_labelme.py,sha256=abtUHJA0WMt3QMpEvFVrYaKsAJhkaSetl51RwP_DMyI,7026
25
+ api/batch_processing/postprocessing/md_to_labelme.py,sha256=lfheIrXqzjq6lInmlYgYq354PrVvH2SPNXKr8e3S_DQ,7075
26
26
  api/batch_processing/postprocessing/merge_detections.py,sha256=B4QnqW9nvcEJpXzAK20TVB0t6L8c7PR5OjPy8FX-5Z8,15930
27
- api/batch_processing/postprocessing/postprocess_batch_results.py,sha256=WqMSWQUpJLt48IytGKLpAcfm9NX92zokL7CIdMsHAtM,68706
27
+ api/batch_processing/postprocessing/postprocess_batch_results.py,sha256=l_uyOTTINq9GBZlHsAnPteEvA-rWmKZH-eWVcqbMPUM,73653
28
+ api/batch_processing/postprocessing/render_detection_confusion_matrix.py,sha256=h-a7tWNBSe3VRUg-Z4aX-ySUzrF8NfiEYWA1lHbZrmo,25040
28
29
  api/batch_processing/postprocessing/separate_detections_into_folders.py,sha256=l5NKxDDxROc2EXt8EslrswXAZkQXgWTy5FSqCqa09Ug,28720
29
- api/batch_processing/postprocessing/subset_json_detector_output.py,sha256=Q4V7RWSjrBCt7VEsakx0c_haHlRdrLSzy0uqD5ELjp4,20809
30
- api/batch_processing/postprocessing/top_folders_to_bottom.py,sha256=crm_UX8jE6JurUHmS2yI-awYn3_MXqvo2xOlFZ_qig8,5475
31
- api/batch_processing/postprocessing/repeat_detection_elimination/find_repeat_detections.py,sha256=-XQ5IKY33y4CR1ELj-DOFbvtH51d-CtB6Dc-wiDOXoE,6899
32
- api/batch_processing/postprocessing/repeat_detection_elimination/remove_repeat_detections.py,sha256=Q0dRNGRO6l83pTbqkfiF0qOFsy2wfbpher3fd23Y_TU,2184
33
- api/batch_processing/postprocessing/repeat_detection_elimination/repeat_detections_core.py,sha256=USbK5LKNXu6MTbfznK2su3nV085ivC39-a9AhEKVOWc,54850
30
+ api/batch_processing/postprocessing/subset_json_detector_output.py,sha256=EROwcj4K-abAwzyZjPCQocuayIVma85lV-D6WvvRMuc,26368
31
+ api/batch_processing/postprocessing/top_folders_to_bottom.py,sha256=etJK9DmHppMe3WqGXypuilW-n-7hOjOO9w_k1khlaVU,5476
32
+ api/batch_processing/postprocessing/repeat_detection_elimination/find_repeat_detections.py,sha256=fYqPZhaL-6cbpKHz96O3Ch65Y8xux2LQ2-ZlMGhOlM0,9053
33
+ api/batch_processing/postprocessing/repeat_detection_elimination/remove_repeat_detections.py,sha256=YdMvM814TX0ZRTnP7BfowE62PoMoCOYcJOFl69DlKhQ,2189
34
+ api/batch_processing/postprocessing/repeat_detection_elimination/repeat_detections_core.py,sha256=D-q20g9kLXCNB8IMyeLYxdMSvipzmgu2buEh--HJrC0,62882
34
35
  api/synchronous/api_core/animal_detection_api/api_backend.py,sha256=PJXV0RFb6FoPBmdRug5W_5nbFwY2C_8CvDpFHjDs9w4,4934
35
36
  api/synchronous/api_core/animal_detection_api/api_frontend.py,sha256=_FGLf5C2tXQABFEGaA2Kzq05hj_D60BaIfWLCI-Os_4,10690
36
37
  api/synchronous/api_core/animal_detection_api/config.py,sha256=yEf7JZwRJCtHEV80kYvnNnUFJNds_AYLhomffwfFQi0,1017
@@ -70,7 +71,7 @@ classification/json_to_azcopy_list.py,sha256=o57wLHJPDrP9OPSY-3x81WI3mmcH1DyIOUh
70
71
  classification/json_validator.py,sha256=ZizcEPpW1J26p-oGyfvcffBy2voNRKCNXKF8NtxIt5A,26618
71
72
  classification/map_classification_categories.py,sha256=2B4K-TdE77VNw8XG1h8X7CuUvw0JSIrALdy6a1FvkXw,10738
72
73
  classification/merge_classification_detection_output.py,sha256=2FDTauvkbMZ3putJH837Ux67HTGsCAnGCOXhnnqjt6g,20123
73
- classification/prepare_classification_script.py,sha256=6BRxiEPSIl3nTVrZHE5qqUGDe_AxAEqnUg7sxMZSFMg,6141
74
+ classification/prepare_classification_script.py,sha256=7xwqws57Fkn0rmH5sADlem9trOJkiriSRwPredeIXho,5952
74
75
  classification/prepare_classification_script_mc.py,sha256=IMCsLyGL70cViVTH0eow0sYDM9E81AsBGrctNveXP10,7440
75
76
  classification/run_classifier.py,sha256=eBpkZzP7TtrnwOIlc99fTpe1QocmDuERaIw9mXqwAWI,9363
76
77
  classification/save_mislabeled.py,sha256=WmOKNXgrvvIkUdehiiWHNiKc5M7q0UM2If0vea0_7K8,3466
@@ -85,26 +86,26 @@ data_management/cct_json_utils.py,sha256=JX5pJh5QLyKDhcXheUYgbRSd99uB9Ui-EfsRZ_F
85
86
  data_management/cct_to_csv.py,sha256=urIL8IUByhKZ4FLLa9TKlzT6mu8upLzAPN1WNnDZdIY,3859
86
87
  data_management/cct_to_md.py,sha256=0QtqUdUkrema2BSNTeJqHYkDuwOLc7tOQwq1KxTbtPE,4485
87
88
  data_management/cct_to_wi.py,sha256=nJKUhLXcZXKE5tAR9UxbqCjeikfaABfB746wpv-1BmI,8336
88
- data_management/coco_to_yolo.py,sha256=mfjv7ELP8AgrdRRbql_7YRaIQPRtfLWppJXsRnX2aSo,25050
89
- data_management/generate_crops_from_cct.py,sha256=6N4pj51gOVTXOi8REfrR5-X56NlBI_p-MHZd4hxBT_Q,4282
89
+ data_management/coco_to_yolo.py,sha256=8c-9cCjelKTwMOL6gQc9oAWum7UPxIr0FP_tiK8NyLc,25880
90
+ data_management/generate_crops_from_cct.py,sha256=m6HJ8bB4N50HYV4SXAUV43k1XJl71QZmmWZ4L-9T45Y,4283
90
91
  data_management/get_image_sizes.py,sha256=yUCI5zQmA9G_GDaQiApwoafmO37cUi97dw-Ekh5leOE,4220
91
- data_management/labelme_to_coco.py,sha256=E9EdXsHkEBZ6KLZzYNGA3tQMJdwDpzJzJtF5kZvRKWA,12923
92
- data_management/labelme_to_yolo.py,sha256=H0bLty1yLm4Cz7cGuecwxUIaRk72PVokNLZTYB8hkCI,8479
92
+ data_management/labelme_to_coco.py,sha256=9RpOp-IV5miJag4KInLijR7koH8eZSztKdAmArhoMx4,14204
93
+ data_management/labelme_to_yolo.py,sha256=XjhrmoGxyo1N-N8kueGzmy_m6FWR4SO8sNHFppoH-GQ,8480
93
94
  data_management/ocr_tools.py,sha256=8cVJMQvzvv_6HXV8zMR4nJH72-L_f3Dy9IjIb3E32Js,29920
94
95
  data_management/read_exif.py,sha256=HGCp5gvD8MHQ0xGGTX2_PD5JHFTdMtqjZ8ql2pt5Fn0,19036
95
96
  data_management/remove_exif.py,sha256=_WDrKfRwK0UWCkj4SiLutGCd7-WRaKYoTgLfBWPDhGU,1555
96
- data_management/resize_coco_dataset.py,sha256=whm-XN7btC914duBZBJDfphVujosJKzJdH1XHM5XPDU,7414
97
- data_management/yolo_output_to_md_output.py,sha256=PznmANlgfMNzou7OI1JH0e76j5pS9VcYMxuXau-Ys30,14974
98
- data_management/yolo_to_coco.py,sha256=ybNqFlfasMfxzPx9u3A-GH1TCbMlnO5s2gX2CmyzXoA,7448
97
+ data_management/resize_coco_dataset.py,sha256=pG1yVktPSp6Vc3DThrJO7lmo67_KvOdqEtFpwM6QjOA,7398
98
+ data_management/yolo_output_to_md_output.py,sha256=vxUdn4bqg0S67ozvxtnlX77X6S7nCvyZbKAyvCh_Suc,16313
99
+ data_management/yolo_to_coco.py,sha256=Xb9UVO-HHYrkJyxbASWJDZrZCyW3JwBPI_WN5SQHys4,8078
99
100
  data_management/annotations/annotation_constants.py,sha256=P2CZCbAE0ImLLfaNRb1SMlP3q1fULWAIjgrYOrF9L0g,1566
100
101
  data_management/databases/add_width_and_height_to_db.py,sha256=71mOEK3xo9gbxK1TVZzBA9nNi-1ElmBZbIPKrUm9XG0,619
101
102
  data_management/databases/combine_coco_camera_traps_files.py,sha256=cwu_REQXdHWfVLtCvTvFEIvM7z8GwHVoawVuHcWv2aw,6888
102
- data_management/databases/integrity_check_json_db.py,sha256=x9BO7fDXCfdyHc-oiwVoeesIp_M9Q2bUOdh9DsohTbc,14377
103
+ data_management/databases/integrity_check_json_db.py,sha256=aQe36eEnhxHFpm9XGmFXCf4jsTvfXuBWMfKdIKKN4tU,14535
103
104
  data_management/databases/remove_corrupted_images_from_db.py,sha256=Dod8UQDFveAUJlrH9Svcp_HezdILRHp74TbAl3YGf84,6138
104
105
  data_management/databases/subset_json_db.py,sha256=UeVn3jlcpEw-K9E-QyRwxdzl7zaV80iv_u4v6kHUd_E,2749
105
106
  data_management/importers/add_nacti_sizes.py,sha256=qsBHPyJ7MPzl0vgJX5iErZxWkTJ6QRcyLJ8GM2YBu2U,1172
106
107
  data_management/importers/add_timestamps_to_icct.py,sha256=8XhQAIt_qw63qTMPobCKGl4O9RQZvZmhbmiSetOyNvA,2459
107
- data_management/importers/animl_results_to_md_results.py,sha256=muhwUQxMSoMSeNKEYNJu2E2d4h0tv_RrKoSgUWX1hiQ,4896
108
+ data_management/importers/animl_results_to_md_results.py,sha256=tzYaPpiUte5A1VHulAbYO9-hzUIpE1xI5lJp6hS_JoI,4899
108
109
  data_management/importers/auckland_doc_test_to_json.py,sha256=9Fg-n_Kj2jK5iZVaPrioNkhlLNxGnrU5GS_44lsadKo,12910
109
110
  data_management/importers/auckland_doc_to_json.py,sha256=qSjBcR7FTd5_J2LO6WOoIFxSnE2IiIIqRkhbydULV7s,5952
110
111
  data_management/importers/awc_to_json.py,sha256=jLXmwGaq81wgH7HcpbAJoNMQP2CqkdfI1mvShdTGeqw,5307
@@ -123,7 +124,7 @@ data_management/importers/jb_csv_to_json.py,sha256=u3IZwDboObYlxtUSa35G8P3t_L48m
123
124
  data_management/importers/mcgill_to_json.py,sha256=ZxsNW9qFi6Kyu8SJ0BB5uK7AMuBW92QOOKXHPbIgPwY,6718
124
125
  data_management/importers/missouri_to_json.py,sha256=y9lbLaD8bGM4m9iqGHIicyZOByeJGfZOF51RikHMSFU,14840
125
126
  data_management/importers/nacti_fieldname_adjustments.py,sha256=57PyfOft2Ws-1AcG4_9mzOcB3uW4IFxaZ3z0LsItUUU,2045
126
- data_management/importers/noaa_seals_2019.py,sha256=WHXqDmOetJYcrBkyNww4ZFQbh4VpCjQ7V4U3RpbBt94,5144
127
+ data_management/importers/noaa_seals_2019.py,sha256=wYcjhARv4IUJgawXcAnwIAOGZq5GORG8ElE_7JZSVCk,5145
127
128
  data_management/importers/pc_to_json.py,sha256=9Nin7R47aaE5bjXjvq7A2trv2vFdJVYzhLHwLFji5Tg,10718
128
129
  data_management/importers/plot_wni_giraffes.py,sha256=V_kAzbYjtXEBUCdSwSGsEEemLN9aVyZuKhoSZQEvkCI,3787
129
130
  data_management/importers/prepare-noaa-fish-data-for-lila.py,sha256=WIkuR4ozEeHwzQPs54jIDIbAgKf1I4taZNgpHHzh-Rc,12774
@@ -140,7 +141,7 @@ data_management/importers/ubc_to_json.py,sha256=MP_whIR-CVhNPCE3vQF_tk-6_EpmxWwR
140
141
  data_management/importers/umn_to_json.py,sha256=emUVCtNfbJmgHS22fBL8GaAMiblaJen52-IuqiFiWyI,16177
141
142
  data_management/importers/wellington_to_json.py,sha256=QFcVfAxflUVHTMuGhXGxe3z3iMKJ0B8Nziwpx6XcoLE,7671
142
143
  data_management/importers/wi_to_json.py,sha256=xuHFXE6tuaUnZmiFik18_3UCSCQx9abaG_2TnaRn0Xg,13656
143
- data_management/importers/zamba_results_to_md_results.py,sha256=acU63-F4NVPNj7h0WW53mfUrvSWf9dn14-WzZxrog94,5591
144
+ data_management/importers/zamba_results_to_md_results.py,sha256=UV0Iczxf_ghR3yL8D8KUAEg1j81_BavdzWhAFtg6wHQ,5594
144
145
  data_management/importers/eMammal/copy_and_unzip_emammal.py,sha256=gVB0drYUeCghWXFDpaJkCL0qdmFjMW75YAEEhFe38js,6080
145
146
  data_management/importers/eMammal/eMammal_helpers.py,sha256=Sv6PBAMDdlgwiek6Q3R6Rjio2RjtA-JpfgBr_Fmr9kA,6838
146
147
  data_management/importers/eMammal/make_eMammal_json.py,sha256=6C_-6Qk-Xhz_87DEPHA-txw90AvXrybJy1PbQXQbqwo,6987
@@ -148,51 +149,54 @@ data_management/importers/snapshotserengeti/make_full_SS_json.py,sha256=khE3W0pO
148
149
  data_management/importers/snapshotserengeti/make_per_season_SS_json.py,sha256=sAwvcR2siwblgY3LfTsbH4mXOXvJZCA246QIsQWuQBA,4316
149
150
  data_management/lila/add_locations_to_island_camera_traps.py,sha256=nsIJXyw2IhOwwM9A0SCn108Fg297fRUdADXGUAN8Y34,2561
150
151
  data_management/lila/add_locations_to_nacti.py,sha256=KVMWwSJx-gYI_J6J8y-AqsWnOTgidtebotJjYPfsj00,5017
151
- data_management/lila/create_lila_test_set.py,sha256=oYgOsUJjjbpfCs2Gx1CM6l2UK4xXmJPgRlwW4DOs1yY,4791
152
- data_management/lila/create_links_to_md_results_files.py,sha256=19YyXy4smcbjGbLYJOx0usbu5Rq2GQ1iDG4tLgOj1UM,3916
153
- data_management/lila/download_lila_subset.py,sha256=b25Pnql93Gtn-ZZmxQ0y30LiJMqxv9rB14z6Hn5T1TA,4382
154
- data_management/lila/generate_lila_per_image_labels.py,sha256=2dIQaVYTnyb5X_zfqQj1DpSqUh8XU0I8SgZkBAHQJiA,16856
155
- data_management/lila/get_lila_annotation_counts.py,sha256=m_tiXkpz3_KxVH4adDay_anUQ4OSdCkmOg7cUSP0tbI,5326
152
+ data_management/lila/create_lila_blank_set.py,sha256=ScGlqalOySsmZEvYtEn4pGNxGOj0qHyxGs-F5URTmk8,16359
153
+ data_management/lila/create_lila_test_set.py,sha256=WxM-LuhtNiee3CLeVPxUEWsfbybgZd7oluZu6epl69A,4825
154
+ data_management/lila/create_links_to_md_results_files.py,sha256=f0pXY2Lyj9DtRlgFpmLqNBs2qWd--B8N6UAt8E26tcM,3916
155
+ data_management/lila/download_lila_subset.py,sha256=nJjzKuMOYJa2lBJcXOEZloWjbFlQW_USke49DJdNruM,5283
156
+ data_management/lila/generate_lila_per_image_labels.py,sha256=b0FDiYbs5BI8wdk221ysr-p1PsprfRFwMIgv65BYS6Y,17351
157
+ data_management/lila/get_lila_annotation_counts.py,sha256=QVSKCmeLzliFZimjzi8AClS0Gz94pDMYckjw2cOm-7E,5490
156
158
  data_management/lila/get_lila_image_counts.py,sha256=r5p2wPL5vuKKO8DWia3Tll-EZZWFNUvax6ljaYtrKsk,3625
157
- data_management/lila/lila_common.py,sha256=olg_eR6Ul2kUQ7tIsndzVIJpils5oXNANYSGBmS455E,8667
158
- detection/process_video.py,sha256=tV7MTaS5mlSaWhAdDP4tvaMN_VCG27s-qr9yzf9Cwow,25915
159
- detection/pytorch_detector.py,sha256=K2mk-zlO81naypKzqdYYxlzX9xcaletDuq0MnNCCc10,11993
160
- detection/run_detector.py,sha256=TwkR0BSNeUvUmg5y-DJ6TtTnIq8Lv547JL4a9aiWpwI,24225
161
- detection/run_detector_batch.py,sha256=-8URucPBn0DVTZ7_U1bYA8fUYmiehTHWVb_ObZ7YVTo,43443
162
- detection/run_inference_with_yolov5_val.py,sha256=N77PkRM4dyOQCVik_BxPqNtIqbYb7jHphByGtB4XOf0,28323
163
- detection/run_tiled_inference.py,sha256=cs1IehE2DXj8Nr3CbnYMXqwcFM1vUBT1Rm5We5nlcSM,28785
159
+ data_management/lila/lila_common.py,sha256=vzazQR3UzvRxbxdBvRBcCbQ9pw0DUD3iWjUscV-nUvo,8785
160
+ data_management/lila/test_lila_metadata_urls.py,sha256=jDInoM5WD_EoahR_b5yTjrj6pkiitvj_Kz_1U0uSDzE,3966
161
+ detection/process_video.py,sha256=wuMoV-DJde_QlTiNAxsRjlDttiLl2e2BiJuyTQBINIE,26825
162
+ detection/pytorch_detector.py,sha256=WG6Q4KueBoA8lCZCdR2PrgbQAHs3HCO6MF01Ful4tfc,11992
163
+ detection/run_detector.py,sha256=XmQ4s-B7IlkxJye56y6uvx2vx6Ml3IBTo3Wx0SalO1Q,26036
164
+ detection/run_detector_batch.py,sha256=dgPwvEAOTutpuEKE6TCopjj5w9J1Eb9jOvT3lyEmoNc,46937
165
+ detection/run_inference_with_yolov5_val.py,sha256=tjHovM8I2YWvDsBcWV0h6hJaAjckTEN7foJ_X6IetIo,33755
166
+ detection/run_tiled_inference.py,sha256=mL1WxA4bWEf2TaT3xK-hXjA4_5ABBwfXx9zVbmhaWB4,33930
164
167
  detection/tf_detector.py,sha256=xOO8kzd-Um2X_sAZyop524LM53nipv5pNx8YueGTJrc,6760
165
- detection/video_utils.py,sha256=w3Ym9YxHCb-sFHTZyapKT0FaxTH-coILOJLpnguTEN0,19390
168
+ detection/video_utils.py,sha256=70dx6_D9zQhAHatzHA0Bo3LreOJe98A859O243dFIvs,19425
166
169
  detection/detector_training/copy_checkpoints.py,sha256=t2c3Q4Pf82tAp_OjSG-veIjRPrX0tJYi-bSQmGL2m4c,1091
167
170
  detection/detector_training/model_main_tf2.py,sha256=YwNsZ7hkIFaEuwKU0rHG_VyqiR_0E01BbdlD0Yx4Smo,4936
168
171
  md_utils/azure_utils.py,sha256=SVoQNSknYlBcpZeGrH2v3Qgm5kXxBrqM5Sx2L_Lax-I,6243
169
- md_utils/ct_utils.py,sha256=ywcKF1Rg8E_9XduxmVOSzcW_fgLFnDjI5IILjoZWiuY,10402
172
+ md_utils/ct_utils.py,sha256=CbuSL-XqI5jU9ShxEgnvIKqQF_BzbDPSTULPBmEVAnU,12908
170
173
  md_utils/directory_listing.py,sha256=dgxMczSOEH352YXdWRuNo_ujsonRrPJXFeuS7ocpe9k,9615
171
- md_utils/md_tests.py,sha256=DL8xhTm_np3B_2I8wdneh6f9PhprVdViZsckrrhKLLI,21688
172
- md_utils/path_utils.py,sha256=ZK2YScgWgogx-oj9WJxHR5xUhDawcClYyWHZvqyI3WY,13202
173
- md_utils/process_utils.py,sha256=ullaq8AIZNbUjG9ftB1kK3q8zJmfgbZdUNo1v3oXmvA,3191
174
+ md_utils/md_tests.py,sha256=FWqv74nBmN5772cSgRxnFZX8zZ3tikwMFr_rhvdV24Y,33316
175
+ md_utils/path_utils.py,sha256=g_ASvwJCeN6eGtypuwrSfCxNM7Gx15oeC6TXwJ6yYJc,16573
176
+ md_utils/process_utils.py,sha256=YkD38KLgceuqvMvDXIcVyzY51npUuUT3tOAjjF5Mvf8,4316
174
177
  md_utils/sas_blob_utils.py,sha256=GpjHn33N2b-XeBAtU3xhGbTIYcBs4YrXHtbQDmlGFvY,16955
175
- md_utils/string_utils.py,sha256=tFTC9TarPFGa7_UkKF0_t6Q2naH9IEsDVM2DOxwkFTQ,1277
176
- md_utils/url_utils.py,sha256=aFN7_WvzMJqYHL9t-SGCP2A0-mlYu1-P0HkZwgzUsKg,4598
177
- md_utils/write_html_image_list.py,sha256=9s9Y20MdDIWoLugyyNUAQNsM8-m46mN46EiIUSpOeu8,6986
178
+ md_utils/split_locations_into_train_val.py,sha256=psiWoXkYYLLOfjVHUyOhaa3fh9mmlm7HGFthklWbMaA,9241
179
+ md_utils/string_utils.py,sha256=Edwa07IWu7-QTNoMmvQYNnYgpwxxNh9VhXQ8AXMX3Qg,1600
180
+ md_utils/url_utils.py,sha256=2Ee459ZRQ4Ms-52WRhyiEBICHACKmigrRnYRi6JtCdQ,4593
181
+ md_utils/write_html_image_list.py,sha256=VLbeJnrRPm-D-_KFDVAnrU3alrXUr6eOr4WOv4-ugwk,7036
178
182
  md_visualization/plot_utils.py,sha256=eppaGgI0k73jhvOCruNrNO-VLH3EEFpFP2la_rZo57E,10712
179
183
  md_visualization/render_images_with_thumbnails.py,sha256=XJcL5qxu5pe2LQ4MqnD-O6dM_cPxGGNoqk5U_rZzFUQ,10391
180
- md_visualization/visualization_utils.py,sha256=EmZFOeYbhv1la53T3eFqJ_QKs7rGgcKkAOGfDcilYfg,34811
181
- md_visualization/visualize_db.py,sha256=QdPbxEmiPqOTQt8oa32-ax61bTw8N9aDx_pOJn6DF90,18665
182
- md_visualization/visualize_detector_output.py,sha256=C-UJZhwz1v4EccTm1Z4CldG1NSDCRQ-TaJ__G6ouM88,11595
184
+ md_visualization/visualization_utils.py,sha256=2OJKG_L70XYCCdhLGmQ5-HD9nCaHisqIJoRGIYb0L1g,35297
185
+ md_visualization/visualize_db.py,sha256=x6Y--RazaPvUayEch_Dr10NV0P0C7l0ZB29-vjW5WjI,18931
186
+ md_visualization/visualize_detector_output.py,sha256=aeg8DbwfddW5CDe84V2dt07eWMyxr4QdFcwTYbC_Lnk,15814
183
187
  md_visualization/visualize_megadb.py,sha256=ZHFMgQv-zjXwvyT6gEfLe2BzodvBNfQYEh0b6P_59TE,6188
184
- taxonomy_mapping/map_lila_taxonomy_to_wi_taxonomy.py,sha256=zDercLXW2tdAdLSsyO7mJYzQD93Ie3hRvW8zHPz_N0k,16516
185
- taxonomy_mapping/map_new_lila_datasets.py,sha256=tPM-uv5nDhCtUaCLV4UtHwN3AS-4GggxLOKfuPVR7iY,4032
186
- taxonomy_mapping/prepare_lila_taxonomy_release.py,sha256=1bZ7QkRjDLkRapytQsWbLvt21_sgDPQAr5Juj2fvde0,4266
187
- taxonomy_mapping/preview_lila_taxonomy.py,sha256=OfiQeVUWBesWE52ZuAMsd53Iv_ZOzqqZhS2Emxs-bac,20079
188
+ taxonomy_mapping/map_lila_taxonomy_to_wi_taxonomy.py,sha256=kFDp6r25LhYVkyrm-35TgBc2vgXXh6SmoARqO4aE9PU,16517
189
+ taxonomy_mapping/map_new_lila_datasets.py,sha256=rJlj-HuP9wNN2RvIlcWfqnW5N7cyiGLWglbe3FsFG0Q,4324
190
+ taxonomy_mapping/prepare_lila_taxonomy_release.py,sha256=Ser_lwpbYR75fMMcE49uT90t7o02dRZ7wY0GUyhzK9c,4357
191
+ taxonomy_mapping/preview_lila_taxonomy.py,sha256=iCcvf8dDsh1WZIZWq2ppua5wloAst6F6lphsS9vRTKQ,20144
188
192
  taxonomy_mapping/retrieve_sample_image.py,sha256=BySUy69DeGwPiIs9Ws5vIILJCTXeVImE5AVoawOiECM,1992
189
193
  taxonomy_mapping/simple_image_download.py,sha256=dXXVhhaR_bI-Elmk4Tmjt2ftdYzHbkuJCTzIMOJfLKs,6874
190
- taxonomy_mapping/species_lookup.py,sha256=wuyrZdFjIGmMdOoRgbON1AHcGEVZ1LjyOhfPE1jTJjY,27402
191
- taxonomy_mapping/taxonomy_csv_checker.py,sha256=db6Biubc0vLxIYe8fhkEW-GqYulT6tfPe8HOyDf3ksc,4795
194
+ taxonomy_mapping/species_lookup.py,sha256=oRqaUbiH_xULH7z5mkrtaFhacxlyM8KT-V-c4FnNq4w,28303
195
+ taxonomy_mapping/taxonomy_csv_checker.py,sha256=xmV2SBOfQEuZBMGmXyUzbuNxvd_oXKysXkxU6-IhKJg,4874
192
196
  taxonomy_mapping/taxonomy_graph.py,sha256=ZDm2enGanBlm8KXWvCndqmeerOp9LREaetSl-Lxy07s,12361
193
197
  taxonomy_mapping/validate_lila_category_mappings.py,sha256=CApYVWIZ8TTJ3vvQTgfjIvWDGHpPo-Zn9jqJFaw3DNw,2314
194
- megadetector-5.0.6.dist-info/LICENSE,sha256=RMa3qq-7Cyk7DdtqRj_bP1oInGFgjyHn9-PZ3PcrqIs,1100
195
- megadetector-5.0.6.dist-info/METADATA,sha256=srthdZm95WW0GdGlpAqRRBSp3Uinsdwr3iGacKR3PKk,7512
196
- megadetector-5.0.6.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92
197
- megadetector-5.0.6.dist-info/top_level.txt,sha256=-mFGpqnmviVz0Vyr2GxZ_kTo_PBPNoK6h4JtqIMjZGQ,88
198
- megadetector-5.0.6.dist-info/RECORD,,
198
+ megadetector-5.0.7.dist-info/LICENSE,sha256=RMa3qq-7Cyk7DdtqRj_bP1oInGFgjyHn9-PZ3PcrqIs,1100
199
+ megadetector-5.0.7.dist-info/METADATA,sha256=xgK96jYJkxj6kXvCzY3y8HlYb0-Oa44nmfETb2Ba7xI,7513
200
+ megadetector-5.0.7.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
201
+ megadetector-5.0.7.dist-info/top_level.txt,sha256=-mFGpqnmviVz0Vyr2GxZ_kTo_PBPNoK6h4JtqIMjZGQ,88
202
+ megadetector-5.0.7.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.41.3)
2
+ Generator: bdist_wheel (0.42.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -481,4 +481,4 @@ with open(wi_mapping_table_file,'w') as f:
481
481
 
482
482
  # ...for each dataset
483
483
 
484
- # ...with open()
484
+ # ...with open()