megadetector 5.0.19__py3-none-any.whl → 5.0.21__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 (34) hide show
  1. megadetector/data_management/importers/bellevue_to_json.py +0 -1
  2. megadetector/data_management/importers/osu-small-animals-to-json.py +364 -0
  3. megadetector/data_management/lila/generate_lila_per_image_labels.py +1 -1
  4. megadetector/data_management/lila/get_lila_annotation_counts.py +2 -0
  5. megadetector/data_management/lila/lila_common.py +28 -12
  6. megadetector/data_management/lila/test_lila_metadata_urls.py +17 -8
  7. megadetector/data_management/read_exif.py +73 -0
  8. megadetector/data_management/yolo_output_to_md_output.py +18 -5
  9. megadetector/detection/process_video.py +84 -16
  10. megadetector/detection/run_detector.py +36 -13
  11. megadetector/detection/run_detector_batch.py +104 -15
  12. megadetector/detection/run_inference_with_yolov5_val.py +20 -23
  13. megadetector/detection/video_utils.py +79 -44
  14. megadetector/postprocessing/combine_api_outputs.py +1 -1
  15. megadetector/postprocessing/detector_calibration.py +367 -0
  16. megadetector/postprocessing/md_to_coco.py +2 -1
  17. megadetector/postprocessing/postprocess_batch_results.py +32 -20
  18. megadetector/postprocessing/validate_batch_results.py +118 -58
  19. megadetector/taxonomy_mapping/map_new_lila_datasets.py +8 -3
  20. megadetector/taxonomy_mapping/prepare_lila_taxonomy_release.py +3 -2
  21. megadetector/taxonomy_mapping/preview_lila_taxonomy.py +3 -1
  22. megadetector/utils/ct_utils.py +20 -0
  23. megadetector/utils/md_tests.py +63 -17
  24. megadetector/utils/path_utils.py +139 -30
  25. megadetector/utils/write_html_image_list.py +16 -5
  26. megadetector/visualization/visualization_utils.py +126 -23
  27. megadetector/visualization/visualize_db.py +104 -63
  28. {megadetector-5.0.19.dist-info → megadetector-5.0.21.dist-info}/METADATA +2 -2
  29. {megadetector-5.0.19.dist-info → megadetector-5.0.21.dist-info}/RECORD +32 -32
  30. {megadetector-5.0.19.dist-info → megadetector-5.0.21.dist-info}/WHEEL +1 -1
  31. megadetector/data_management/importers/prepare-noaa-fish-data-for-lila.py +0 -359
  32. megadetector/data_management/importers/snapshot_safari_importer_reprise.py +0 -677
  33. {megadetector-5.0.19.dist-info → megadetector-5.0.21.dist-info}/LICENSE +0 -0
  34. {megadetector-5.0.19.dist-info → megadetector-5.0.21.dist-info}/top_level.txt +0 -0
@@ -32,6 +32,9 @@ from megadetector.utils.write_html_image_list import write_html_image_list
32
32
  from megadetector.data_management.cct_json_utils import IndexedJsonDb
33
33
  from megadetector.visualization import visualization_utils as vis_utils
34
34
 
35
+ def isnan(x):
36
+ return (isinstance(x,float) and np.isnan(x))
37
+
35
38
 
36
39
  #%% Settings
37
40
 
@@ -84,12 +87,12 @@ class DbVizOptions:
84
87
  #: Number of pixels to expand each bounding box
85
88
  self.box_expansion = 0
86
89
 
87
- #: Only include images that contain annotations with these class names (not IDs)
90
+ #: Only include images that contain annotations with these class names (not IDs) (list)
88
91
  #:
89
92
  #: Mutually exclusive with classes_to_exclude
90
93
  self.classes_to_include = None
91
94
 
92
- #: Exclude images that contain annotations with these class names (not IDs)
95
+ #: Exclude images that contain annotations with these class names (not IDs) (list)
93
96
  #:
94
97
  #: Mutually exclusive with classes_to_include
95
98
  self.classes_to_exclude = None
@@ -117,6 +120,12 @@ class DbVizOptions:
117
120
  #: Should we show absolute (True) or relative (False) paths for each image?
118
121
  self.show_full_paths = False
119
122
 
123
+ #: List of additional fields in the image struct that we should print in image headers
124
+ self.extra_image_fields_to_print = None
125
+
126
+ #: List of additional fields in the annotation struct that we should print in image headers
127
+ self.extra_annotation_fields_to_print = None
128
+
120
129
  #: Set to False to skip existing images
121
130
  self.force_rendering = True
122
131
 
@@ -164,6 +173,12 @@ def visualize_db(db_path, output_dir, image_base_dir, options=None):
164
173
  if options is None:
165
174
  options = DbVizOptions()
166
175
 
176
+ # Consistency checking for fields with specific format requirements
177
+
178
+ # This should be a list, but if someone specifies a string, do a reasonable thing
179
+ if isinstance(options.extra_image_fields_to_print,str):
180
+ options.extra_image_fields_to_print = [options.extra_image_fields_to_print]
181
+
167
182
  if not options.parallelize_rendering_with_threads:
168
183
  print('Warning: process-based parallelization is not yet supported by visualize_db')
169
184
  options.parallelize_rendering_with_threads = True
@@ -190,61 +205,69 @@ def visualize_db(db_path, output_dir, image_base_dir, options=None):
190
205
  annotations = image_db['annotations']
191
206
  images = image_db['images']
192
207
  categories = image_db['categories']
193
-
208
+
194
209
  # Optionally remove all images without bounding boxes, *before* sampling
195
210
  if options.trim_to_images_with_bboxes:
