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,189 @@
1
+ """
2
+
3
+ tf_detector.py
4
+
5
+ Module containing the class TFDetector, for loading and running a TensorFlow detection model.
6
+
7
+ """
8
+
9
+ #%% Imports and constants
10
+
11
+ import numpy as np
12
+
13
+ from megadetector.detection.run_detector import \
14
+ CONF_DIGITS, COORD_DIGITS, FAILURE_INFER
15
+ from megadetector.utils.ct_utils import truncate_float
16
+
17
+ import tensorflow.compat.v1 as tf
18
+
19
+ print('TensorFlow version:', tf.__version__)
20
+ print('Is GPU available? tf.test.is_gpu_available:', tf.test.is_gpu_available())
21
+
22
+
23
+ #%% Classes
24
+
25
+ class TFDetector:
26
+ """
27
+ A detector model loaded at the time of initialization. It is intended to be used with
28
+ TensorFlow-based versions of MegaDetector (v2, v3, or v4). If someone can find v1, I
29
+ suppose you could use this class for v1 also.
30
+ """
31
+
32
+ #: TF versions of MD were trained with batch size of 1, and the resizing function is a
33
+ #: part of the inference graph, so this is fixed.
34
+ #:
35
+ #: :meta private:
36
+ BATCH_SIZE = 1
37
+
38
+
39
+ def __init__(self, model_path):
40
+ """
41
+ Loads a model from [model_path] and starts a tf.Session with this graph. Obtains
42
+ input and output tensor handles.
43
+ """
44
+
45
+ detection_graph = TFDetector.__load_model(model_path)
46
+ self.tf_session = tf.Session(graph=detection_graph)
47
+ self.image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')
48
+ self.box_tensor = detection_graph.get_tensor_by_name('detection_boxes:0')
49
+ self.score_tensor = detection_graph.get_tensor_by_name('detection_scores:0')
50
+ self.class_tensor = detection_graph.get_tensor_by_name('detection_classes:0')
51
+
52
+
53
+ @staticmethod
54
+ def __round_and_make_float(d, precision=4):
55
+ return truncate_float(float(d), precision=precision)
56
+
57
+
58
+ @staticmethod
59
+ def __convert_coords(tf_coords):
60
+ """
61
+ Converts coordinates from the model's output format [y1, x1, y2, x2] to the
62
+ format used by our API and MegaDB: [x1, y1, width, height]. All coordinates
63
+ (including model outputs) are normalized in the range [0, 1].
64
+
65
+ Args:
66
+ tf_coords: np.array of predicted bounding box coordinates from the TF detector,
67
+ has format [y1, x1, y2, x2]
68
+
69
+ Returns: list of Python float, predicted bounding box coordinates [x1, y1, width, height]
70
+ """
71
+
72
+ # change from [y1, x1, y2, x2] to [x1, y1, width, height]
73
+ width = tf_coords[3] - tf_coords[1]
74
+ height = tf_coords[2] - tf_coords[0]
75
+
76
+ new = [tf_coords[1], tf_coords[0], width, height] # must be a list instead of np.array
77
+
78
+ # convert numpy floats to Python floats
79
+ for i, d in enumerate(new):
80
+ new[i] = TFDetector.__round_and_make_float(d, precision=COORD_DIGITS)
81
+ return new
82
+
83
+
84
+ @staticmethod
85
+ def __load_model(model_path):
86
+ """
87
+ Loads a detection model (i.e., create a graph) from a .pb file.
88
+
89
+ Args:
90
+ model_path: .pb file of the model.
91
+
92
+ Returns: the loaded graph.
93
+ """
94
+
95
+ print('TFDetector: Loading graph...')
96
+ detection_graph = tf.Graph()
97
+ with detection_graph.as_default():
98
+ od_graph_def = tf.GraphDef()
99
+ with tf.gfile.GFile(model_path, 'rb') as fid:
100
+ serialized_graph = fid.read()
101
+ od_graph_def.ParseFromString(serialized_graph)
102
+ tf.import_graph_def(od_graph_def, name='')
103
+ print('TFDetector: Detection graph loaded.')
104
+
105
+ return detection_graph
106
+
107
+
108
+ def _generate_detections_one_image(self, image):
109
+ """
110
+ Runs the detector on a single image.
111
+ """
112
+
113
+ np_im = np.asarray(image, np.uint8)
114
+ im_w_batch_dim = np.expand_dims(np_im, axis=0)
115
+
116
+ # need to change the above line to the following if supporting a batch size > 1 and resizing to the same size
117
+ # np_images = [np.asarray(image, np.uint8) for image in images]
118
+ # images_stacked = np.stack(np_images, axis=0) if len(images) > 1 else np.expand_dims(np_images[0], axis=0)
119
+
120
+ # performs inference
121
+ (box_tensor_out, score_tensor_out, class_tensor_out) = self.tf_session.run(
122
+ [self.box_tensor, self.score_tensor, self.class_tensor],
123
+ feed_dict={self.image_tensor: im_w_batch_dim})
124
+
125
+ return box_tensor_out, score_tensor_out, class_tensor_out
126
+
127
+
128
+ def generate_detections_one_image(self, image, image_id, detection_threshold, image_size=None,
129
+ skip_image_resizing=False):
130
+ """
131
+ Runs the detector on an image.
132
+
133
+ Args:
134
+ image (Image): the PIL Image object on which we should run the detector
135
+ image_id (str): a path to identify the image; will be in the "file" field of the output object
136
+ detection_threshold (float): only detections above this threshold will be included in the return
137
+ value
138
+ image_size (tuple, optional): image size to use for inference, only mess with this
139
+ if (a) you're using a model other than MegaDetector or (b) you know what you're
140
+ doing
141
+ skip_image_resizing (bool, optional): whether to skip internal image resizing (and rely on external
142
+ resizing)... not currently supported, but included here for compatibility with PTDetector.
143
+
144
+ Returns:
145
+ dict: a dictionary with the following fields:
146
+ - 'file' (filename, always present)
147
+ - 'max_detection_conf' (removed from MegaDetector output files by default, but generated here)
148
+ - 'detections' (a list of detection objects containing keys 'category', 'conf', and 'bbox')
149
+ - 'failure' (a failure string, or None if everything went fine)
150
+ """
151
+
152
+ assert image_size is None, 'Image sizing not supported for TF detectors'
153
+ assert not skip_image_resizing, 'Image sizing not supported for TF detectors'
154
+
155
+ result = { 'file': image_id }
156
+
157
+ try:
158
+ b_box, b_score, b_class = self._generate_detections_one_image(image)
159
+
160
+ # our batch size is 1; need to loop the batch dim if supporting batch size > 1
161
+ boxes, scores, classes = b_box[0], b_score[0], b_class[0]
162
+
163
+ detections_cur_image = [] # will be empty for an image with no confident detections
164
+ max_detection_conf = 0.0
165
+ for b, s, c in zip(boxes, scores, classes):
166
+ if s > detection_threshold:
167
+ detection_entry = {
168
+ 'category': str(int(c)), # use string type for the numerical class label, not int
169
+ 'conf': truncate_float(float(s), # cast to float for json serialization
170
+ precision=CONF_DIGITS),
171
+ 'bbox': TFDetector.__convert_coords(b)
172
+ }
173
+ detections_cur_image.append(detection_entry)
174
+ if s > max_detection_conf:
175
+ max_detection_conf = s
176
+
177
+ result['max_detection_conf'] = truncate_float(float(max_detection_conf),
178
+ precision=CONF_DIGITS)
179
+ result['detections'] = detections_cur_image
180
+
181
+ except Exception as e:
182
+ result['failure'] = FAILURE_INFER
183
+ print('TFDetector: image {} failed during inference: {}'.format(image_id, str(e)))
184
+
185
+ return result
186
+
187
+ # ...def generate_detections_one_image(...)
188
+
189
+ # ...class TFDetector