megadetector 5.0.11__py3-none-any.whl → 5.0.12__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 (201) hide show
  1. megadetector/api/__init__.py +0 -0
  2. megadetector/api/batch_processing/__init__.py +0 -0
  3. megadetector/api/batch_processing/api_core/__init__.py +0 -0
  4. megadetector/api/batch_processing/api_core/batch_service/__init__.py +0 -0
  5. megadetector/api/batch_processing/api_core/batch_service/score.py +439 -0
  6. megadetector/api/batch_processing/api_core/server.py +294 -0
  7. megadetector/api/batch_processing/api_core/server_api_config.py +98 -0
  8. megadetector/api/batch_processing/api_core/server_app_config.py +55 -0
  9. megadetector/api/batch_processing/api_core/server_batch_job_manager.py +220 -0
  10. megadetector/api/batch_processing/api_core/server_job_status_table.py +152 -0
  11. megadetector/api/batch_processing/api_core/server_orchestration.py +360 -0
  12. megadetector/api/batch_processing/api_core/server_utils.py +92 -0
  13. megadetector/api/batch_processing/api_core_support/__init__.py +0 -0
  14. megadetector/api/batch_processing/api_core_support/aggregate_results_manually.py +46 -0
  15. megadetector/api/batch_processing/api_support/__init__.py +0 -0
  16. megadetector/api/batch_processing/api_support/summarize_daily_activity.py +152 -0
  17. megadetector/api/batch_processing/data_preparation/__init__.py +0 -0
  18. megadetector/api/batch_processing/integration/digiKam/setup.py +6 -0
  19. megadetector/api/batch_processing/integration/digiKam/xmp_integration.py +465 -0
  20. megadetector/api/batch_processing/integration/eMammal/test_scripts/config_template.py +5 -0
  21. megadetector/api/batch_processing/integration/eMammal/test_scripts/push_annotations_to_emammal.py +126 -0
  22. megadetector/api/batch_processing/integration/eMammal/test_scripts/select_images_for_testing.py +55 -0
  23. megadetector/api/synchronous/__init__.py +0 -0
  24. megadetector/api/synchronous/api_core/animal_detection_api/__init__.py +0 -0
  25. megadetector/api/synchronous/api_core/animal_detection_api/api_backend.py +152 -0
  26. megadetector/api/synchronous/api_core/animal_detection_api/api_frontend.py +266 -0
  27. megadetector/api/synchronous/api_core/animal_detection_api/config.py +35 -0
  28. megadetector/api/synchronous/api_core/tests/__init__.py +0 -0
  29. megadetector/api/synchronous/api_core/tests/load_test.py +110 -0
  30. megadetector/classification/__init__.py +0 -0
  31. megadetector/classification/aggregate_classifier_probs.py +108 -0
  32. megadetector/classification/analyze_failed_images.py +227 -0
  33. megadetector/classification/cache_batchapi_outputs.py +198 -0
  34. megadetector/classification/create_classification_dataset.py +627 -0
  35. megadetector/classification/crop_detections.py +516 -0
  36. megadetector/classification/csv_to_json.py +226 -0
  37. megadetector/classification/detect_and_crop.py +855 -0
  38. megadetector/classification/efficientnet/__init__.py +9 -0
  39. megadetector/classification/efficientnet/model.py +415 -0
  40. megadetector/classification/efficientnet/utils.py +610 -0
  41. megadetector/classification/evaluate_model.py +520 -0
  42. megadetector/classification/identify_mislabeled_candidates.py +152 -0
  43. megadetector/classification/json_to_azcopy_list.py +63 -0
  44. megadetector/classification/json_validator.py +699 -0
  45. megadetector/classification/map_classification_categories.py +276 -0
  46. megadetector/classification/merge_classification_detection_output.py +506 -0
  47. megadetector/classification/prepare_classification_script.py +194 -0
  48. megadetector/classification/prepare_classification_script_mc.py +228 -0
  49. megadetector/classification/run_classifier.py +287 -0
  50. megadetector/classification/save_mislabeled.py +110 -0
  51. megadetector/classification/train_classifier.py +827 -0
  52. megadetector/classification/train_classifier_tf.py +725 -0
  53. megadetector/classification/train_utils.py +323 -0
  54. megadetector/data_management/__init__.py +0 -0
  55. megadetector/data_management/annotations/__init__.py +0 -0
  56. megadetector/data_management/annotations/annotation_constants.py +34 -0
  57. megadetector/data_management/camtrap_dp_to_coco.py +239 -0
  58. megadetector/data_management/cct_json_utils.py +395 -0
  59. megadetector/data_management/cct_to_md.py +176 -0
  60. megadetector/data_management/cct_to_wi.py +289 -0
  61. megadetector/data_management/coco_to_labelme.py +272 -0
  62. megadetector/data_management/coco_to_yolo.py +662 -0
  63. megadetector/data_management/databases/__init__.py +0 -0
  64. megadetector/data_management/databases/add_width_and_height_to_db.py +33 -0
  65. megadetector/data_management/databases/combine_coco_camera_traps_files.py +206 -0
  66. megadetector/data_management/databases/integrity_check_json_db.py +477 -0
  67. megadetector/data_management/databases/subset_json_db.py +115 -0
  68. megadetector/data_management/generate_crops_from_cct.py +149 -0
  69. megadetector/data_management/get_image_sizes.py +189 -0
  70. megadetector/data_management/importers/add_nacti_sizes.py +52 -0
  71. megadetector/data_management/importers/add_timestamps_to_icct.py +79 -0
  72. megadetector/data_management/importers/animl_results_to_md_results.py +158 -0
  73. megadetector/data_management/importers/auckland_doc_test_to_json.py +373 -0
  74. megadetector/data_management/importers/auckland_doc_to_json.py +201 -0
  75. megadetector/data_management/importers/awc_to_json.py +191 -0
  76. megadetector/data_management/importers/bellevue_to_json.py +273 -0
  77. megadetector/data_management/importers/cacophony-thermal-importer.py +796 -0
  78. megadetector/data_management/importers/carrizo_shrubfree_2018.py +269 -0
  79. megadetector/data_management/importers/carrizo_trail_cam_2017.py +289 -0
  80. megadetector/data_management/importers/cct_field_adjustments.py +58 -0
  81. megadetector/data_management/importers/channel_islands_to_cct.py +913 -0
  82. megadetector/data_management/importers/eMammal/copy_and_unzip_emammal.py +180 -0
  83. megadetector/data_management/importers/eMammal/eMammal_helpers.py +249 -0
  84. megadetector/data_management/importers/eMammal/make_eMammal_json.py +223 -0
  85. megadetector/data_management/importers/ena24_to_json.py +276 -0
  86. megadetector/data_management/importers/filenames_to_json.py +386 -0
  87. megadetector/data_management/importers/helena_to_cct.py +283 -0
  88. megadetector/data_management/importers/idaho-camera-traps.py +1407 -0
  89. megadetector/data_management/importers/idfg_iwildcam_lila_prep.py +294 -0
  90. megadetector/data_management/importers/jb_csv_to_json.py +150 -0
  91. megadetector/data_management/importers/mcgill_to_json.py +250 -0
  92. megadetector/data_management/importers/missouri_to_json.py +490 -0
  93. megadetector/data_management/importers/nacti_fieldname_adjustments.py +79 -0
  94. megadetector/data_management/importers/noaa_seals_2019.py +181 -0
  95. megadetector/data_management/importers/pc_to_json.py +365 -0
  96. megadetector/data_management/importers/plot_wni_giraffes.py +123 -0
  97. megadetector/data_management/importers/prepare-noaa-fish-data-for-lila.py +359 -0
  98. megadetector/data_management/importers/prepare_zsl_imerit.py +131 -0
  99. megadetector/data_management/importers/rspb_to_json.py +356 -0
  100. megadetector/data_management/importers/save_the_elephants_survey_A.py +320 -0
  101. megadetector/data_management/importers/save_the_elephants_survey_B.py +329 -0
  102. megadetector/data_management/importers/snapshot_safari_importer.py +758 -0
  103. megadetector/data_management/importers/snapshot_safari_importer_reprise.py +665 -0
  104. megadetector/data_management/importers/snapshot_serengeti_lila.py +1067 -0
  105. megadetector/data_management/importers/snapshotserengeti/make_full_SS_json.py +150 -0
  106. megadetector/data_management/importers/snapshotserengeti/make_per_season_SS_json.py +153 -0
  107. megadetector/data_management/importers/sulross_get_exif.py +65 -0
  108. megadetector/data_management/importers/timelapse_csv_set_to_json.py +490 -0
  109. megadetector/data_management/importers/ubc_to_json.py +399 -0
  110. megadetector/data_management/importers/umn_to_json.py +507 -0
  111. megadetector/data_management/importers/wellington_to_json.py +263 -0
  112. megadetector/data_management/importers/wi_to_json.py +442 -0
  113. megadetector/data_management/importers/zamba_results_to_md_results.py +181 -0
  114. megadetector/data_management/labelme_to_coco.py +547 -0
  115. megadetector/data_management/labelme_to_yolo.py +272 -0
  116. megadetector/data_management/lila/__init__.py +0 -0
  117. megadetector/data_management/lila/add_locations_to_island_camera_traps.py +97 -0
  118. megadetector/data_management/lila/add_locations_to_nacti.py +147 -0
  119. megadetector/data_management/lila/create_lila_blank_set.py +558 -0
  120. megadetector/data_management/lila/create_lila_test_set.py +152 -0
  121. megadetector/data_management/lila/create_links_to_md_results_files.py +106 -0
  122. megadetector/data_management/lila/download_lila_subset.py +178 -0
  123. megadetector/data_management/lila/generate_lila_per_image_labels.py +516 -0
  124. megadetector/data_management/lila/get_lila_annotation_counts.py +170 -0
  125. megadetector/data_management/lila/get_lila_image_counts.py +112 -0
  126. megadetector/data_management/lila/lila_common.py +300 -0
  127. megadetector/data_management/lila/test_lila_metadata_urls.py +132 -0
  128. megadetector/data_management/ocr_tools.py +874 -0
  129. megadetector/data_management/read_exif.py +681 -0
  130. megadetector/data_management/remap_coco_categories.py +84 -0
  131. megadetector/data_management/remove_exif.py +66 -0
  132. megadetector/data_management/resize_coco_dataset.py +189 -0
  133. megadetector/data_management/wi_download_csv_to_coco.py +246 -0
  134. megadetector/data_management/yolo_output_to_md_output.py +441 -0
  135. megadetector/data_management/yolo_to_coco.py +676 -0
  136. megadetector/detection/__init__.py +0 -0
  137. megadetector/detection/detector_training/__init__.py +0 -0
  138. megadetector/detection/detector_training/model_main_tf2.py +114 -0
  139. megadetector/detection/process_video.py +702 -0
  140. megadetector/detection/pytorch_detector.py +341 -0
  141. megadetector/detection/run_detector.py +779 -0
  142. megadetector/detection/run_detector_batch.py +1219 -0
  143. megadetector/detection/run_inference_with_yolov5_val.py +917 -0
  144. megadetector/detection/run_tiled_inference.py +934 -0
  145. megadetector/detection/tf_detector.py +189 -0
  146. megadetector/detection/video_utils.py +606 -0
  147. megadetector/postprocessing/__init__.py +0 -0
  148. megadetector/postprocessing/add_max_conf.py +64 -0
  149. megadetector/postprocessing/categorize_detections_by_size.py +163 -0
  150. megadetector/postprocessing/combine_api_outputs.py +249 -0
  151. megadetector/postprocessing/compare_batch_results.py +958 -0
  152. megadetector/postprocessing/convert_output_format.py +396 -0
  153. megadetector/postprocessing/load_api_results.py +195 -0
  154. megadetector/postprocessing/md_to_coco.py +310 -0
  155. megadetector/postprocessing/md_to_labelme.py +330 -0
  156. megadetector/postprocessing/merge_detections.py +401 -0
  157. megadetector/postprocessing/postprocess_batch_results.py +1902 -0
  158. megadetector/postprocessing/remap_detection_categories.py +170 -0
  159. megadetector/postprocessing/render_detection_confusion_matrix.py +660 -0
  160. megadetector/postprocessing/repeat_detection_elimination/find_repeat_detections.py +211 -0
  161. megadetector/postprocessing/repeat_detection_elimination/remove_repeat_detections.py +83 -0
  162. megadetector/postprocessing/repeat_detection_elimination/repeat_detections_core.py +1631 -0
  163. megadetector/postprocessing/separate_detections_into_folders.py +730 -0
  164. megadetector/postprocessing/subset_json_detector_output.py +696 -0
  165. megadetector/postprocessing/top_folders_to_bottom.py +223 -0
  166. megadetector/taxonomy_mapping/__init__.py +0 -0
  167. megadetector/taxonomy_mapping/map_lila_taxonomy_to_wi_taxonomy.py +491 -0
  168. megadetector/taxonomy_mapping/map_new_lila_datasets.py +150 -0
  169. megadetector/taxonomy_mapping/prepare_lila_taxonomy_release.py +142 -0
  170. megadetector/taxonomy_mapping/preview_lila_taxonomy.py +590 -0
  171. megadetector/taxonomy_mapping/retrieve_sample_image.py +71 -0
  172. megadetector/taxonomy_mapping/simple_image_download.py +219 -0
  173. megadetector/taxonomy_mapping/species_lookup.py +834 -0
  174. megadetector/taxonomy_mapping/taxonomy_csv_checker.py +159 -0
  175. megadetector/taxonomy_mapping/taxonomy_graph.py +346 -0
  176. megadetector/taxonomy_mapping/validate_lila_category_mappings.py +83 -0
  177. megadetector/utils/__init__.py +0 -0
  178. megadetector/utils/azure_utils.py +178 -0
  179. megadetector/utils/ct_utils.py +612 -0
  180. megadetector/utils/directory_listing.py +246 -0
  181. megadetector/utils/md_tests.py +968 -0
  182. megadetector/utils/path_utils.py +1044 -0
  183. megadetector/utils/process_utils.py +157 -0
  184. megadetector/utils/sas_blob_utils.py +509 -0
  185. megadetector/utils/split_locations_into_train_val.py +228 -0
  186. megadetector/utils/string_utils.py +92 -0
  187. megadetector/utils/url_utils.py +323 -0
  188. megadetector/utils/write_html_image_list.py +225 -0
  189. megadetector/visualization/__init__.py +0 -0
  190. megadetector/visualization/plot_utils.py +293 -0
  191. megadetector/visualization/render_images_with_thumbnails.py +275 -0
  192. megadetector/visualization/visualization_utils.py +1536 -0
  193. megadetector/visualization/visualize_db.py +550 -0
  194. megadetector/visualization/visualize_detector_output.py +405 -0
  195. {megadetector-5.0.11.dist-info → megadetector-5.0.12.dist-info}/METADATA +1 -1
  196. megadetector-5.0.12.dist-info/RECORD +199 -0
  197. megadetector-5.0.12.dist-info/top_level.txt +1 -0
  198. megadetector-5.0.11.dist-info/RECORD +0 -5
  199. megadetector-5.0.11.dist-info/top_level.txt +0 -1
  200. {megadetector-5.0.11.dist-info → megadetector-5.0.12.dist-info}/LICENSE +0 -0
  201. {megadetector-5.0.11.dist-info → megadetector-5.0.12.dist-info}/WHEEL +0 -0
