megadetector 5.0.9__py3-none-any.whl → 5.0.11__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-5.0.9.dist-info → megadetector-5.0.11.dist-info}/LICENSE +0 -0
- {megadetector-5.0.9.dist-info → megadetector-5.0.11.dist-info}/METADATA +12 -11
- megadetector-5.0.11.dist-info/RECORD +5 -0
- megadetector-5.0.11.dist-info/top_level.txt +1 -0
- api/__init__.py +0 -0
- api/batch_processing/__init__.py +0 -0
- api/batch_processing/api_core/__init__.py +0 -0
- api/batch_processing/api_core/batch_service/__init__.py +0 -0
- api/batch_processing/api_core/batch_service/score.py +0 -439
- api/batch_processing/api_core/server.py +0 -294
- api/batch_processing/api_core/server_api_config.py +0 -98
- api/batch_processing/api_core/server_app_config.py +0 -55
- api/batch_processing/api_core/server_batch_job_manager.py +0 -220
- api/batch_processing/api_core/server_job_status_table.py +0 -152
- api/batch_processing/api_core/server_orchestration.py +0 -360
- api/batch_processing/api_core/server_utils.py +0 -92
- api/batch_processing/api_core_support/__init__.py +0 -0
- api/batch_processing/api_core_support/aggregate_results_manually.py +0 -46
- api/batch_processing/api_support/__init__.py +0 -0
- api/batch_processing/api_support/summarize_daily_activity.py +0 -152
- api/batch_processing/data_preparation/__init__.py +0 -0
- api/batch_processing/data_preparation/manage_local_batch.py +0 -2391
- api/batch_processing/data_preparation/manage_video_batch.py +0 -327
- api/batch_processing/integration/digiKam/setup.py +0 -6
- api/batch_processing/integration/digiKam/xmp_integration.py +0 -465
- api/batch_processing/integration/eMammal/test_scripts/config_template.py +0 -5
- api/batch_processing/integration/eMammal/test_scripts/push_annotations_to_emammal.py +0 -126
- api/batch_processing/integration/eMammal/test_scripts/select_images_for_testing.py +0 -55
- api/batch_processing/postprocessing/__init__.py +0 -0
- api/batch_processing/postprocessing/add_max_conf.py +0 -64
- api/batch_processing/postprocessing/categorize_detections_by_size.py +0 -163
- api/batch_processing/postprocessing/combine_api_outputs.py +0 -249
- api/batch_processing/postprocessing/compare_batch_results.py +0 -958
- api/batch_processing/postprocessing/convert_output_format.py +0 -397
- api/batch_processing/postprocessing/load_api_results.py +0 -195
- api/batch_processing/postprocessing/md_to_coco.py +0 -310
- api/batch_processing/postprocessing/md_to_labelme.py +0 -330
- api/batch_processing/postprocessing/merge_detections.py +0 -401
- api/batch_processing/postprocessing/postprocess_batch_results.py +0 -1904
- api/batch_processing/postprocessing/remap_detection_categories.py +0 -170
- api/batch_processing/postprocessing/render_detection_confusion_matrix.py +0 -661
- api/batch_processing/postprocessing/repeat_detection_elimination/find_repeat_detections.py +0 -211
- api/batch_processing/postprocessing/repeat_detection_elimination/remove_repeat_detections.py +0 -82
- api/batch_processing/postprocessing/repeat_detection_elimination/repeat_detections_core.py +0 -1631
- api/batch_processing/postprocessing/separate_detections_into_folders.py +0 -731
- api/batch_processing/postprocessing/subset_json_detector_output.py +0 -696
- api/batch_processing/postprocessing/top_folders_to_bottom.py +0 -223
- api/synchronous/__init__.py +0 -0
- api/synchronous/api_core/animal_detection_api/__init__.py +0 -0
- api/synchronous/api_core/animal_detection_api/api_backend.py +0 -152
- api/synchronous/api_core/animal_detection_api/api_frontend.py +0 -266
- api/synchronous/api_core/animal_detection_api/config.py +0 -35
- api/synchronous/api_core/animal_detection_api/data_management/annotations/annotation_constants.py +0 -47
- api/synchronous/api_core/animal_detection_api/detection/detector_training/copy_checkpoints.py +0 -43
- api/synchronous/api_core/animal_detection_api/detection/detector_training/model_main_tf2.py +0 -114
- api/synchronous/api_core/animal_detection_api/detection/process_video.py +0 -543
- api/synchronous/api_core/animal_detection_api/detection/pytorch_detector.py +0 -304
- api/synchronous/api_core/animal_detection_api/detection/run_detector.py +0 -627
- api/synchronous/api_core/animal_detection_api/detection/run_detector_batch.py +0 -1029
- api/synchronous/api_core/animal_detection_api/detection/run_inference_with_yolov5_val.py +0 -581
- api/synchronous/api_core/animal_detection_api/detection/run_tiled_inference.py +0 -754
- api/synchronous/api_core/animal_detection_api/detection/tf_detector.py +0 -165
- api/synchronous/api_core/animal_detection_api/detection/video_utils.py +0 -495
- api/synchronous/api_core/animal_detection_api/md_utils/azure_utils.py +0 -174
- api/synchronous/api_core/animal_detection_api/md_utils/ct_utils.py +0 -262
- api/synchronous/api_core/animal_detection_api/md_utils/directory_listing.py +0 -251
- api/synchronous/api_core/animal_detection_api/md_utils/matlab_porting_tools.py +0 -97
- api/synchronous/api_core/animal_detection_api/md_utils/path_utils.py +0 -416
- api/synchronous/api_core/animal_detection_api/md_utils/process_utils.py +0 -110
- api/synchronous/api_core/animal_detection_api/md_utils/sas_blob_utils.py +0 -509
- api/synchronous/api_core/animal_detection_api/md_utils/string_utils.py +0 -59
- api/synchronous/api_core/animal_detection_api/md_utils/url_utils.py +0 -144
- api/synchronous/api_core/animal_detection_api/md_utils/write_html_image_list.py +0 -226
- api/synchronous/api_core/animal_detection_api/md_visualization/visualization_utils.py +0 -841
- api/synchronous/api_core/tests/__init__.py +0 -0
- api/synchronous/api_core/tests/load_test.py +0 -110
- classification/__init__.py +0 -0
- classification/aggregate_classifier_probs.py +0 -108
- classification/analyze_failed_images.py +0 -227
- classification/cache_batchapi_outputs.py +0 -198
- classification/create_classification_dataset.py +0 -627
- classification/crop_detections.py +0 -516
- classification/csv_to_json.py +0 -226
- classification/detect_and_crop.py +0 -855
- classification/efficientnet/__init__.py +0 -9
- classification/efficientnet/model.py +0 -415
- classification/efficientnet/utils.py +0 -610
- classification/evaluate_model.py +0 -520
- classification/identify_mislabeled_candidates.py +0 -152
- classification/json_to_azcopy_list.py +0 -63
- classification/json_validator.py +0 -695
- classification/map_classification_categories.py +0 -276
- classification/merge_classification_detection_output.py +0 -506
- classification/prepare_classification_script.py +0 -194
- classification/prepare_classification_script_mc.py +0 -228
- classification/run_classifier.py +0 -286
- classification/save_mislabeled.py +0 -110
- classification/train_classifier.py +0 -825
- classification/train_classifier_tf.py +0 -724
- classification/train_utils.py +0 -322
- data_management/__init__.py +0 -0
- data_management/annotations/__init__.py +0 -0
- data_management/annotations/annotation_constants.py +0 -34
- data_management/camtrap_dp_to_coco.py +0 -238
- data_management/cct_json_utils.py +0 -395
- data_management/cct_to_md.py +0 -176
- data_management/cct_to_wi.py +0 -289
- data_management/coco_to_labelme.py +0 -272
- data_management/coco_to_yolo.py +0 -662
- data_management/databases/__init__.py +0 -0
- data_management/databases/add_width_and_height_to_db.py +0 -33
- data_management/databases/combine_coco_camera_traps_files.py +0 -206
- data_management/databases/integrity_check_json_db.py +0 -477
- data_management/databases/subset_json_db.py +0 -115
- data_management/generate_crops_from_cct.py +0 -149
- data_management/get_image_sizes.py +0 -188
- data_management/importers/add_nacti_sizes.py +0 -52
- data_management/importers/add_timestamps_to_icct.py +0 -79
- data_management/importers/animl_results_to_md_results.py +0 -158
- data_management/importers/auckland_doc_test_to_json.py +0 -372
- data_management/importers/auckland_doc_to_json.py +0 -200
- data_management/importers/awc_to_json.py +0 -189
- data_management/importers/bellevue_to_json.py +0 -273
- data_management/importers/cacophony-thermal-importer.py +0 -796
- data_management/importers/carrizo_shrubfree_2018.py +0 -268
- data_management/importers/carrizo_trail_cam_2017.py +0 -287
- data_management/importers/cct_field_adjustments.py +0 -57
- data_management/importers/channel_islands_to_cct.py +0 -913
- data_management/importers/eMammal/copy_and_unzip_emammal.py +0 -180
- data_management/importers/eMammal/eMammal_helpers.py +0 -249
- data_management/importers/eMammal/make_eMammal_json.py +0 -223
- data_management/importers/ena24_to_json.py +0 -275
- data_management/importers/filenames_to_json.py +0 -385
- data_management/importers/helena_to_cct.py +0 -282
- data_management/importers/idaho-camera-traps.py +0 -1407
- data_management/importers/idfg_iwildcam_lila_prep.py +0 -294
- data_management/importers/jb_csv_to_json.py +0 -150
- data_management/importers/mcgill_to_json.py +0 -250
- data_management/importers/missouri_to_json.py +0 -489
- data_management/importers/nacti_fieldname_adjustments.py +0 -79
- data_management/importers/noaa_seals_2019.py +0 -181
- data_management/importers/pc_to_json.py +0 -365
- data_management/importers/plot_wni_giraffes.py +0 -123
- data_management/importers/prepare-noaa-fish-data-for-lila.py +0 -359
- data_management/importers/prepare_zsl_imerit.py +0 -131
- data_management/importers/rspb_to_json.py +0 -356
- data_management/importers/save_the_elephants_survey_A.py +0 -320
- data_management/importers/save_the_elephants_survey_B.py +0 -332
- data_management/importers/snapshot_safari_importer.py +0 -758
- data_management/importers/snapshot_safari_importer_reprise.py +0 -665
- data_management/importers/snapshot_serengeti_lila.py +0 -1067
- data_management/importers/snapshotserengeti/make_full_SS_json.py +0 -150
- data_management/importers/snapshotserengeti/make_per_season_SS_json.py +0 -153
- data_management/importers/sulross_get_exif.py +0 -65
- data_management/importers/timelapse_csv_set_to_json.py +0 -490
- data_management/importers/ubc_to_json.py +0 -399
- data_management/importers/umn_to_json.py +0 -507
- data_management/importers/wellington_to_json.py +0 -263
- data_management/importers/wi_to_json.py +0 -441
- data_management/importers/zamba_results_to_md_results.py +0 -181
- data_management/labelme_to_coco.py +0 -548
- data_management/labelme_to_yolo.py +0 -272
- data_management/lila/__init__.py +0 -0
- data_management/lila/add_locations_to_island_camera_traps.py +0 -97
- data_management/lila/add_locations_to_nacti.py +0 -147
- data_management/lila/create_lila_blank_set.py +0 -557
- data_management/lila/create_lila_test_set.py +0 -151
- data_management/lila/create_links_to_md_results_files.py +0 -106
- data_management/lila/download_lila_subset.py +0 -177
- data_management/lila/generate_lila_per_image_labels.py +0 -515
- data_management/lila/get_lila_annotation_counts.py +0 -170
- data_management/lila/get_lila_image_counts.py +0 -111
- data_management/lila/lila_common.py +0 -300
- data_management/lila/test_lila_metadata_urls.py +0 -132
- data_management/ocr_tools.py +0 -874
- data_management/read_exif.py +0 -681
- data_management/remap_coco_categories.py +0 -84
- data_management/remove_exif.py +0 -66
- data_management/resize_coco_dataset.py +0 -189
- data_management/wi_download_csv_to_coco.py +0 -246
- data_management/yolo_output_to_md_output.py +0 -441
- data_management/yolo_to_coco.py +0 -676
- detection/__init__.py +0 -0
- detection/detector_training/__init__.py +0 -0
- detection/detector_training/model_main_tf2.py +0 -114
- detection/process_video.py +0 -703
- detection/pytorch_detector.py +0 -337
- detection/run_detector.py +0 -779
- detection/run_detector_batch.py +0 -1219
- detection/run_inference_with_yolov5_val.py +0 -917
- detection/run_tiled_inference.py +0 -935
- detection/tf_detector.py +0 -188
- detection/video_utils.py +0 -606
- docs/source/conf.py +0 -43
- md_utils/__init__.py +0 -0
- md_utils/azure_utils.py +0 -174
- md_utils/ct_utils.py +0 -612
- md_utils/directory_listing.py +0 -246
- md_utils/md_tests.py +0 -968
- md_utils/path_utils.py +0 -1044
- md_utils/process_utils.py +0 -157
- md_utils/sas_blob_utils.py +0 -509
- md_utils/split_locations_into_train_val.py +0 -228
- md_utils/string_utils.py +0 -92
- md_utils/url_utils.py +0 -323
- md_utils/write_html_image_list.py +0 -225
- md_visualization/__init__.py +0 -0
- md_visualization/plot_utils.py +0 -293
- md_visualization/render_images_with_thumbnails.py +0 -275
- md_visualization/visualization_utils.py +0 -1537
- md_visualization/visualize_db.py +0 -551
- md_visualization/visualize_detector_output.py +0 -406
- megadetector-5.0.9.dist-info/RECORD +0 -224
- megadetector-5.0.9.dist-info/top_level.txt +0 -8
- taxonomy_mapping/__init__.py +0 -0
- taxonomy_mapping/map_lila_taxonomy_to_wi_taxonomy.py +0 -491
- taxonomy_mapping/map_new_lila_datasets.py +0 -154
- taxonomy_mapping/prepare_lila_taxonomy_release.py +0 -142
- taxonomy_mapping/preview_lila_taxonomy.py +0 -591
- taxonomy_mapping/retrieve_sample_image.py +0 -71
- taxonomy_mapping/simple_image_download.py +0 -218
- taxonomy_mapping/species_lookup.py +0 -834
- taxonomy_mapping/taxonomy_csv_checker.py +0 -159
- taxonomy_mapping/taxonomy_graph.py +0 -346
- taxonomy_mapping/validate_lila_category_mappings.py +0 -83
- {megadetector-5.0.9.dist-info → megadetector-5.0.11.dist-info}/WHEEL +0 -0
|
@@ -1,282 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
|
|
3
|
-
helena_to_cct.py
|
|
4
|
-
|
|
5
|
-
Convert the Helena Detections data set to a COCO-camera-traps .json file
|
|
6
|
-
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
#%% Constants and environment
|
|
10
|
-
|
|
11
|
-
import os
|
|
12
|
-
import json
|
|
13
|
-
import uuid
|
|
14
|
-
import time
|
|
15
|
-
import humanfriendly
|
|
16
|
-
import numpy as np
|
|
17
|
-
from PIL import Image
|
|
18
|
-
from tqdm import tqdm
|
|
19
|
-
import pandas as pd
|
|
20
|
-
from datetime import datetime
|
|
21
|
-
|
|
22
|
-
from md_utils.path_utils import find_images
|
|
23
|
-
|
|
24
|
-
base_directory = r'/mnt/blobfuse/wildlifeblobssc/'
|
|
25
|
-
output_directory = r'/home/gramener'
|
|
26
|
-
output_json_file = os.path.join(output_directory,'rspb.json')
|
|
27
|
-
input_metadata_file = os.path.join(base_directory, 'StHelena_Detections.xlsx')
|
|
28
|
-
image_directory = os.path.join(base_directory, 'StHELENA_images/')
|
|
29
|
-
mapping_df = ''
|
|
30
|
-
filename_col = 'image_name'
|
|
31
|
-
load_width_and_height = True
|
|
32
|
-
annotation_fields_to_copy = ['Fortnight', 'Detector', 'datetime', 'site']
|
|
33
|
-
|
|
34
|
-
assert(os.path.isdir(image_directory))
|
|
35
|
-
|
|
36
|
-
# This is one time process
|
|
37
|
-
#%% Create Filenames and timestamps mapping CSV
|
|
38
|
-
|
|
39
|
-
image_full_paths = find_images(image_directory, bRecursive=True)
|
|
40
|
-
csv_file = os.path.join(output_directory, "mapping_names.csv")
|
|
41
|
-
if not os.path.exists(csv_file):
|
|
42
|
-
map_list = []
|
|
43
|
-
for img_ in image_full_paths:
|
|
44
|
-
try:
|
|
45
|
-
date_cr = Image.open(img_)._getexif()[306]
|
|
46
|
-
_tmp = {}
|
|
47
|
-
# import pdb;pdb.set_trace()
|
|
48
|
-
img_path = img_.replace(image_directory, "")
|
|
49
|
-
img_folder = img_path.split("/")[0]
|
|
50
|
-
site = img_path.split("/")[1]
|
|
51
|
-
detector = img_path.split("/")[2]
|
|
52
|
-
_tmp["image_name"] = img_path
|
|
53
|
-
_tmp["Fortnight"] = img_folder.replace("Fortnight", "")
|
|
54
|
-
_tmp["site"] = site
|
|
55
|
-
_tmp["Detector"] = detector
|
|
56
|
-
_tmp["datetime"] = "-".join(date_cr.split(":")[:-1])
|
|
57
|
-
map_list.append(_tmp)
|
|
58
|
-
except Exception as e:
|
|
59
|
-
print(e)
|
|
60
|
-
print(img_)
|
|
61
|
-
mapping_df = pd.DataFrame(map_list)
|
|
62
|
-
mapping_df.to_csv(csv_file, index=False)
|
|
63
|
-
else:
|
|
64
|
-
mapping_df = pd.read_csv(csv_file)
|
|
65
|
-
|
|
66
|
-
#%% To create CCT JSON for RSPB dataset
|
|
67
|
-
|
|
68
|
-
#%% Read source data
|
|
69
|
-
input_metadata = pd.read_excel(input_metadata_file)
|
|
70
|
-
|
|
71
|
-
print('Read {} columns and {} rows from metadata file'.format(len(input_metadata.columns),
|
|
72
|
-
len(input_metadata)))
|
|
73
|
-
|
|
74
|
-
# Original Excel file had timestamp in different columns
|
|
75
|
-
input_metadata['datetime'] = input_metadata[['DATUM', 'Hour', 'Mins']].apply(lambda x: '{0} {1}-{2}'.format(datetime.strftime(x[0], '%Y-%m-%d'),"{0:0=2d}".format(x[1]),"{0:0=2d}".format(x[2])), axis = 1)
|
|
76
|
-
input_metadata['Detector'] = "Detector"+input_metadata['Detector'].astype('str')
|
|
77
|
-
result = pd.merge(input_metadata, mapping_df, how='left', on=['datetime', "Fortnight", "site", "Detector"])
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
#%% Map filenames to rows, verify image existence
|
|
81
|
-
|
|
82
|
-
start_time = time.time()
|
|
83
|
-
filenames_to_rows = {}
|
|
84
|
-
image_filenames = result[filename_col]
|
|
85
|
-
image_filenames = list(set(image_filenames))
|
|
86
|
-
|
|
87
|
-
missing_files = []
|
|
88
|
-
duplicate_rows = []
|
|
89
|
-
|
|
90
|
-
# Build up a map from filenames to a list of rows, checking image existence as we go
|
|
91
|
-
for iFile, fn in enumerate(image_filenames):
|
|
92
|
-
try:
|
|
93
|
-
if fn == 'nan' or type(fn) == float:
|
|
94
|
-
pass
|
|
95
|
-
else:
|
|
96
|
-
if (fn in filenames_to_rows):
|
|
97
|
-
duplicate_rows.append(iFile)
|
|
98
|
-
filenames_to_rows[fn].append(iFile)
|
|
99
|
-
else:
|
|
100
|
-
filenames_to_rows[fn] = [iFile]
|
|
101
|
-
image_path = os.path.join(image_directory, fn)
|
|
102
|
-
if not os.path.isfile(image_path):
|
|
103
|
-
missing_files.append(fn)
|
|
104
|
-
except Exception as e:
|
|
105
|
-
pass
|
|
106
|
-
|
|
107
|
-
elapsed = time.time() - start_time
|
|
108
|
-
|
|
109
|
-
print('Finished verifying image existence in {}, found {} missing files (of {})'.format(
|
|
110
|
-
humanfriendly.format_timespan(elapsed),
|
|
111
|
-
len(missing_files),len(image_filenames)))
|
|
112
|
-
|
|
113
|
-
#%% Skipping this check because one image has multiple species
|
|
114
|
-
# assert len(duplicate_rows) == 0
|
|
115
|
-
|
|
116
|
-
#%% Check for images that aren't included in the metadata file
|
|
117
|
-
|
|
118
|
-
images_missing_from_metadata = []
|
|
119
|
-
|
|
120
|
-
for iImage, image_path in enumerate(image_full_paths):
|
|
121
|
-
|
|
122
|
-
relative_path = os.path.relpath(image_path, image_directory)
|
|
123
|
-
if relative_path not in filenames_to_rows:
|
|
124
|
-
images_missing_from_metadata.append(relative_path)
|
|
125
|
-
|
|
126
|
-
print('{} of {} files are not in metadata'.format(len(images_missing_from_metadata),len(image_full_paths)))
|
|
127
|
-
|
|
128
|
-
#%% Create CCT dictionaries
|
|
129
|
-
|
|
130
|
-
images = []
|
|
131
|
-
annotations = []
|
|
132
|
-
|
|
133
|
-
# Map categories to integer IDs
|
|
134
|
-
#
|
|
135
|
-
# The category '0' is reserved for 'empty'
|
|
136
|
-
|
|
137
|
-
categories_to_category_id = {}
|
|
138
|
-
categories_to_counts = {}
|
|
139
|
-
categories_to_category_id['empty'] = 0
|
|
140
|
-
categories_to_counts['empty'] = 0
|
|
141
|
-
|
|
142
|
-
next_category_id = 1
|
|
143
|
-
|
|
144
|
-
# For each image
|
|
145
|
-
|
|
146
|
-
start_time = time.time()
|
|
147
|
-
for image_name in image_filenames:
|
|
148
|
-
|
|
149
|
-
if type(image_name) != str:
|
|
150
|
-
continue
|
|
151
|
-
|
|
152
|
-
image_path = os.path.join(image_directory, image_name)
|
|
153
|
-
# Don't include images that don't exist on disk
|
|
154
|
-
if not os.path.isfile(image_path):
|
|
155
|
-
continue
|
|
156
|
-
|
|
157
|
-
im = {}
|
|
158
|
-
im['id'] = image_name.split('.')[0]
|
|
159
|
-
im['file_name'] = image_name
|
|
160
|
-
|
|
161
|
-
if load_width_and_height:
|
|
162
|
-
pilImage = Image.open(image_path)
|
|
163
|
-
width, height = pilImage.size
|
|
164
|
-
im['width'] = width
|
|
165
|
-
im['height'] = height
|
|
166
|
-
else:
|
|
167
|
-
im['width'] = -1
|
|
168
|
-
im['height'] = -1
|
|
169
|
-
|
|
170
|
-
images.append(im)
|
|
171
|
-
|
|
172
|
-
rows = filenames_to_rows[image_name]
|
|
173
|
-
|
|
174
|
-
# Some filenames will match to multiple rows
|
|
175
|
-
# assert(len(rows) == 1)
|
|
176
|
-
|
|
177
|
-
# iRow = rows[0]
|
|
178
|
-
for iRow in rows:
|
|
179
|
-
row = result.iloc[iRow]
|
|
180
|
-
|
|
181
|
-
category = row['Species']
|
|
182
|
-
|
|
183
|
-
# Have we seen this category before?
|
|
184
|
-
if category in categories_to_category_id:
|
|
185
|
-
categoryID = categories_to_category_id[category]
|
|
186
|
-
categories_to_counts[category] += 1
|
|
187
|
-
else:
|
|
188
|
-
categoryID = next_category_id
|
|
189
|
-
categories_to_category_id[category] = categoryID
|
|
190
|
-
categories_to_counts[category] = 1
|
|
191
|
-
next_category_id += 1
|
|
192
|
-
|
|
193
|
-
# Create an annotation
|
|
194
|
-
ann = {}
|
|
195
|
-
|
|
196
|
-
# The Internet tells me this guarantees uniqueness to a reasonable extent, even
|
|
197
|
-
# beyond the sheer improbability of collisions.
|
|
198
|
-
ann['id'] = str(uuid.uuid1())
|
|
199
|
-
ann['image_id'] = im['id']
|
|
200
|
-
ann['category_id'] = categoryID
|
|
201
|
-
# ann['datetime'] = row['datetime']
|
|
202
|
-
# ann['site'] = row['site']
|
|
203
|
-
|
|
204
|
-
for fieldname in annotation_fields_to_copy:
|
|
205
|
-
ann[fieldname] = row[fieldname]
|
|
206
|
-
if ann[fieldname] is np.nan:
|
|
207
|
-
ann[fieldname] = ''
|
|
208
|
-
ann[fieldname] = str(ann[fieldname])
|
|
209
|
-
|
|
210
|
-
annotations.append(ann)
|
|
211
|
-
|
|
212
|
-
# ...for each image
|
|
213
|
-
|
|
214
|
-
# Convert categories to a CCT-style dictionary
|
|
215
|
-
categories = []
|
|
216
|
-
|
|
217
|
-
for category in categories_to_counts:
|
|
218
|
-
print('Category {}, count {}'.format(
|
|
219
|
-
category, categories_to_counts[category]))
|
|
220
|
-
categoryID = categories_to_category_id[category]
|
|
221
|
-
cat = {}
|
|
222
|
-
cat['name'] = category
|
|
223
|
-
cat['id'] = categoryID
|
|
224
|
-
categories.append(cat)
|
|
225
|
-
|
|
226
|
-
elapsed = time.time() - start_time
|
|
227
|
-
print('Finished creating CCT dictionaries in {}'.format(
|
|
228
|
-
humanfriendly.format_timespan(elapsed)))
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
#%% Create info struct
|
|
232
|
-
|
|
233
|
-
info = {}
|
|
234
|
-
info['year'] = 2012
|
|
235
|
-
info['version'] = 1
|
|
236
|
-
info['description'] = 'RSPB Dataset'
|
|
237
|
-
info['contributor'] = 'Helena Detection'
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
#%% Write output
|
|
241
|
-
|
|
242
|
-
json_data = {}
|
|
243
|
-
json_data['images'] = images
|
|
244
|
-
json_data['annotations'] = annotations
|
|
245
|
-
json_data['categories'] = categories
|
|
246
|
-
json_data['info'] = info
|
|
247
|
-
json.dump(json_data, open(output_json_file, 'w'), indent=4)
|
|
248
|
-
|
|
249
|
-
print('Finished writing .json file with {} images, {} annotations, and {} categories'.format(
|
|
250
|
-
len(images), len(annotations), len(categories)))
|
|
251
|
-
|
|
252
|
-
#%% Validate output
|
|
253
|
-
|
|
254
|
-
from data_management.databases import integrity_check_json_db
|
|
255
|
-
|
|
256
|
-
options = integrity_check_json_db.IntegrityCheckOptions()
|
|
257
|
-
options.baseDir = image_directory
|
|
258
|
-
options.bCheckImageSizes = False
|
|
259
|
-
options.bCheckImageExistence = False
|
|
260
|
-
options.bFindUnusedImages = False
|
|
261
|
-
data = integrity_check_json_db.integrity_check_json_db(output_json_file,options)
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
#%% Preview labels
|
|
265
|
-
|
|
266
|
-
from md_visualization import visualize_db
|
|
267
|
-
from data_management.databases import integrity_check_json_db
|
|
268
|
-
|
|
269
|
-
viz_options = visualize_db.DbVizOptions()
|
|
270
|
-
viz_options.num_to_visualize = None
|
|
271
|
-
viz_options.trim_to_images_with_bboxes = False
|
|
272
|
-
viz_options.add_search_links = True
|
|
273
|
-
viz_options.sort_by_filename = False
|
|
274
|
-
viz_options.parallelize_rendering = True
|
|
275
|
-
viz_options.classes_to_exclude = ['empty']
|
|
276
|
-
html_output_file,image_db = visualize_db.visualize_db(db_path=output_json_file,
|
|
277
|
-
output_dir=os.path.join(
|
|
278
|
-
output_directory, 'RSPB/preview'),
|
|
279
|
-
image_base_dir=image_directory,
|
|
280
|
-
options=viz_options)
|
|
281
|
-
os.startfile(html_output_file)
|
|
282
|
-
|