196
211
 
197
- bHasBbox = [False] * len(annotations)
198
- for iAnn,ann in enumerate(annotations):
212
+ b_has_bbox = [False] * len(annotations)
213
+ for i_ann,ann in enumerate(annotations):
199
214
  if 'bbox' in ann:
200
215
  assert isinstance(ann['bbox'],list)
201
- bHasBbox[iAnn] = True
202
- annotationsWithBboxes = list(compress(annotations, bHasBbox))
216
+ b_has_bbox[i_ann] = True
217
+ annotations_with_boxes = list(compress(annotations, b_has_bbox))
203
218
 
204
- imageIDsWithBboxes = [x['image_id'] for x in annotationsWithBboxes]
205
- imageIDsWithBboxes = set(imageIDsWithBboxes)
219
+ image_ids_with_boxes = [x['image_id'] for x in annotations_with_boxes]
220
+ image_ids_with_boxes = set(image_ids_with_boxes)
206
221
 
207
- bImageHasBbox = [False] * len(images)
208
- for iImage,image in enumerate(images):
222
+ image_has_box = [False] * len(images)
223
+ for i_image,image in enumerate(images):
209
224
  imageID = image['id']
210
- if imageID in imageIDsWithBboxes:
211
- bImageHasBbox[iImage] = True
212
- imagesWithBboxes = list(compress(images, bImageHasBbox))
213
- images = imagesWithBboxes
225
+ if imageID in image_ids_with_boxes:
226
+ image_has_box[i_image] = True
227
+ images_with_bboxes = list(compress(images, image_has_box))
228
+ images = images_with_bboxes
214
229
 
215
230
  # Optionally include/remove images with specific labels, *before* sampling
216
231
 
217
232
  assert (not ((options.classes_to_exclude is not None) and \
218
233
  (options.classes_to_include is not None))), \
219
234
  'Cannot specify an inclusion and exclusion list'
220
-
235
+
236
+ if options.classes_to_exclude is not None:
237
+ assert isinstance(options.classes_to_exclude,list), \
238
+ 'If supplied, classes_to_exclude should be a list'
239
+
240
+ if options.classes_to_include is not None:
241
+ assert isinstance(options.classes_to_include,list), \
242
+ 'If supplied, classes_to_include should be a list'
243
+
221
244
  if (options.classes_to_exclude is not None) or (options.classes_to_include is not None):
222
245
 
223
246
  print('Indexing database')
224
247
  indexed_db = IndexedJsonDb(image_db)
225
- bValidClass = [True] * len(images)
226
- for iImage,image in enumerate(images):
248
+ b_valid_class = [True] * len(images)
249
+ for i_image,image in enumerate(images):
227
250
  classes = indexed_db.get_classes_for_image(image)
228
251
  if options.classes_to_exclude is not None:
229
- for excludedClass in options.classes_to_exclude:
230
- if excludedClass in classes:
231
- bValidClass[iImage] = False
252
+ for excluded_class in options.classes_to_exclude:
253
+ if excluded_class in classes:
254
+ b_valid_class[i_image] = False
232
255
  break
233
256
  elif options.classes_to_include is not None:
234
- bValidClass[iImage] = False
257
+ b_valid_class[i_image] = False
235
258
  if options.multiple_categories_tag in options.classes_to_include:
236
259
  if len(classes) > 1:
237
- bValidClass[iImage] = True
238
- if not bValidClass[iImage]:
260
+ b_valid_class[i_image] = True
261
+ if not b_valid_class[i_image]:
239
262
  for c in classes:
240
263
  if c in options.classes_to_include:
241
- bValidClass[iImage] = True
264
+ b_valid_class[i_image] = True
242
265
  break
243
266
  else:
244
267
  raise ValueError('Illegal include/exclude combination')
245
268
 
246
- imagesWithValidClasses = list(compress(images, bValidClass))
247
- images = imagesWithValidClasses
269
+ images_with_valid_classes = list(compress(images, b_valid_class))
270
+ images = images_with_valid_classes
248
271
 
249
272
  # ...if we need to include/exclude categories
250
273
 
@@ -270,12 +293,12 @@ def visualize_db(db_path, output_dir, image_base_dir, options=None):
270
293
 
271
294
  # Set of dicts representing inputs to render_db_bounding_boxes:
272
295
  #
273
- # bboxes, boxClasses, image_path
296
+ # bboxes, box_classes, image_path
274
297
  rendering_info = []
275
298
 
276
299
  print('Preparing rendering list')
277
300
 
278
- for iImage,img in tqdm(df_img.iterrows(),total=len(df_img)):
301
+ for i_image,img in tqdm(df_img.iterrows(),total=len(df_img)):
279
302
 
280
303
  img_id = img['id']
281
304
  assert img_id is not None
@@ -291,17 +314,27 @@ def visualize_db(db_path, output_dir, image_base_dir, options=None):
291
314
  annos_i = df_anno.loc[df_anno['image_id'] == img_id, :] # all annotations on this image
292
315
 
293
316
  bboxes = []
294
- boxClasses = []
317
+ box_classes = []
295
318
 
296
319
  # All the class labels we've seen for this image (with out without bboxes)
297
- imageCategories = set()
320
+ image_categories = set()
298
321
 
299
- annotationLevelForImage = ''
322
+ extra_annotation_field_string = ''
323
+ annotation_level_for_image = ''
300
324
 
301
325
  # Iterate over annotations for this image
