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,226 @@
1
+ """
2
+
3
+ csv_to_json.py
4
+
5
+ Converts CSV to JSON format for label specification.
6
+
7
+ There are 3 possible values for the 'type' column in the CSV:
8
+
9
+ - "row": this selects a specific rowfrom the master taxonomy CSV
10
+ content syntax: <dataset_name>|<dataset_label>
11
+
12
+ - "datasettaxon": this selects all animals in a taxon from a particular dataset
13
+ content syntax: <dataset_name>|<taxon_level>|<taxon_name>
14
+
15
+ - <taxon_level>: this selects all animals in a taxon across all datasets
16
+ content syntax: <taxon_name>
17
+
18
+ Example CSV input:
19
+
20
+ "
21
+ # comment lines starting with '#' are allowed
22
+ output_label,type,content
23
+ cervid,row,idfg|deer
24
+ cervid,row,idfg|elk
25
+ cervid,row,idfg|prong
26
+ cervid,row,idfg_swwlf_2019|elk
27
+ cervid,row,idfg_swwlf_2019|muledeer
28
+ cervid,row,idfg_swwlf_2019|whitetaileddeer
29
+ cervid,max_count,50000
30
+ cervid,family,cervidae
31
+ cervid,datasettaxon,idfg|family|cervidae
32
+ cervid,datasettaxon,idfg_swwlf_2019|family|cervidae
33
+ bird,row,idfg_swwlf_2019|bird
34
+ bird,class,aves
35
+ bird,max_count,50000
36
+ bird,prioritize,"[['idfg_swwlf_2019'], ['idfg']]"
37
+ !bird,row,idfg_swwlf_2019|turkey
38
+ !bird,genus,meleagris
39
+ "
40
+
41
+ Example JSON output:
42
+
43
+ "
44
+ {
45
+ "cervid": {
46
+ "dataset_labels": {
47
+ "idfg": ["deer", "elk", "prong"],
48
+ "idfg_swwlf_2019": ["elk", "muledeer", "whitetaileddeer"]
49
+ },
50
+ "taxa": [
51
+ {
52
+ "level": "family",
53
+ "name": "cervidae"
54
+ },
55
+ {
56
+ "level": "family",
57
+ "name": "cervidae"
58
+ "datasets": ["idfg"]
59
+ },
60
+ {
61
+ "level": "family",
62
+ "name": "cervidae"
63
+ "datasets": ["idfg_swwlf_2019"]
64
+ }
65
+ ],
66
+ "max_count": 50000
67
+ },
68
+ "bird": {
69
+ "dataset_labels": {
70
+ "idfg_swwlf_2019": ["bird"]
71
+ },
72
+ "taxa": [
73
+ {
74
+ "level": "class",
75
+ "name": "aves"
76
+ }
77
+ ],
78
+ "exclude": {
79
+ "dataset_labels": {
80
+ "idfg_swwlf_2019": ["turkey"]
81
+ },
82
+ "taxa": [
83
+ {
84
+ "level": "genus",
85
+ "name": "meleagris"
86
+ }
87
+ ]
88
+ },
89
+ "max_count": "50000",
90
+ "prioritize": [
91
+ ["idfg_swwlf_2019"],
92
+ ["idfg"]
93
+ ],
94
+ }
95
+ }
96
+ "
97
+
98
+ """
99
+
100
+ #%% Imports
101
+
102
+ from __future__ import annotations
103
+
104
+ import argparse
105
+ from collections import defaultdict
106
+ import json
107
+ from typing import Any
108
+
109
+ import pandas as pd
110
+
111
+
112
+ #%% Main function
113
+
114
+ def main():
115
+ args = _parse_args()
116
+ js = csv_to_jsondict(args.input_csv_file)
117
+ for label in js:
118
+ js[label] = order_spec_dict(js[label])
119
+ with open(args.output_json_path, 'w') as f:
120
+ json.dump(js, f, indent=args.json_indent)
121
+
122
+
123
+ #%% Support functions
124
+
125
+ def parse_csv_row(obj: dict[str, Any], rowtype: str, content: str) -> None:
126
+ """
127
+ Parses a row in the CSV.
128
+ """
129
+
130
+ if rowtype == 'row':
131
+ if 'dataset_labels' not in obj:
132
+ obj['dataset_labels'] = defaultdict(list)
133
+
134
+ assert '|' in content
135
+ ds, ds_label = content.split('|')
136
+ obj['dataset_labels'][ds].append(ds_label)
137
+
138
+ elif rowtype == 'datasettaxon':
139
+ if 'taxa' not in obj:
140
+ obj['taxa'] = []
141
+
142
+ assert '|' in content
143
+ ds, taxon_level, taxon_name = content.split('|')
144
+ obj['taxa'].append({
145
+ 'level': taxon_level,
146
+ 'name': taxon_name,
147
+ 'datasets': [ds]
148
+ })
149
+
150
+ elif rowtype == 'max_count':
151
+ obj['max_count'] = int(content)
152
+
153
+ elif rowtype == 'prioritize':
154
+ obj['prioritize'] = eval(content) # pylint: disable=eval-used
155
+
156
+ else:
157
+ if 'taxa' not in obj:
158
+ obj['taxa'] = []
159
+
160
+ taxon_level = rowtype
161
+ taxon_name = content
162
+ obj['taxa'].append({
163
+ 'level': taxon_level,
164
+ 'name': taxon_name
165
+ })
166
+
167
+
168
+ def csv_to_jsondict(csv_path: str) -> dict[str, dict[str, Any]]:
169
+ """
170
+ Converts CSV to json-style dictionary.
171
+ """
172
+
173
+ df = pd.read_csv(csv_path, comment='#', skip_blank_lines=True)
174
+ assert (df.columns == ['output_label', 'type', 'content']).all()
175
+
176
+ js: defaultdict[str, dict[str, Any]] = defaultdict(dict)
177
+
178
+ for i in df.index:
179
+ label, rowtype, content = df.loc[i]
180
+ if label.startswith('!'):
181
+ label = label[1:]
182
+ if 'exclude' not in js[label]:
183
+ js[label]['exclude'] = {}
184
+ obj = js[label]['exclude']
185
+ else:
186
+ obj = js[label]
187
+ parse_csv_row(obj, rowtype, content)
188
+
189
+ return js
190
+
191
+
192
+ def order_spec_dict(spec_dict: dict[str, Any]) -> dict[str, Any]:
193
+ """
194
+ Returns spec_dict with keys in a specific order.
195
+ """
196
+
197
+ if 'exclude' in spec_dict:
198
+ spec_dict['exclude'] = order_spec_dict(spec_dict['exclude'])
199
+ ordered_spec_dict: dict[str, Any] = {}
200
+ for key in ['dataset_labels', 'taxa', 'exclude', 'max_count', 'prioritize']:
201
+ if key in spec_dict:
202
+ ordered_spec_dict[key] = spec_dict[key]
203
+ return ordered_spec_dict
204
+
205
+
206
+ #%% Command-line driver
207
+
208
+ def _parse_args() -> argparse.Namespace:
209
+
210
+ parser = argparse.ArgumentParser(
211
+ formatter_class=argparse.ArgumentDefaultsHelpFormatter,
212
+ description='Converts CSV to JSON format for label specification.')
213
+ parser.add_argument(
214
+ 'input_csv_file',
215
+ help='path to CSV file containing label specification')
216
+ parser.add_argument(
217
+ 'output_json_path',
218
+ help='path to save converted JSON file')
219
+ parser.add_argument(
220
+ '--json-indent', type=int,
221
+ help='number of spaces to use for JSON indent (default no indent)')
222
+ return parser.parse_args()
223
+
224
+
225
+ if __name__ == '__main__':
226
+ main()