megadetector 5.0.12__py3-none-any.whl → 5.0.14__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 (45) hide show
  1. megadetector/api/batch_processing/api_core/server.py +1 -1
  2. megadetector/api/batch_processing/api_core/server_api_config.py +0 -1
  3. megadetector/api/batch_processing/api_core/server_job_status_table.py +0 -3
  4. megadetector/api/batch_processing/api_core/server_utils.py +0 -4
  5. megadetector/api/batch_processing/integration/eMammal/test_scripts/push_annotations_to_emammal.py +0 -1
  6. megadetector/api/synchronous/api_core/animal_detection_api/api_frontend.py +0 -3
  7. megadetector/classification/efficientnet/utils.py +0 -3
  8. megadetector/data_management/camtrap_dp_to_coco.py +0 -2
  9. megadetector/data_management/cct_json_utils.py +15 -6
  10. megadetector/data_management/coco_to_labelme.py +12 -1
  11. megadetector/data_management/databases/integrity_check_json_db.py +43 -27
  12. megadetector/data_management/importers/cacophony-thermal-importer.py +1 -4
  13. megadetector/data_management/ocr_tools.py +0 -4
  14. megadetector/data_management/read_exif.py +178 -44
  15. megadetector/data_management/rename_images.py +187 -0
  16. megadetector/data_management/wi_download_csv_to_coco.py +3 -2
  17. megadetector/data_management/yolo_output_to_md_output.py +7 -2
  18. megadetector/detection/process_video.py +548 -244
  19. megadetector/detection/pytorch_detector.py +33 -14
  20. megadetector/detection/run_detector.py +17 -5
  21. megadetector/detection/run_detector_batch.py +179 -65
  22. megadetector/detection/run_inference_with_yolov5_val.py +527 -357
  23. megadetector/detection/tf_detector.py +14 -3
  24. megadetector/detection/video_utils.py +284 -61
  25. megadetector/postprocessing/categorize_detections_by_size.py +16 -14
  26. megadetector/postprocessing/classification_postprocessing.py +716 -0
  27. megadetector/postprocessing/compare_batch_results.py +101 -93
  28. megadetector/postprocessing/convert_output_format.py +12 -5
  29. megadetector/postprocessing/merge_detections.py +18 -7
  30. megadetector/postprocessing/postprocess_batch_results.py +133 -127
  31. megadetector/postprocessing/repeat_detection_elimination/repeat_detections_core.py +236 -232
  32. megadetector/postprocessing/subset_json_detector_output.py +66 -62
  33. megadetector/taxonomy_mapping/preview_lila_taxonomy.py +0 -2
  34. megadetector/utils/ct_utils.py +5 -4
  35. megadetector/utils/md_tests.py +380 -128
  36. megadetector/utils/path_utils.py +39 -6
  37. megadetector/utils/process_utils.py +13 -4
  38. megadetector/visualization/visualization_utils.py +7 -2
  39. megadetector/visualization/visualize_db.py +79 -77
  40. megadetector/visualization/visualize_detector_output.py +0 -1
  41. {megadetector-5.0.12.dist-info → megadetector-5.0.14.dist-info}/LICENSE +0 -0
  42. {megadetector-5.0.12.dist-info → megadetector-5.0.14.dist-info}/METADATA +2 -2
  43. {megadetector-5.0.12.dist-info → megadetector-5.0.14.dist-info}/RECORD +45 -43
  44. {megadetector-5.0.12.dist-info → megadetector-5.0.14.dist-info}/top_level.txt +0 -0
  45. {megadetector-5.0.12.dist-info → megadetector-5.0.14.dist-info}/WHEEL +0 -0
@@ -733,9 +733,13 @@ def _get_file_size(filename,verbose=False):
733
733
  return (filename,size)
734
734
 
735
735
 
736
- def parallel_get_file_sizes(filenames, max_workers=16,
737
- use_threads=True, verbose=False,
738
- recursive=True):
736
+ def parallel_get_file_sizes(filenames,
737
+ max_workers=16,
738
+ use_threads=True,
739
+ verbose=False,
740
+ recursive=True,
741
+ convert_slashes=True,
742
+ return_relative_paths=False):
739
743
  """
740
744
  Returns a dictionary mapping every file in [filenames] to the corresponding file size,
741
745
  or None for errors. If [filenames] is a folder, will enumerate the folder (optionally recursively).
@@ -747,6 +751,10 @@ def parallel_get_file_sizes(filenames, max_workers=16,
747
751
  use_threads (bool, optional): whether to use threads (True) or processes (False) for
748
752
  parallel copying; ignored if max_workers <= 1
749
753
  verbose (bool, optional): enable additionald debug output
754
+ recursive (bool, optional): enumerate recursively, only relevant if [filenames] is a folder.
755
+ convert_slashes (bool, optional): convert backslashes to forward slashes
756
+ return_relative_paths (bool, optional): return relative paths; only relevant if [filenames]
757
+ is a folder.
750
758
 
751
759
  Returns:
752
760
  dict: dictionary mapping filenames to file sizes in bytes
@@ -754,20 +762,45 @@ def parallel_get_file_sizes(filenames, max_workers=16,
754
762
 
755
763
  n_workers = min(max_workers,len(filenames))
756
764
 
765
+ folder_name = None
766
+
767
+ if verbose:
768
+ print('Enumerating files')
769
+
757
770
  if isinstance(filenames,str) and os.path.isdir(filenames):
771
+
772
+ folder_name = filenames
773
+
774
+ # Enumerate absolute paths here, we'll convert to relative later if requested
758
775
  filenames = recursive_file_list(filenames,recursive=recursive,return_relative_paths=False)
776
+
777
+ if verbose:
778
+ print('Creating worker pool')
759
779
 
760
780
  if use_threads:
781
+ pool_string = 'thread'
761
782
  pool = ThreadPool(n_workers)
762
783
  else:
784
+ pool_string = 'process'
763
785
  pool = Pool(n_workers)
764
786
 
765
- resize_results = list(tqdm(pool.imap(
787
+ if verbose:
788
+ print('Created a {} pool of {} workers'.format(
789
+ pool_string,n_workers))
790
+
791
+ # This returns (filename,size) tuples
792
+ get_size_results = list(tqdm(pool.imap(
766
793
  partial(_get_file_size,verbose=verbose),filenames), total=len(filenames)))
767
794
 
768
795
  to_return = {}
769
- for r in resize_results:
770
- to_return[r[0]] = r[1]
796
+ for r in get_size_results:
797
+ fn = r[0]
798
+ if return_relative_paths and (folder_name is not None):
799
+ fn = os.path.relpath(fn,folder_name)
800
+ if convert_slashes:
801
+ fn = fn.replace('\\','/')
802
+ size = r[1]
803
+ to_return[fn] = size
771
804
 
772
805
  return to_return
773
806
 
@@ -15,8 +15,6 @@ Includes handy example code for doing this on multiple processes/threads.
15
15
  import os
16
16
  import subprocess
17
17
 
18
- os.environ["PYTHONUNBUFFERED"] = "1"
19
-
20
18
  def execute(cmd,encoding=None,errors=None,env=None,verbose=False):
21
19
  """
