| |
|
|
| import math |
|
|
|
|
| def get_image_size_for_max_num_patches( |
| image_height, image_width, patch_size, max_num_patches |
| ): |
| """Find target image size preserving aspect ratio within patch budget. |
| |
| Uses binary search to find the optimal scale such that |
| ceil(h*scale/ps)*ceil(w*scale/ps) <= max_num_patches. |
| |
| Args: |
| image_height: Original image height. |
| image_width: Original image width. |
| patch_size: Patch size (int). |
| max_num_patches: Maximum number of patches allowed. |
| |
| Returns: |
| (target_h, target_w) both multiples of patch_size. |
| """ |
| scale_min, scale_max = 1e-6, 100.0 |
| eps = 1e-5 |
| while (scale_max - scale_min) >= eps: |
| scale = (scale_min + scale_max) / 2 |
| target_h = max( |
| patch_size, int(math.ceil(image_height * scale / patch_size) * patch_size) |
| ) |
| target_w = max( |
| patch_size, int(math.ceil(image_width * scale / patch_size) * patch_size) |
| ) |
| num_patches = (target_h // patch_size) * (target_w // patch_size) |
| if num_patches <= max_num_patches: |
| scale_min = scale |
| else: |
| scale_max = scale |
| target_h = max( |
| patch_size, int(math.ceil(image_height * scale_min / patch_size) * patch_size) |
| ) |
| target_w = max( |
| patch_size, int(math.ceil(image_width * scale_min / patch_size) * patch_size) |
| ) |
| return target_h, target_w |
|
|