megadetector 5.0.7__py3-none-any.whl → 5.0.9__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.
- 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 -1
- api/batch_processing/api_core/server_job_status_table.py +0 -1
- api/batch_processing/api_core_support/__init__.py +0 -0
- api/batch_processing/api_core_support/aggregate_results_manually.py +0 -1
- api/batch_processing/api_support/__init__.py +0 -0
- api/batch_processing/api_support/summarize_daily_activity.py +0 -1
- api/batch_processing/data_preparation/__init__.py +0 -0
- api/batch_processing/data_preparation/manage_local_batch.py +93 -79
- api/batch_processing/data_preparation/manage_video_batch.py +8 -8
- api/batch_processing/integration/digiKam/xmp_integration.py +0 -1
- api/batch_processing/integration/eMammal/test_scripts/push_annotations_to_emammal.py +0 -1
- api/batch_processing/postprocessing/__init__.py +0 -0
- api/batch_processing/postprocessing/add_max_conf.py +12 -12
- api/batch_processing/postprocessing/categorize_detections_by_size.py +32 -14
- api/batch_processing/postprocessing/combine_api_outputs.py +69 -55
- api/batch_processing/postprocessing/compare_batch_results.py +114 -44
- api/batch_processing/postprocessing/convert_output_format.py +62 -19
- api/batch_processing/postprocessing/load_api_results.py +17 -20
- api/batch_processing/postprocessing/md_to_coco.py +31 -21
- api/batch_processing/postprocessing/md_to_labelme.py +165 -68
- api/batch_processing/postprocessing/merge_detections.py +40 -15
- api/batch_processing/postprocessing/postprocess_batch_results.py +270 -186
- api/batch_processing/postprocessing/remap_detection_categories.py +170 -0
- api/batch_processing/postprocessing/render_detection_confusion_matrix.py +75 -39
- api/batch_processing/postprocessing/repeat_detection_elimination/find_repeat_detections.py +53 -44
- api/batch_processing/postprocessing/repeat_detection_elimination/remove_repeat_detections.py +25 -14
- api/batch_processing/postprocessing/repeat_detection_elimination/repeat_detections_core.py +244 -160
- api/batch_processing/postprocessing/separate_detections_into_folders.py +159 -114
- api/batch_processing/postprocessing/subset_json_detector_output.py +146 -169
- api/batch_processing/postprocessing/top_folders_to_bottom.py +77 -43
- 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 -2
- api/synchronous/api_core/animal_detection_api/api_frontend.py +266 -268
- api/synchronous/api_core/animal_detection_api/config.py +35 -35
- api/synchronous/api_core/tests/__init__.py +0 -0
- api/synchronous/api_core/tests/load_test.py +109 -109
- classification/__init__.py +0 -0
- classification/aggregate_classifier_probs.py +21 -24
- classification/analyze_failed_images.py +11 -13
- classification/cache_batchapi_outputs.py +51 -51
- classification/create_classification_dataset.py +69 -68
- classification/crop_detections.py +54 -53
- classification/csv_to_json.py +97 -100
- classification/detect_and_crop.py +105 -105
- classification/evaluate_model.py +43 -42
- classification/identify_mislabeled_candidates.py +47 -46
- classification/json_to_azcopy_list.py +10 -10
- classification/json_validator.py +72 -71
- classification/map_classification_categories.py +44 -43
- classification/merge_classification_detection_output.py +68 -68
- classification/prepare_classification_script.py +157 -154
- classification/prepare_classification_script_mc.py +228 -228
- classification/run_classifier.py +27 -26
- classification/save_mislabeled.py +30 -30
- classification/train_classifier.py +20 -20
- classification/train_classifier_tf.py +21 -22
- classification/train_utils.py +10 -10
- data_management/__init__.py +0 -0
- data_management/annotations/__init__.py +0 -0
- data_management/annotations/annotation_constants.py +18 -31
- data_management/camtrap_dp_to_coco.py +238 -0
- data_management/cct_json_utils.py +107 -59
- data_management/cct_to_md.py +176 -158
- data_management/cct_to_wi.py +247 -219
- data_management/coco_to_labelme.py +272 -0
- data_management/coco_to_yolo.py +86 -62
- data_management/databases/__init__.py +0 -0
- data_management/databases/add_width_and_height_to_db.py +20 -16
- data_management/databases/combine_coco_camera_traps_files.py +35 -31
- data_management/databases/integrity_check_json_db.py +130 -83
- data_management/databases/subset_json_db.py +25 -16
- data_management/generate_crops_from_cct.py +27 -45
- data_management/get_image_sizes.py +188 -144
- data_management/importers/add_nacti_sizes.py +8 -8
- data_management/importers/add_timestamps_to_icct.py +78 -78
- data_management/importers/animl_results_to_md_results.py +158 -160
- data_management/importers/auckland_doc_test_to_json.py +9 -9
- data_management/importers/auckland_doc_to_json.py +8 -8
- data_management/importers/awc_to_json.py +7 -7
- data_management/importers/bellevue_to_json.py +15 -15
- data_management/importers/cacophony-thermal-importer.py +13 -13
- data_management/importers/carrizo_shrubfree_2018.py +8 -8
- data_management/importers/carrizo_trail_cam_2017.py +8 -8
- data_management/importers/cct_field_adjustments.py +9 -9
- data_management/importers/channel_islands_to_cct.py +10 -10
- data_management/importers/eMammal/copy_and_unzip_emammal.py +1 -0
- data_management/importers/ena24_to_json.py +7 -7
- data_management/importers/filenames_to_json.py +8 -8
- data_management/importers/helena_to_cct.py +7 -7
- data_management/importers/idaho-camera-traps.py +7 -7
- data_management/importers/idfg_iwildcam_lila_prep.py +10 -10
- data_management/importers/jb_csv_to_json.py +9 -9
- data_management/importers/mcgill_to_json.py +8 -8
- data_management/importers/missouri_to_json.py +18 -18
- data_management/importers/nacti_fieldname_adjustments.py +10 -10
- data_management/importers/noaa_seals_2019.py +8 -8
- data_management/importers/pc_to_json.py +7 -7
- data_management/importers/plot_wni_giraffes.py +7 -7
- data_management/importers/prepare-noaa-fish-data-for-lila.py +359 -359
- data_management/importers/prepare_zsl_imerit.py +7 -7
- data_management/importers/rspb_to_json.py +8 -8
- data_management/importers/save_the_elephants_survey_A.py +8 -8
- data_management/importers/save_the_elephants_survey_B.py +9 -9
- data_management/importers/snapshot_safari_importer.py +26 -26
- data_management/importers/snapshot_safari_importer_reprise.py +665 -665
- data_management/importers/snapshot_serengeti_lila.py +14 -14
- data_management/importers/sulross_get_exif.py +8 -9
- data_management/importers/timelapse_csv_set_to_json.py +11 -11
- data_management/importers/ubc_to_json.py +13 -13
- data_management/importers/umn_to_json.py +7 -7
- data_management/importers/wellington_to_json.py +8 -8
- data_management/importers/wi_to_json.py +9 -9
- data_management/importers/zamba_results_to_md_results.py +181 -181
- data_management/labelme_to_coco.py +309 -159
- data_management/labelme_to_yolo.py +103 -60
- data_management/lila/__init__.py +0 -0
- data_management/lila/add_locations_to_island_camera_traps.py +9 -9
- data_management/lila/add_locations_to_nacti.py +147 -147
- data_management/lila/create_lila_blank_set.py +114 -31
- data_management/lila/create_lila_test_set.py +8 -8
- data_management/lila/create_links_to_md_results_files.py +106 -106
- data_management/lila/download_lila_subset.py +92 -90
- data_management/lila/generate_lila_per_image_labels.py +56 -43
- data_management/lila/get_lila_annotation_counts.py +18 -15
- data_management/lila/get_lila_image_counts.py +11 -11
- data_management/lila/lila_common.py +103 -70
- data_management/lila/test_lila_metadata_urls.py +132 -116
- data_management/ocr_tools.py +173 -128
- data_management/read_exif.py +161 -99
- data_management/remap_coco_categories.py +84 -0
- data_management/remove_exif.py +58 -62
- data_management/resize_coco_dataset.py +32 -44
- data_management/wi_download_csv_to_coco.py +246 -0
- data_management/yolo_output_to_md_output.py +86 -73
- data_management/yolo_to_coco.py +535 -95
- detection/__init__.py +0 -0
- detection/detector_training/__init__.py +0 -0
- detection/process_video.py +85 -33
- detection/pytorch_detector.py +43 -25
- detection/run_detector.py +157 -72
- detection/run_detector_batch.py +189 -114
- detection/run_inference_with_yolov5_val.py +118 -51
- detection/run_tiled_inference.py +113 -42
- detection/tf_detector.py +51 -28
- detection/video_utils.py +606 -521
- docs/source/conf.py +43 -0
- md_utils/__init__.py +0 -0
- md_utils/azure_utils.py +9 -9
- md_utils/ct_utils.py +249 -70
- md_utils/directory_listing.py +59 -64
- md_utils/md_tests.py +968 -862
- md_utils/path_utils.py +655 -155
- md_utils/process_utils.py +157 -133
- md_utils/sas_blob_utils.py +20 -20
- md_utils/split_locations_into_train_val.py +45 -32
- md_utils/string_utils.py +33 -10
- md_utils/url_utils.py +208 -27
- md_utils/write_html_image_list.py +51 -35
- md_visualization/__init__.py +0 -0
- md_visualization/plot_utils.py +102 -109
- md_visualization/render_images_with_thumbnails.py +34 -34
- md_visualization/visualization_utils.py +908 -311
- md_visualization/visualize_db.py +109 -58
- md_visualization/visualize_detector_output.py +61 -42
- {megadetector-5.0.7.dist-info → megadetector-5.0.9.dist-info}/METADATA +21 -17
- megadetector-5.0.9.dist-info/RECORD +224 -0
- {megadetector-5.0.7.dist-info → megadetector-5.0.9.dist-info}/WHEEL +1 -1
- {megadetector-5.0.7.dist-info → megadetector-5.0.9.dist-info}/top_level.txt +1 -0
- taxonomy_mapping/__init__.py +0 -0
- taxonomy_mapping/map_lila_taxonomy_to_wi_taxonomy.py +342 -335
- taxonomy_mapping/map_new_lila_datasets.py +154 -154
- taxonomy_mapping/prepare_lila_taxonomy_release.py +142 -134
- taxonomy_mapping/preview_lila_taxonomy.py +591 -591
- taxonomy_mapping/retrieve_sample_image.py +12 -12
- taxonomy_mapping/simple_image_download.py +11 -11
- taxonomy_mapping/species_lookup.py +10 -10
- taxonomy_mapping/taxonomy_csv_checker.py +18 -18
- taxonomy_mapping/taxonomy_graph.py +47 -47
- taxonomy_mapping/validate_lila_category_mappings.py +83 -76
- data_management/cct_json_to_filename_json.py +0 -89
- data_management/cct_to_csv.py +0 -140
- data_management/databases/remove_corrupted_images_from_db.py +0 -191
- detection/detector_training/copy_checkpoints.py +0 -43
- md_visualization/visualize_megadb.py +0 -183
- megadetector-5.0.7.dist-info/RECORD +0 -202
- {megadetector-5.0.7.dist-info → megadetector-5.0.9.dist-info}/LICENSE +0 -0
md_visualization/plot_utils.py
CHANGED
|
@@ -1,56 +1,53 @@
|
|
|
1
|
-
|
|
2
|
-
#
|
|
3
|
-
# plot_utils.py
|
|
4
|
-
#
|
|
5
|
-
# Utility functions for plotting.
|
|
6
|
-
#
|
|
7
|
-
# NOTE: Do NOT import matplotlib.pyplot here to avoid the interactive backend.
|
|
8
|
-
# Thus, the matplotlib.figure.Figure objects returned by the functions here do not
|
|
9
|
-
# need to be "closed" with `plt.close(fig)`.
|
|
10
|
-
#
|
|
11
|
-
########
|
|
1
|
+
"""
|
|
12
2
|
|
|
13
|
-
|
|
3
|
+
plot_utils.py
|
|
4
|
+
|
|
5
|
+
Utility functions for plotting, particularly for plotting confusion matrices
|
|
6
|
+
and precision-recall curves.
|
|
14
7
|
|
|
15
|
-
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
#%% Imports
|
|
16
11
|
|
|
17
12
|
import numpy as np
|
|
18
|
-
|
|
13
|
+
|
|
14
|
+
# This also imports mpl.{cm, axes, colors}
|
|
15
|
+
import matplotlib.figure
|
|
19
16
|
|
|
20
17
|
|
|
21
18
|
#%% Plotting functions
|
|
22
19
|
|
|
23
|
-
def plot_confusion_matrix(
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
fig=None
|
|
34
|
-
) -> matplotlib.figure.Figure:
|
|
20
|
+
def plot_confusion_matrix(matrix,
|
|
21
|
+
classes,
|
|
22
|
+
normalize=False,
|
|
23
|
+
title='Confusion matrix',
|
|
24
|
+
cmap=matplotlib.cm.Blues,
|
|
25
|
+
vmax=None,
|
|
26
|
+
use_colorbar=True,
|
|
27
|
+
y_label=True,
|
|
28
|
+
fmt= '{:.0f}',
|
|
29
|
+
fig=None):
|
|
35
30
|
"""
|
|
36
|
-
|
|
37
|
-
are percentages. If the matrix contains counts, normalization can be applied
|
|
38
|
-
by setting `normalize=True`.
|
|
31
|
+
Plots a confusion matrix.
|
|
39
32
|
|
|
40
33
|
Args:
|
|
41
|
-
matrix
|
|
42
|
-
where rows are ground-truth classes and
|
|
43
|
-
classes
|
|
44
|
-
normalize
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
34
|
+
matrix (np.ndarray): shape [num_classes, num_classes], confusion matrix
|
|
35
|
+
where rows are ground-truth classes and columns are predicted classes
|
|
36
|
+
classes (list of str): class names for each row/column
|
|
37
|
+
normalize (bool, optional): whether to perform row-wise normalization;
|
|
38
|
+
by default, assumes values in the confusion matrix are percentages
|
|
39
|
+
title (str, optional): figure title
|
|
40
|
+
cmap (matplotlib.colors.colormap): colormap for cell backgrounds
|
|
41
|
+
vmax (float, optional), value corresponding to the largest value of the colormap;
|
|
42
|
+
if None, the maximum value in [matrix] will be used
|
|
43
|
+
use_colorbar (bool, optional): whether to show colorbar
|
|
44
|
+
y_label (bool, optional): whether to show class names on the y axis
|
|
45
|
+
fmt (str): format string for rendering numeric values
|
|
46
|
+
fig (Figure): existing figure to which we should render, otherwise creates
|
|
47
|
+
a new figure
|
|
48
|
+
|
|
49
|
+
Returns:
|
|
50
|
+
matplotlib.figure.Figure: the figure we rendered to or created
|
|
54
51
|
"""
|
|
55
52
|
|
|
56
53
|
num_classes = matrix.shape[0]
|
|
@@ -97,24 +94,29 @@ def plot_confusion_matrix(
|
|
|
97
94
|
|
|
98
95
|
return fig
|
|
99
96
|
|
|
97
|
+
# ...def plot_confusion_matrix(...)
|
|
100
98
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
99
|
+
|
|
100
|
+
def plot_precision_recall_curve(precisions,
|
|
101
|
+
recalls,
|
|
102
|
+
title='Precision/recall curve',
|
|
103
|
+
xlim=(0.0,1.05),
|
|
104
|
+
ylim=(0.0,1.05)):
|
|
106
105
|
"""
|
|
107
|
-
Plots
|
|
106
|
+
Plots a precision/recall curve given lists of (ordered) precision
|
|
108
107
|
and recall values.
|
|
109
108
|
|
|
110
109
|
Args:
|
|
111
|
-
precisions
|
|
112
|
-
should have same length as
|
|
113
|
-
recalls
|
|
114
|
-
should have same length as
|
|
115
|
-
title
|
|
116
|
-
|
|
117
|
-
|
|
110
|
+
precisions (list of float): precision for corresponding recall values,
|
|
111
|
+
should have same length as [recalls].
|
|
112
|
+
recalls (list of float): recall for corresponding precision values,
|
|
113
|
+
should have same length as [precisions].
|
|
114
|
+
title (str, optional): plot title
|
|
115
|
+
xlim (tuple, optional): x-axis limits as a length-2 tuple
|
|
116
|
+
ylim (tuple, optional): y-axis limits as a length-2 tuple
|
|
117
|
+
|
|
118
|
+
Returns:
|
|
119
|
+
matplotlib.figure.Figure: the (new) figure
|
|
118
120
|
"""
|
|
119
121
|
|
|
120
122
|
assert len(precisions) == len(recalls)
|
|
@@ -138,27 +140,24 @@ def plot_precision_recall_curve(
|
|
|
138
140
|
return fig
|
|
139
141
|
|
|
140
142
|
|
|
141
|
-
def plot_stacked_bar_chart(data
|
|
142
|
-
|
|
143
|
-
col_labels: Optional[Sequence[str]] = None,
|
|
144
|
-
x_label: Optional[str] = None,
|
|
145
|
-
y_label: Optional[str] = None,
|
|
146
|
-
log_scale: bool = False
|
|
147
|
-
) -> matplotlib.figure.Figure:
|
|
143
|
+
def plot_stacked_bar_chart(data, series_labels=None, col_labels=None,
|
|
144
|
+
x_label=None, y_label=None, log_scale=False):
|
|
148
145
|
"""
|
|
149
|
-
|
|
146
|
+
Plot a stacked bar chart, for plotting e.g. species distribution across locations.
|
|
147
|
+
|
|
150
148
|
Reference: https://stackoverflow.com/q/44309507
|
|
151
149
|
|
|
152
150
|
Args:
|
|
153
|
-
data
|
|
151
|
+
data (np.ndarray or list of list): data to plot; rows (series) are species, columns
|
|
154
152
|
are locations
|
|
155
|
-
series_labels
|
|
156
|
-
col_labels
|
|
157
|
-
x_label:
|
|
158
|
-
y_label:
|
|
159
|
-
log_scale
|
|
160
|
-
|
|
161
|
-
Returns:
|
|
153
|
+
series_labels (list of str, optional): series labels, typically species names
|
|
154
|
+
col_labels (list of str, optional): column labels, typically location names
|
|
155
|
+
x_label (str, optional): x-axis label
|
|
156
|
+
y_label (str, optional): y-axis label
|
|
157
|
+
log_scale (bool, optional) whether to plot the y axis in log-scale
|
|
158
|
+
|
|
159
|
+
Returns:
|
|
160
|
+
matplotlib.figure.Figure: the (new) figure
|
|
162
161
|
"""
|
|
163
162
|
|
|
164
163
|
data = np.asarray(data)
|
|
@@ -200,28 +199,29 @@ def plot_stacked_bar_chart(data: np.ndarray,
|
|
|
200
199
|
return fig
|
|
201
200
|
|
|
202
201
|
|
|
203
|
-
def calibration_ece(true_scores
|
|
204
|
-
|
|
205
|
-
"""
|
|
202
|
+
def calibration_ece(true_scores, pred_scores, num_bins):
|
|
203
|
+
r"""
|
|
206
204
|
Expected calibration error (ECE) as defined in equation (3) of
|
|
207
|
-
|
|
205
|
+
Guo et al. "On Calibration of Modern Neural Networks." (2017).
|
|
208
206
|
|
|
209
207
|
Implementation modified from sklearn.calibration.calibration_curve()
|
|
210
|
-
in order to implement ECE calculation. See
|
|
211
|
-
|
|
208
|
+
in order to implement ECE calculation. See:
|
|
209
|
+
|
|
210
|
+
https://github.com/scikit-learn/scikit-learn/issues/18268
|
|
212
211
|
|
|
213
212
|
Args:
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
num_bins
|
|
213
|
+
true_scores (list of int): true values, length N, binary-valued (0 = neg, 1 = pos)
|
|
214
|
+
pred_scores (list of float): predicted confidence values, length N, pred_scores[i] is the
|
|
215
|
+
predicted confidence that example i is positive
|
|
216
|
+
num_bins (int): number of bins to use (`M` in eq. (3) of Guo 2017)
|
|
218
217
|
|
|
219
218
|
Returns:
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
219
|
+
tuple: a length-three tuple containing:
|
|
220
|
+
- accs: np.ndarray, shape [M], type float64, accuracy in each bin,
|
|
221
|
+
M <= num_bins because bins with no samples are not returned
|
|
222
|
+
- confs: np.ndarray, shape [M], type float64, mean model confidence in
|
|
223
|
+
each bin
|
|
224
|
+
- ece: float, expected calibration error
|
|
225
225
|
"""
|
|
226
226
|
|
|
227
227
|
assert len(true_scores) == len(pred_scores)
|
|
@@ -242,32 +242,25 @@ def calibration_ece(true_scores: Sequence[int], pred_scores: Sequence[float],
|
|
|
242
242
|
return accs, confs, ece
|
|
243
243
|
|
|
244
244
|
|
|
245
|
-
def plot_calibration_curve(true_scores
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
name: str = 'calibration',
|
|
249
|
-
plot_perf: bool = True,
|
|
250
|
-
plot_hist: bool = True,
|
|
251
|
-
ax: Optional[matplotlib.axes.Axes] = None,
|
|
252
|
-
**fig_kwargs: Any
|
|
253
|
-
) -> matplotlib.figure.Figure:
|
|
245
|
+
def plot_calibration_curve(true_scores, pred_scores, num_bins,
|
|
246
|
+
name='calibration', plot_perf=True, plot_hist=True,
|
|
247
|
+
ax=None, **fig_kwargs):
|
|
254
248
|
"""
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
Consider rewriting / removing this function if
|
|
258
|
-
https://github.com/scikit-learn/scikit-learn/pull/17443
|
|
259
|
-
is merged into an actual scikit-learn release.
|
|
249
|
+
Plots a calibration curve.
|
|
260
250
|
|
|
261
251
|
Args:
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
252
|
+
true_scores (list of int): true values, length N, binary-valued (0 = neg, 1 = pos)
|
|
253
|
+
pred_scores (list of float): predicted confidence values, length N, pred_scores[i] is the
|
|
254
|
+
predicted confidence that example i is positive
|
|
255
|
+
num_bins (int): number of bins to use (`M` in eq. (3) of Guo 2017)
|
|
256
|
+
name (str, optional): label in legend for the calibration curve
|
|
257
|
+
plot_perf (bool, optional): whether to plot y=x line indicating perfect calibration
|
|
258
|
+
plot_hist (bool, optional): whether to plot histogram of counts
|
|
259
|
+
ax (Axes, optional): if given then no legend is drawn, and fig_kwargs are ignored
|
|
260
|
+
fig_kwargs (dict, optional): only used if [ax] is None
|
|
261
|
+
|
|
262
|
+
Returns:
|
|
263
|
+
matplotlib.figure.Figure: the (new) figure
|
|
271
264
|
"""
|
|
272
265
|
|
|
273
266
|
accs, confs, ece = calibration_ece(true_scores, pred_scores, num_bins)
|
|
@@ -1,21 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
#
|
|
3
|
-
# render_images_with_thumbnails.py
|
|
4
|
-
#
|
|
5
|
-
# Render an output image with one primary and crops from many secondary images,
|
|
6
|
-
# used to check whether suspicious detections are actually false positives or not.
|
|
7
|
-
#
|
|
8
|
-
########
|
|
1
|
+
"""
|
|
9
2
|
|
|
10
|
-
|
|
3
|
+
render_images_with_thumbnails.py
|
|
4
|
+
|
|
5
|
+
Renders an output image with one primary image and crops from many secondary images,
|
|
6
|
+
used primarily to check whether candidate repeat detections are actually false positives or not.
|
|
7
|
+
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
#%% Imports
|
|
11
11
|
|
|
12
12
|
import math
|
|
13
13
|
import os
|
|
14
14
|
import random
|
|
15
15
|
|
|
16
|
-
from md_visualization import visualization_utils as vis_utils
|
|
17
16
|
from PIL import Image
|
|
18
17
|
|
|
18
|
+
from md_visualization import visualization_utils as vis_utils
|
|
19
|
+
from md_utils import path_utils
|
|
20
|
+
|
|
19
21
|
|
|
20
22
|
#%% Support functions
|
|
21
23
|
|
|
@@ -24,10 +26,13 @@ def crop_image_with_normalized_coordinates(
|
|
|
24
26
|
bounding_box):
|
|
25
27
|
"""
|
|
26
28
|
Args:
|
|
27
|
-
image: image to crop
|
|
28
|
-
bounding_box: tuple formatted as (x,y,w,h), where (0,0) is the
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
image (PIL.Image): image to crop
|
|
30
|
+
bounding_box (tuple): tuple formatted as (x,y,w,h), where (0,0) is the
|
|
31
|
+
upper-left of the image, and coordinates are normalized
|
|
32
|
+
(so (0,0,1,1) is a box containing the entire image).
|
|
33
|
+
|
|
34
|
+
Returns:
|
|
35
|
+
PIL.Image: cropped image
|
|
31
36
|
"""
|
|
32
37
|
|
|
33
38
|
im_width, im_height = image.size
|
|
@@ -39,7 +44,6 @@ def crop_image_with_normalized_coordinates(
|
|
|
39
44
|
return image.crop((x, y, x+w, y+h))
|
|
40
45
|
|
|
41
46
|
|
|
42
|
-
|
|
43
47
|
#%% Main function
|
|
44
48
|
|
|
45
49
|
def render_images_with_thumbnails(
|
|
@@ -64,20 +68,19 @@ def render_images_with_thumbnails(
|
|
|
64
68
|
ratio of the primary image.
|
|
65
69
|
|
|
66
70
|
Args:
|
|
67
|
-
primary_image_filename: filename of the primary image to load as str
|
|
68
|
-
primary_image_width: width at which to render the primary image; if this is
|
|
69
|
-
None, will render at the original image width
|
|
70
|
-
secondary_image_filename_list: list of
|
|
71
|
-
|
|
72
|
-
secondary_image_bounding_box_list: list of tuples, one per secondary
|
|
71
|
+
primary_image_filename (str): filename of the primary image to load as str
|
|
72
|
+
primary_image_width (int): width at which to render the primary image; if this is
|
|
73
|
+
None, will render at the original image width
|
|
74
|
+
secondary_image_filename_list (list): list of filenames of the secondary images
|
|
75
|
+
secondary_image_bounding_box_list (list): list of tuples, one per secondary
|
|
73
76
|
image. Each tuple is a bounding box of the secondary image,
|
|
74
77
|
formatted as (x,y,w,h), where (0,0) is the upper-left of the image,
|
|
75
78
|
and coordinates are normalized (so (0,0,1,1) is a box containing
|
|
76
79
|
the entire image.
|
|
77
|
-
cropped_grid_width: width of
|
|
78
|
-
output_image_filename
|
|
79
|
-
primary_image_location: 'right' or left'; reserving 'top', 'bottom', etc.
|
|
80
|
-
for future use
|
|
80
|
+
cropped_grid_width (int): width of the cropped-image area
|
|
81
|
+
output_image_filename (str): filename to write the output image
|
|
82
|
+
primary_image_location (str, optional): 'right' or left'; reserving 'top', 'bottom', etc.
|
|
83
|
+
for future use
|
|
81
84
|
"""
|
|
82
85
|
|
|
83
86
|
# Check to make sure the arguments are reasonable
|
|
@@ -183,6 +186,8 @@ def render_images_with_thumbnails(
|
|
|
183
186
|
# Write output image to disk
|
|
184
187
|
output_image.save(output_image_filename)
|
|
185
188
|
|
|
189
|
+
# ...def render_images_with_thumbnails(...)
|
|
190
|
+
|
|
186
191
|
|
|
187
192
|
#%% Interactive driver
|
|
188
193
|
|
|
@@ -216,18 +221,15 @@ if False:
|
|
|
216
221
|
output_image_filename,
|
|
217
222
|
primary_image_location='right')
|
|
218
223
|
|
|
219
|
-
from md_utils import path_utils
|
|
220
224
|
path_utils.open_file(output_image_filename)
|
|
221
225
|
|
|
222
226
|
|
|
223
227
|
#%% Command-line driver
|
|
224
228
|
|
|
229
|
+
# This is just a test driver, this module is not meant to be run from the command line.
|
|
230
|
+
|
|
225
231
|
def main():
|
|
226
|
-
|
|
227
|
-
#%%
|
|
228
|
-
|
|
229
|
-
from md_utils import path_utils
|
|
230
|
-
|
|
232
|
+
|
|
231
233
|
# Load images from a test directory.
|
|
232
234
|
#
|
|
233
235
|
# Make the first image in the directory the primary image,
|
|
@@ -268,8 +270,6 @@ def main():
|
|
|
268
270
|
|
|
269
271
|
from md_utils import path_utils
|
|
270
272
|
path_utils.open_file(output_image_filename)
|
|
271
|
-
|
|
272
|
-
#%%
|
|
273
|
-
|
|
273
|
+
|
|
274
274
|
if __name__ == '__main__':
|
|
275
275
|
main()
|