22
20
  Run [cmd] (a single string) in a shell, yielding each line of output to the caller.
@@ -37,6 +35,8 @@ def execute(cmd,encoding=None,errors=None,env=None,verbose=False):
37
35
  int: the command's return code, always zero, otherwise a CalledProcessError is raised
38
36
  """
39
37
 
38
+ os.environ["PYTHONUNBUFFERED"] = "1"
39
+
40
40
  if verbose:
41
41
  if encoding is not None:
42
42
  print('Launching child process with non-default encoding {}'.format(encoding))
@@ -59,7 +59,9 @@ def execute(cmd,encoding=None,errors=None,env=None,verbose=False):
59
59
  return return_code
60
60
 
61
61
 
62
- def execute_and_print(cmd,print_output=True,encoding=None,errors=None,env=None,verbose=False):
62
+ def execute_and_print(cmd,print_output=True,encoding=None,errors=None,
63
+ env=None,verbose=False,catch_exceptions=True,
64
+ echo_command=False):
63
65
  """
64
66
  Run [cmd] (a single string) in a shell, capturing and printing output. Returns
65
67
  a dictionary with fields "status" and "output".
@@ -76,12 +78,17 @@ def execute_and_print(cmd,print_output=True,encoding=None,errors=None,env=None,v
76
78
  errors (str, optional): error handling, see Popen() documentation
77
79
  env (dict, optional): environment variables, see Popen() documentation
78
80
  verbose (bool, optional): enable additional debug console output
79
-
81
+ catch_exceptions (bool, optional): catch exceptions and include in the output, otherwise raise
82
+ echo_command (bool, optional): print the command before executing
83
+
80
84
  Returns:
81
85
  dict: a dictionary with fields "status" (the process return code) and "output"
82
86
  (the content of stdout)
83
87
  """
84
88
 
89
+ if echo_command:
90
+ print('Running command:\n{}\n'.format(cmd))
91
+
85
92
  to_return = {'status':'unknown','output':''}
86
93
  output = []
87
94
  try:
@@ -91,6 +98,8 @@ def execute_and_print(cmd,print_output=True,encoding=None,errors=None,env=None,v
91
98
  print(s,end='',flush=True)
92
99
  to_return['status'] = 0
93
100
  except subprocess.CalledProcessError as cpe:
101
+ if not catch_exceptions:
102
+ raise
94
103
  print('execute_and_print caught error: {} ({})'.format(cpe.output,str(cpe)))
95
104
  to_return['status'] = cpe.returncode
96
105
  to_return['output'] = output
@@ -1457,7 +1457,8 @@ def parallel_check_image_integrity(filenames,
1457
1457
  modes=None,
1458
1458
  max_workers=16,
1459
1459
  use_threads=True,
1460
- recursive=True):
1460
+ recursive=True,
1461
+ verbose=False):
1461
1462
  """
1462
1463
  Check whether we can successfully load a list of images via OpenCV and/or PIL.
1463
1464
 
@@ -1470,6 +1471,7 @@ def parallel_check_image_integrity(filenames,
1470
1471
  parallelization
1471
1472
  recursive (bool, optional): if [filenames] is a folder, whether to search recursively for images.
1472
1473
  Ignored if [filenames] is a list.
1474
+ verbose (bool, optional): enable additional debug output
1473
1475
 
1474
1476
  Returns:
1475
1477
  list: a list of dicts, each with a key called 'file' (the value of [filename]), one key for
@@ -1480,9 +1482,12 @@ def parallel_check_image_integrity(filenames,
1480
1482
  n_workers = min(max_workers,len(filenames))
1481
1483
 
1482
1484
  if isinstance(filenames,str) and os.path.isdir(filenames):
1485
+ if verbose:
1486
+ print('Enumerating images in {}'.format(filenames))
1483
1487
  filenames = find_images(filenames,recursive=recursive,return_relative_paths=False)
1484
1488
 
1485
- print('Checking image integrity for {} filenames'.format(len(filenames)))
1489
+ if verbose:
1490
+ print('Checking image integrity for {} filenames'.format(len(filenames)))
1486
1491
 
1487
1492
  if n_workers <= 1:
1488
1493
 
@@ -40,86 +40,88 @@ class DbVizOptions:
40
40
  Parameters controlling the behavior of visualize_db().
41
41
  """
42
42
 
43
- #: Number of images to sample from the database, or None to visualize all images
44
- num_to_visualize = None
45
-
46
- #: Target size for rendering; set either dimension to -1 to preserve aspect ratio.
47
- #:
48
- #: If viz_size is None or (-1,-1), the original image size is used.
49
- viz_size = (800, -1)
50
-
51
- #: HTML rendering options; see write_html_image_list for details
52
- #:
53
- #:The most relevant option one might want to set here is:
54
- #:
55
- #: htmlOptions['maxFiguresPerHtmlFile']
56
- #:
57
- #: ...which can be used to paginate previews to a number of images that will load well
58
- #: in a browser (5000 is a reasonable limit).
59
- htmlOptions = write_html_image_list()
60
-
61
- #: Whether to sort images by filename (True) or randomly (False)
62
- sort_by_filename = True
63
-
64
- #: Only show images that contain bounding boxes
65
- trim_to_images_with_bboxes = False
66
-
67
- #: Random seed to use for sampling images
68
- random_seed = 0
69
-
70
- #: Should we include Web search links for each category name?
71
- add_search_links = False
72
-
73
- #: Should each thumbnail image link back to the original image?
74
- include_image_links = False
75
-
76
- #: Should there be a text link back to each original image?
77
- include_filename_links = False
78
-
79
- #: Line width in pixels
80
- box_thickness = 4
81
-
82
- #: Number of pixels to expand each bounding box
83
- box_expansion = 0
84
-
85
- #: Only include images that contain annotations with these class names (not IDs)
86
- #:
87
- #: Mutually exclusive with classes_to_exclude
88
- classes_to_include = None
89
-
90
- #: Exclude images that contain annotations with these class names (not IDs)
91
- #:
92
- #: Mutually exclusive with classes_to_include
93
- classes_to_exclude = None
94
-
95
- #: Special tag used to say "show me all images with multiple categories"
96
- #:
97
- #: :meta private:
98
- multiple_categories_tag = '*multiple*'
99
-
100
- #: We sometimes flatten image directories by replacing a path separator with
101
- #: another character. Leave blank for the typical case where this isn't necessary.
102
- pathsep_replacement = '' # '~'
103
-
104
- #: Parallelize rendering across multiple workers
105
- parallelize_rendering = False
106
-
107
- #: In theory, whether to parallelize with threads (True) or processes (False), but
108
- #: process-based parallelization in this function is currently unsupported
109
- parallelize_rendering_with_threads = True
110
-
111
- #: Number of workers to use for parallelization; ignored if parallelize_rendering
112
- #: is False
113
- parallelize_rendering_n_cores = 25
43
+ def __init__(self):
44
+
45
+ #: Number of images to sample from the database, or None to visualize all images
46
+ self.num_to_visualize = None
47
+
48
+ #: Target size for rendering; set either dimension to -1 to preserve aspect ratio.
49
+ #:
50
+ #: If viz_size is None or (-1,-1), the original image size is used.
51
+ self.viz_size = (800, -1)
52
+
53
+ #: HTML rendering options; see write_html_image_list for details
54
+ #:
55
+ #:The most relevant option one might want to set here is:
56
+ #:
57
+ #: htmlOptions['maxFiguresPerHtmlFile']
58
+ #:
59
+ #: ...which can be used to paginate previews to a number of images that will load well
60
+ #: in a browser (5000 is a reasonable limit).
61
+ self.htmlOptions = write_html_image_list()
62
+
63
+ #: Whether to sort images by filename (True) or randomly (False)
64
+ self.sort_by_filename = True
65
+
66
+ #: Only show images that contain bounding boxes
67
+ self.trim_to_images_with_bboxes = False
68
+
69
+ #: Random seed to use for sampling images
70
+ self.random_seed = 0
71
+
72
+ #: Should we include Web search links for each category name?
73
+ self.add_search_links = False
114
74
 
115
- #: Should we show absolute (True) or relative (False) paths for each image?
116
- show_full_paths = False
75
+ #: Should each thumbnail image link back to the original image?
76
+ self.include_image_links = False
77
+
78
+ #: Should there be a text link back to each original image?
79
+ self.include_filename_links = False
80
+
81
+ #: Line width in pixels
82
+ self.box_thickness = 4
83
+
84
+ #: Number of pixels to expand each bounding box
85
+ self.box_expansion = 0
86
+
87
+ #: Only include images that contain annotations with these class names (not IDs)
88
+ #:
89
+ #: Mutually exclusive with classes_to_exclude
90
+ self.classes_to_include = None
91
+
92
+ #: Exclude images that contain annotations with these class names (not IDs)
93
+ #:
94
+ #: Mutually exclusive with classes_to_include
95
+ self.classes_to_exclude = None
96
+
97
+ #: Special tag used to say "show me all images with multiple categories"
98
+ #:
99
+ #: :meta private:
100
+ self.multiple_categories_tag = '*multiple*'
117
101
 
118
- #: Set to False to skip existing images
119
- force_rendering = True
102
+ #: We sometimes flatten image directories by replacing a path separator with
103
+ #: another character. Leave blank for the typical case where this isn't necessary.
104
+ self.pathsep_replacement = '' # '~'
120
105
 
121
- #: Enable additionald debug console output
122
- verbose = False
106
+ #: Parallelize rendering across multiple workers
107
+ self.parallelize_rendering = False
108
+
109
+ #: In theory, whether to parallelize with threads (True) or processes (False), but
110
+ #: process-based parallelization in this function is currently unsupported
111
+ self.parallelize_rendering_with_threads = True
112
+
113
+ #: Number of workers to use for parallelization; ignored if parallelize_rendering
114
+ #: is False
115
+ self.parallelize_rendering_n_cores = 25
116
+
117
+ #: Should we show absolute (True) or relative (False) paths for each image?
118
+ self.show_full_paths = False
119
+
120
+ #: Set to False to skip existing images
121
+ self.force_rendering = True
122
+
123
+ #: Enable additionald debug console output
124
+ self.verbose = False
123
125
 
124
126
 
125
127
  #%% Helper functions
@@ -174,7 +174,6 @@ def visualize_detector_output(detector_output_path,
174
174
  f'Confidence threshold {confidence_threshold} is invalid, must be in (0, 1).')
175
175
 
176
176
  if 'detection_categories' in detector_output:
177
- print('Using custom label mapping')
178
177
  detector_label_map = detector_output['detection_categories']
179
178
  else:
180
179
  detector_label_map = DEFAULT_DETECTOR_LABEL_MAP
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: megadetector
3
- Version: 5.0.12
3
+ Version: 5.0.14
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>
@@ -114,7 +114,7 @@ print('Found {} detections above threshold'.format(len(detections_above_threshol
114
114
 
115
115
  ```
116
116
  from megadetector.detection.run_detector_batch import \
117
- load_and_run_detector_batch,write_results_to_file
117
+ load_and_run_detector_batch, write_results_to_file
118
118
  from megadetector.utils import path_utils
119
119
  import os
120
120
 
@@ -1,13 +1,13 @@
1
1
  megadetector/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  megadetector/api/batch_processing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  megadetector/api/batch_processing/api_core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- megadetector/api/batch_processing/api_core/server.py,sha256=BNqM5EK29B0haCW7rdeOzVqcCJDziZiD0Etc1mPs56c,11668
5
- megadetector/api/batch_processing/api_core/server_api_config.py,sha256=G8X5wgqEXPrWWQpgDI9ua-JktiUgy9mOpEltXSIazLQ,3318
4
+ megadetector/api/batch_processing/api_core/server.py,sha256=-g6hfaSp7dUaT-2-bUSXkLE-MJnig3gZ3W_GbNkoAE0,11618
5
+ megadetector/api/batch_processing/api_core/server_api_config.py,sha256=AjmLStXYoMMwxZJSephYROEprcSkG5RPlOr7Zho9xLk,3277
6
6
  megadetector/api/batch_processing/api_core/server_app_config.py,sha256=tQCFsFv0wJCegHfnu-Za3okdXwEd4U522hiM0YGNkMY,1860
7
7
  megadetector/api/batch_processing/api_core/server_batch_job_manager.py,sha256=K7fMFBJA8Z1SkA4eBM-nymcq7VQjwZ6ZRaNnNKFlat8,10324
8
- megadetector/api/batch_processing/api_core/server_job_status_table.py,sha256=3fJrdyeoVLGbbbdKy7cAVL_ZHbCmCQ2o5D26jBBQRJo,6239
8
+ megadetector/api/batch_processing/api_core/server_job_status_table.py,sha256=P621Df7RTTKqW8VlxnCqkBtIO4Ko5bSS6WbU0ETzPGY,5984
9
9
  megadetector/api/batch_processing/api_core/server_orchestration.py,sha256=LYHABzhOvP0NrM1VIjI6Vwb95YZ5xjQ52mUJW8oIOQ0,17003
10
- megadetector/api/batch_processing/api_core/server_utils.py,sha256=oFusP1E29op5DN1nEaR-jQZgRExqMDdzmRL6BHj8EDk,3314
10
+ megadetector/api/batch_processing/api_core/server_utils.py,sha256=uJvnW50lSE_LnRtEyrFI2dbVSecmGudaRhUH6NcAx1M,3100
11
11
  megadetector/api/batch_processing/api_core/batch_service/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
12
  megadetector/api/batch_processing/api_core/batch_service/score.py,sha256=_hjUBIe0s9wmpmQwwDg-fd7tJMCn8735zJcgF15mTFo,17354
13
13
  megadetector/api/batch_processing/api_core_support/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -18,12 +18,12 @@ megadetector/api/batch_processing/data_preparation/__init__.py,sha256=47DEQpj8HB
18
18
  megadetector/api/batch_processing/integration/digiKam/setup.py,sha256=7P1X3JYrBDXmLUeLRrzxNfDkL5lo-pY8nXsp9Cz8rOI,203
19
19
  megadetector/api/batch_processing/integration/digiKam/xmp_integration.py,sha256=zk5s7dD-FIkNnRxECT-0TAuBw7R__Or5_ft7Ha3iqMM,17774
20
20
  megadetector/api/batch_processing/integration/eMammal/test_scripts/config_template.py,sha256=UnvrgaFRBu59MuVUJa2WpG8ebcOJWcNeZEx6GWuYLzc,73
21
- megadetector/api/batch_processing/integration/eMammal/test_scripts/push_annotations_to_emammal.py,sha256=_mfKTNfLtQKaOK5YuG5mTm_Q_24_0K4wR3eLzJwXVPs,3607
21
+ megadetector/api/batch_processing/integration/eMammal/test_scripts/push_annotations_to_emammal.py,sha256=keqru1Ktbrj6J6TBEUm3e5N0Ps_0G2X4u4YVavWvDiU,3576
22
22
  megadetector/api/batch_processing/integration/eMammal/test_scripts/select_images_for_testing.py,sha256=OYMu97p8vprSv03QcnS6aSxPBocn9sgaozfUqq_JpyM,1369
23
23
  megadetector/api/synchronous/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
24
  megadetector/api/synchronous/api_core/animal_detection_api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
25
  megadetector/api/synchronous/api_core/animal_detection_api/api_backend.py,sha256=6fo9k1byFZdxeHzov-qNFD1ZMClXPIG-BBUlZlbHoMw,4929
26
- megadetector/api/synchronous/api_core/animal_detection_api/api_frontend.py,sha256=aV522pnD__xtk902JHULOrLrq0lVM7JTC5AUKNPmtBk,10417
26
+ megadetector/api/synchronous/api_core/animal_detection_api/api_frontend.py,sha256=f16J7OBN87Tv0vVIIpXlyyVDeT6qYXDe5Kpr5XGqhdQ,10233
27
27
  megadetector/api/synchronous/api_core/animal_detection_api/config.py,sha256=05fVcLx0KK3wWFi62Mr-m_soewVn81qqeObUh-a2mrA,982
28
28
  megadetector/api/synchronous/api_core/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
29
  megadetector/api/synchronous/api_core/tests/load_test.py,sha256=bxyk3Oufl0V79vRsCPeRtWlE2o2KRtVgiqs7TSyP-iU,3277
@@ -50,32 +50,33 @@ megadetector/classification/train_classifier_tf.py,sha256=aounVoV20Iz1X5VZzKfJEa
50
50
  megadetector/classification/train_utils.py,sha256=5XnwPGtIjtDFu4xend8BH97zYhulUhF0BJHA-uYzojg,11333
51
51
  megadetector/classification/efficientnet/__init__.py,sha256=e-jfknjzCc5a0CSW-TaZ2vi0SPU1OMIsayoz2s94QAo,182
52
52
  megadetector/classification/efficientnet/model.py,sha256=qJHWV9-rYKa4E_TIee5N_OjRhqDdM-icPpoMap3Q5HM,17040
53
- megadetector/classification/efficientnet/utils.py,sha256=TF5S2cn2lvlCO2dFhdFPdzjbBBs-SyZGZmEx_dsJMbo,24846
53
+ megadetector/classification/efficientnet/utils.py,sha256=dzrDrQQcvINdJFbODmrHQMUaM0RaUbct52zcSprseAg,24693
54
54
  megadetector/data_management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
- megadetector/data_management/camtrap_dp_to_coco.py,sha256=DLiGrSdndiEIUi1lF-kc-HsQVt3ouCWOQ3sthDw-Ais,8635
56
- megadetector/data_management/cct_json_utils.py,sha256=eCyypfQ1K21IoPDp3aYumm9WyiprNoqZAlMN8AVVKls,14795
55
+ megadetector/data_management/camtrap_dp_to_coco.py,sha256=WC5u5nK5BwXpV26_pGy6CppQryJMgsJ9NtDbGIRQqLg,8629
56
+ megadetector/data_management/cct_json_utils.py,sha256=LuNbxU5EAslWanC08PTKzwzCUmesGnbbJhZ1e2dCgnI,15140
57
57
  megadetector/data_management/cct_to_md.py,sha256=BvQ24XlYhgMYFcsvo6btR1k1UsiPL1vBoxegooJbxdA,5070
58
58
  megadetector/data_management/cct_to_wi.py,sha256=hnFErIlBDmhZtBv21kDW14MSdHlUjwtCGn2vnG-cN34,9771
59
- megadetector/data_management/coco_to_labelme.py,sha256=7HIk8N3gkGz85hffTYvzoPMw_XaCbAjvyruoMoxiFU8,8314
59
+ megadetector/data_management/coco_to_labelme.py,sha256=Uql6f1TaMmKIZClCcqUB1bPxokdXgyAKsQm5pk5foKk,8986
60
60
  megadetector/data_management/coco_to_yolo.py,sha256=rTDOh3XdoOoo7HCSH7obT3xpQgiSykf71ba8uOXfnxc,28121
61
61
  megadetector/data_management/generate_crops_from_cct.py,sha256=Esq2Vlvp1AQvD8bmtC15OvoTZTHASBfcIVIuisxXT08,4383
62
62
  megadetector/data_management/get_image_sizes.py,sha256=2b6arj4gvoN-9f61lC3t1zAFFwYFxfb2iL83Tstoiik,6602
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
- megadetector/data_management/ocr_tools.py,sha256=sdOu1hCnQrohtoKDhSdMcmQPKrTp9EpbFRfXx0Bph74,32562
66
- megadetector/data_management/read_exif.py,sha256=bMMzZYP8p5Ey1MglJo3fz2NeSV1l90GiTWQGxalKfNw,22765
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
67
67
  megadetector/data_management/remap_coco_categories.py,sha256=xXWv0QhTjkUfc9RKtAZanK77HMSq_21mFg_34KFD6hw,2903
68
68
  megadetector/data_management/remove_exif.py,sha256=9YwMUliszhVzkkUcotpRKA-a3h5WdQF1taQ594Bgm60,1666
69
+ megadetector/data_management/rename_images.py,sha256=AG3YIxXEYdGmK4G-rv0_XZIylPqOZpS6gfEkydF6oDg,6918
69
70
  megadetector/data_management/resize_coco_dataset.py,sha256=AaiV7efIcNnqsXsnQckmHq2G__7ZQHBV_jN6rhZfMjo,6810
70
- megadetector/data_management/wi_download_csv_to_coco.py,sha256=8UJRlu1JAhKcIl-wydq54k037htCMrXBZVDHDYMZm8A,8340
71
- megadetector/data_management/yolo_output_to_md_output.py,sha256=cxIeEcqhPOdLGYnNcT-yYnFg-yXD5wIcYJX5TGNWeEg,17305
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=VZtatLoryeh2pbh1fRAJe-ao7vtoNn6ACyRbAk-2Mlg,17561
72
73
  megadetector/data_management/yolo_to_coco.py,sha256=G9XiB9D8PWaCq_kc61pKe2GkkuKwdJ7K7zsbGShb_jw,25176
73
74
  megadetector/data_management/annotations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
75
  megadetector/data_management/annotations/annotation_constants.py,sha256=1597MpAr_HdidIHoDFj4RgUO3K5e2Xm2bGafGeonR2k,953
75
76
  megadetector/data_management/databases/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
77
  megadetector/data_management/databases/add_width_and_height_to_db.py,sha256=X7A_iniGwlkhZ0jUNm564GT_mH2_RJGLD0aGP9cBhY0,749
77
78
  megadetector/data_management/databases/combine_coco_camera_traps_files.py,sha256=oeELrMgxhsJ6aNBxPQyu4CmsdtYnzS5GKZEV8U-XUdk,6693
78
- megadetector/data_management/databases/integrity_check_json_db.py,sha256=RNUz6A24UwBzRIbolzXIPic3Q5LFaaCHcAJP1arap2I,16305
79
+ megadetector/data_management/databases/integrity_check_json_db.py,sha256=A8AAlpfAbbthUH3ZOQrvRjzliMl2RS8g764Nk7Ypuqk,17109
79
80
  megadetector/data_management/databases/subset_json_db.py,sha256=JK71qSUpUZe7cJquyt2xEzirDoZq1Lrr2X0cgtHKBpA,3219
80
81
  megadetector/data_management/importers/add_nacti_sizes.py,sha256=jjGTpd36g5w7nLIeOatXRwu1Uti2GiGgP3-61QSg8oA,1156
81
82
  megadetector/data_management/importers/add_timestamps_to_icct.py,sha256=5l1TkWq3X4Mxed7zlZ07U1RQcjbzBnwcoftNiaruigM,2364
@@ -84,7 +85,7 @@ megadetector/data_management/importers/auckland_doc_test_to_json.py,sha256=tT4Xn
84
85
  megadetector/data_management/importers/auckland_doc_to_json.py,sha256=EoNsAJvzTwcgHspE05eO0LHazMVYM7-yzFBit0FiJWk,5970
85
86
  megadetector/data_management/importers/awc_to_json.py,sha256=e1HjShGS2WC-l99FV89g1u0o2v5990Vh9XsjIukg6qQ,5327
86
87
  megadetector/data_management/importers/bellevue_to_json.py,sha256=oJMSF0r_snRXtppiwFy4vvP8gErEw6_7Kv1UJs59QLo,7919
87
- megadetector/data_management/importers/cacophony-thermal-importer.py,sha256=YauLjRDwMaML3MpVJvon308bcO14r956iClKNwDsIDs,28640
88
+ megadetector/data_management/importers/cacophony-thermal-importer.py,sha256=4o7gyX-uUlS3rkQZlOUGMaaUVT_pdTizcuXw4rvDrE4,28577
88
89
  megadetector/data_management/importers/carrizo_shrubfree_2018.py,sha256=ah14pfzLuDUph--qUqRqvWszOFY245rsIfAgCEF7F_I,7858
89
90
  megadetector/data_management/importers/carrizo_trail_cam_2017.py,sha256=gwpL0sM82A6UBn2qWilP15D-1lOzQchZuhxXMzZ_7Ws,8862
90
91
  megadetector/data_management/importers/cct_field_adjustments.py,sha256=wQmcntZNpHYRGjZvOcXqPxhAGdn1pDZa1pAXgTAyKmI,1348
@@ -134,40 +135,41 @@ megadetector/data_management/lila/get_lila_image_counts.py,sha256=UxXS5RDnSA_Wbx
134
135
  megadetector/data_management/lila/lila_common.py,sha256=IEnGoyRgcqbek1qJ1gFE83p1Pg_5kaMS-nQI25lRWIs,10132
135
136
  megadetector/data_management/lila/test_lila_metadata_urls.py,sha256=2zKNjgqC3kxdFfyvQC3KTlpc9lf2iMzecHQBf--r_Tk,4438
136
137
  megadetector/detection/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
137
- megadetector/detection/process_video.py,sha256=Fufvtmmuf6huWdwet1d035BJHq2Sq7muIgLNVGS8Y0Y,29912
138
- megadetector/detection/pytorch_detector.py,sha256=-sI1Bm4acNLDi63RaiPpuEM8_RDwDQ2LWHBVTtkr2RM,12727
139
- megadetector/detection/run_detector.py,sha256=CxwCqE-T5ioQ1kb5Tn4HvzBMK0gvJwaAOl8HfDTWiVY,29745
140
- megadetector/detection/run_detector_batch.py,sha256=MQ8cEVg92aTmysapPuj3JAr92HfnuopCHbDGoMZA7ko,52132
141
- megadetector/detection/run_inference_with_yolov5_val.py,sha256=e0LRZ8J1VI3G3eVL6_y19i2j77ZUsLl-mf3i7oLde7U,36946
138
+ megadetector/detection/process_video.py,sha256=wNjv2LciLSzIu_wkMQMrSf9gOyv0NC-Busq-yYORG_0,42686
139
+ megadetector/detection/pytorch_detector.py,sha256=p70kAX5pqU4SO4GjYJmzbTPV4tKUp5WRapOs7vgSKes,13885
140
+ megadetector/detection/run_detector.py,sha256=biXbeS8aNDlidilxjzhZ-p4_wr2ID-rpsRklbNEd7ME,30094
141
+ megadetector/detection/run_detector_batch.py,sha256=V8gfcWNHu7r0Nj7seQVeFpB5ylkkhZK1gFwHuoiB4L4,56894
142
+ megadetector/detection/run_inference_with_yolov5_val.py,sha256=u9i1ndwl_k0DsiAWYQcYrrrB9D9Wt56_k6iGTAetUaM,46786
142
143
  megadetector/detection/run_tiled_inference.py,sha256=vw0713eNuMiEOjHfweQl58zPHNxPOMdFWZ8bTDLhlMY,37883
143
- megadetector/detection/tf_detector.py,sha256=5tdGXgF7bkeDJaXe4U34HD5z97xVzDpmYWqNK2AVf1o,7562
144
- megadetector/detection/video_utils.py,sha256=vdetbPCHKccJZNt4sREVcHil6WyMgU3QXNWe4mgSJLg,22773
144
+ megadetector/detection/tf_detector.py,sha256=-vcBuYRRLKumUj6imcDYgCgClGji0a21uMjoUAtY3yw,8104
145
+ megadetector/detection/video_utils.py,sha256=e6XidwChyqkN5ga7yLbujMqKwXITvQGVWEw0qyAhSoA,32398
145
146
  megadetector/detection/detector_training/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
146
147
  megadetector/detection/detector_training/model_main_tf2.py,sha256=YwNsZ7hkIFaEuwKU0rHG_VyqiR_0E01BbdlD0Yx4Smo,4936
147
148
  megadetector/postprocessing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
148
149
  megadetector/postprocessing/add_max_conf.py,sha256=qTE1_0RwGAy6jLDkHrIo2pS84yNbUV11s4IZuAYGdIU,1514
149
- megadetector/postprocessing/categorize_detections_by_size.py,sha256=RFTQrVM8FhIcwevBFKOiBv2epY4GzWHf-kIXyhyAUX8,5688
150
+ megadetector/postprocessing/categorize_detections_by_size.py,sha256=YdapcvjA6Dz2dPa2AFf1Dwyl7C-OmmP4G4OjhTOuaF4,5797
151
+ megadetector/postprocessing/classification_postprocessing.py,sha256=8uvlA0Gc8nakM5IE5Pud7WZfmF5kEhcYvxgQXcI9kl0,30429
150
152
  megadetector/postprocessing/combine_api_outputs.py,sha256=xCJHEKca8YW-mupEr0yNNwwSBeL9NvcV1w3VtEzN4lk,8535
151
- megadetector/postprocessing/compare_batch_results.py,sha256=qLEqVpqaGa6tbEfToEZNyATaqXMvgBc7bLwgykAGpz4,38261
152
- megadetector/postprocessing/convert_output_format.py,sha256=IGCWoIJ1Z9RUI9yqpbL3t5KThDiElM3czmiTyXty72c,15002
153
+ megadetector/postprocessing/compare_batch_results.py,sha256=7O5c6-JsIDpuIGobks_R9j8MPuiZQRnEtNnJQsJqICM,38918
154
+ megadetector/postprocessing/convert_output_format.py,sha256=HwThfK76UPEAGa3KQbJ_tMKIrUvJ3JhKoQVWJt9dPBk,15447
153
155
  megadetector/postprocessing/load_api_results.py,sha256=FqcaiPMuqTojZOV3Jn14pJESpuwjWGbZtcvJuVXUaDM,6861
154
156
  megadetector/postprocessing/md_to_coco.py,sha256=t8zHN3QmwxuvcQKxLd_yMSjwncxy7YEoq2EGr0kwBDs,11049
155
157
  megadetector/postprocessing/md_to_labelme.py,sha256=hejMKVxaz_xdtsGDPTQkeWuis7gzT-VOrL2Qf8ym1x0,11703
156
- megadetector/postprocessing/merge_detections.py,sha256=cpAeyWJjC6_Mf0wv9Qxo_zxp_xfgmrMIfeEhCEBKVe4,17173
157
- megadetector/postprocessing/postprocess_batch_results.py,sha256=fl3a7Mc4l0OgRA5BLT_GgaC9WuDcoyf3hNW9fXIZeI4,77376
158
+ megadetector/postprocessing/merge_detections.py,sha256=AEMgMivhph1vph_t_Qv85d9iHynT2nvq7otN4KGrDLU,17776
159
+ megadetector/postprocessing/postprocess_batch_results.py,sha256=ucFW2WsuoxIgEC62CrgOLCOTO3LxIZ-LPCYRJ9xjais,78178
158
160
  megadetector/postprocessing/remap_detection_categories.py,sha256=d9IYTa0i_KbbrarJc_mczABmdwypscl5-KpK8Hx_z8o,6640
159
161
  megadetector/postprocessing/render_detection_confusion_matrix.py,sha256=_wsk4W0PbNiqmFuHy-EA0Z07B1tQLMsdCTPatnHAdZw,27382
160
162
  megadetector/postprocessing/separate_detections_into_folders.py,sha256=k42gxnL8hbBiV0e2T-jmFrhxzIxnhi57Nx9cDSSL5s0,31218
161
- megadetector/postprocessing/subset_json_detector_output.py,sha256=64nEOilaB0_B8o-unh7PCjyUkfDPQDcl2QGOuzkw5OI,26424
163
+ megadetector/postprocessing/subset_json_detector_output.py,sha256=TIXIWEv0nh4cXvhMLcM_ZryM5ly1NOTkWopM2RjEpqQ,26822
162
164
  megadetector/postprocessing/top_folders_to_bottom.py,sha256=Dqk-KZXiRlIYlmLZmk6aUapmaaLJUKOf8wK1kxt9W6A,6283
163
165
  megadetector/postprocessing/repeat_detection_elimination/find_repeat_detections.py,sha256=e4Y9CyMyd-bLN3il8tu76vI0nVYHZlhZr6vcL0J4zQ0,9832
164
166
  megadetector/postprocessing/repeat_detection_elimination/remove_repeat_detections.py,sha256=tARPxuY0OyQgpKU2XqiQPko3f-hHnWuISB8ZlZgXwxI,2819
165
- megadetector/postprocessing/repeat_detection_elimination/repeat_detections_core.py,sha256=qj9gcvXu_xdpvzIuPVyHfGegOO5R0bdYtXlI9gKrFcM,66513
167
+ megadetector/postprocessing/repeat_detection_elimination/repeat_detections_core.py,sha256=_RX0Gtb8YQPYdfQDGIvg1RvyqsdyanmEg1pqVmheHlg,67776
166
168
  megadetector/taxonomy_mapping/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
167
169
  megadetector/taxonomy_mapping/map_lila_taxonomy_to_wi_taxonomy.py,sha256=6D_YHTeWTs6O8S9ABog2t9-wfQSh9dW2k9XTqXUZKfo,17927
168
170
  megadetector/taxonomy_mapping/map_new_lila_datasets.py,sha256=M-hRnQuqh5QhW-7LmTvYRex1Y2izQFSgEzb92gqqx1M,4062
169
171
  megadetector/taxonomy_mapping/prepare_lila_taxonomy_release.py,sha256=N9TUgg3_2u4hc5OBRydvEpweC3RIJ9ry5bXoi1BXLAY,4676
170
- megadetector/taxonomy_mapping/preview_lila_taxonomy.py,sha256=eYl7tjvSlEH7F7UsRm8YlljQAdITEQvjQb-1NyYbQK8,19583
172
+ megadetector/taxonomy_mapping/preview_lila_taxonomy.py,sha256=3e-e3rurissksHgRCrc-_oLJSy2KCxcvwtAQM7L2E1U,19549
171
173
  megadetector/taxonomy_mapping/retrieve_sample_image.py,sha256=4cfWsLRwS_EwAmQr2p5tA_W6glBK71tSjPfaHxUZQWs,1979
172
174
  megadetector/taxonomy_mapping/simple_image_download.py,sha256=_1dEGn4356mdQAy9yzkH5DntPO7-nQyYo2zm08ODpJc,6852
173
175
  megadetector/taxonomy_mapping/species_lookup.py,sha256=B5arfF1OVICtTokVOtJcN8W2SxGmq46AO0SfA11Upt8,28291
@@ -176,11 +178,11 @@ megadetector/taxonomy_mapping/taxonomy_graph.py,sha256=ayrTFseVaIMbtMXhnjWCkZdxI
176
178
  megadetector/taxonomy_mapping/validate_lila_category_mappings.py,sha256=1qyZr23bvZSVUYLQnO1XAtIZ4jdpARA5dxt8euKVyOA,2527
177
179
  megadetector/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
178
180
  megadetector/utils/azure_utils.py,sha256=0BdnkG2hW-X0yFpsJqmBhOd2wysz_LvhuyImPJMVPJs,6271
179
- megadetector/utils/ct_utils.py,sha256=mppmjTtRNGgnp0IBoXUPy5uNAanxpgPteVW5ACUi3vg,17847
181
+ megadetector/utils/ct_utils.py,sha256=RTMc0UszYuW9QpMo-qetaWder1mFWIzkMLL2UM6PYdY,17960
180
182
  megadetector/utils/directory_listing.py,sha256=r4rg2xA4O9ZVxVtzPZzXIXa0DOEukAJMTTNcNSiQcuM,9668
181
- megadetector/utils/md_tests.py,sha256=FTNB-_5_gICkvbQZ9_m5aPoHc-5PeWokkKvFJ47qTcM,36018
182
- megadetector/utils/path_utils.py,sha256=kVkz70tZM2RpNpuquqFCydL6ca5n3Grwh0Un2lHpXCA,35948
183
- megadetector/utils/process_utils.py,sha256=uNzbijLk4lRqj2uU9zlUN8VuDeM4J7aLR2eb2O2-9ys,5226
183
+ megadetector/utils/md_tests.py,sha256=W8Ua4eh8Z1QHBUlhKoBTt-2a9XOEhVv2TgLu065_PlI,46842
184
+ megadetector/utils/path_utils.py,sha256=Uj_aNvA_P0buq-3ebQLZz-6to8mNO5JyBhD7n1-pUoU,37149
185
+ megadetector/utils/process_utils.py,sha256=2SdFVxqob-YUW2BTjUEavNuRH3jA4V05fbKMtrVSd3c,5635
184
186
  megadetector/utils/sas_blob_utils.py,sha256=k76EcMmJc_otrEHcfV2fxAC6fNhxU88FxM3ddSYrsKU,16917
185
187
  megadetector/utils/split_locations_into_train_val.py,sha256=jvaDu1xKB51L3Xq2nXQo0XtXRjNRf8RglBApl1g6gHo,10101
186
188
  megadetector/utils/string_utils.py,sha256=ZQapJodzvTDyQhjZgMoMl3-9bqnKAUlORpws8Db9AkA,2050
@@ -189,11 +191,11 @@ megadetector/utils/write_html_image_list.py,sha256=apzoWkgZWG-ybCT4k92PlS4-guN_s
189
191
  megadetector/visualization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
190
192
  megadetector/visualization/plot_utils.py,sha256=lOfU3uPrcuHZagV_1SN8erT8PujIepocgw6KZ17Ej6c,10671
191
193
  megadetector/visualization/render_images_with_thumbnails.py,sha256=kgJYW8BsqRO4C7T3sqItdBuSkZ64I1vOtIWAsVG4XBI,10589
192
- megadetector/visualization/visualization_utils.py,sha256=BIb1uCDD6TlHLDM_2uA-4lzcVcdiFLeKu8kuY2fct6g,62150
193
- megadetector/visualization/visualize_db.py,sha256=l7U4emtNdLGTWU5gB7i7O9yOmvLDBCeZMOAGeKu36rk,20798
194
- megadetector/visualization/visualize_detector_output.py,sha256=dFpQdLnbULO8wPGeN2z0muYNtHglUDsH-LeqdbYa6DY,17096
195
- megadetector-5.0.12.dist-info/LICENSE,sha256=RMa3qq-7Cyk7DdtqRj_bP1oInGFgjyHn9-PZ3PcrqIs,1100
196
- megadetector-5.0.12.dist-info/METADATA,sha256=Hc-G5FqXVt5T1zxOx6qR5E4qpbinZvxBXVKnEqxkkeU,7892
197
- megadetector-5.0.12.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
198
- megadetector-5.0.12.dist-info/top_level.txt,sha256=wf9DXa8EwiOSZ4G5IPjakSxBPxTDjhYYnqWRfR-zS4M,13
199
- megadetector-5.0.12.dist-info/RECORD,,
194
+ megadetector/visualization/visualization_utils.py,sha256=jWiXlLpmWh_CH2vApZURclOC7fdip1aKWQ66wuNabyA,62369
195
+ megadetector/visualization/visualize_db.py,sha256=3FhOtn3GHvNsomwSpsSEzYe58lF9B4Ob3MEi_xplrdo,21256
196
+ megadetector/visualization/visualize_detector_output.py,sha256=LY8QgDWpWlXVLZJUskvT29CdkNvIlEsFTk4DC_lS6pk,17052
197
+ megadetector-5.0.14.dist-info/LICENSE,sha256=RMa3qq-7Cyk7DdtqRj_bP1oInGFgjyHn9-PZ3PcrqIs,1100
198
+ megadetector-5.0.14.dist-info/METADATA,sha256=yeX8szvUXU887ERsfi8lV8lSYEa4fBPM21KXbjNJOOI,7893
199
+ megadetector-5.0.14.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
200
+ megadetector-5.0.14.dist-info/top_level.txt,sha256=wf9DXa8EwiOSZ4G5IPjakSxBPxTDjhYYnqWRfR-zS4M,13
201
+ megadetector-5.0.14.dist-info/RECORD,,