megadetector 5.0.28__py3-none-any.whl → 10.0.0__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/api/batch_processing/integration/digiKam/xmp_integration.py +2 -2
- megadetector/api/batch_processing/integration/eMammal/test_scripts/push_annotations_to_emammal.py +1 -1
- megadetector/api/batch_processing/integration/eMammal/test_scripts/select_images_for_testing.py +1 -1
- megadetector/classification/aggregate_classifier_probs.py +3 -3
- megadetector/classification/analyze_failed_images.py +5 -5
- megadetector/classification/cache_batchapi_outputs.py +5 -5
- megadetector/classification/create_classification_dataset.py +11 -12
- megadetector/classification/crop_detections.py +10 -10
- megadetector/classification/csv_to_json.py +8 -8
- megadetector/classification/detect_and_crop.py +13 -15
- megadetector/classification/efficientnet/model.py +8 -8
- megadetector/classification/efficientnet/utils.py +6 -5
- megadetector/classification/evaluate_model.py +7 -7
- megadetector/classification/identify_mislabeled_candidates.py +6 -6
- megadetector/classification/json_to_azcopy_list.py +1 -1
- megadetector/classification/json_validator.py +29 -32
- megadetector/classification/map_classification_categories.py +9 -9
- megadetector/classification/merge_classification_detection_output.py +12 -9
- megadetector/classification/prepare_classification_script.py +19 -19
- megadetector/classification/prepare_classification_script_mc.py +26 -26
- megadetector/classification/run_classifier.py +4 -4
- megadetector/classification/save_mislabeled.py +6 -6
- megadetector/classification/train_classifier.py +1 -1
- megadetector/classification/train_classifier_tf.py +9 -9
- megadetector/classification/train_utils.py +10 -10
- megadetector/data_management/annotations/annotation_constants.py +1 -2
- megadetector/data_management/camtrap_dp_to_coco.py +79 -46
- megadetector/data_management/cct_json_utils.py +103 -103
- megadetector/data_management/cct_to_md.py +49 -49
- megadetector/data_management/cct_to_wi.py +33 -33
- megadetector/data_management/coco_to_labelme.py +75 -75
- megadetector/data_management/coco_to_yolo.py +210 -193
- megadetector/data_management/databases/add_width_and_height_to_db.py +86 -12
- megadetector/data_management/databases/combine_coco_camera_traps_files.py +40 -40
- megadetector/data_management/databases/integrity_check_json_db.py +228 -200
- megadetector/data_management/databases/subset_json_db.py +33 -33
- megadetector/data_management/generate_crops_from_cct.py +88 -39
- megadetector/data_management/get_image_sizes.py +54 -49
- megadetector/data_management/labelme_to_coco.py +133 -125
- megadetector/data_management/labelme_to_yolo.py +159 -73
- megadetector/data_management/lila/create_lila_blank_set.py +81 -83
- megadetector/data_management/lila/create_lila_test_set.py +32 -31
- megadetector/data_management/lila/create_links_to_md_results_files.py +18 -18
- megadetector/data_management/lila/download_lila_subset.py +21 -24
- megadetector/data_management/lila/generate_lila_per_image_labels.py +365 -107
- megadetector/data_management/lila/get_lila_annotation_counts.py +35 -33
- megadetector/data_management/lila/get_lila_image_counts.py +22 -22
- megadetector/data_management/lila/lila_common.py +73 -70
- megadetector/data_management/lila/test_lila_metadata_urls.py +28 -19
- megadetector/data_management/mewc_to_md.py +344 -340
- megadetector/data_management/ocr_tools.py +262 -255
- megadetector/data_management/read_exif.py +249 -227
- megadetector/data_management/remap_coco_categories.py +90 -28
- megadetector/data_management/remove_exif.py +81 -21
- megadetector/data_management/rename_images.py +187 -187
- megadetector/data_management/resize_coco_dataset.py +588 -120
- megadetector/data_management/speciesnet_to_md.py +41 -41
- megadetector/data_management/wi_download_csv_to_coco.py +55 -55
- megadetector/data_management/yolo_output_to_md_output.py +248 -122
- megadetector/data_management/yolo_to_coco.py +333 -191
- megadetector/detection/change_detection.py +832 -0
- megadetector/detection/process_video.py +340 -337
- megadetector/detection/pytorch_detector.py +358 -278
- megadetector/detection/run_detector.py +399 -186
- megadetector/detection/run_detector_batch.py +404 -377
- megadetector/detection/run_inference_with_yolov5_val.py +340 -327
- megadetector/detection/run_tiled_inference.py +257 -249
- megadetector/detection/tf_detector.py +24 -24
- megadetector/detection/video_utils.py +332 -295
- megadetector/postprocessing/add_max_conf.py +19 -11
- megadetector/postprocessing/categorize_detections_by_size.py +45 -45
- megadetector/postprocessing/classification_postprocessing.py +468 -433
- megadetector/postprocessing/combine_batch_outputs.py +23 -23
- megadetector/postprocessing/compare_batch_results.py +590 -525
- megadetector/postprocessing/convert_output_format.py +106 -102
- megadetector/postprocessing/create_crop_folder.py +347 -147
- megadetector/postprocessing/detector_calibration.py +173 -168
- megadetector/postprocessing/generate_csv_report.py +508 -499
- megadetector/postprocessing/load_api_results.py +48 -27
- megadetector/postprocessing/md_to_coco.py +133 -102
- megadetector/postprocessing/md_to_labelme.py +107 -90
- megadetector/postprocessing/md_to_wi.py +40 -40
- megadetector/postprocessing/merge_detections.py +92 -114
- megadetector/postprocessing/postprocess_batch_results.py +319 -301
- megadetector/postprocessing/remap_detection_categories.py +91 -38
- megadetector/postprocessing/render_detection_confusion_matrix.py +214 -205
- megadetector/postprocessing/repeat_detection_elimination/find_repeat_detections.py +57 -57
- megadetector/postprocessing/repeat_detection_elimination/remove_repeat_detections.py +27 -28
- megadetector/postprocessing/repeat_detection_elimination/repeat_detections_core.py +704 -679
- megadetector/postprocessing/separate_detections_into_folders.py +226 -211
- megadetector/postprocessing/subset_json_detector_output.py +265 -262
- megadetector/postprocessing/top_folders_to_bottom.py +45 -45
- megadetector/postprocessing/validate_batch_results.py +70 -70
- megadetector/taxonomy_mapping/map_lila_taxonomy_to_wi_taxonomy.py +52 -52
- megadetector/taxonomy_mapping/map_new_lila_datasets.py +18 -19
- megadetector/taxonomy_mapping/prepare_lila_taxonomy_release.py +54 -33
- megadetector/taxonomy_mapping/preview_lila_taxonomy.py +67 -67
- megadetector/taxonomy_mapping/retrieve_sample_image.py +16 -16
- megadetector/taxonomy_mapping/simple_image_download.py +8 -8
- megadetector/taxonomy_mapping/species_lookup.py +156 -74
- megadetector/taxonomy_mapping/taxonomy_csv_checker.py +14 -14
- megadetector/taxonomy_mapping/taxonomy_graph.py +10 -10
- megadetector/taxonomy_mapping/validate_lila_category_mappings.py +13 -13
- megadetector/utils/ct_utils.py +1049 -211
- megadetector/utils/directory_listing.py +21 -77
- megadetector/utils/gpu_test.py +22 -22
- megadetector/utils/md_tests.py +632 -529
- megadetector/utils/path_utils.py +1520 -431
- megadetector/utils/process_utils.py +41 -41
- megadetector/utils/split_locations_into_train_val.py +62 -62
- megadetector/utils/string_utils.py +148 -27
- megadetector/utils/url_utils.py +489 -176
- megadetector/utils/wi_utils.py +2658 -2526
- megadetector/utils/write_html_image_list.py +137 -137
- megadetector/visualization/plot_utils.py +34 -30
- megadetector/visualization/render_images_with_thumbnails.py +39 -74
- megadetector/visualization/visualization_utils.py +487 -435
- megadetector/visualization/visualize_db.py +232 -198
- megadetector/visualization/visualize_detector_output.py +82 -76
- {megadetector-5.0.28.dist-info → megadetector-10.0.0.dist-info}/METADATA +5 -2
- megadetector-10.0.0.dist-info/RECORD +139 -0
- {megadetector-5.0.28.dist-info → megadetector-10.0.0.dist-info}/WHEEL +1 -1
- megadetector/api/batch_processing/api_core/__init__.py +0 -0
- megadetector/api/batch_processing/api_core/batch_service/__init__.py +0 -0
- megadetector/api/batch_processing/api_core/batch_service/score.py +0 -439
- megadetector/api/batch_processing/api_core/server.py +0 -294
- megadetector/api/batch_processing/api_core/server_api_config.py +0 -97
- megadetector/api/batch_processing/api_core/server_app_config.py +0 -55
- megadetector/api/batch_processing/api_core/server_batch_job_manager.py +0 -220
- megadetector/api/batch_processing/api_core/server_job_status_table.py +0 -149
- megadetector/api/batch_processing/api_core/server_orchestration.py +0 -360
- megadetector/api/batch_processing/api_core/server_utils.py +0 -88
- megadetector/api/batch_processing/api_core_support/__init__.py +0 -0
- megadetector/api/batch_processing/api_core_support/aggregate_results_manually.py +0 -46
- megadetector/api/batch_processing/api_support/__init__.py +0 -0
- megadetector/api/batch_processing/api_support/summarize_daily_activity.py +0 -152
- megadetector/api/batch_processing/data_preparation/__init__.py +0 -0
- megadetector/api/synchronous/__init__.py +0 -0
- megadetector/api/synchronous/api_core/animal_detection_api/__init__.py +0 -0
- megadetector/api/synchronous/api_core/animal_detection_api/api_backend.py +0 -151
- megadetector/api/synchronous/api_core/animal_detection_api/api_frontend.py +0 -263
- megadetector/api/synchronous/api_core/animal_detection_api/config.py +0 -35
- megadetector/api/synchronous/api_core/tests/__init__.py +0 -0
- megadetector/api/synchronous/api_core/tests/load_test.py +0 -110
- megadetector/data_management/importers/add_nacti_sizes.py +0 -52
- megadetector/data_management/importers/add_timestamps_to_icct.py +0 -79
- megadetector/data_management/importers/animl_results_to_md_results.py +0 -158
- megadetector/data_management/importers/auckland_doc_test_to_json.py +0 -373
- megadetector/data_management/importers/auckland_doc_to_json.py +0 -201
- megadetector/data_management/importers/awc_to_json.py +0 -191
- megadetector/data_management/importers/bellevue_to_json.py +0 -272
- megadetector/data_management/importers/cacophony-thermal-importer.py +0 -793
- megadetector/data_management/importers/carrizo_shrubfree_2018.py +0 -269
- megadetector/data_management/importers/carrizo_trail_cam_2017.py +0 -289
- megadetector/data_management/importers/cct_field_adjustments.py +0 -58
- megadetector/data_management/importers/channel_islands_to_cct.py +0 -913
- megadetector/data_management/importers/eMammal/copy_and_unzip_emammal.py +0 -180
- megadetector/data_management/importers/eMammal/eMammal_helpers.py +0 -249
- megadetector/data_management/importers/eMammal/make_eMammal_json.py +0 -223
- megadetector/data_management/importers/ena24_to_json.py +0 -276
- megadetector/data_management/importers/filenames_to_json.py +0 -386
- megadetector/data_management/importers/helena_to_cct.py +0 -283
- megadetector/data_management/importers/idaho-camera-traps.py +0 -1407
- megadetector/data_management/importers/idfg_iwildcam_lila_prep.py +0 -294
- megadetector/data_management/importers/import_desert_lion_conservation_camera_traps.py +0 -387
- megadetector/data_management/importers/jb_csv_to_json.py +0 -150
- megadetector/data_management/importers/mcgill_to_json.py +0 -250
- megadetector/data_management/importers/missouri_to_json.py +0 -490
- megadetector/data_management/importers/nacti_fieldname_adjustments.py +0 -79
- megadetector/data_management/importers/noaa_seals_2019.py +0 -181
- megadetector/data_management/importers/osu-small-animals-to-json.py +0 -364
- megadetector/data_management/importers/pc_to_json.py +0 -365
- megadetector/data_management/importers/plot_wni_giraffes.py +0 -123
- megadetector/data_management/importers/prepare_zsl_imerit.py +0 -131
- megadetector/data_management/importers/raic_csv_to_md_results.py +0 -416
- megadetector/data_management/importers/rspb_to_json.py +0 -356
- megadetector/data_management/importers/save_the_elephants_survey_A.py +0 -320
- megadetector/data_management/importers/save_the_elephants_survey_B.py +0 -329
- megadetector/data_management/importers/snapshot_safari_importer.py +0 -758
- megadetector/data_management/importers/snapshot_serengeti_lila.py +0 -1067
- megadetector/data_management/importers/snapshotserengeti/make_full_SS_json.py +0 -150
- megadetector/data_management/importers/snapshotserengeti/make_per_season_SS_json.py +0 -153
- megadetector/data_management/importers/sulross_get_exif.py +0 -65
- megadetector/data_management/importers/timelapse_csv_set_to_json.py +0 -490
- megadetector/data_management/importers/ubc_to_json.py +0 -399
- megadetector/data_management/importers/umn_to_json.py +0 -507
- megadetector/data_management/importers/wellington_to_json.py +0 -263
- megadetector/data_management/importers/wi_to_json.py +0 -442
- megadetector/data_management/importers/zamba_results_to_md_results.py +0 -180
- megadetector/data_management/lila/add_locations_to_island_camera_traps.py +0 -101
- megadetector/data_management/lila/add_locations_to_nacti.py +0 -151
- megadetector/utils/azure_utils.py +0 -178
- megadetector/utils/sas_blob_utils.py +0 -509
- megadetector-5.0.28.dist-info/RECORD +0 -209
- /megadetector/{api/batch_processing/__init__.py → __init__.py} +0 -0
- {megadetector-5.0.28.dist-info → megadetector-10.0.0.dist-info}/licenses/LICENSE +0 -0
- {megadetector-5.0.28.dist-info → megadetector-10.0.0.dist-info}/top_level.txt +0 -0
|
@@ -6,14 +6,14 @@ If you want to use this script, we recommend that you read the RDE user's guide:
|
|
|
6
6
|
|
|
7
7
|
https://github.com/agentmorris/MegaDetector/tree/main/megadetector/postprocessing/repeat_detection_elimination
|
|
8
8
|
|
|
9
|
-
Really, don't try to run this script without reading the user's guide, you'll think
|
|
10
|
-
it's more magical than it is.
|
|
9
|
+
Really, don't try to run this script without reading the user's guide, you'll think
|
|
10
|
+
it's more magical than it is.
|
|
11
11
|
|
|
12
|
-
This script looks through a sequence of detections in the API output json file, and finds
|
|
13
|
-
candidates that might be "repeated false positives", i.e. that random branch that the
|
|
12
|
+
This script looks through a sequence of detections in the API output json file, and finds
|
|
13
|
+
candidates that might be "repeated false positives", i.e. that random branch that the
|
|
14
14
|
detector thinks is an animal/person/vehicle.
|
|
15
15
|
|
|
16
|
-
Typically after running this script, you would do a manual step to remove
|
|
16
|
+
Typically after running this script, you would do a manual step to remove
|
|
17
17
|
true positives, then run remove_repeat_detections to produce a final output file.
|
|
18
18
|
|
|
19
19
|
There's no way that statement was self-explanatory; see the user's guide.
|
|
@@ -35,14 +35,14 @@ from megadetector.postprocessing.repeat_detection_elimination import repeat_dete
|
|
|
35
35
|
#%% Interactive driver
|
|
36
36
|
|
|
37
37
|
if False:
|
|
38
|
-
|
|
38
|
+
|
|
39
39
|
#%%
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
base_dir = ''
|
|
42
42
|
|
|
43
43
|
options = repeat_detections_core.RepeatDetectionOptions()
|
|
44
|
-
options.imageBase =
|
|
45
|
-
options.outputBase = os.path.join(
|
|
44
|
+
options.imageBase = base_dir
|
|
45
|
+
options.outputBase = os.path.join(base_dir, 'repeat_detections')
|
|
46
46
|
options.filenameReplacements = {} # E.g., {'20190430cameratraps\\':''}
|
|
47
47
|
|
|
48
48
|
options.confidenceMin = 0.15
|
|
@@ -52,7 +52,7 @@ if False:
|
|
|
52
52
|
options.maxSuspiciousDetectionSize = 0.2
|
|
53
53
|
|
|
54
54
|
options.filterFileToLoad = ''
|
|
55
|
-
options.filterFileToLoad = os.path.join(
|
|
55
|
+
options.filterFileToLoad = os.path.join(base_dir,r'..\detectionIndex.json')
|
|
56
56
|
|
|
57
57
|
options.debugMaxDir = -1
|
|
58
58
|
options.debugMaxRenderDir = -1
|
|
@@ -63,81 +63,81 @@ if False:
|
|
|
63
63
|
options.bParallelizeRendering = False
|
|
64
64
|
options.excludeClasses = [2]
|
|
65
65
|
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
input_filename = os.path.join(base_dir, 'blah.json')
|
|
67
|
+
output_filename = os.path.join(base_dir, 'blah.json')
|
|
68
68
|
|
|
69
|
-
results = repeat_detections_core.find_repeat_detections(
|
|
69
|
+
results = repeat_detections_core.find_repeat_detections(input_filename, output_filename, options)
|
|
70
70
|
|
|
71
71
|
|
|
72
72
|
#%% Command-line driver
|
|
73
73
|
|
|
74
|
-
def main():
|
|
75
|
-
|
|
76
|
-
|
|
74
|
+
def main(): # noqa
|
|
75
|
+
|
|
76
|
+
default_options = repeat_detections_core.RepeatDetectionOptions()
|
|
77
77
|
|
|
78
78
|
parser = argparse.ArgumentParser()
|
|
79
|
-
|
|
79
|
+
|
|
80
80
|
parser.add_argument('inputFile', type=str, help='MD results .json file to process')
|
|
81
|
-
|
|
81
|
+
|
|
82
82
|
parser.add_argument('--outputFile', action='store', type=str, default=None,
|
|
83
83
|
help='.json file to write filtered results to... do not use this if you are going to ' + \
|
|
84
84
|
'do manual review of the repeat detection images (which you should)')
|
|
85
|
-
|
|
85
|
+
|
|
86
86
|
parser.add_argument('--imageBase', action='store', type=str, default='',
|
|
87
87
|
help='Image base dir')
|
|
88
|
-
|
|
88
|
+
|
|
89
89
|
parser.add_argument('--outputBase', action='store', type=str, default='',
|
|
90
90
|
help='filtering folder output dir')
|
|
91
|
-
|
|
91
|
+
|
|
92
92
|
parser.add_argument('--confidenceMin', action='store', type=float,
|
|
93
|
-
default=
|
|
93
|
+
default=default_options.confidenceMin,
|
|
94
94
|
help='Detection confidence threshold; don\'t process anything below this')
|
|
95
|
-
|
|
95
|
+
|
|
96
96
|
parser.add_argument('--confidenceMax', action='store', type=float,
|
|
97
|
-
default=
|
|
97
|
+
default=default_options.confidenceMax,
|
|
98
98
|
help='Detection confidence threshold; don\'t process anything above this')
|
|
99
|
-
|
|
99
|
+
|
|
100
100
|
parser.add_argument('--iouThreshold', action='store', type=float,
|
|
101
|
-
default=
|
|
101
|
+
default=default_options.iouThreshold,
|
|
102
102
|
help='Detections with IOUs greater than this are considered ' + \
|
|
103
103
|
'"the same detection"')
|
|
104
|
-
|
|
104
|
+
|
|
105
105
|
parser.add_argument('--occurrenceThreshold', action='store', type=int,
|
|
106
|
-
default=
|
|
106
|
+
default=default_options.occurrenceThreshold,
|
|
107
107
|
help='More than this many near-identical detections in a group ' + \
|
|
108
108
|
'(e.g. a folder) is considered suspicious')
|
|
109
|
-
|
|
109
|
+
|
|
110
110
|
parser.add_argument('--minSuspiciousDetectionSize', action='store', type=float,
|
|
111
|
-
default=
|
|
111
|
+
default=default_options.minSuspiciousDetectionSize,
|
|
112
112
|
help='Detections smaller than this fraction of image area are not ' + \
|
|
113
113
|
'considered suspicious')
|
|
114
114
|
|
|
115
115
|
parser.add_argument('--maxSuspiciousDetectionSize', action='store', type=float,
|
|
116
|
-
default=
|
|
116
|
+
default=default_options.maxSuspiciousDetectionSize,
|
|
117
117
|
help='Detections larger than this fraction of image area are not ' + \
|
|
118
118
|
'considered suspicious')
|
|
119
119
|
|
|
120
120
|
parser.add_argument('--maxImagesPerFolder', action='store', type=int,
|
|
121
|
-
default=
|
|
121
|
+
default=default_options.maxImagesPerFolder,
|
|
122
122
|
help='Ignore folders with more than this many images in them')
|
|
123
|
-
|
|
123
|
+
|
|
124
124
|
parser.add_argument('--excludeClasses', action='store', nargs='+', type=int,
|
|
125
125
|
default=None,
|
|
126
126
|
help='List of integer classes we don\'t want to treat as suspicious, separated by spaces.')
|
|
127
|
-
|
|
127
|
+
|
|
128
128
|
parser.add_argument('--pass_detections_to_processes_method', action='store', type=str,
|
|
129
|
-
default=
|
|
129
|
+
default=default_options.pass_detections_to_processes_method,
|
|
130
130
|
help='Pass detections information to/from workers via "memory" (default) or "files"')
|
|
131
|
-
|
|
131
|
+
|
|
132
132
|
parser.add_argument('--nWorkers', action='store', type=int,
|
|
133
|
-
default=
|
|
133
|
+
default=default_options.nWorkers,
|
|
134
134
|
help='Level of parallelism for rendering and IOU computation')
|
|
135
|
-
|
|
136
|
-
parser.add_argument('--parallelizationUsesProcesses', action='store_false',
|
|
135
|
+
|
|
136
|
+
parser.add_argument('--parallelizationUsesProcesses', action='store_false',
|
|
137
137
|
dest='parallelizationUsesThreads',
|
|
138
|
-
help='Parallelize with processes (defaults to threads)')
|
|
139
|
-
|
|
140
|
-
parser.add_argument('--filterFileToLoad', action='store', type=str, default='',
|
|
138
|
+
help='Parallelize with processes (defaults to threads)')
|
|
139
|
+
|
|
140
|
+
parser.add_argument('--filterFileToLoad', action='store', type=str, default='',
|
|
141
141
|
help='Path to detectionIndex.json, which should be inside a ' + \
|
|
142
142
|
'folder of images that are manually verified to _not_ ' + \
|
|
143
143
|
'contain valid animals')
|
|
@@ -145,8 +145,8 @@ def main():
|
|
|
145
145
|
parser.add_argument('--omitFilteringFolder', action='store_false',
|
|
146
146
|
dest='bWriteFilteringFolder',
|
|
147
147
|
help='Should we skip creating the folder of rendered detections filtering?')
|
|
148
|
-
|
|
149
|
-
parser.add_argument('--debugMaxDir', action='store', type=int, default=-1,
|
|
148
|
+
|
|
149
|
+
parser.add_argument('--debugMaxDir', action='store', type=int, default=-1,
|
|
150
150
|
help='For debugging only, limit the number of directories we process')
|
|
151
151
|
parser.add_argument('--debugMaxRenderDir', action='store', type=int, default=-1,
|
|
152
152
|
help='For debugging only, limit the number of directories we render')
|
|
@@ -161,32 +161,32 @@ def main():
|
|
|
161
161
|
parser.add_argument('--forceSerialRendering', action='store_false',
|
|
162
162
|
dest='bParallelizeRendering',
|
|
163
163
|
help='Disable parallelization during the rendering stage')
|
|
164
|
-
|
|
164
|
+
|
|
165
165
|
parser.add_argument('--maxOutputImageWidth', action='store', type=int,
|
|
166
|
-
default=
|
|
167
|
-
help='Maximum output size for thumbnail images')
|
|
168
|
-
|
|
166
|
+
default=default_options.maxOutputImageWidth,
|
|
167
|
+
help='Maximum output size for thumbnail images')
|
|
168
|
+
|
|
169
169
|
parser.add_argument('--lineThickness', action='store', type=int,
|
|
170
|
-
default=
|
|
171
|
-
help='Line thickness thumbnail images')
|
|
172
|
-
|
|
170
|
+
default=default_options.lineThickness,
|
|
171
|
+
help='Line thickness thumbnail images')
|
|
172
|
+
|
|
173
173
|
parser.add_argument('--boxExpansion', action='store', type=int,
|
|
174
|
-
default=
|
|
174
|
+
default=default_options.boxExpansion,
|
|
175
175
|
help='Box expansion for thumbnail images')
|
|
176
|
-
|
|
176
|
+
|
|
177
177
|
parser.add_argument('--nDirLevelsFromLeaf', type=int,
|
|
178
|
-
default=
|
|
178
|
+
default=default_options.nDirLevelsFromLeaf,
|
|
179
179
|
help='Number of levels from the leaf folders to use for repeat ' + \
|
|
180
180
|
'detection (0 == leaves)')
|
|
181
181
|
|
|
182
182
|
parser.add_argument('--bRenderOtherDetections', action='store_true',
|
|
183
183
|
help='Show non-target detections in light gray on each image')
|
|
184
|
-
|
|
184
|
+
|
|
185
185
|
parser.add_argument('--bRenderDetectionTiles', action='store_true',
|
|
186
186
|
help='Should we render a grid showing every instance (up to a limit) for each detection?')
|
|
187
|
-
|
|
187
|
+
|
|
188
188
|
parser.add_argument('--detectionTilesPrimaryImageWidth', type=int,
|
|
189
|
-
default=
|
|
189
|
+
default=default_options.detectionTilesPrimaryImageWidth,
|
|
190
190
|
help='The width of the main image when rendering images with detection tiles')
|
|
191
191
|
|
|
192
192
|
if len(sys.argv[1:]) == 0:
|
|
@@ -15,69 +15,68 @@ https://github.com/agentmorris/MegaDetector/tree/main/megadetector/postprocessin
|
|
|
15
15
|
|
|
16
16
|
import argparse
|
|
17
17
|
import os
|
|
18
|
+
import sys
|
|
18
19
|
|
|
19
20
|
from megadetector.postprocessing.repeat_detection_elimination import repeat_detections_core
|
|
20
21
|
|
|
21
22
|
|
|
22
23
|
#%% Main function
|
|
23
24
|
|
|
24
|
-
def remove_repeat_detections(
|
|
25
|
+
def remove_repeat_detections(input_file,output_file,filtering_dir):
|
|
25
26
|
"""
|
|
26
27
|
Given an index file that was produced in a first pass through find_repeat_detections,
|
|
27
28
|
and a folder of images (from which the user has deleted images they don't want removed),
|
|
28
29
|
remove the identified repeat detections from a set of MD results and write to a new file.
|
|
29
|
-
|
|
30
|
+
|
|
30
31
|
Args:
|
|
31
|
-
|
|
32
|
-
|
|
32
|
+
input_file (str): .json file of MD results, from which we should remove repeat detections
|
|
33
|
+
output_file (str): output .json file to which we should write MD results (with repeat
|
|
33
34
|
detections removed)
|
|
34
|
-
|
|
35
|
-
detectionIndex.json file
|
|
35
|
+
filtering_dir (str): the folder produced by find_repeat_detections, containing a
|
|
36
|
+
detectionIndex.json file
|
|
36
37
|
"""
|
|
37
|
-
|
|
38
|
-
assert os.path.isfile(
|
|
39
|
-
assert os.path.isdir(
|
|
38
|
+
|
|
39
|
+
assert os.path.isfile(input_file), "Can't find file {}".format(input_file)
|
|
40
|
+
assert os.path.isdir(filtering_dir), "Can't find folder {}".format(filtering_dir)
|
|
40
41
|
options = repeat_detections_core.RepeatDetectionOptions()
|
|
41
|
-
if os.path.isfile(
|
|
42
|
-
options.filterFileToLoad =
|
|
42
|
+
if os.path.isfile(filtering_dir):
|
|
43
|
+
options.filterFileToLoad = filtering_dir
|
|
43
44
|
else:
|
|
44
|
-
assert os.path.isdir(
|
|
45
|
+
assert os.path.isdir(filtering_dir), '{} is not a valid folder'.format(filtering_dir)
|
|
45
46
|
options.filterFileToLoad = \
|
|
46
|
-
os.path.join(
|
|
47
|
-
repeat_detections_core.find_repeat_detections(
|
|
47
|
+
os.path.join(filtering_dir,repeat_detections_core.detection_index_file_name_base)
|
|
48
|
+
repeat_detections_core.find_repeat_detections(input_file, output_file, options)
|
|
48
49
|
|
|
49
50
|
|
|
50
51
|
#%% Interactive driver
|
|
51
52
|
|
|
52
53
|
if False:
|
|
53
|
-
|
|
54
|
+
|
|
54
55
|
#%%
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
remove_repeat_detections(
|
|
56
|
+
|
|
57
|
+
input_file = r''
|
|
58
|
+
output_file = r''
|
|
59
|
+
filtering_dir = r''
|
|
60
|
+
remove_repeat_detections(input_file,output_file,filtering_dir)
|
|
60
61
|
|
|
61
62
|
|
|
62
63
|
#%% Command-line driver
|
|
63
64
|
|
|
64
|
-
|
|
65
|
+
def main(): # noqa
|
|
65
66
|
|
|
66
|
-
def main():
|
|
67
|
-
|
|
68
67
|
parser = argparse.ArgumentParser()
|
|
69
|
-
parser.add_argument('
|
|
70
|
-
parser.add_argument('
|
|
68
|
+
parser.add_argument('input_file', help='.json file containing the original, unfiltered API results')
|
|
69
|
+
parser.add_argument('output_file', help='.json file to which you want to write the final, ' + \
|
|
71
70
|
'filtered API results')
|
|
72
|
-
parser.add_argument('
|
|
71
|
+
parser.add_argument('filtering_dir', help='directory where you looked at lots of images and ' + \
|
|
73
72
|
'decided which ones were really false positives')
|
|
74
|
-
|
|
73
|
+
|
|
75
74
|
if len(sys.argv[1:]) == 0:
|
|
76
75
|
parser.print_help()
|
|
77
76
|
parser.exit()
|
|
78
77
|
|
|
79
78
|
args = parser.parse_args()
|
|
80
|
-
remove_repeat_detections(args.
|
|
79
|
+
remove_repeat_detections(args.input_file, args.output_file, args.filtering_dir)
|
|
81
80
|
|
|
82
81
|
if __name__ == '__main__':
|
|
83
82
|
main()
|