302
- # iAnn = 0; anno = annos_i.iloc[iAnn]
303
- for iAnn,anno in annos_i.iterrows():
304
-
326
+ # i_ann = 0; anno = annos_i.iloc[i_ann]
327
+ for i_ann,anno in annos_i.iterrows():
328
+
329
+ if options.extra_annotation_fields_to_print is not None:
330
+ field_names = list(anno.index)
331
+ for field_name in field_names:
332
+ if field_name in options.extra_annotation_fields_to_print:
333
+ field_value = anno[field_name]
334
+ if (field_value is not None) and (not isnan(field_value)):
335
+ extra_annotation_field_string += ' ({}:{})'.format(
336
+ field_name,field_value)
337
+
305
338
  if options.confidence_threshold is not None:
306
339
  assert options.confidence_field_name in anno, \
307
340
  'Error: confidence thresholding requested, ' + \
@@ -316,18 +349,18 @@ def visualize_db(db_path, output_dir, image_base_dir, options=None):
316
349
  annLevel = 'sequence'
317
350
  else:
318
351
  annLevel = 'image'
319
- if annotationLevelForImage == '':
320
- annotationLevelForImage = annLevel
321
- elif annotationLevelForImage != annLevel:
322
- annotationLevelForImage = 'mixed'
352
+ if annotation_level_for_image == '':
353
+ annotation_level_for_image = annLevel
354
+ elif annotation_level_for_image != annLevel:
355
+ annotation_level_for_image = 'mixed'
323
356
 
324
- categoryID = anno['category_id']
325
- categoryName = label_map[categoryID]
357
+ category_id = anno['category_id']
358
+ category_name = label_map[category_id]
326
359
  if options.add_search_links:
327
- categoryName = categoryName.replace('"','')
328
- categoryName = '<a href="https://www.google.com/search?tbm=isch&q={}">{}</a>'.format(
329
- categoryName,categoryName)
330
- imageCategories.add(categoryName)
360
+ category_name = category_name.replace('"','')
361
+ category_name = '<a href="https://www.google.com/search?tbm=isch&q={}">{}</a>'.format(
362
+ category_name,category_name)
363
+ image_categories.add(category_name)
331
364
 
332
365
  if 'bbox' in anno:
333
366
  bbox = anno['bbox']
@@ -335,11 +368,11 @@ def visualize_db(db_path, output_dir, image_base_dir, options=None):
335
368
  assert math.isnan(bbox), "I shouldn't see a bbox that's neither a box nor NaN"
336
369
  continue
337
370
  bboxes.append(bbox)
338
- boxClasses.append(anno['category_id'])
371
+ box_classes.append(anno['category_id'])
339
372
 
340
373
  # ...for each of this image's annotations
341
374
 
342
- imageClasses = ', '.join(imageCategories)
375
+ image_classes = ', '.join(image_categories)
343
376
 
344
377
  img_id_string = str(img_id).lower()
345
378
  file_name = '{}_gt.jpg'.format(os.path.splitext(img_id_string)[0])
@@ -349,19 +382,19 @@ def visualize_db(db_path, output_dir, image_base_dir, options=None):
349
382
  for c in illegal_characters:
350
383
  file_name = file_name.replace(c,'~')
351
384
 
