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.

Files changed (226) hide show
  1. {megadetector-5.0.9.dist-info → megadetector-5.0.11.dist-info}/LICENSE +0 -0
  2. {megadetector-5.0.9.dist-info → megadetector-5.0.11.dist-info}/METADATA +12 -11
  3. megadetector-5.0.11.dist-info/RECORD +5 -0
  4. megadetector-5.0.11.dist-info/top_level.txt +1 -0
  5. api/__init__.py +0 -0
  6. api/batch_processing/__init__.py +0 -0
  7. api/batch_processing/api_core/__init__.py +0 -0
  8. api/batch_processing/api_core/batch_service/__init__.py +0 -0
  9. api/batch_processing/api_core/batch_service/score.py +0 -439
  10. api/batch_processing/api_core/server.py +0 -294
  11. api/batch_processing/api_core/server_api_config.py +0 -98
  12. api/batch_processing/api_core/server_app_config.py +0 -55
  13. api/batch_processing/api_core/server_batch_job_manager.py +0 -220
  14. api/batch_processing/api_core/server_job_status_table.py +0 -152
  15. api/batch_processing/api_core/server_orchestration.py +0 -360
  16. api/batch_processing/api_core/server_utils.py +0 -92
  17. api/batch_processing/api_core_support/__init__.py +0 -0
  18. api/batch_processing/api_core_support/aggregate_results_manually.py +0 -46
  19. api/batch_processing/api_support/__init__.py +0 -0
  20. api/batch_processing/api_support/summarize_daily_activity.py +0 -152
  21. api/batch_processing/data_preparation/__init__.py +0 -0
  22. api/batch_processing/data_preparation/manage_local_batch.py +0 -2391
  23. api/batch_processing/data_preparation/manage_video_batch.py +0 -327
  24. api/batch_processing/integration/digiKam/setup.py +0 -6
  25. api/batch_processing/integration/digiKam/xmp_integration.py +0 -465
  26. api/batch_processing/integration/eMammal/test_scripts/config_template.py +0 -5
  27. api/batch_processing/integration/eMammal/test_scripts/push_annotations_to_emammal.py +0 -126
  28. api/batch_processing/integration/eMammal/test_scripts/select_images_for_testing.py +0 -55
  29. api/batch_processing/postprocessing/__init__.py +0 -0
  30. api/batch_processing/postprocessing/add_max_conf.py +0 -64
  31. api/batch_processing/postprocessing/categorize_detections_by_size.py +0 -163
  32. api/batch_processing/postprocessing/combine_api_outputs.py +0 -249
  33. api/batch_processing/postprocessing/compare_batch_results.py +0 -958
  34. api/batch_processing/postprocessing/convert_output_format.py +0 -397
  35. api/batch_processing/postprocessing/load_api_results.py +0 -195
  36. api/batch_processing/postprocessing/md_to_coco.py +0 -310
  37. api/batch_processing/postprocessing/md_to_labelme.py +0 -330
  38. api/batch_processing/postprocessing/merge_detections.py +0 -401
  39. api/batch_processing/postprocessing/postprocess_batch_results.py +0 -1904
  40. api/batch_processing/postprocessing/remap_detection_categories.py +0 -170
  41. api/batch_processing/postprocessing/render_detection_confusion_matrix.py +0 -661
  42. api/batch_processing/postprocessing/repeat_detection_elimination/find_repeat_detections.py +0 -211
  43. api/batch_processing/postprocessing/repeat_detection_elimination/remove_repeat_detections.py +0 -82
  44. api/batch_processing/postprocessing/repeat_detection_elimination/repeat_detections_core.py +0 -1631
  45. api/batch_processing/postprocessing/separate_detections_into_folders.py +0 -731
  46. api/batch_processing/postprocessing/subset_json_detector_output.py +0 -696
  47. api/batch_processing/postprocessing/top_folders_to_bottom.py +0 -223
  48. api/synchronous/__init__.py +0 -0
  49. api/synchronous/api_core/animal_detection_api/__init__.py +0 -0
  50. api/synchronous/api_core/animal_detection_api/api_backend.py +0 -152
  51. api/synchronous/api_core/animal_detection_api/api_frontend.py +0 -266
  52. api/synchronous/api_core/animal_detection_api/config.py +0 -35
  53. api/synchronous/api_core/animal_detection_api/data_management/annotations/annotation_constants.py +0 -47
  54. api/synchronous/api_core/animal_detection_api/detection/detector_training/copy_checkpoints.py +0 -43
  55. api/synchronous/api_core/animal_detection_api/detection/detector_training/model_main_tf2.py +0 -114
  56. api/synchronous/api_core/animal_detection_api/detection/process_video.py +0 -543
  57. api/synchronous/api_core/animal_detection_api/detection/pytorch_detector.py +0 -304
  58. api/synchronous/api_core/animal_detection_api/detection/run_detector.py +0 -627
  59. api/synchronous/api_core/animal_detection_api/detection/run_detector_batch.py +0 -1029
  60. api/synchronous/api_core/animal_detection_api/detection/run_inference_with_yolov5_val.py +0 -581
  61. api/synchronous/api_core/animal_detection_api/detection/run_tiled_inference.py +0 -754
  62. api/synchronous/api_core/animal_detection_api/detection/tf_detector.py +0 -165
  63. api/synchronous/api_core/animal_detection_api/detection/video_utils.py +0 -495
  64. api/synchronous/api_core/animal_detection_api/md_utils/azure_utils.py +0 -174
  65. api/synchronous/api_core/animal_detection_api/md_utils/ct_utils.py +0 -262
  66. api/synchronous/api_core/animal_detection_api/md_utils/directory_listing.py +0 -251
  67. api/synchronous/api_core/animal_detection_api/md_utils/matlab_porting_tools.py +0 -97
  68. api/synchronous/api_core/animal_detection_api/md_utils/path_utils.py +0 -416
  69. api/synchronous/api_core/animal_detection_api/md_utils/process_utils.py +0 -110
  70. api/synchronous/api_core/animal_detection_api/md_utils/sas_blob_utils.py +0 -509
  71. api/synchronous/api_core/animal_detection_api/md_utils/string_utils.py +0 -59
  72. api/synchronous/api_core/animal_detection_api/md_utils/url_utils.py +0 -144
  73. api/synchronous/api_core/animal_detection_api/md_utils/write_html_image_list.py +0 -226
  74. api/synchronous/api_core/animal_detection_api/md_visualization/visualization_utils.py +0 -841
  75. api/synchronous/api_core/tests/__init__.py +0 -0
  76. api/synchronous/api_core/tests/load_test.py +0 -110
  77. classification/__init__.py +0 -0
  78. classification/aggregate_classifier_probs.py +0 -108
  79. classification/analyze_failed_images.py +0 -227
  80. classification/cache_batchapi_outputs.py +0 -198
  81. classification/create_classification_dataset.py +0 -627
  82. classification/crop_detections.py +0 -516
  83. classification/csv_to_json.py +0 -226
  84. classification/detect_and_crop.py +0 -855
  85. classification/efficientnet/__init__.py +0 -9
  86. classification/efficientnet/model.py +0 -415
  87. classification/efficientnet/utils.py +0 -610
  88. classification/evaluate_model.py +0 -520
  89. classification/identify_mislabeled_candidates.py +0 -152
  90. classification/json_to_azcopy_list.py +0 -63
  91. classification/json_validator.py +0 -695
  92. classification/map_classification_categories.py +0 -276
  93. classification/merge_classification_detection_output.py +0 -506
  94. classification/prepare_classification_script.py +0 -194
  95. classification/prepare_classification_script_mc.py +0 -228
  96. classification/run_classifier.py +0 -286
  97. classification/save_mislabeled.py +0 -110
  98. classification/train_classifier.py +0 -825
  99. classification/train_classifier_tf.py +0 -724
  100. classification/train_utils.py +0 -322
  101. data_management/__init__.py +0 -0
  102. data_management/annotations/__init__.py +0 -0
  103. data_management/annotations/annotation_constants.py +0 -34
  104. data_management/camtrap_dp_to_coco.py +0 -238
  105. data_management/cct_json_utils.py +0 -395
  106. data_management/cct_to_md.py +0 -176
  107. data_management/cct_to_wi.py +0 -289
  108. data_management/coco_to_labelme.py +0 -272
  109. data_management/coco_to_yolo.py +0 -662
  110. data_management/databases/__init__.py +0 -0
  111. data_management/databases/add_width_and_height_to_db.py +0 -33
  112. data_management/databases/combine_coco_camera_traps_files.py +0 -206
  113. data_management/databases/integrity_check_json_db.py +0 -477
  114. data_management/databases/subset_json_db.py +0 -115
  115. data_management/generate_crops_from_cct.py +0 -149
  116. data_management/get_image_sizes.py +0 -188
  117. data_management/importers/add_nacti_sizes.py +0 -52
  118. data_management/importers/add_timestamps_to_icct.py +0 -79
  119. data_management/importers/animl_results_to_md_results.py +0 -158
  120. data_management/importers/auckland_doc_test_to_json.py +0 -372
  121. data_management/importers/auckland_doc_to_json.py +0 -200
  122. data_management/importers/awc_to_json.py +0 -189
  123. data_management/importers/bellevue_to_json.py +0 -273
  124. data_management/importers/cacophony-thermal-importer.py +0 -796
  125. data_management/importers/carrizo_shrubfree_2018.py +0 -268
  126. data_management/importers/carrizo_trail_cam_2017.py +0 -287
  127. data_management/importers/cct_field_adjustments.py +0 -57
  128. data_management/importers/channel_islands_to_cct.py +0 -913
  129. data_management/importers/eMammal/copy_and_unzip_emammal.py +0 -180
  130. data_management/importers/eMammal/eMammal_helpers.py +0 -249
  131. data_management/importers/eMammal/make_eMammal_json.py +0 -223
  132. data_management/importers/ena24_to_json.py +0 -275
  133. data_management/importers/filenames_to_json.py +0 -385
  134. data_management/importers/helena_to_cct.py +0 -282
  135. data_management/importers/idaho-camera-traps.py +0 -1407
  136. data_management/importers/idfg_iwildcam_lila_prep.py +0 -294
  137. data_management/importers/jb_csv_to_json.py +0 -150
  138. data_management/importers/mcgill_to_json.py +0 -250
  139. data_management/importers/missouri_to_json.py +0 -489
  140. data_management/importers/nacti_fieldname_adjustments.py +0 -79
  141. data_management/importers/noaa_seals_2019.py +0 -181
  142. data_management/importers/pc_to_json.py +0 -365
  143. data_management/importers/plot_wni_giraffes.py +0 -123
  144. data_management/importers/prepare-noaa-fish-data-for-lila.py +0 -359
  145. data_management/importers/prepare_zsl_imerit.py +0 -131
  146. data_management/importers/rspb_to_json.py +0 -356
  147. data_management/importers/save_the_elephants_survey_A.py +0 -320
  148. data_management/importers/save_the_elephants_survey_B.py +0 -332
  149. data_management/importers/snapshot_safari_importer.py +0 -758
  150. data_management/importers/snapshot_safari_importer_reprise.py +0 -665
  151. data_management/importers/snapshot_serengeti_lila.py +0 -1067
  152. data_management/importers/snapshotserengeti/make_full_SS_json.py +0 -150
  153. data_management/importers/snapshotserengeti/make_per_season_SS_json.py +0 -153
  154. data_management/importers/sulross_get_exif.py +0 -65
  155. data_management/importers/timelapse_csv_set_to_json.py +0 -490
  156. data_management/importers/ubc_to_json.py +0 -399
  157. data_management/importers/umn_to_json.py +0 -507
  158. data_management/importers/wellington_to_json.py +0 -263
  159. data_management/importers/wi_to_json.py +0 -441
  160. data_management/importers/zamba_results_to_md_results.py +0 -181
  161. data_management/labelme_to_coco.py +0 -548
  162. data_management/labelme_to_yolo.py +0 -272
  163. data_management/lila/__init__.py +0 -0
  164. data_management/lila/add_locations_to_island_camera_traps.py +0 -97
  165. data_management/lila/add_locations_to_nacti.py +0 -147
  166. data_management/lila/create_lila_blank_set.py +0 -557
  167. data_management/lila/create_lila_test_set.py +0 -151
  168. data_management/lila/create_links_to_md_results_files.py +0 -106
  169. data_management/lila/download_lila_subset.py +0 -177
  170. data_management/lila/generate_lila_per_image_labels.py +0 -515
  171. data_management/lila/get_lila_annotation_counts.py +0 -170
  172. data_management/lila/get_lila_image_counts.py +0 -111
  173. data_management/lila/lila_common.py +0 -300
  174. data_management/lila/test_lila_metadata_urls.py +0 -132
  175. data_management/ocr_tools.py +0 -874
  176. data_management/read_exif.py +0 -681
  177. data_management/remap_coco_categories.py +0 -84
  178. data_management/remove_exif.py +0 -66
  179. data_management/resize_coco_dataset.py +0 -189
  180. data_management/wi_download_csv_to_coco.py +0 -246
  181. data_management/yolo_output_to_md_output.py +0 -441
  182. data_management/yolo_to_coco.py +0 -676
  183. detection/__init__.py +0 -0
  184. detection/detector_training/__init__.py +0 -0
  185. detection/detector_training/model_main_tf2.py +0 -114
  186. detection/process_video.py +0 -703
  187. detection/pytorch_detector.py +0 -337
  188. detection/run_detector.py +0 -779
  189. detection/run_detector_batch.py +0 -1219
  190. detection/run_inference_with_yolov5_val.py +0 -917
  191. detection/run_tiled_inference.py +0 -935
  192. detection/tf_detector.py +0 -188
  193. detection/video_utils.py +0 -606
  194. docs/source/conf.py +0 -43
  195. md_utils/__init__.py +0 -0
  196. md_utils/azure_utils.py +0 -174
  197. md_utils/ct_utils.py +0 -612
  198. md_utils/directory_listing.py +0 -246
  199. md_utils/md_tests.py +0 -968
  200. md_utils/path_utils.py +0 -1044
  201. md_utils/process_utils.py +0 -157
  202. md_utils/sas_blob_utils.py +0 -509
  203. md_utils/split_locations_into_train_val.py +0 -228
  204. md_utils/string_utils.py +0 -92
  205. md_utils/url_utils.py +0 -323
  206. md_utils/write_html_image_list.py +0 -225
  207. md_visualization/__init__.py +0 -0
  208. md_visualization/plot_utils.py +0 -293
  209. md_visualization/render_images_with_thumbnails.py +0 -275
  210. md_visualization/visualization_utils.py +0 -1537
  211. md_visualization/visualize_db.py +0 -551
  212. md_visualization/visualize_detector_output.py +0 -406
  213. megadetector-5.0.9.dist-info/RECORD +0 -224
  214. megadetector-5.0.9.dist-info/top_level.txt +0 -8
  215. taxonomy_mapping/__init__.py +0 -0
  216. taxonomy_mapping/map_lila_taxonomy_to_wi_taxonomy.py +0 -491
  217. taxonomy_mapping/map_new_lila_datasets.py +0 -154
  218. taxonomy_mapping/prepare_lila_taxonomy_release.py +0 -142
  219. taxonomy_mapping/preview_lila_taxonomy.py +0 -591
  220. taxonomy_mapping/retrieve_sample_image.py +0 -71
  221. taxonomy_mapping/simple_image_download.py +0 -218
  222. taxonomy_mapping/species_lookup.py +0 -834
  223. taxonomy_mapping/taxonomy_csv_checker.py +0 -159
  224. taxonomy_mapping/taxonomy_graph.py +0 -346
  225. taxonomy_mapping/validate_lila_category_mappings.py +0 -83
  226. {megadetector-5.0.9.dist-info → megadetector-5.0.11.dist-info}/WHEEL +0 -0