@@ -0,0 +1,223 @@
1
+ """
2
+
3
+ top_folders_to_bottom.py
4
+
5
+ Given a base folder with files like:
6
+
7
+ * A/1/2/a.jpg
8
+ * B/3/4/b.jpg
9
+
10
+ ...moves the top-level folders to the bottom in a new output folder, i.e., creates:
11
+
12
+ * 1/2/A/a.jpg
13
+ * 3/4/B/b.jpg
14
+
15
+ In practice, this is used to make this:
16
+
17
+ animal/camera01/image01.jpg
18
+
19
+ ...look like:
20
+
21
+ camera01/animal/image01.jpg
22
+
23
+ """
24
+
25
+ #%% Constants and imports
26
+
27
+ import os
28
+ import sys
29
+ import shutil
30
+ import argparse
31
+
32
+ from pathlib import Path
33
+ from tqdm import tqdm
34
+
35
+ from functools import partial
36
+ from multiprocessing.pool import ThreadPool
37
+
38
+ from megadetector.utils.path_utils import path_is_abs
39
+
40
+
41
+ #%% Classes
42
+
43
+ class TopFoldersToBottomOptions:
44
+ """
45
+ Options used to parameterize top_folders_to_bottom()
46
+ """
47
+
48
+ def __init__(self,input_folder,output_folder,copy=True,n_threads=1):
49
+
50
+ #: Whether to copy (True) vs. move (False) false when re-organizing
51
+ self.copy = copy
52
+
53
+ #: Number of worker threads to use, or <1 to disable parallelization
54
+ self.n_threads = n_threads
55
+
56
+ #: Input folder
57
+ self.input_folder = input_folder
58
+
59
+ #: Output folder
60
+ self.output_folder = output_folder
61
+
62
+ #: If this is False and an output file exists, throw an error
63
+ self.overwrite = False
64
+
65
+
66
+ #%% Main functions
67
+
68
+ def _process_file(relative_filename,options,execute=True):
69
+
70
+ assert ('/' in relative_filename) and \
71
+ ('\\' not in relative_filename) and \
72
+ (not path_is_abs(relative_filename))
73
+
74
+ # Find top-level folder
75
+ tokens = relative_filename.split('/')
76
+ topmost_folder = tokens.pop(0)
77
+ tokens.insert(len(tokens)-1,topmost_folder)
78
+
79
+ # Find file/folder names
80
+ output_relative_path = '/'.join(tokens)
81
+ output_relative_folder = '/'.join(tokens[0:-1])
82
+
83
+ output_absolute_folder = os.path.join(options.output_folder,output_relative_folder)
84
+ output_absolute_path = os.path.join(options.output_folder,output_relative_path)
85
+
86
+ if execute:
87
+
88
+ os.makedirs(output_absolute_folder,exist_ok=True)
89
+
90
+ input_absolute_path = os.path.join(options.input_folder,relative_filename)
91
+
92
+ if not options.overwrite:
93
+ assert not os.path.isfile(output_absolute_path), \
94
+ 'Error: output file {} exists'.format(output_absolute_path)
95
+
96
+ # Move or copy
97
+ if options.copy:
98
+ shutil.copy(input_absolute_path, output_absolute_path)
99
+ else:
100
+ shutil.move(input_absolute_path, output_absolute_path)
101
+
102
+ return output_absolute_path
103
+
104
+ # ...def _process_file()
105
+
106
+
107
+ def top_folders_to_bottom(options):
108
+ """
109
+ top_folders_to_bottom.py
110
+
111
+ Given a base folder with files like:
112
+
113
+ * A/1/2/a.jpg
114
+ * B/3/4/b.jpg
115
+
116
+ ...moves the top-level folders to the bottom in a new output folder, i.e., creates:
117
+
118
+ * 1/2/A/a.jpg
119
+ * 3/4/B/b.jpg
120
+
121
+ In practice, this is used to make this:
122
+
123
+ animal/camera01/image01.jpg
124
+
125
+ ...look like:
126
+
127
+ camera01/animal/image01.jpg
128
+
129
+ Args:
130
+ options (TopFoldersToBottomOptions): See TopFoldersToBottomOptions for parameter details.
131
+
132
+ """
133
+ os.makedirs(options.output_folder,exist_ok=True)
134
+
135
+ # Enumerate input folder
136
+ print('Enumerating files...')
137
+ files = list(Path(options.input_folder).rglob('*'))
138
+ files = [p for p in files if not p.is_dir()]
139
+ files = [str(s) for s in files]
140
+ print('Enumerated {} files'.format(len(files)))
141
+
142
+ # Convert absolute paths to relative paths
143
+ relative_files = [os.path.relpath(s,options.input_folder) for s in files]
144
+
145
+ # Standardize delimiters
146
+ relative_files = [s.replace('\\','/') for s in relative_files]
147
+
148
+ base_files = [s for s in relative_files if '/' not in s]
149
+ if len(base_files) > 0:
150
+ print('Warning: ignoring {} files in the base folder'.format(len(base_files)))
151
+ relative_files = [s for s in relative_files if '/' in s]
152
+
153
+ # Make sure each input file maps to a unique output file
154
+ absolute_output_files = [_process_file(s, options, execute=False) for s in relative_files]
155
+ assert len(absolute_output_files) == len(set(absolute_output_files)),\
156
+ "Error: input filenames don't map to unique output filenames"
157
+
158
+ # relative_filename = relative_files[0]
159
+
160
+ # Loop
161
+ if options.n_threads <= 1:
162
+
163
+ for relative_filename in tqdm(relative_files):
164
+ _process_file(relative_filename,options)
165
+
166
+ else:
167
+
168
+ print('Starting a pool with {} threads'.format(options.n_threads))
169
+ pool = ThreadPool(options.n_threads)
170
+ process_file_with_options = partial(_process_file, options=options)
171
+ _ = list(tqdm(pool.imap(process_file_with_options, relative_files), total=len(relative_files)))
172
+
173
+ # ...def top_folders_to_bottom()
174
+
175
+
176
+ #%% Interactive driver
177
+
178
+ if False:
179
+
180
+ pass
181
+
182
+ #%%
183
+
184
+ input_folder = r"G:\temp\output"
185
+ output_folder = r"G:\temp\output-inverted"
186
+ options = TopFoldersToBottomOptions(input_folder,output_folder,copy=True,n_threads=10)
187
+
188
+ #%%
189
+
190
+ top_folders_to_bottom(options)
191
+
192
+
193
+ #%% Command-line driver
194
+
195
+ # python top_folders_to_bottom.py "g:\temp\separated_images" "g:\temp\separated_images_inverted" --n_threads 100
196
+
197
+ def main():
198
+
199
+ parser = argparse.ArgumentParser()
200
+ parser.add_argument('input_folder', type=str, help='Input image folder')
201
+ parser.add_argument('output_folder', type=str, help='Output image folder')
202
+
203
+ parser.add_argument('--copy', action='store_true',
204
+ help='Copy images, instead of moving (moving is the default)')
205
+ parser.add_argument('--overwrite', action='store_true',
206
+ help='Allow image overwrite (default=False)')
207
+ parser.add_argument('--n_threads', type=int, default=1,
208
+ help='Number of threads to use for parallel operation (default=1)')
209
+
210
+ if len(sys.argv[1:])==0:
211
+ parser.print_help()
212
+ parser.exit()
213
+
214
+ args = parser.parse_args()
215
+
216
+ # Convert to an options object
217
+ options = TopFoldersToBottomOptions(
218
+ args.input_folder,args.output_folder,copy=args.copy,n_threads=args.n_threads)
219
+
220
+ top_folders_to_bottom(options)
221
+
222
+ if __name__ == '__main__':
223
+ main()
File without changes