352
- rendering_info.append({'bboxes':bboxes, 'boxClasses':boxClasses, 'img_path':img_path,
385
+ rendering_info.append({'bboxes':bboxes, 'box_classes':box_classes, 'img_path':img_path,
353
386
  'output_file_name':file_name})
354
387
 
355
- labelLevelString = ' '
356
- if len(annotationLevelForImage) > 0:
357
- labelLevelString = ' (annotation level: {})'.format(annotationLevelForImage)
388
+ label_level_string = ''
389
+ if len(annotation_level_for_image) > 0:
390
+ label_level_string = ' (annotation level: {})'.format(annotation_level_for_image)
358
391
 
359
392
  if 'frame_num' in img and 'seq_num_frames' in img:
360
- frameString = ' frame: {} of {}, '.format(img['frame_num'],img['seq_num_frames'])
393
+ frame_string = ' frame: {} of {},'.format(img['frame_num'],img['seq_num_frames'])
361
394
  elif 'frame_num' in img:
362
- frameString = ' frame: {}, '.format(img['frame_num'])
395
+ frame_string = ' frame: {},'.format(img['frame_num'])
363
396
  else:
364
- frameString = ' '
397
+ frame_string = ''
365
398
 
366
399
  if options.show_full_paths:
367
400
  filename_text = img_path
@@ -370,22 +403,30 @@ def visualize_db(db_path, output_dir, image_base_dir, options=None):
370
403
  if options.include_filename_links:
371
404
  filename_text = '<a href="{}">{}</a>'.format(img_path,filename_text)
372
405
 
373
- flagString = ''
374
-
375
- def isnan(x):
376
- return (isinstance(x,float) and np.isnan(x))
406
+ flag_string = ''
377
407
 
378
408
  if ('flags' in img) and (not isnan(img['flags'])):
379
- flagString = ', flags: {}'.format(str(img['flags']))
409
+ flag_string = ', flags: {}'.format(str(img['flags']))
380
410
 
411
+ extra_field_string = ''
412
+
413
+ if options.extra_image_fields_to_print is not None:
414
+ for field_name in options.extra_image_fields_to_print:
415
+ if field_name in img:
416
+ # Always include a leading comma; this either separates us from the
417
+ # previous field in [extra_fields_to_print] or from the rest of the string
418
+ extra_field_string += ', {}: {}'.format(
419
+ field_name,str(img[field_name]))
420
+
381
421
  # We're adding html for an image before we render it, so it's possible this image will
382
422
  # fail to render. For applications where this script is being used to debua a database
383
423
  # (the common case?), this is useful behavior, for other applications, this is annoying.
384
424
  image_dict = \
385
425
  {
386
426
  'filename': '{}/{}'.format('rendered_images', file_name),
387
- 'title': '{}<br/>{}, num boxes: {}, {}class labels: {}{}{}'.format(
388
- filename_text, img_id, len(bboxes), frameString, imageClasses, labelLevelString, flagString),
427
+ 'title': '{}<br/>{}, num boxes: {},{} class labels: {}{}{}{}{}'.format(
428
+ filename_text, img_id, len(bboxes), frame_string, image_classes,
429
+ label_level_string, flag_string, extra_field_string, extra_annotation_field_string),
389
430
  'textStyle': 'font-family:verdana,arial,calibri;font-size:80%;' + \
390
431
  'text-align:left;margin-top:20;margin-bottom:5'
391
432
  }
@@ -400,7 +441,7 @@ def visualize_db(db_path, output_dir, image_base_dir, options=None):
400
441
 
401
442
  img_path = rendering_info['img_path']
402
443
  bboxes = rendering_info['bboxes']
403
- bboxClasses = rendering_info['boxClasses']
444
+ bbox_classes = rendering_info['box_classes']
404
445
  output_file_name = rendering_info['output_file_name']
405
446
  output_full_path = os.path.join(output_dir, 'rendered_images', output_file_name)
406
447
 
@@ -426,7 +467,7 @@ def visualize_db(db_path, output_dir, image_base_dir, options=None):
426
467
  print('Image {} failed to open, error: {}'.format(img_path, e))
427
468
  return False
428
469
 
429
- vis_utils.render_db_bounding_boxes(boxes=bboxes, classes=bboxClasses,
470
+ vis_utils.render_db_bounding_boxes(boxes=bboxes, classes=bbox_classes,
430
471
  image=image, original_size=original_size,
431
472
  label_map=label_map,
432
473
  thickness=options.box_thickness,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: megadetector
3
- Version: 5.0.19
3
+ Version: 5.0.21
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>
@@ -39,7 +39,7 @@ Requires-Dist: Pillow >=9.5
39
39
  Requires-Dist: tqdm >=4.64.0
40
40
  Requires-Dist: jsonpickle >=3.0.2
41
41
  Requires-Dist: humanfriendly >=10.0
42
- Requires-Dist: numpy >=1.26.0
42
+ Requires-Dist: numpy <1.24,>=1.22
43
43
  Requires-Dist: matplotlib >=3.8.0
44
44
  Requires-Dist: opencv-python >=4.8.0
45
45
  Requires-Dist: requests >=2.31.0
@@ -63,13 +63,13 @@ megadetector/data_management/get_image_sizes.py,sha256=2b6arj4gvoN-9f61lC3t1zAFF
63
63
  megadetector/data_management/labelme_to_coco.py,sha256=8RUXALXbLpmS7UYUet4BAe9JVSDW7ojwDDpxYs072ZI,21231
64
64
  megadetector/data_management/labelme_to_yolo.py,sha256=dRePSOwU_jiCr0EakDQCz1Ct-ZHDxDglUk4HbM1LfWc,10034
65
65
  megadetector/data_management/ocr_tools.py,sha256=T9ClY3B-blnK3-UF1vpVdageknYsykm_6FAfqn0kliU,32529
66
- megadetector/data_management/read_exif.py,sha256=-q0NqJ3VZSBovD_d6de-s3UR2NuKF6gSw2etfvVuRO4,27866
66
+ megadetector/data_management/read_exif.py,sha256=iW3oQz4vKHnSe1nY38Pp-bXlQ5EUO49ttnhvO-0Pcqk,30508
67
67
  megadetector/data_management/remap_coco_categories.py,sha256=xXWv0QhTjkUfc9RKtAZanK77HMSq_21mFg_34KFD6hw,2903
68
68
  megadetector/data_management/remove_exif.py,sha256=vIWnJfw1i9JgyQKUDGEzzqkHro4ndykIPFWhtkm6RAU,2502
69
69
  megadetector/data_management/rename_images.py,sha256=AG3YIxXEYdGmK4G-rv0_XZIylPqOZpS6gfEkydF6oDg,6918
70
70
  megadetector/data_management/resize_coco_dataset.py,sha256=AaiV7efIcNnqsXsnQckmHq2G__7ZQHBV_jN6rhZfMjo,6810
71
71
  megadetector/data_management/wi_download_csv_to_coco.py,sha256=ilnJZhNZK-FGUR-AfUSWjIDUk9Gytgxw7IOK_N8WKLE,8350
72
- megadetector/data_management/yolo_output_to_md_output.py,sha256=1RUJSWiVa7CVVQ_CresOVXAD3Eb7oHjdgPg7fTX_Vwg,17563
72
+ megadetector/data_management/yolo_output_to_md_output.py,sha256=VuU9G6QOeAXOa7JsuHjSYhE3Y7MjEd2bPtceugOOILY,17920
73
73
  megadetector/data_management/yolo_to_coco.py,sha256=TzAagQ2ATbB_tn1oZxrHCWsrFGO_OhfZmi-3X45WdDU,26180
74
74
  megadetector/data_management/annotations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
75
  megadetector/data_management/annotations/annotation_constants.py,sha256=1597MpAr_HdidIHoDFj4RgUO3K5e2Xm2bGafGeonR2k,953
@@ -84,7 +84,7 @@ megadetector/data_management/importers/animl_results_to_md_results.py,sha256=duv
84
84
  megadetector/data_management/importers/auckland_doc_test_to_json.py,sha256=tT4XnvY3c5idDkQByfN6Z646CNiCprS-75ytjbMbnVY,12911
85
85
  megadetector/data_management/importers/auckland_doc_to_json.py,sha256=EoNsAJvzTwcgHspE05eO0LHazMVYM7-yzFBit0FiJWk,5970
86
86
  megadetector/data_management/importers/awc_to_json.py,sha256=e1HjShGS2WC-l99FV89g1u0o2v5990Vh9XsjIukg6qQ,5327
87
- megadetector/data_management/importers/bellevue_to_json.py,sha256=oJMSF0r_snRXtppiwFy4vvP8gErEw6_7Kv1UJs59QLo,7919
87
+ megadetector/data_management/importers/bellevue_to_json.py,sha256=mtlugpWhFjqBs4zgKvPGmBjWSM640BczzVV65zOHWVo,7918
88
88
  megadetector/data_management/importers/cacophony-thermal-importer.py,sha256=4o7gyX-uUlS3rkQZlOUGMaaUVT_pdTizcuXw4rvDrE4,28577
89
89
  megadetector/data_management/importers/carrizo_shrubfree_2018.py,sha256=ah14pfzLuDUph--qUqRqvWszOFY245rsIfAgCEF7F_I,7858
90
90
  megadetector/data_management/importers/carrizo_trail_cam_2017.py,sha256=gwpL0sM82A6UBn2qWilP15D-1lOzQchZuhxXMzZ_7Ws,8862
@@ -101,15 +101,14 @@ megadetector/data_management/importers/mcgill_to_json.py,sha256=dfSxU1hHimyGT6Zt
101
101
  megadetector/data_management/importers/missouri_to_json.py,sha256=C0ia3eCEZujVUKE2gmQc6ScsK8kXWM7m0ibeKgHfXNo,14848
102
102
  megadetector/data_management/importers/nacti_fieldname_adjustments.py,sha256=1oDCSuFXhc2b7JPIzkSb3DkusacdAjMM2GQZnhfFQCg,2027
103
103
  megadetector/data_management/importers/noaa_seals_2019.py,sha256=oar378j46fm27ygcbjrgN1rbq6h1SC8utAdSPNqiQt4,5152
104
+ megadetector/data_management/importers/osu-small-animals-to-json.py,sha256=wBbnY8kqZrzRiujrNK750DB3mq14EyIz4Zlx9JHRTkw,10096
104
105
  megadetector/data_management/importers/pc_to_json.py,sha256=VmVvY5Fr8jMLmRkDZI9CuyLvrNuLrspJA9Q8Auxbw1A,10762
105
106
  megadetector/data_management/importers/plot_wni_giraffes.py,sha256=KdEjbItDOXbXj0fr0celfMp7z31Rr3S29SLWBCMY-4M,3772
106
- megadetector/data_management/importers/prepare-noaa-fish-data-for-lila.py,sha256=Pq5tSKWTIGEAGxBiGaO5Tz0QvKZ6QgJTIQ3raDAhjkk,12435
107
107
  megadetector/data_management/importers/prepare_zsl_imerit.py,sha256=ohrUaTXIGg1M4_liptWaPa-4g3yNvc1E4o_knfHSE-8,3775
108
108
  megadetector/data_management/importers/rspb_to_json.py,sha256=y03v1d1un9mI3HZRCZinMB1pEkNvTb70S7Qkr3F76qg,9841
109
109
  megadetector/data_management/importers/save_the_elephants_survey_A.py,sha256=lugw8m5Nh2Fhs-FYo9L0mDL3_29nAweLxEul6GekdkI,10669
110
110
  megadetector/data_management/importers/save_the_elephants_survey_B.py,sha256=SWClXENsIePwifP8eJeRsj3kh3Bztl6Kzc_BdqNZvFw,11172
111
111
  megadetector/data_management/importers/snapshot_safari_importer.py,sha256=dQ1GmpHcrQCQF9YZ0UaLTvc_3aOZEDqWGcxzYQeq4ho,23605
112
- megadetector/data_management/importers/snapshot_safari_importer_reprise.py,sha256=f2WXC22fzbKaQl2888bfUlzap4oDhRG3ysZOUMBrcw0,22549
113
112
  megadetector/data_management/importers/snapshot_serengeti_lila.py,sha256=-aYq_5IxhpcR6oxFYYVv98WVnGAr0mnVkbX-oJCPd8M,33865
114
113
  megadetector/data_management/importers/sulross_get_exif.py,sha256=Bt1tGYtr5CllxCe2BL8uI3SfPu3e1SSqijnOz--iRqQ,2071
115
114
  megadetector/data_management/importers/timelapse_csv_set_to_json.py,sha256=B9VbBltf3IdPBI2O1Cmg8wODhlIML4MQpjdhTFD4GP4,15916
@@ -130,48 +129,49 @@ megadetector/data_management/lila/create_lila_blank_set.py,sha256=SBwpM0-pycW37T
130
129
  megadetector/data_management/lila/create_lila_test_set.py,sha256=DjivKgsFJlO1IHezXrwAGpiCAhLVmvPnv2nJYpv1ABU,4835
131
130
  megadetector/data_management/lila/create_links_to_md_results_files.py,sha256=MvaPBAgdwoxaNrRaKZ8mGaOCky1BYXlrT08tPG9BrpM,3803
132
131
  megadetector/data_management/lila/download_lila_subset.py,sha256=rh09kphSCVPlUGuYY-CkSyd8dy0pBUdth6uHkZ84sEo,5345
133
- megadetector/data_management/lila/generate_lila_per_image_labels.py,sha256=K54-JS7s88HsugtaXo56P22PiPsGEdHYB2AaGMBhvIY,18135
134
- megadetector/data_management/lila/get_lila_annotation_counts.py,sha256=aOkjemasOqf1Uixu-yhaFKYyKILYRZQZi4GBW4sbtic,5602
132
+ megadetector/data_management/lila/generate_lila_per_image_labels.py,sha256=WRfqYW0cyan_-2OHy4YudoUC8ojjslfBHS_iA8JLaPo,18150
133
+ megadetector/data_management/lila/get_lila_annotation_counts.py,sha256=DWysGF5y7E_RYEoAyvR5RUPTOZVbauTxfAwFcIbn5sc,5622
135
134
  megadetector/data_management/lila/get_lila_image_counts.py,sha256=UxXS5RDnSA_WbxE92qN-N7p-qR-jbyTsTZ7duLo06us,3620
136
- megadetector/data_management/lila/lila_common.py,sha256=IEnGoyRgcqbek1qJ1gFE83p1Pg_5kaMS-nQI25lRWIs,10132
137
- megadetector/data_management/lila/test_lila_metadata_urls.py,sha256=jqN7UID16fu78BK_2sygb4s9BBeVCpSZT3_oL2GYxxY,4438
135
+ megadetector/data_management/lila/lila_common.py,sha256=74ecaGItH4AtCYeY1WSejLIcylhJPCJ1y97gYYL34PM,11080
136
+ megadetector/data_management/lila/test_lila_metadata_urls.py,sha256=iMpoz9Y6fcVz9whTJpo2f6EuTCiptUix2UV6khyKn9I,4688
138
137
  megadetector/detection/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
139
- megadetector/detection/process_video.py,sha256=ugBpIPy7ogrbHSklIA7FTh5YqnTzDtfeN5z8JmrXJpc,50282
138
+ megadetector/detection/process_video.py,sha256=4Fwt9utPjctSUMe8YnJzgoEsu_WHehe7MKIR3s81hC8,53242
140
139
  megadetector/detection/pytorch_detector.py,sha256=StOnaspDBkMeePiTyq5ZEcFUDBEddq36nigHXbF-zAQ,14029
141
- megadetector/detection/run_detector.py,sha256=vEfq3jJTseD0sIM9MaIhbeEVqP6JoLXOC2cl8Dhehxs,30553
142
- megadetector/detection/run_detector_batch.py,sha256=P1sb922Vo_TD-ioGGkwt1FfXLyJFJms-MLGIcnmBtfg,57304
143
- megadetector/detection/run_inference_with_yolov5_val.py,sha256=yjNm130qntOyJ4jbetdt5xDHWnSmBXRydyxB2I56XjM,49099
140
+ megadetector/detection/run_detector.py,sha256=r_RKrrz6ppKe9cLvuN9Q3OUhv032wC7uESQ_vxJZ1iw,32029
141
+ megadetector/detection/run_detector_batch.py,sha256=a98fzorcGtQaOYa5AGW2XPoJpbHeJWO5prqwzxVoPaI,62055
142
+ megadetector/detection/run_inference_with_yolov5_val.py,sha256=2miU2QZG_zp3rEPyoKf2XozuMpW6zAW4bAoyg6hSe-k,48691
144
143
  megadetector/detection/run_tiled_inference.py,sha256=vw0713eNuMiEOjHfweQl58zPHNxPOMdFWZ8bTDLhlMY,37883
145
144
  megadetector/detection/tf_detector.py,sha256=5V94a0gR6WmGPacKm59hl1eYEZI8cG04frF4EvHrmzU,8285
146
- megadetector/detection/video_utils.py,sha256=tMKl47sg7jtU07vBeobGvjVgXdHWpHrMOx3jRvJ3iLo,41471
145
+ megadetector/detection/video_utils.py,sha256=TmUIcnnqk3VEXtk9MXHKAvixqCCVMvj5HHuBOmPBNDk,43036
147
146
  megadetector/detection/detector_training/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
148
147
  megadetector/detection/detector_training/model_main_tf2.py,sha256=YwNsZ7hkIFaEuwKU0rHG_VyqiR_0E01BbdlD0Yx4Smo,4936
149
148
  megadetector/postprocessing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
150
149
  megadetector/postprocessing/add_max_conf.py,sha256=qTE1_0RwGAy6jLDkHrIo2pS84yNbUV11s4IZuAYGdIU,1514
151
150
  megadetector/postprocessing/categorize_detections_by_size.py,sha256=YdapcvjA6Dz2dPa2AFf1Dwyl7C-OmmP4G4OjhTOuaF4,5797
152
151
  megadetector/postprocessing/classification_postprocessing.py,sha256=8uvlA0Gc8nakM5IE5Pud7WZfmF5kEhcYvxgQXcI9kl0,30429
153
- megadetector/postprocessing/combine_api_outputs.py,sha256=xCJHEKca8YW-mupEr0yNNwwSBeL9NvcV1w3VtEzN4lk,8535
152
+ megadetector/postprocessing/combine_api_outputs.py,sha256=zBGpSLbcQUiLYxgJrjZXjBwc2dOwAytV30UFnroP2Fg,8536
154
153
  megadetector/postprocessing/compare_batch_results.py,sha256=7O5c6-JsIDpuIGobks_R9j8MPuiZQRnEtNnJQsJqICM,38918
155
154
  megadetector/postprocessing/convert_output_format.py,sha256=HwThfK76UPEAGa3KQbJ_tMKIrUvJ3JhKoQVWJt9dPBk,15447
155
+ megadetector/postprocessing/detector_calibration.py,sha256=WHIj-i91geXZjNV2Am2783PL2iGAebkeVFJZhc1K6uY,12702
156
156
  megadetector/postprocessing/load_api_results.py,sha256=FqcaiPMuqTojZOV3Jn14pJESpuwjWGbZtcvJuVXUaDM,6861
157
- megadetector/postprocessing/md_to_coco.py,sha256=x3sUnOLd2lVfdG2zRN7k-oUvx6rvRD7DWmWJymPc108,12359
157
+ megadetector/postprocessing/md_to_coco.py,sha256=AhlI2w2kOu1Y1b4yliyu81WsMBxYXcBJ0YAF5laX9v8,12406
158
158
  megadetector/postprocessing/md_to_labelme.py,sha256=hejMKVxaz_xdtsGDPTQkeWuis7gzT-VOrL2Qf8ym1x0,11703
159
159
  megadetector/postprocessing/merge_detections.py,sha256=AEMgMivhph1vph_t_Qv85d9iHynT2nvq7otN4KGrDLU,17776
160
- megadetector/postprocessing/postprocess_batch_results.py,sha256=xa1FCQnzo1B6Inq8EWqS_In5xDu3qNzES_YdZ0INKr0,78978
160
+ megadetector/postprocessing/postprocess_batch_results.py,sha256=JnH3bezK9lm5Sljlsxgp9_JFUgUzcjRDjRRbLOYy7qk,79879
161
161
  megadetector/postprocessing/remap_detection_categories.py,sha256=d9IYTa0i_KbbrarJc_mczABmdwypscl5-KpK8Hx_z8o,6640
162
162
  megadetector/postprocessing/render_detection_confusion_matrix.py,sha256=_wsk4W0PbNiqmFuHy-EA0Z07B1tQLMsdCTPatnHAdZw,27382
163
163
  megadetector/postprocessing/separate_detections_into_folders.py,sha256=k42gxnL8hbBiV0e2T-jmFrhxzIxnhi57Nx9cDSSL5s0,31218
164
164
  megadetector/postprocessing/subset_json_detector_output.py,sha256=PDgb6cnsFm9d4E7_sMVIguLIU7s79uFQa2CRCxAO0F4,27064
165
165
  megadetector/postprocessing/top_folders_to_bottom.py,sha256=Dqk-KZXiRlIYlmLZmk6aUapmaaLJUKOf8wK1kxt9W6A,6283
166
- megadetector/postprocessing/validate_batch_results.py,sha256=uFS-Iag7tZYMWJeDuIYwDhEdc8F_5BGKhV4V7y3SGVw,5551
166
+ megadetector/postprocessing/validate_batch_results.py,sha256=bC2wSuR1ir3gW-VF6zFq6TqoMIxDXIK4eyTM8oBq6u8,8598
167
167
  megadetector/postprocessing/repeat_detection_elimination/find_repeat_detections.py,sha256=e4Y9CyMyd-bLN3il8tu76vI0nVYHZlhZr6vcL0J4zQ0,9832
168
168
  megadetector/postprocessing/repeat_detection_elimination/remove_repeat_detections.py,sha256=tARPxuY0OyQgpKU2XqiQPko3f-hHnWuISB8ZlZgXwxI,2819
169
169
  megadetector/postprocessing/repeat_detection_elimination/repeat_detections_core.py,sha256=vEmWLSSv0_rxDwhjz_S9YaKZ_LM2tADTz2JYb_zUCnc,67923
170
170
  megadetector/taxonomy_mapping/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
171
171
  megadetector/taxonomy_mapping/map_lila_taxonomy_to_wi_taxonomy.py,sha256=6D_YHTeWTs6O8S9ABog2t9-wfQSh9dW2k9XTqXUZKfo,17927
172
- megadetector/taxonomy_mapping/map_new_lila_datasets.py,sha256=FSJ6ygpADtlYLf5Bhp9kMb5km2-MH0mmM_ccyStxo34,4054
173
- megadetector/taxonomy_mapping/prepare_lila_taxonomy_release.py,sha256=sRCTgaY84FiGoTtK5LOHL5dhpSrEk9zZGkUR1w9FNm4,4694
174
- megadetector/taxonomy_mapping/preview_lila_taxonomy.py,sha256=qCOyhrgddFZOYBCamfIDKdMMQuIMdGhSrd7ovLz1Yuo,19549
172
+ megadetector/taxonomy_mapping/map_new_lila_datasets.py,sha256=g--BMaLkFvkXyBs48od1fEX0T9BgpxlJicGeSHKeNUU,4150
173
+ megadetector/taxonomy_mapping/prepare_lila_taxonomy_release.py,sha256=-BpstFpmO_HcyEKaQt8bGsX5bcdPSPpR7S5ZQyhXwwo,4800
174
+ megadetector/taxonomy_mapping/preview_lila_taxonomy.py,sha256=SpZzL5Ibsz34bc6gPQ2vrgD8EHBmHxrr7b4PFAT9_IE,19580
175
175
  megadetector/taxonomy_mapping/retrieve_sample_image.py,sha256=4cfWsLRwS_EwAmQr2p5tA_W6glBK71tSjPfaHxUZQWs,1979
176
176
  megadetector/taxonomy_mapping/simple_image_download.py,sha256=wLhyMSocX_JhDGA6yLbEfpysz8MMI8YFJWaxyA-GZ9c,6932
177
177
  megadetector/taxonomy_mapping/species_lookup.py,sha256=HZ7fyhap9CNdhdmq-id8dMnIa9TPMA3557rsamAkWkU,28329
@@ -180,25 +180,25 @@ megadetector/taxonomy_mapping/taxonomy_graph.py,sha256=ayrTFseVaIMbtMXhnjWCkZdxI
180
180
  megadetector/taxonomy_mapping/validate_lila_category_mappings.py,sha256=1qyZr23bvZSVUYLQnO1XAtIZ4jdpARA5dxt8euKVyOA,2527
181
181
  megadetector/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
182
182
  megadetector/utils/azure_utils.py,sha256=0BdnkG2hW-X0yFpsJqmBhOd2wysz_LvhuyImPJMVPJs,6271
183
- megadetector/utils/ct_utils.py,sha256=1LXAjnzeeFeQqp59cWn3Nxt5OQk3t2DfO5wQ30flA5E,19441
183
+ megadetector/utils/ct_utils.py,sha256=Ecac5CLEIrEi89JFuoqdOMxiOdmbno106a1MT2SVdJY,19956
184
184
  megadetector/utils/directory_listing.py,sha256=r4rg2xA4O9ZVxVtzPZzXIXa0DOEukAJMTTNcNSiQcuM,9668
185
- megadetector/utils/md_tests.py,sha256=qRotO_FCRQEs2jGm4aQCrfnktJws29O9iRzha_vjZ4Q,58435
186
- megadetector/utils/path_utils.py,sha256=o68jfPDaLj3NizipVCQEnmB5GfPHpMOLUmQWamYM4w0,37165
185
+ megadetector/utils/md_tests.py,sha256=DvGfRZXpes4bg8S_-btA2NEW8X7k8vXfRaOZewauVxM,61189
186
+ megadetector/utils/path_utils.py,sha256=Kn7Ro37MapRW78_eraK_V_4_I-V8H9pgtvTDL4q7_a8,40571
187
187
  megadetector/utils/process_utils.py,sha256=2SdFVxqob-YUW2BTjUEavNuRH3jA4V05fbKMtrVSd3c,5635
188
188
  megadetector/utils/sas_blob_utils.py,sha256=k76EcMmJc_otrEHcfV2fxAC6fNhxU88FxM3ddSYrsKU,16917
189
189
  megadetector/utils/split_locations_into_train_val.py,sha256=jvaDu1xKB51L3Xq2nXQo0XtXRjNRf8RglBApl1g6gHo,10101
190
190
  megadetector/utils/string_utils.py,sha256=ZQapJodzvTDyQhjZgMoMl3-9bqnKAUlORpws8Db9AkA,2050
191
191
  megadetector/utils/torch_test.py,sha256=aEYE-1vGt5PujD0bHAVRTJiLrKFlGWpS8zeYhqEYZLY,853
192
192
  megadetector/utils/url_utils.py,sha256=yybWwJ-vl2A6Fci66i-xt_dl3Uqh72Ylnb8XOT2Grog,14835
193
- megadetector/utils/write_html_image_list.py,sha256=apzoWkgZWG-ybCT4k92PlS4-guN_sNBSMMMbj7Cfm1k,8638
193
+ megadetector/utils/write_html_image_list.py,sha256=zz98QFQlUIb-kKC-I7llf4EXbNh3PULZBtCZpfMVMfM,9148
194
194
  megadetector/visualization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
195
195
  megadetector/visualization/plot_utils.py,sha256=lOfU3uPrcuHZagV_1SN8erT8PujIepocgw6KZ17Ej6c,10671
196
196
  megadetector/visualization/render_images_with_thumbnails.py,sha256=kgJYW8BsqRO4C7T3sqItdBuSkZ64I1vOtIWAsVG4XBI,10589
197
- megadetector/visualization/visualization_utils.py,sha256=J53VsI8aQmzzBBeu-msm8c-qC6pm_HCMkMKYvnylqjo,63083
198
- megadetector/visualization/visualize_db.py,sha256=x9jScwG-3V-mZGy5cB1s85KWbiAIfvgVUcLqUplHxGA,22110
197
+ megadetector/visualization/visualization_utils.py,sha256=1_xUzuiA-GTD7XNsRwZiemXjQZooOa4p4_nqMd9u6F4,66269
198
+ megadetector/visualization/visualize_db.py,sha256=tswoWqyAo_S5RW76yvPEEWkUVEzn2NJrX1lfDl2jqY4,24392
199
199
  megadetector/visualization/visualize_detector_output.py,sha256=LY8QgDWpWlXVLZJUskvT29CdkNvIlEsFTk4DC_lS6pk,17052
200
- megadetector-5.0.19.dist-info/LICENSE,sha256=RMa3qq-7Cyk7DdtqRj_bP1oInGFgjyHn9-PZ3PcrqIs,1100
201
- megadetector-5.0.19.dist-info/METADATA,sha256=fxnqQFFPLS8pROblOELOmej7ULwUYhV16VWcxuanq8k,7464
202
- megadetector-5.0.19.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
203
- megadetector-5.0.19.dist-info/top_level.txt,sha256=wf9DXa8EwiOSZ4G5IPjakSxBPxTDjhYYnqWRfR-zS4M,13
204
- megadetector-5.0.19.dist-info/RECORD,,
200
+ megadetector-5.0.21.dist-info/LICENSE,sha256=RMa3qq-7Cyk7DdtqRj_bP1oInGFgjyHn9-PZ3PcrqIs,1100
201
+ megadetector-5.0.21.dist-info/METADATA,sha256=Spj46ZROGJbmTdn_D-pOTHFAODg1npXS8xyiErghlKo,7468
202
+ megadetector-5.0.21.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
203
+ megadetector-5.0.21.dist-info/top_level.txt,sha256=wf9DXa8EwiOSZ4G5IPjakSxBPxTDjhYYnqWRfR-zS4M,13
204
+ megadetector-5.0.21.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (74.1.2)
2
+ Generator: setuptools (75.3.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5