@@ -1,275 +0,0 @@
1
- """
2
-
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
-
12
- import math
13
- import os
14
- import random
15
-
16
- from PIL import Image
17
-
18
- from md_visualization import visualization_utils as vis_utils
19
- from md_utils import path_utils
20
-
21
-
22
- #%% Support functions
23
-
24
- def crop_image_with_normalized_coordinates(
25
- image,
26
- bounding_box):
27
- """
28
- Args:
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
36
- """
37
-
38
- im_width, im_height = image.size
39
- (x_norm, y_norm, w_norm, h_norm) = bounding_box
40
- (x, y, w, h) = (x_norm * im_width,
41
- y_norm * im_height,
42
- w_norm * im_width,
43
- h_norm * im_height)
44
- return image.crop((x, y, x+w, y+h))
45
-
46
-
47
- #%% Main function
48
-
49
- def render_images_with_thumbnails(
50
- primary_image_filename,
51
- primary_image_width,
52
- secondary_image_filename_list,
53
- secondary_image_bounding_box_list,
54
- cropped_grid_width,
55
- output_image_filename,
56
- primary_image_location='right'):
57
- """
58
- Given a primary image filename and a list of secondary images, writes to
59
- the provided output_image_filename an image where the one
60
- side is the primary image, and the other side is a grid of the
61
- secondary images, cropped according to the provided list of bounding
62
- boxes.
63
-
64
- The output file will be primary_image_width + cropped_grid_width pixels
65
- wide.
66
-
67
- The height of the output image will be determined by the original aspect
68
- ratio of the primary image.
69
-
70
- Args:
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
76
- image. Each tuple is a bounding box of the secondary image,
77
- formatted as (x,y,w,h), where (0,0) is the upper-left of the image,
78
- and coordinates are normalized (so (0,0,1,1) is a box containing
79
- the entire image.
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
84
- """
85
-
86
- # Check to make sure the arguments are reasonable
87
- assert(len(secondary_image_filename_list) ==
88
- len(secondary_image_bounding_box_list)), \
89
- 'Length of secondary image list and bounding box list should be equal'
90
-
91
- assert primary_image_location in ['left','right']
92
-
93
- # Load primary image and resize to desired width
94
- primary_image = vis_utils.load_image(primary_image_filename)
95
- if primary_image_width is not None:
96
- primary_image = vis_utils.resize_image(primary_image, primary_image_width,
97
- target_height=-1)
98
-
99
- # Compute the number of grid elements for the secondary images
100
- # to best fit the available aspect ratio
101
- grid_width = cropped_grid_width
102
- grid_height = primary_image.size[1]
103
- grid_aspect = grid_width / grid_height
104
-
105
- sample_crop_width = secondary_image_bounding_box_list[0][2]
106
- sample_crop_height = secondary_image_bounding_box_list[0][3]
107
-
108
- n_crops = len(secondary_image_filename_list)
109
-
110
- optimal_n_rows = None
111
- optimal_aspect_error = None
112
-
113
- for candidate_n_rows in range(1,n_crops+1):
114
- candidate_n_cols = math.ceil(n_crops / candidate_n_rows)
115
- candidate_grid_aspect = (candidate_n_cols*sample_crop_width) / \
116
- (candidate_n_rows*sample_crop_height)
117
- aspect_error = abs(grid_aspect-candidate_grid_aspect)
118
- if optimal_n_rows is None or aspect_error < optimal_aspect_error:
119
- optimal_n_rows = candidate_n_rows
120
- optimal_aspect_error = aspect_error
121
-
122
- assert optimal_n_rows is not None
123
- grid_rows = optimal_n_rows
124
- grid_columns = math.ceil(n_crops/grid_rows)
125
-
126
- # Compute the width of each grid cell
127
- grid_cell_width = math.floor(grid_width / grid_columns)
128
- grid_cell_height = math.floor(grid_height / grid_rows)
129
-
130
- # Load secondary images and their associated bounding boxes. Iterate
131
- # through them, crop them, and save them to a list of cropped_images
132
- cropped_images = []
133
- for (name, box) in zip(secondary_image_filename_list,
134
- secondary_image_bounding_box_list):
135
-
136
- other_image = vis_utils.load_image(name)
137
- cropped_image = crop_image_with_normalized_coordinates(
138
- other_image, box)
139
-
140
- # Rescale this crop to fit within the desired grid cell size
141
- width_scale_factor = grid_cell_width / cropped_image.size[0]
142
- height_scale_factor = grid_cell_height / cropped_image.size[1]
143
- scale_factor = min(width_scale_factor,height_scale_factor)
144
-
145
- # Resize the cropped image, whether we're making it larger or smaller
146
- cropped_image = cropped_image.resize(
147
- ((int)(cropped_image.size[0] * scale_factor),
148
- (int)(cropped_image.size[1] * scale_factor)))
149
-
150
- cropped_images.append(cropped_image)
151
-
152
- # ...for each crop
153
-
154
- # Compute the final output image size. This will depend upon the aspect
155
- # ratio of the crops.
156
- output_image_width = primary_image.size[0] + grid_width
157
- output_image_height = primary_image.size[1]
158
-
159
- # Create blank output image
160
- output_image = Image.new('RGB', (output_image_width, output_image_height))
161
-
162
- # Copy resized primary image to output image
163
- if primary_image_location == 'right':
164
- primary_image_x = grid_width
165
- else:
166
- primary_image_x = 0
167
-
168
- output_image.paste(primary_image, (primary_image_x, 0))
169
-
170
- # Compute the final locations of the secondary images in the output image
171
- i_row = 0; i_col = 0
172
- for image in cropped_images:
173
-
174
- x = i_col * grid_cell_width
175
- if primary_image_location == 'left':
176
- x += primary_image.size[0]
177
- y = i_row * grid_cell_height
178
- output_image.paste(image, (x,y))
179
- i_col += 1
180
- if i_col >= grid_columns:
181
- i_col = 0
182
- i_row += 1
183
-
184
- # ...for each crop
185
-
186
- # Write output image to disk
187
- output_image.save(output_image_filename)
188
-
189
- # ...def render_images_with_thumbnails(...)
190
-
191
-
192
- #%% Interactive driver
193
-
194
- if False:
195
-
196
- pass
197
-
198
- #%%
199
-
200
- primary_image_filename = '/home/user/data/KRU/KRU_public/KRU_S1/13/13_R1/KRU_S1_13_R1_IMAG0035.JPG'
201
-
202
- primary_image_width = 5152
203
-
204
- secondary_image_filename_list = ['/home/user/data/KRU/KRU_public/KRU_S1/13/13_R1/KRU_S1_13_R1_IMAG0035.JPG', '/home/user/data/KRU/KRU_public/KRU_S1/13/13_R1/KRU_S1_13_R1_IMAG0040.JPG', '/home/user/data/KRU/KRU_public/KRU_S1/13/13_R1/KRU_S1_13_R1_IMAG0007.JPG', '/home/user/data/KRU/KRU_public/KRU_S1/13/13_R1/KRU_S1_13_R1_IMAG0041.JPG', '/home/user/data/KRU/KRU_public/KRU_S1/13/13_R1/KRU_S1_13_R1_IMAG0008.JPG', '/home/user/data/KRU/KRU_public/KRU_S1/13/13_R1/KRU_S1_13_R1_IMAG0048.JPG', '/home/user/data/KRU/KRU_public/KRU_S1/13/13_R1/KRU_S1_13_R1_IMAG0031.JPG', '/home/user/data/KRU/KRU_public/KRU_S1/13/13_R1/KRU_S1_13_R1_IMAG0006.JPG', '/home/user/data/KRU/KRU_public/KRU_S1/13/13_R1/KRU_S1_13_R1_IMAG0004.JPG', '/home/user/data/KRU/KRU_public/KRU_S1/13/13_R1/KRU_S1_13_R1_IMAG0026.JPG', '/home/user/data/KRU/KRU_public/KRU_S1/13/13_R1/KRU_S1_13_R1_IMAG0005.JPG']
205
-
206
- secondary_image_bounding_box_list = [[0, 0, 0.1853, 0.6552], [0, 0, 0.1855, 0.6527], [0, 0.000252, 0.1991, 0.6925], [0, 0, 0.1855, 0.6527], [0, 0.001008, 0.1902, 0.6774], [0, 0, 0.1845, 0.658], [0, 0, 0.1824, 0.6711], [0, 0.00252, 0.2005, 0.6857], [0, 0.002268, 0.1983, 0.6852], [0, 0, 0.1752, 0.6897], [0, 0.001764, 0.1989, 0.6887]]
207
-
208
- # cropped_grid_width = 3091
209
- cropped_grid_width = 500
210
-
211
- primary_image_location = 'right'
212
-
213
- output_image_filename = os.path.expanduser('~/tmp/grid-test.jpg')
214
-
215
- render_images_with_thumbnails(
216
- primary_image_filename,
217
- primary_image_width,
218
- secondary_image_filename_list,
219
- secondary_image_bounding_box_list,
220
- cropped_grid_width,
221
- output_image_filename,
222
- primary_image_location='right')
223
-
224
- path_utils.open_file(output_image_filename)
225
-
226
-
227
- #%% Command-line driver
228
-
229
- # This is just a test driver, this module is not meant to be run from the command line.
230
-
231
- def main():
232
-
233
- # Load images from a test directory.
234
- #
235
- # Make the first image in the directory the primary image,
236
- # the remaining ones the comparison images.
237
- test_input_folder = os.path.expanduser('~/data/KRU-test')
238
- output_image_filename = os.path.expanduser('~/tmp/thumbnail_test.jpg')
239
-
240
- files = path_utils.find_images(test_input_folder)
241
-
242
- random.seed(0); random.shuffle(files)
243
- primary_image_filename = files[0]
244
-
245
- secondary_image_filename_list = []
246
- secondary_image_bounding_box_list = []
247
-
248
- # Initialize the x,y location of the bounding box
249
- box = (random.uniform(0.25, 0.75), random.uniform(0.25, 0.75))
250
-
251
- # Create the list of secondary images and their bounding boxes
252
- for file in files[1:]:
253
- secondary_image_filename_list.append(file)
254
- secondary_image_bounding_box_list.append(
255
- (box[0] + random.uniform(-0.001, 0.001),
256
- box[1] + random.uniform(-0.001, 0.001),
257
- 0.2,
258
- 0.2))
259
-
260
- primary_image_width = 1000
261
- cropped_grid_width = 1000
262
-
263
- render_images_with_thumbnails(
264
- primary_image_filename,
265
- primary_image_width,
266
- secondary_image_filename_list,
267
- secondary_image_bounding_box_list,
268
- cropped_grid_width,
269
- output_image_filename, 'right')
270
-
271
- from md_utils import path_utils
272
- path_utils.open_file(output_image_filename)
273
-
274
- if __name__ == '__main__':
275
- main()