megadetector 10.0.13__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.
- megadetector/__init__.py +0 -0
- megadetector/api/__init__.py +0 -0
- megadetector/api/batch_processing/integration/digiKam/setup.py +6 -0
- megadetector/api/batch_processing/integration/digiKam/xmp_integration.py +465 -0
- megadetector/api/batch_processing/integration/eMammal/test_scripts/config_template.py +5 -0
- megadetector/api/batch_processing/integration/eMammal/test_scripts/push_annotations_to_emammal.py +125 -0
- megadetector/api/batch_processing/integration/eMammal/test_scripts/select_images_for_testing.py +55 -0
- megadetector/classification/__init__.py +0 -0
- megadetector/classification/aggregate_classifier_probs.py +108 -0
- megadetector/classification/analyze_failed_images.py +227 -0
- megadetector/classification/cache_batchapi_outputs.py +198 -0
- megadetector/classification/create_classification_dataset.py +626 -0
- megadetector/classification/crop_detections.py +516 -0
- megadetector/classification/csv_to_json.py +226 -0
- megadetector/classification/detect_and_crop.py +853 -0
- megadetector/classification/efficientnet/__init__.py +9 -0
- megadetector/classification/efficientnet/model.py +415 -0
- megadetector/classification/efficientnet/utils.py +608 -0
- megadetector/classification/evaluate_model.py +520 -0
- megadetector/classification/identify_mislabeled_candidates.py +152 -0
- megadetector/classification/json_to_azcopy_list.py +63 -0
- megadetector/classification/json_validator.py +696 -0
- megadetector/classification/map_classification_categories.py +276 -0
- megadetector/classification/merge_classification_detection_output.py +509 -0
- megadetector/classification/prepare_classification_script.py +194 -0
- megadetector/classification/prepare_classification_script_mc.py +228 -0
- megadetector/classification/run_classifier.py +287 -0
- megadetector/classification/save_mislabeled.py +110 -0
- megadetector/classification/train_classifier.py +827 -0
- megadetector/classification/train_classifier_tf.py +725 -0
- megadetector/classification/train_utils.py +323 -0
- megadetector/data_management/__init__.py +0 -0
- megadetector/data_management/animl_to_md.py +161 -0
- megadetector/data_management/annotations/__init__.py +0 -0
- megadetector/data_management/annotations/annotation_constants.py +33 -0
- megadetector/data_management/camtrap_dp_to_coco.py +270 -0
- megadetector/data_management/cct_json_utils.py +566 -0
- megadetector/data_management/cct_to_md.py +184 -0
- megadetector/data_management/cct_to_wi.py +293 -0
- megadetector/data_management/coco_to_labelme.py +284 -0
- megadetector/data_management/coco_to_yolo.py +702 -0
- megadetector/data_management/databases/__init__.py +0 -0
- megadetector/data_management/databases/add_width_and_height_to_db.py +107 -0
- megadetector/data_management/databases/combine_coco_camera_traps_files.py +210 -0
- megadetector/data_management/databases/integrity_check_json_db.py +528 -0
- megadetector/data_management/databases/subset_json_db.py +195 -0
- megadetector/data_management/generate_crops_from_cct.py +200 -0
- megadetector/data_management/get_image_sizes.py +164 -0
- megadetector/data_management/labelme_to_coco.py +559 -0
- megadetector/data_management/labelme_to_yolo.py +349 -0
- megadetector/data_management/lila/__init__.py +0 -0
- megadetector/data_management/lila/create_lila_blank_set.py +556 -0
- megadetector/data_management/lila/create_lila_test_set.py +187 -0
- megadetector/data_management/lila/create_links_to_md_results_files.py +106 -0
- megadetector/data_management/lila/download_lila_subset.py +182 -0
- megadetector/data_management/lila/generate_lila_per_image_labels.py +777 -0
- megadetector/data_management/lila/get_lila_annotation_counts.py +174 -0
- megadetector/data_management/lila/get_lila_image_counts.py +112 -0
- megadetector/data_management/lila/lila_common.py +319 -0
- megadetector/data_management/lila/test_lila_metadata_urls.py +164 -0
- megadetector/data_management/mewc_to_md.py +344 -0
- megadetector/data_management/ocr_tools.py +873 -0
- megadetector/data_management/read_exif.py +964 -0
- megadetector/data_management/remap_coco_categories.py +195 -0
- megadetector/data_management/remove_exif.py +156 -0
- megadetector/data_management/rename_images.py +194 -0
- megadetector/data_management/resize_coco_dataset.py +663 -0
- megadetector/data_management/speciesnet_to_md.py +41 -0
- megadetector/data_management/wi_download_csv_to_coco.py +247 -0
- megadetector/data_management/yolo_output_to_md_output.py +594 -0
- megadetector/data_management/yolo_to_coco.py +876 -0
- megadetector/data_management/zamba_to_md.py +188 -0
- megadetector/detection/__init__.py +0 -0
- megadetector/detection/change_detection.py +840 -0
- megadetector/detection/process_video.py +479 -0
- megadetector/detection/pytorch_detector.py +1451 -0
- megadetector/detection/run_detector.py +1267 -0
- megadetector/detection/run_detector_batch.py +2159 -0
- megadetector/detection/run_inference_with_yolov5_val.py +1314 -0
- megadetector/detection/run_md_and_speciesnet.py +1494 -0
- megadetector/detection/run_tiled_inference.py +1038 -0
- megadetector/detection/tf_detector.py +209 -0
- megadetector/detection/video_utils.py +1379 -0
- megadetector/postprocessing/__init__.py +0 -0
- megadetector/postprocessing/add_max_conf.py +72 -0
- megadetector/postprocessing/categorize_detections_by_size.py +166 -0
- megadetector/postprocessing/classification_postprocessing.py +1752 -0
- megadetector/postprocessing/combine_batch_outputs.py +249 -0
- megadetector/postprocessing/compare_batch_results.py +2110 -0
- megadetector/postprocessing/convert_output_format.py +403 -0
- megadetector/postprocessing/create_crop_folder.py +629 -0
- megadetector/postprocessing/detector_calibration.py +570 -0
- megadetector/postprocessing/generate_csv_report.py +522 -0
- megadetector/postprocessing/load_api_results.py +223 -0
- megadetector/postprocessing/md_to_coco.py +428 -0
- megadetector/postprocessing/md_to_labelme.py +351 -0
- megadetector/postprocessing/md_to_wi.py +41 -0
- megadetector/postprocessing/merge_detections.py +392 -0
- megadetector/postprocessing/postprocess_batch_results.py +2077 -0
- megadetector/postprocessing/remap_detection_categories.py +226 -0
- megadetector/postprocessing/render_detection_confusion_matrix.py +677 -0
- megadetector/postprocessing/repeat_detection_elimination/find_repeat_detections.py +206 -0
- megadetector/postprocessing/repeat_detection_elimination/remove_repeat_detections.py +82 -0
- megadetector/postprocessing/repeat_detection_elimination/repeat_detections_core.py +1665 -0
- megadetector/postprocessing/separate_detections_into_folders.py +795 -0
- megadetector/postprocessing/subset_json_detector_output.py +964 -0
- megadetector/postprocessing/top_folders_to_bottom.py +238 -0
- megadetector/postprocessing/validate_batch_results.py +332 -0
- megadetector/taxonomy_mapping/__init__.py +0 -0
- megadetector/taxonomy_mapping/map_lila_taxonomy_to_wi_taxonomy.py +491 -0
- megadetector/taxonomy_mapping/map_new_lila_datasets.py +213 -0
- megadetector/taxonomy_mapping/prepare_lila_taxonomy_release.py +165 -0
- megadetector/taxonomy_mapping/preview_lila_taxonomy.py +543 -0
- megadetector/taxonomy_mapping/retrieve_sample_image.py +71 -0
- megadetector/taxonomy_mapping/simple_image_download.py +224 -0
- megadetector/taxonomy_mapping/species_lookup.py +1008 -0
- megadetector/taxonomy_mapping/taxonomy_csv_checker.py +159 -0
- megadetector/taxonomy_mapping/taxonomy_graph.py +346 -0
- megadetector/taxonomy_mapping/validate_lila_category_mappings.py +83 -0
- megadetector/tests/__init__.py +0 -0
- megadetector/tests/test_nms_synthetic.py +335 -0
- megadetector/utils/__init__.py +0 -0
- megadetector/utils/ct_utils.py +1857 -0
- megadetector/utils/directory_listing.py +199 -0
- megadetector/utils/extract_frames_from_video.py +307 -0
- megadetector/utils/gpu_test.py +125 -0
- megadetector/utils/md_tests.py +2072 -0
- megadetector/utils/path_utils.py +2832 -0
- megadetector/utils/process_utils.py +172 -0
- megadetector/utils/split_locations_into_train_val.py +237 -0
- megadetector/utils/string_utils.py +234 -0
- megadetector/utils/url_utils.py +825 -0
- megadetector/utils/wi_platform_utils.py +968 -0
- megadetector/utils/wi_taxonomy_utils.py +1759 -0
- megadetector/utils/write_html_image_list.py +239 -0
- megadetector/visualization/__init__.py +0 -0
- megadetector/visualization/plot_utils.py +309 -0
- megadetector/visualization/render_images_with_thumbnails.py +243 -0
- megadetector/visualization/visualization_utils.py +1940 -0
- megadetector/visualization/visualize_db.py +630 -0
- megadetector/visualization/visualize_detector_output.py +479 -0
- megadetector/visualization/visualize_video_output.py +705 -0
- megadetector-10.0.13.dist-info/METADATA +134 -0
- megadetector-10.0.13.dist-info/RECORD +147 -0
- megadetector-10.0.13.dist-info/WHEEL +5 -0
- megadetector-10.0.13.dist-info/licenses/LICENSE +19 -0
- megadetector-10.0.13.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
r"""
|
|
2
|
+
|
|
3
|
+
save_mislabeled.py
|
|
4
|
+
|
|
5
|
+
Update the list of known mislabeled images in MegaDB.
|
|
6
|
+
|
|
7
|
+
List of known mislabeled images is stored in Azure Blob Storage.
|
|
8
|
+
* storage account: cameratrapsc
|
|
9
|
+
* container: classifier-training
|
|
10
|
+
* blob: megadb_mislabeled/{dataset}.csv, one file per dataset
|
|
11
|
+
|
|
12
|
+
Each file megadb_mislabeled/{dataset}.csv has two columns:
|
|
13
|
+
|
|
14
|
+
* 'file': str, blob name
|
|
15
|
+
|
|
16
|
+
* 'correct_class': optional str, correct dataset class
|
|
17
|
+
|
|
18
|
+
if empty, indicates that the existing class in MegaDB is inaccurate, but
|
|
19
|
+
the correct class is unknown.
|
|
20
|
+
|
|
21
|
+
This script assumes that the classifier-training container is mounted locally.
|
|
22
|
+
|
|
23
|
+
Takes as input a CSV file (output from Timelapse) with the following columns:
|
|
24
|
+
|
|
25
|
+
* 'File': str, <blob_basename>
|
|
26
|
+
* 'RelativePath': str, <dataset>\<blob_dirname>
|
|
27
|
+
* 'mislabeled': str, values in ['true', 'false']
|
|
28
|
+
* 'correct_class': either empty or str
|
|
29
|
+
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
#%% Imports
|
|
33
|
+
|
|
34
|
+
import argparse
|
|
35
|
+
import os
|
|
36
|
+
import pathlib
|
|
37
|
+
|
|
38
|
+
import pandas as pd
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
#%% Main function
|
|
42
|
+
|
|
43
|
+
def update_mislabeled_images(container_path: str, input_csv_path: str) -> None:
|
|
44
|
+
|
|
45
|
+
df = pd.read_csv(input_csv_path, index_col=False)
|
|
46
|
+
|
|
47
|
+
# error checking
|
|
48
|
+
assert df['mislabeled'].dtype == bool
|
|
49
|
+
|
|
50
|
+
# any row with 'correct_class' should be marked 'mislabeled'
|
|
51
|
+
tmp = (df['correct_class'].notna() & df['mislabeled']).sum()
|
|
52
|
+
assert df['correct_class'].notna().sum() == tmp
|
|
53
|
+
|
|
54
|
+
# filter to only the mislabeled rows
|
|
55
|
+
df = df[df['mislabeled']].copy()
|
|
56
|
+
|
|
57
|
+
# convert '\' to '/'
|
|
58
|
+
df['RelativePath'] = df['RelativePath'].map(
|
|
59
|
+
lambda p: pathlib.PureWindowsPath(p).as_posix())
|
|
60
|
+
df[['dataset', 'blob_dirname']] = df['RelativePath'].str.split(
|
|
61
|
+
'/', n=1, expand=True)
|
|
62
|
+
df['file'] = df['blob_dirname'] + '/' + df['File']
|
|
63
|
+
|
|
64
|
+
for ds, ds_df in df.groupby('dataset'):
|
|
65
|
+
|
|
66
|
+
sr_path = os.path.join(container_path, 'megadb_mislabeled', f'{ds}.csv')
|
|
67
|
+
if os.path.exists(sr_path):
|
|
68
|
+
old_sr = pd.read_csv(sr_path, index_col='file', squeeze=True)
|
|
69
|
+
else:
|
|
70
|
+
old_sr = pd.Series(index=pd.Index([], name='file'),
|
|
71
|
+
dtype='str', name='correct_class')
|
|
72
|
+
|
|
73
|
+
ds_sr = ds_df.set_index('file', verify_integrity=True)['correct_class']
|
|
74
|
+
|
|
75
|
+
# verify that overlapping indices are the same
|
|
76
|
+
overlap_index = ds_sr.index.intersection(old_sr.index)
|
|
77
|
+
assert ds_sr.loc[overlap_index].equals(old_sr.loc[overlap_index])
|
|
78
|
+
|
|
79
|
+
# "add" any new mislabelings
|
|
80
|
+
new_indices = ds_sr.index.difference(old_sr.index)
|
|
81
|
+
new_sr = pd.concat([old_sr, ds_sr.loc[new_indices]],
|
|
82
|
+
verify_integrity=True)
|
|
83
|
+
new_sr.sort_index(inplace=True)
|
|
84
|
+
|
|
85
|
+
# write out results
|
|
86
|
+
new_sr.to_csv(sr_path, index=True)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
#%% Command-line driver
|
|
90
|
+
|
|
91
|
+
def _parse_args() -> argparse.Namespace:
|
|
92
|
+
|
|
93
|
+
parser = argparse.ArgumentParser(
|
|
94
|
+
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
|
|
95
|
+
description='Merges classification results with Batch Detection API '
|
|
96
|
+
'outputs.')
|
|
97
|
+
parser.add_argument(
|
|
98
|
+
'container_path',
|
|
99
|
+
help='path to locally-mounted classifier-training container')
|
|
100
|
+
parser.add_argument(
|
|
101
|
+
'input_csv',
|
|
102
|
+
help='path to CSV file output by Timelapse')
|
|
103
|
+
return parser.parse_args()
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
if __name__ == '__main__':
|
|
107
|
+
|
|
108
|
+
args = _parse_args()
|
|
109
|
+
update_mislabeled_images(container_path=args.container_path,
|
|
110
|
+
input_csv_path=args.input_csv)
|